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

OsiSpxSolverInterfaceTest.cpp

00001 //  LAST EDIT: Thu Oct 12 14:54:23 2000 by Tobias Pfender (opt32!bzfpfend) 
00002 //-----------------------------------------------------------------------------
00003 // name:     OSI Interface for SOPLEX
00004 // author:   Tobias Pfender
00005 //           Konrad-Zuse-Zentrum Berlin (Germany)
00006 //           email: pfender@zib.de
00007 // date:     01/17/2002
00008 //-----------------------------------------------------------------------------
00009 // Copyright (C) 2002, Tobias Pfender, International Business Machines
00010 // Corporation and others.  All Rights Reserved.
00011 
00012 #if defined(_MSC_VER)
00013 // Turn off compiler warning about long names
00014 #  pragma warning(disable:4786)
00015 #endif
00016 
00017 #include <cassert>
00018 #include <iostream>
00019 
00020 #include <string>
00021 
00022 #include "OsiSpxSolverInterface.hpp"
00023 #include "OsiCuts.hpp"
00024 #include "OsiRowCut.hpp"
00025 #include "OsiColCut.hpp"
00026 #include "CoinPackedMatrix.hpp"
00027 
00028 #ifdef NDEBUG
00029 #undef NDEBUG
00030 #endif
00031 
00032 void OsiSpxSolverInterface::printBounds()
00033 {
00034   int nc = getNumCols();
00035   int nr = getNumRows();
00036   const char * s = getRowSense();
00037   const double * b = getRightHandSide();
00038   const double * rng = getRowRange();
00039   const double * cl = getColLower();
00040   const double * cu = getColUpper();
00041   const double * rl = getRowLower();
00042   const double * ru = getRowUpper();
00043   
00044   std::cout << "ncols=" << nc << ", nrows=" << nr;
00045   std::cout << std::endl << "sns=";
00046   int i;
00047   for( i = 0; i < nr; ++i )
00048     std::cout << " " << s[i];
00049   std::cout << std::endl << "rhs=";
00050   for( i = 0; i < nr; ++i )
00051     std::cout << " " << b[i];
00052   std::cout << std::endl << "rng=";
00053   for( i = 0; i < nr; ++i )
00054     std::cout << " " << rng[i];
00055   std::cout << std::endl << "cl =";
00056   for( i = 0; i < nc; ++i )
00057     std::cout << " " << cl[i];
00058   std::cout << std::endl << "cu =";
00059   for( i = 0; i < nc; ++i )
00060     std::cout << " " << cu[i];
00061   std::cout << std::endl << "rl =";
00062   for( i = 0; i < nr; ++i )
00063     std::cout << " " << rl[i];
00064   std::cout << std::endl << "ru =";
00065   for( i = 0; i < nr; ++i )
00066     std::cout << " " << ru[i];
00067   std::cout << std::endl;
00068 }
00069 
00070 //--------------------------------------------------------------------------
00071 void OsiSpxSolverInterfaceUnitTest( const std::string & mpsDir, const std::string & netlibDir )
00072 {
00073   // Test default constructor
00074   {
00075     OsiSpxSolverInterface m;
00076     assert( m.rowsense_==NULL );
00077     assert( m.rhs_==NULL );
00078     assert( m.rowrange_==NULL );
00079     assert( m.colsol_==NULL );
00080     assert( m.rowsol_==NULL );
00081     assert( m.matrixByRow_==NULL );
00082     assert( m.matrixByCol_==NULL );
00083     assert( m.getApplicationData() == NULL );
00084     int i=2346;
00085     m.setApplicationData(&i);
00086     assert( *((int *)(m.getApplicationData())) == i );
00087   }
00088 
00089   {    
00090     CoinRelFltEq eq;
00091     OsiSpxSolverInterface m;
00092     std::string fn = mpsDir+"exmip1";
00093     m.readMps(fn.c_str(),"mps");
00094     int ad = 13579;
00095     m.setApplicationData(&ad);
00096     assert( *((int *)(m.getApplicationData())) == ad );
00097 
00098     {
00099       assert( m.getNumCols()==8 );
00100       const CoinPackedMatrix * colCopy = m.getMatrixByCol();
00101       assert( colCopy->getNumCols() == 8 );
00102       assert( colCopy->getMajorDim() == 8 );
00103       assert( colCopy->getNumRows() == 5 );
00104       assert( colCopy->getMinorDim() == 5 );
00105       assert (colCopy->getVectorLengths()[7] == 2 );
00106       CoinPackedMatrix revColCopy;
00107       revColCopy.reverseOrderedCopyOf(*colCopy);
00108       CoinPackedMatrix rev2ColCopy;      
00109       rev2ColCopy.reverseOrderedCopyOf(revColCopy);
00110       assert( rev2ColCopy.getNumCols() == 8 );
00111       assert( rev2ColCopy.getMajorDim() == 8 );
00112       assert( rev2ColCopy.getNumRows() == 5 );
00113       assert( rev2ColCopy.getMinorDim() == 5 );
00114       assert( rev2ColCopy.getVectorLengths()[7] == 2 );
00115     }
00116     
00117     {
00118       OsiSpxSolverInterface im;    
00119       assert( im.getNumCols() == 0 ); 
00120     }
00121     
00122     // Test copy constructor and assignment operator
00123     {
00124       OsiSpxSolverInterface lhs;
00125       {      
00126         assert( *((int *)(m.getApplicationData())) == ad );
00127         OsiSpxSolverInterface im(m);   
00128         assert( *((int *)(im.getApplicationData())) == ad );
00129 
00130         OsiSpxSolverInterface imC1(im);
00131         assert( imC1.getNumCols() == im.getNumCols() );
00132         assert( imC1.getNumRows() == im.getNumRows() );   
00133         assert( *((int *)(imC1.getApplicationData())) == ad ); 
00134         
00135         //im.setModelPtr(m);
00136         
00137         OsiSpxSolverInterface imC2(im);
00138         assert( imC2.getNumCols() == im.getNumCols() );
00139         assert( imC2.getNumRows() == im.getNumRows() );  
00140         assert( *((int *)(imC2.getApplicationData())) == ad ); 
00141         
00142         lhs=imC2;
00143       }
00144       // Test that lhs has correct values even though rhs has gone out of scope
00145 
00146       assert( lhs.getNumCols() == m.getNumCols() );
00147       assert( lhs.getNumRows() == m.getNumRows() );      
00148       assert( *((int *)(lhs.getApplicationData())) == ad );
00149     }
00150     
00151     // Test clone
00152     {
00153       OsiSpxSolverInterface soplexSi(m);
00154       OsiSolverInterface * siPtr = &soplexSi;
00155       OsiSolverInterface * siClone = siPtr->clone();
00156       OsiSpxSolverInterface * soplexClone = dynamic_cast<OsiSpxSolverInterface*>(siClone);
00157       assert( soplexClone != NULL );
00158       assert( soplexClone->getNumRows() == soplexSi.getNumRows() );
00159       assert( soplexClone->getNumCols() == m.getNumCols() );
00160       
00161       assert( *((int *)(soplexClone->getApplicationData())) == ad );
00162       delete siClone;
00163     }
00164    
00165     // test infinity
00166     {
00167       OsiSpxSolverInterface si;
00168       assert( eq( si.getInfinity(), soplex::infinity ) );
00169     }     
00170     
00171     // Test setting solution
00172     {
00173       OsiSpxSolverInterface m1(m);
00174       int i;
00175 
00176       double * cs = new double[m1.getNumCols()];
00177       for ( i = 0;  i < m1.getNumCols();  i++ ) 
00178         cs[i] = i + .5;
00179       m1.setColSolution(cs);
00180       for ( i = 0;  i < m1.getNumCols();  i++ ) 
00181         assert(m1.getColSolution()[i] == i + .5);
00182       
00183       double * rs = new double[m1.getNumRows()];
00184       for ( i = 0;  i < m1.getNumRows();  i++ ) 
00185         rs[i] = i - .5;
00186       m1.setRowPrice(rs);
00187       for ( i = 0;  i < m1.getNumRows();  i++ ) 
00188         assert(m1.getRowPrice()[i] == i - .5);
00189 
00190       delete [] cs;
00191       delete [] rs;
00192     }
00193     
00194     // Test fraction Indices
00195     {
00196       OsiSpxSolverInterface fim;
00197       std::string fn = mpsDir+"exmip1";
00198       fim.readMps(fn.c_str(),"mps");
00199       //fim.setModelPtr(m);
00200       // exmip1.mps has 2 integer variables with index 2 & 3
00201       assert(  fim.isContinuous(0) );
00202       assert(  fim.isContinuous(1) );
00203       assert( !fim.isContinuous(2) );
00204       assert( !fim.isContinuous(3) );
00205       assert(  fim.isContinuous(4) );
00206       
00207       assert( !fim.isInteger(0) );
00208       assert( !fim.isInteger(1) );
00209       assert(  fim.isInteger(2) );
00210       assert(  fim.isInteger(3) );
00211       assert( !fim.isInteger(4) );
00212       
00213       assert( !fim.isBinary(0) );
00214       assert( !fim.isBinary(1) );
00215       assert(  fim.isBinary(2) );
00216       assert(  fim.isBinary(3) );
00217       assert( !fim.isBinary(4) );
00218       
00219       assert( !fim.isIntegerNonBinary(0) );
00220       assert( !fim.isIntegerNonBinary(1) );
00221       assert( !fim.isIntegerNonBinary(2) );
00222       assert( !fim.isIntegerNonBinary(3) );
00223       assert( !fim.isIntegerNonBinary(4) );
00224 
00225       
00226       // Test fractionalIndices
00227       {
00228         // Set a solution vector
00229         double * cs = new double[fim.getNumCols()];
00230         for ( int i = 0;  i < fim.getNumCols();  cs[i++] = 0.0 );
00231         cs[2] = 2.9;
00232         cs[3] = 3.0;
00233         fim.setColSolution(cs);
00234 
00235         OsiVectorInt fi = fim.getFractionalIndices();
00236         assert( fi.size() == 1 );
00237         assert( fi[0]==2 );
00238         
00239         // Set integer variables very close to integer values
00240         cs[2] = 5 + .00001/2.;
00241         cs[3] = 8 - .00001/2.;
00242         fim.setColSolution(cs);
00243         fi = fim.getFractionalIndices(1e-5);
00244         assert( fi.size() == 0 );
00245         
00246         // Set integer variables close, but beyond tolerances
00247         cs[2] = 5 + .00001*2.;
00248         cs[3] = 8 - .00001*2.;
00249         fim.setColSolution(cs);
00250         fi = fim.getFractionalIndices(1e-5);
00251         assert( fi.size() == 2 );
00252         assert( fi[0]==2 );
00253         assert( fi[1]==3 );
00254 
00255         delete [] cs;
00256       }
00257      
00258       // Change data so column 2 & 3 are integerNonBinary
00259       fim.setColUpper(2, 5);
00260       fim.setColUpper(3, 6.0);
00261       assert( !fim.isBinary(0) );
00262       assert( !fim.isBinary(1) );
00263       assert( !fim.isBinary(2) );
00264       assert( !fim.isBinary(3) );
00265       assert( !fim.isBinary(4) );
00266       
00267       assert( !fim.isIntegerNonBinary(0) );
00268       assert( !fim.isIntegerNonBinary(1) );
00269       assert(  fim.isIntegerNonBinary(2) );
00270       assert(  fim.isIntegerNonBinary(3) );
00271       assert( !fim.isIntegerNonBinary(4) );
00272     }
00273     
00274     // Test apply cuts method
00275     {      
00276       OsiSpxSolverInterface im(m);
00277       OsiCuts cuts;
00278       
00279       // Generate some cuts 
00280       {
00281         // Get number of rows and columns in model
00282         int nr=im.getNumRows();
00283         int nc=im.getNumCols();
00284         assert( nr == 5 );
00285         assert( nc == 8 );
00286         
00287         // Generate a valid row cut from thin air
00288         int c;
00289         {
00290           int *inx = new int[nc];
00291           for (c=0;c<nc;c++) inx[c]=c;
00292           double *el = new double[nc];
00293           for (c=0;c<nc;c++) el[c]=((double)c)*((double)c);
00294           
00295           OsiRowCut rc;
00296           rc.setRow(nc,inx,el);
00297           rc.setLb(-100.);
00298           rc.setUb(100.);
00299           rc.setEffectiveness(22);
00300           
00301           cuts.insert(rc);
00302           delete[]el;
00303           delete[]inx;
00304         }
00305         
00306         // Generate valid col cut from thin air
00307         {
00308           const double * soplexColLB = im.getColLower();
00309           const double * soplexColUB = im.getColUpper();
00310           int *inx = new int[nc];
00311           for (c=0;c<nc;c++) inx[c]=c;
00312           double *lb = new double[nc];
00313           double *ub = new double[nc];
00314           for (c=0;c<nc;c++) lb[c]=soplexColLB[c]+0.001;
00315           for (c=0;c<nc;c++) ub[c]=soplexColUB[c]-0.001;
00316           
00317           OsiColCut cc;
00318           cc.setLbs(nc,inx,lb);
00319           cc.setUbs(nc,inx,ub);
00320           
00321           cuts.insert(cc);
00322           delete [] ub;
00323           delete [] lb;
00324           delete [] inx;
00325         }
00326         
00327         {
00328           // Generate a row and column cut which have are ineffective
00329           OsiRowCut * rcP= new OsiRowCut;
00330           rcP->setEffectiveness(-1.);
00331           cuts.insert(rcP);
00332           assert(rcP==NULL);
00333           
00334           OsiColCut * ccP= new OsiColCut;
00335           ccP->setEffectiveness(-12.);
00336           cuts.insert(ccP);
00337           assert(ccP==NULL);
00338         }
00339         {
00340           //Generate inconsistent Row cut
00341           OsiRowCut rc;
00342           const int ne=1;
00343           int inx[ne]={-10};
00344           double el[ne]={2.5};
00345           rc.setRow(ne,inx,el);
00346           rc.setLb(3.);
00347           rc.setUb(4.);
00348           assert(!rc.consistent());
00349           cuts.insert(rc);
00350         }
00351         {
00352           //Generate inconsistent col cut
00353           OsiColCut cc;
00354           const int ne=1;
00355           int inx[ne]={-10};
00356           double el[ne]={2.5};
00357           cc.setUbs(ne,inx,el);
00358           assert(!cc.consistent());
00359           cuts.insert(cc);
00360         }
00361         {
00362           // Generate row cut which is inconsistent for model m
00363           OsiRowCut rc;
00364           const int ne=1;
00365           int inx[ne]={10};
00366           double el[ne]={2.5};
00367           rc.setRow(ne,inx,el);
00368           assert(rc.consistent());
00369           assert(!rc.consistent(im));
00370           cuts.insert(rc);
00371         }
00372         {
00373           // Generate col cut which is inconsistent for model m
00374           OsiColCut cc;
00375           const int ne=1;
00376           int inx[ne]={30};
00377           double el[ne]={2.0};
00378           cc.setLbs(ne,inx,el);
00379           assert(cc.consistent());
00380           assert(!cc.consistent(im));
00381           cuts.insert(cc);
00382         }
00383         {
00384           // Generate col cut which is infeasible
00385           OsiColCut cc;
00386           const int ne=1;
00387           int inx[ne]={0};
00388           double el[ne]={2.0};
00389           cc.setUbs(ne,inx,el);
00390           cc.setEffectiveness(1000.);
00391           assert(cc.consistent());
00392           assert(cc.consistent(im));
00393           assert(cc.infeasible(im));
00394           cuts.insert(cc);
00395         }
00396       }
00397       assert(cuts.sizeRowCuts()==4);
00398       assert(cuts.sizeColCuts()==5);
00399       
00400       OsiSolverInterface::ApplyCutsReturnCode rc = im.applyCuts(cuts);
00401       assert( rc.getNumIneffective() == 2 );
00402       assert( rc.getNumApplied() == 2 );
00403       assert( rc.getNumInfeasible() == 1 );
00404       assert( rc.getNumInconsistentWrtIntegerModel() == 2 );
00405       assert( rc.getNumInconsistent() == 2 );
00406       assert( cuts.sizeCuts() == rc.getNumIneffective() +
00407         rc.getNumApplied() +
00408         rc.getNumInfeasible() +
00409         rc.getNumInconsistentWrtIntegerModel() +
00410         rc.getNumInconsistent() );
00411     }
00412     {    
00413       OsiSpxSolverInterface soplexSi(m);
00414       int nc = soplexSi.getNumCols();
00415       int nr = soplexSi.getNumRows();
00416       const double * cl = soplexSi.getColLower();
00417       const double * cu = soplexSi.getColUpper();
00418       const double * rl = soplexSi.getRowLower();
00419       const double * ru = soplexSi.getRowUpper();
00420 
00421       assert( nc == 8 );
00422       assert( nr == 5 );
00423       assert( eq(cl[0],2.5) );
00424       assert( eq(cl[1],0.0) );
00425       assert( eq(cu[1],4.1) );
00426       assert( eq(cu[2],1.0) );
00427 
00428       assert( eq(rl[0],2.5) );
00429       assert( eq(rl[4],3.0) );
00430       assert( eq(ru[1],2.1) );
00431       assert( eq(ru[4],15.0) );
00432       
00433       double newCs[8] = {1., 2., 3., 4., 5., 6., 7., 8.};
00434       soplexSi.setColSolution(newCs);
00435       const double * cs = soplexSi.getColSolution();
00436       assert( eq(cs[0],1.0) );
00437       assert( eq(cs[7],8.0) );
00438       {
00439         OsiSpxSolverInterface solnSi(soplexSi);
00440         const double * cs = solnSi.getColSolution();
00441         assert( eq(cs[0],1.0) );
00442         assert( eq(cs[7],8.0) );
00443       }
00444 
00445       assert( !eq(cl[3],1.2345) );
00446       soplexSi.setColLower( 3, 1.2345 );
00447       assert( eq(soplexSi.getColLower()[3],1.2345) );
00448       
00449       assert( !eq(cu[4],10.2345) );
00450       soplexSi.setColUpper( 4, 10.2345 );
00451       assert( eq(soplexSi.getColUpper()[4],10.2345) );
00452 
00453       assert( eq(soplexSi.getObjValue(),0.0) );
00454 
00455       assert( eq( soplexSi.getObjCoefficients()[0],  1.0) );
00456       assert( eq( soplexSi.getObjCoefficients()[1],  0.0) );
00457       assert( eq( soplexSi.getObjCoefficients()[2],  0.0) );
00458       assert( eq( soplexSi.getObjCoefficients()[3],  0.0) );
00459       assert( eq( soplexSi.getObjCoefficients()[4],  2.0) );
00460       assert( eq( soplexSi.getObjCoefficients()[5],  0.0) );
00461       assert( eq( soplexSi.getObjCoefficients()[6],  0.0) );
00462       assert( eq( soplexSi.getObjCoefficients()[7], -1.0) );
00463     }
00464     
00465     // Test getMatrixByRow method
00466     { 
00467       const OsiSpxSolverInterface si(m);
00468       const CoinPackedMatrix * smP = si.getMatrixByRow();
00469       //const CoinPackedMatrix * osmP = dynamic_cast(const OsiSpxPackedMatrix*)(smP);
00470       //assert( osmP!=NULL );
00471       
00472       CoinRelFltEq eq;
00473       const double * ev = smP->getElements();
00474       assert( eq(ev[0],   3.0) );
00475       assert( eq(ev[1],   1.0) );
00476       assert( eq(ev[2],  -2.0) );
00477       assert( eq(ev[3],  -1.0) );
00478       assert( eq(ev[4],  -1.0) );
00479       assert( eq(ev[5],   2.0) );
00480       assert( eq(ev[6],   1.1) );
00481       assert( eq(ev[7],   1.0) );
00482       assert( eq(ev[8],   1.0) );
00483       assert( eq(ev[9],   2.8) );
00484       assert( eq(ev[10], -1.2) );
00485       assert( eq(ev[11],  5.6) );
00486       assert( eq(ev[12],  1.0) );
00487       assert( eq(ev[13],  1.9) );
00488       
00489       const int * mi = smP->getVectorStarts();
00490       assert( mi[0]==0 );
00491       assert( mi[1]==5 );
00492       assert( mi[2]==7 );
00493       assert( mi[3]==9 );
00494       assert( mi[4]==11 );
00495       assert( mi[5]==14 );
00496       
00497       const int * ei = smP->getIndices();
00498       assert( ei[0]  ==  0 );
00499       assert( ei[1]  ==  1 );
00500       assert( ei[2]  ==  3 );
00501       assert( ei[3]  ==  4 );
00502       assert( ei[4]  ==  7 );
00503       assert( ei[5]  ==  1 );
00504       assert( ei[6]  ==  2 );
00505       assert( ei[7]  ==  2 );
00506       assert( ei[8]  ==  5 );
00507       assert( ei[9]  ==  3 );
00508       assert( ei[10] ==  6 );
00509       assert( ei[11] ==  0 );
00510       assert( ei[12] ==  4 );
00511       assert( ei[13] ==  7 );    
00512       
00513       assert( smP->getMajorDim() == 5 ); 
00514       assert( smP->getNumElements() == 14 );
00515       
00516     }
00517     //--------------
00518     // Test rowsense, rhs, rowrange, getMatrixByRow
00519     {
00520       OsiSpxSolverInterface lhs;
00521       {     
00522         OsiSpxSolverInterface siC1(m);     
00523         assert( siC1.rowrange_==NULL );
00524         assert( siC1.rowsense_==NULL );
00525         assert( siC1.rhs_==NULL );
00526         assert( siC1.colsol_!=NULL );
00527         assert( siC1.rowsol_!=NULL );
00528         assert( siC1.matrixByRow_==NULL );
00529 
00530         const char   * siC1rs  = siC1.getRowSense();
00531         assert( siC1rs[0]=='G' );
00532         assert( siC1rs[1]=='L' );
00533         assert( siC1rs[2]=='E' );
00534         assert( siC1rs[3]=='R' );
00535         assert( siC1rs[4]=='R' );
00536         
00537         const double * siC1rhs = siC1.getRightHandSide();
00538         assert( eq(siC1rhs[0],2.5) );
00539         assert( eq(siC1rhs[1],2.1) );
00540         assert( eq(siC1rhs[2],4.0) );
00541         assert( eq(siC1rhs[3],5.0) );
00542         assert( eq(siC1rhs[4],15.) ); 
00543         
00544         const double * siC1rr  = siC1.getRowRange();
00545         assert( eq(siC1rr[0],0.0) );
00546         assert( eq(siC1rr[1],0.0) );
00547         assert( eq(siC1rr[2],0.0) );
00548         assert( eq(siC1rr[3],5.0-1.8) );
00549         assert( eq(siC1rr[4],15.0-3.0) );
00550         
00551         const CoinPackedMatrix * siC1mbr = siC1.getMatrixByRow();
00552         assert( siC1mbr != NULL );
00553         
00554         const double * ev = siC1mbr->getElements();
00555         assert( eq(ev[0],   3.0) );
00556         assert( eq(ev[1],   1.0) );
00557         assert( eq(ev[2],  -2.0) );
00558         assert( eq(ev[3],  -1.0) );
00559         assert( eq(ev[4],  -1.0) );
00560         assert( eq(ev[5],   2.0) );
00561         assert( eq(ev[6],   1.1) );
00562         assert( eq(ev[7],   1.0) );
00563         assert( eq(ev[8],   1.0) );
00564         assert( eq(ev[9],   2.8) );
00565         assert( eq(ev[10], -1.2) );
00566         assert( eq(ev[11],  5.6) );
00567         assert( eq(ev[12],  1.0) );
00568         assert( eq(ev[13],  1.9) );
00569         
00570         const int * mi = siC1mbr->getVectorStarts();
00571         assert( mi[0]==0 );
00572         assert( mi[1]==5 );
00573         assert( mi[2]==7 );
00574         assert( mi[3]==9 );
00575         assert( mi[4]==11 );
00576         assert( mi[5]==14 );
00577         
00578         const int * ei = siC1mbr->getIndices();
00579         assert( ei[0]  ==  0 );
00580         assert( ei[1]  ==  1 );
00581         assert( ei[2]  ==  3 );
00582         assert( ei[3]  ==  4 );
00583         assert( ei[4]  ==  7 );
00584         assert( ei[5]  ==  1 );
00585         assert( ei[6]  ==  2 );
00586         assert( ei[7]  ==  2 );
00587         assert( ei[8]  ==  5 );
00588         assert( ei[9]  ==  3 );
00589         assert( ei[10] ==  6 );
00590         assert( ei[11] ==  0 );
00591         assert( ei[12] ==  4 );
00592         assert( ei[13] ==  7 );    
00593         
00594         assert( siC1mbr->getMajorDim() == 5 ); 
00595         assert( siC1mbr->getNumElements() == 14 );
00596         
00597 
00598         assert( siC1rs  == siC1.getRowSense() );
00599         assert( siC1rhs == siC1.getRightHandSide() );
00600         assert( siC1rr  == siC1.getRowRange() );
00601 
00602         // Change SOPLEX Model by adding free row
00603         OsiRowCut rc;
00604         rc.setLb(-DBL_MAX);
00605         rc.setUb( DBL_MAX);
00606         OsiCuts cuts;
00607         cuts.insert(rc);
00608         siC1.applyCuts(cuts);
00609              
00610         // Since model was changed, test that cached
00611         // data is now freed.
00612         assert( siC1.rowrange_==NULL );
00613         assert( siC1.rowsense_==NULL );
00614         assert( siC1.rhs_==NULL );
00615         assert( siC1.colsol_==NULL );
00616         assert( siC1.rowsol_==NULL );
00617         assert( siC1.matrixByRow_==NULL );
00618         assert( siC1.matrixByCol_==NULL );
00619         
00620         siC1rs  = siC1.getRowSense();
00621         siC1rhs = siC1.getRightHandSide();
00622         siC1rr  = siC1.getRowRange();
00623 
00624         assert( siC1rs[0]=='G' );
00625         assert( siC1rs[1]=='L' );
00626         assert( siC1rs[2]=='E' );
00627         assert( siC1rs[3]=='R' );
00628         assert( siC1rs[4]=='R' );
00629         assert( siC1rs[5]=='N' );
00630 
00631         assert( eq(siC1rhs[0],2.5) );
00632         assert( eq(siC1rhs[1],2.1) );
00633         assert( eq(siC1rhs[2],4.0) );
00634         assert( eq(siC1rhs[3],5.0) );
00635         assert( eq(siC1rhs[4],15.) ); 
00636         assert( eq(siC1rhs[5],0.0) ); 
00637 
00638         assert( eq(siC1rr[0],0.0) );
00639         assert( eq(siC1rr[1],0.0) );
00640         assert( eq(siC1rr[2],0.0) );
00641         assert( eq(siC1rr[3],5.0-1.8) );
00642         assert( eq(siC1rr[4],15.0-3.0) );
00643         assert( eq(siC1rr[5],0.0) );
00644     
00645         lhs=siC1;
00646       }
00647       // Test that lhs has correct values even though siC1 has gone out of scope    
00648       assert( lhs.rowrange_==NULL );
00649       assert( lhs.rowsense_==NULL );
00650       assert( lhs.rhs_==NULL ); 
00651       assert( lhs.colsol_!=NULL );
00652       assert( lhs.rowsol_!=NULL );
00653       assert( lhs.matrixByRow_==NULL ); 
00654       assert( lhs.matrixByCol_==NULL ); 
00655       
00656       const char * lhsrs  = lhs.getRowSense();
00657       assert( lhsrs[0]=='G' );
00658       assert( lhsrs[1]=='L' );
00659       assert( lhsrs[2]=='E' );
00660       assert( lhsrs[3]=='R' );
00661       assert( lhsrs[4]=='R' );
00662       assert( lhsrs[5]=='N' );
00663       
00664       const double * lhsrhs = lhs.getRightHandSide();
00665       assert( eq(lhsrhs[0],2.5) );
00666       assert( eq(lhsrhs[1],2.1) );
00667       assert( eq(lhsrhs[2],4.0) );
00668       assert( eq(lhsrhs[3],5.0) );
00669       assert( eq(lhsrhs[4],15.) ); 
00670       assert( eq(lhsrhs[5],0.0) ); 
00671       
00672       const double *lhsrr  = lhs.getRowRange();
00673       assert( eq(lhsrr[0],0.0) );
00674       assert( eq(lhsrr[1],0.0) );
00675       assert( eq(lhsrr[2],0.0) );
00676       assert( eq(lhsrr[3],5.0-1.8) );
00677       assert( eq(lhsrr[4],15.0-3.0) );
00678       assert( eq(lhsrr[5],0.0) );      
00679       
00680       const CoinPackedMatrix * lhsmbr = lhs.getMatrixByRow();
00681       assert( lhsmbr != NULL );       
00682       const double * ev = lhsmbr->getElements();
00683       assert( eq(ev[0],   3.0) );
00684       assert( eq(ev[1],   1.0) );
00685       assert( eq(ev[2],  -2.0) );
00686       assert( eq(ev[3],  -1.0) );
00687       assert( eq(ev[4],  -1.0) );
00688       assert( eq(ev[5],   2.0) );
00689       assert( eq(ev[6],   1.1) );
00690       assert( eq(ev[7],   1.0) );
00691       assert( eq(ev[8],   1.0) );
00692       assert( eq(ev[9],   2.8) );
00693       assert( eq(ev[10], -1.2) );
00694       assert( eq(ev[11],  5.6) );
00695       assert( eq(ev[12],  1.0) );
00696       assert( eq(ev[13],  1.9) );
00697       
00698       const int * mi = lhsmbr->getVectorStarts();
00699       assert( mi[0]==0 );
00700       assert( mi[1]==5 );
00701       assert( mi[2]==7 );
00702       assert( mi[3]==9 );
00703       assert( mi[4]==11 );
00704       assert( mi[5]==14 );
00705       
00706       const int * ei = lhsmbr->getIndices();
00707       assert( ei[0]  ==  0 );
00708       assert( ei[1]  ==  1 );
00709       assert( ei[2]  ==  3 );
00710       assert( ei[3]  ==  4 );
00711       assert( ei[4]  ==  7 );
00712       assert( ei[5]  ==  1 );
00713       assert( ei[6]  ==  2 );
00714       assert( ei[7]  ==  2 );
00715       assert( ei[8]  ==  5 );
00716       assert( ei[9]  ==  3 );
00717       assert( ei[10] ==  6 );
00718       assert( ei[11] ==  0 );
00719       assert( ei[12] ==  4 );
00720       assert( ei[13] ==  7 );    
00721       
00722       int md = lhsmbr->getMajorDim();
00723       assert(  md == 6 ); 
00724       assert( lhsmbr->getNumElements() == 14 );
00725     }
00726     
00727     //--------------    
00728   }
00729 
00730     
00731   // Do common solverInterface testing by calling the
00732   // base class testing method.
00733   {
00734     OsiSpxSolverInterface m;
00735     OsiSolverInterfaceCommonUnitTest(&m, mpsDir,netlibDir);
00736   }
00737 }

Generated on Wed Dec 3 14:35:34 2003 for Osi by doxygen 1.3.5