Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

testBasis.cpp

00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 #include "ClpSimplex.hpp"
00005 #include "CoinHelperFunctions.hpp"
00006 #include <iomanip>
00007 #include <cassert>
00008 
00009 int main (int argc, const char *argv[])
00010 {
00011   ClpSimplex  model;
00012   int status;
00013   // Keep names
00014   if (argc<2) {
00015     status=model.readMps("small.mps",true);
00016   } else {
00017     status=model.readMps(argv[1],true);
00018   }
00019   if (status)
00020     exit(10);
00021   /*
00022     This driver turns a problem into all equalities, solves it and
00023     then creates optimal basis.
00024   */
00025 
00026   // copy of original
00027   ClpSimplex model2(model);
00028   // And another
00029   ClpSimplex model3(model);
00030 
00031   int originalNumberColumns = model.numberColumns();
00032   int numberRows = model.numberRows();
00033 
00034   int * addStarts = new int [numberRows+1];
00035   int * addRow = new int[numberRows];
00036   double * addElement = new double[numberRows];
00037   double * newUpper = new double[numberRows];
00038   double * newLower = new double[numberRows];
00039 
00040   double * lower = model2.rowLower();
00041   double * upper = model2.rowUpper();
00042   int iRow;
00043   // Simplest is to change all rhs to zero
00044   // One should skip E rows but this is simpler coding
00045   for (iRow=0;iRow<numberRows;iRow++) {
00046     newUpper[iRow]=upper[iRow];
00047     upper[iRow]=0.0;
00048     newLower[iRow]=lower[iRow];
00049     lower[iRow]=0.0;
00050     addRow[iRow]=iRow;
00051     addElement[iRow]=-1.0;
00052     addStarts[iRow]=iRow;
00053   }
00054   addStarts[numberRows]=numberRows;
00055   model2.addColumns(numberRows,newLower,newUpper,NULL,
00056                    addStarts,addRow,addElement);
00057   delete [] addStarts;
00058   delete [] addRow;
00059   delete [] addElement;
00060   delete [] newLower;
00061   delete [] newUpper;
00062 
00063   // Modify costs
00064   double * randomArray = new double[numberRows];
00065   for (iRow=0;iRow<numberRows;iRow++) 
00066     randomArray[iRow]=CoinDrand48();
00067 
00068   model2.transposeTimes(1.0,randomArray,model2.objective());
00069   delete [] randomArray;
00070   // solve
00071   model2.primal();
00072   // first check okay if solution values back
00073   memcpy(model.primalColumnSolution(),model2.primalColumnSolution(),
00074          originalNumberColumns*sizeof(double));
00075   memcpy(model.primalRowSolution(),model2.primalRowSolution(),
00076          numberRows*sizeof(double));
00077   int iColumn;
00078   for (iColumn=0;iColumn<originalNumberColumns;iColumn++) 
00079     model.setColumnStatus(iColumn,model2.getColumnStatus(iColumn));
00080   
00081   for (iRow=0;iRow<numberRows;iRow++) 
00082     model.setRowStatus(iRow,model2.getColumnStatus(iRow+originalNumberColumns));
00083   model.primal(0);
00084   // and now without solution values
00085 
00086   for (iColumn=0;iColumn<originalNumberColumns;iColumn++) 
00087     model3.setColumnStatus(iColumn,model2.getColumnStatus(iColumn));
00088   
00089   for (iRow=0;iRow<numberRows;iRow++) 
00090     model3.setRowStatus(iRow,model2.getColumnStatus(iRow+originalNumberColumns));
00091   model3.primal(0);
00092   return 0;
00093 }    

Generated on Wed Dec 3 14:37:37 2003 for CLP by doxygen 1.3.5