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

CoinMpsIOTest.cpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #if defined(_MSC_VER)
00004 // Turn off compiler warning about long names
00005 #  pragma warning(disable:4786)
00006 #endif
00007 
00008 #include <cassert>
00009 
00010 #include "CoinMpsIO.hpp"
00011 
00012 //#############################################################################
00013 
00014 #ifdef NDEBUG
00015 #undef NDEBUG
00016 #endif
00017 
00018 //--------------------------------------------------------------------------
00019 // test import methods
00020 void
00021 CoinMpsIOUnitTest(const std::string & mpsDir)
00022 {
00023   
00024   // Test default constructor
00025   {
00026     CoinMpsIO m;
00027     assert( m.rowsense_==NULL );
00028     assert( m.rhs_==NULL );
00029     assert( m.rowrange_==NULL );
00030     assert( m.matrixByRow_==NULL );
00031     assert( m.matrixByColumn_==NULL );
00032     assert( m.integerType_==NULL);
00033     assert( !strcmp( m.getFileName() , "stdin"));
00034     assert( !strcmp( m.getProblemName() , ""));
00035     assert( !strcmp( m.objectiveName_ , ""));
00036     assert( !strcmp( m.rhsName_ , ""));
00037     assert( !strcmp( m.rangeName_ , ""));
00038     assert( !strcmp( m.boundName_ , ""));
00039   }
00040   
00041   
00042   {    
00043     CoinRelFltEq eq;
00044     CoinMpsIO m;
00045     std::string fn = mpsDir+"exmip1";
00046     int numErr = m.readMps(fn.c_str(),"mps");
00047     assert( numErr== 0 );
00048 
00049     assert( !strcmp( m.problemName_ , "EXAMPLE"));
00050     assert( !strcmp( m.objectiveName_ , "OBJ"));
00051     assert( !strcmp( m.rhsName_ , "RHS1"));
00052     assert( !strcmp( m.rangeName_ , "RNG1"));
00053     assert( !strcmp( m.boundName_ , "BND1"));
00054     
00055      // Test language and re-use
00056     m.newLanguage(CoinMessages::it);
00057     m.messageHandler()->setPrefix(false);
00058 
00059     // This call should return an error indicating that the 
00060     // end-of-file was reached.
00061     // This is because the file remains open to possibly read
00062     // a quad. section.
00063     numErr = m.readMps(fn.c_str(),"mps");
00064     assert( numErr < 0 );
00065 
00066     // Test copy constructor and assignment operator
00067     {
00068       CoinMpsIO lhs;
00069       {      
00070         CoinMpsIO im(m);        
00071         
00072         CoinMpsIO imC1(im);
00073         assert( imC1.getNumCols() == im.getNumCols() );
00074         assert( imC1.getNumRows() == im.getNumRows() );   
00075         
00076         CoinMpsIO imC2(im);
00077         assert( imC2.getNumCols() == im.getNumCols() );
00078         assert( imC2.getNumRows() == im.getNumRows() );  
00079         
00080         lhs=imC2;
00081       }
00082       // Test that lhs has correct values even though rhs has gone out of scope
00083       
00084       assert( lhs.getNumCols() == m.getNumCols() );
00085       assert( lhs.getNumRows() == m.getNumRows() );      
00086     }
00087     
00088     
00089     {    
00090       CoinMpsIO dumSi(m);
00091       int nc = dumSi.getNumCols();
00092       int nr = dumSi.getNumRows();
00093       const double * cl = dumSi.getColLower();
00094       const double * cu = dumSi.getColUpper();
00095       const double * rl = dumSi.getRowLower();
00096       const double * ru = dumSi.getRowUpper();
00097       assert( nc == 8 );
00098       assert( nr == 5 );
00099       assert( eq(cl[0],2.5) );
00100       assert( eq(cl[1],0.0) );
00101       assert( eq(cu[1],4.1) );
00102       assert( eq(cu[2],1.0) );
00103       assert( eq(rl[0],2.5) );
00104       assert( eq(rl[4],3.0) );
00105       assert( eq(ru[1],2.1) );
00106       assert( eq(ru[4],15.0) );
00107       
00108       assert( !eq(cl[3],1.2345) );
00109       
00110       assert( !eq(cu[4],10.2345) );
00111       
00112       assert( eq( dumSi.getObjCoefficients()[0],  1.0) );
00113       assert( eq( dumSi.getObjCoefficients()[1],  0.0) );
00114       assert( eq( dumSi.getObjCoefficients()[2],  0.0) );
00115       assert( eq( dumSi.getObjCoefficients()[3],  0.0) );
00116       assert( eq( dumSi.getObjCoefficients()[4],  2.0) );
00117       assert( eq( dumSi.getObjCoefficients()[5],  0.0) );
00118       assert( eq( dumSi.getObjCoefficients()[6],  0.0) );
00119       assert( eq( dumSi.getObjCoefficients()[7], -1.0) );
00120 
00121       dumSi.writeMps("CoinMpsIoTest.mps");//,0,0,1);
00122     }
00123 
00124     // Read just written file
00125     {    
00126       CoinMpsIO dumSi;
00127       dumSi.readMps("CoinMpsIoTest");
00128       int nc = dumSi.getNumCols();
00129       int nr = dumSi.getNumRows();
00130       const double * cl = dumSi.getColLower();
00131       const double * cu = dumSi.getColUpper();
00132       const double * rl = dumSi.getRowLower();
00133       const double * ru = dumSi.getRowUpper();
00134       assert( nc == 8 );
00135       assert( nr == 5 );
00136       assert( eq(cl[0],2.5) );
00137       assert( eq(cl[1],0.0) );
00138       assert( eq(cu[1],4.1) );
00139       assert( eq(cu[2],1.0) );
00140       assert( eq(rl[0],2.5) );
00141       assert( eq(rl[4],3.0) );
00142       assert( eq(ru[1],2.1) );
00143       assert( eq(ru[4],15.0) );
00144       
00145       assert( !eq(cl[3],1.2345) );
00146       
00147       assert( !eq(cu[4],10.2345) );
00148       
00149       assert( eq( dumSi.getObjCoefficients()[0],  1.0) );
00150       assert( eq( dumSi.getObjCoefficients()[1],  0.0) );
00151       assert( eq( dumSi.getObjCoefficients()[2],  0.0) );
00152       assert( eq( dumSi.getObjCoefficients()[3],  0.0) );
00153       assert( eq( dumSi.getObjCoefficients()[4],  2.0) );
00154       assert( eq( dumSi.getObjCoefficients()[5],  0.0) );
00155       assert( eq( dumSi.getObjCoefficients()[6],  0.0) );
00156       assert( eq( dumSi.getObjCoefficients()[7], -1.0) );
00157     }
00158     
00159     // Test matrixByRow method
00160     { 
00161       const CoinMpsIO si(m);
00162       const CoinPackedMatrix * smP = si.getMatrixByRow();
00163       // LL:      const CoinDumPackedMatrix * osmP = dynamic_cast<const CoinDumPackedMatrix*>(smP);
00164       // LL: assert( osmP!=NULL );
00165       
00166       CoinRelFltEq eq;
00167       const double * ev = smP->getElements();
00168       assert( eq(ev[0],   3.0) );
00169       assert( eq(ev[1],   1.0) );
00170       assert( eq(ev[2],  -2.0) );
00171       assert( eq(ev[3],  -1.0) );
00172       assert( eq(ev[4],  -1.0) );
00173       assert( eq(ev[5],   2.0) );
00174       assert( eq(ev[6],   1.1) );
00175       assert( eq(ev[7],   1.0) );
00176       assert( eq(ev[8],   1.0) );
00177       assert( eq(ev[9],   2.8) );
00178       assert( eq(ev[10], -1.2) );
00179       assert( eq(ev[11],  5.6) );
00180       assert( eq(ev[12],  1.0) );
00181       assert( eq(ev[13],  1.9) );
00182       
00183       const CoinBigIndex * mi = smP->getVectorStarts();
00184       assert( mi[0]==0 );
00185       assert( mi[1]==5 );
00186       assert( mi[2]==7 );
00187       assert( mi[3]==9 );
00188       assert( mi[4]==11 );
00189       assert( mi[5]==14 );
00190       
00191       const int * ei = smP->getIndices();
00192       assert( ei[0]  ==  0 );
00193       assert( ei[1]  ==  1 );
00194       assert( ei[2]  ==  3 );
00195       assert( ei[3]  ==  4 );
00196       assert( ei[4]  ==  7 );
00197       assert( ei[5]  ==  1 );
00198       assert( ei[6]  ==  2 );
00199       assert( ei[7]  ==  2 );
00200       assert( ei[8]  ==  5 );
00201       assert( ei[9]  ==  3 );
00202       assert( ei[10] ==  6 );
00203       assert( ei[11] ==  0 );
00204       assert( ei[12] ==  4 );
00205       assert( ei[13] ==  7 );    
00206       
00207       assert( smP->getMajorDim() == 5 ); 
00208       assert( smP->getNumElements() == 14 );
00209       
00210     }
00211         // Test matrixByCol method
00212     {
00213       
00214       const CoinMpsIO si(m);
00215       const CoinPackedMatrix * smP = si.getMatrixByCol();
00216       // LL:      const CoinDumPackedMatrix * osmP = dynamic_cast<const CoinDumPackedMatrix*>(smP);
00217       // LL: assert( osmP!=NULL );
00218       
00219       CoinRelFltEq eq;
00220       const double * ev = smP->getElements();
00221       assert( eq(ev[0],   3.0) );
00222       assert( eq(ev[1],   5.6) );
00223       assert( eq(ev[2],   1.0) );
00224       assert( eq(ev[3],   2.0) );
00225       assert( eq(ev[4],   1.1) );
00226       assert( eq(ev[5],   1.0) );
00227       assert( eq(ev[6],  -2.0) );
00228       assert( eq(ev[7],   2.8) );
00229       assert( eq(ev[8],  -1.0) );
00230       assert( eq(ev[9],   1.0) );
00231       assert( eq(ev[10],  1.0) );
00232       assert( eq(ev[11], -1.2) );
00233       assert( eq(ev[12], -1.0) );
00234       assert( eq(ev[13],  1.9) );
00235       
00236       const CoinBigIndex * mi = smP->getVectorStarts();
00237       assert( mi[0]==0 );
00238       assert( mi[1]==2 );
00239       assert( mi[2]==4 );
00240       assert( mi[3]==6 );
00241       assert( mi[4]==8 );
00242       assert( mi[5]==10 );
00243       assert( mi[6]==11 );
00244       assert( mi[7]==12 );
00245       assert( mi[8]==14 );
00246       
00247       const int * ei = smP->getIndices();
00248       assert( ei[0]  ==  0 );
00249       assert( ei[1]  ==  4 );
00250       assert( ei[2]  ==  0 );
00251       assert( ei[3]  ==  1 );
00252       assert( ei[4]  ==  1 );
00253       assert( ei[5]  ==  2 );
00254       assert( ei[6]  ==  0 );
00255       assert( ei[7]  ==  3 );
00256       assert( ei[8]  ==  0 );
00257       assert( ei[9]  ==  4 );
00258       assert( ei[10] ==  2 );
00259       assert( ei[11] ==  3 );
00260       assert( ei[12] ==  0 );
00261       assert( ei[13] ==  4 );    
00262       
00263       assert( smP->getMajorDim() == 8 ); 
00264       assert( smP->getNumElements() == 14 );
00265 
00266       assert( smP->getSizeVectorStarts()==9 );
00267       assert( smP->getMinorDim() == 5 );
00268       
00269     }
00270     //--------------
00271     // Test rowsense, rhs, rowrange, matrixByRow
00272     {
00273       CoinMpsIO lhs;
00274       {      
00275         assert( m.rowrange_==NULL );
00276         assert( m.rowsense_==NULL );
00277         assert( m.rhs_==NULL );
00278         assert( m.matrixByRow_==NULL );
00279         
00280         CoinMpsIO siC1(m);     
00281         assert( siC1.rowrange_==NULL );
00282         assert( siC1.rowsense_==NULL );
00283         assert( siC1.rhs_==NULL );
00284         assert( siC1.matrixByRow_==NULL );
00285 
00286         const char   * siC1rs  = siC1.getRowSense();
00287         assert( siC1rs[0]=='G' );
00288         assert( siC1rs[1]=='L' );
00289         assert( siC1rs[2]=='E' );
00290         assert( siC1rs[3]=='R' );
00291         assert( siC1rs[4]=='R' );
00292         
00293         const double * siC1rhs = siC1.getRightHandSide();
00294         assert( eq(siC1rhs[0],2.5) );
00295         assert( eq(siC1rhs[1],2.1) );
00296         assert( eq(siC1rhs[2],4.0) );
00297         assert( eq(siC1rhs[3],5.0) );
00298         assert( eq(siC1rhs[4],15.) ); 
00299         
00300         const double * siC1rr  = siC1.getRowRange();
00301         assert( eq(siC1rr[0],0.0) );
00302         assert( eq(siC1rr[1],0.0) );
00303         assert( eq(siC1rr[2],0.0) );
00304         assert( eq(siC1rr[3],5.0-1.8) );
00305         assert( eq(siC1rr[4],15.0-3.0) );
00306         
00307         const CoinPackedMatrix * siC1mbr = siC1.getMatrixByRow();
00308         assert( siC1mbr != NULL );
00309         
00310         const double * ev = siC1mbr->getElements();
00311         assert( eq(ev[0],   3.0) );
00312         assert( eq(ev[1],   1.0) );
00313         assert( eq(ev[2],  -2.0) );
00314         assert( eq(ev[3],  -1.0) );
00315         assert( eq(ev[4],  -1.0) );
00316         assert( eq(ev[5],   2.0) );
00317         assert( eq(ev[6],   1.1) );
00318         assert( eq(ev[7],   1.0) );
00319         assert( eq(ev[8],   1.0) );
00320         assert( eq(ev[9],   2.8) );
00321         assert( eq(ev[10], -1.2) );
00322         assert( eq(ev[11],  5.6) );
00323         assert( eq(ev[12],  1.0) );
00324         assert( eq(ev[13],  1.9) );
00325         
00326         const CoinBigIndex * mi = siC1mbr->getVectorStarts();
00327         assert( mi[0]==0 );
00328         assert( mi[1]==5 );
00329         assert( mi[2]==7 );
00330         assert( mi[3]==9 );
00331         assert( mi[4]==11 );
00332         assert( mi[5]==14 );
00333         
00334         const int * ei = siC1mbr->getIndices();
00335         assert( ei[0]  ==  0 );
00336         assert( ei[1]  ==  1 );
00337         assert( ei[2]  ==  3 );
00338         assert( ei[3]  ==  4 );
00339         assert( ei[4]  ==  7 );
00340         assert( ei[5]  ==  1 );
00341         assert( ei[6]  ==  2 );
00342         assert( ei[7]  ==  2 );
00343         assert( ei[8]  ==  5 );
00344         assert( ei[9]  ==  3 );
00345         assert( ei[10] ==  6 );
00346         assert( ei[11] ==  0 );
00347         assert( ei[12] ==  4 );
00348         assert( ei[13] ==  7 );    
00349         
00350         assert( siC1mbr->getMajorDim() == 5 ); 
00351         assert( siC1mbr->getNumElements() == 14 );
00352         
00353 
00354         assert( siC1rs  == siC1.getRowSense() );
00355         assert( siC1rhs == siC1.getRightHandSide() );
00356         assert( siC1rr  == siC1.getRowRange() );
00357       }
00358     }
00359   }
00360   
00361 }
00362 
00363 
00364 
00365 
00366 

Generated on Wed Dec 3 14:34:20 2003 for Coin by doxygen 1.3.5