00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if defined(_MSC_VER)
00013
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
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
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
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
00145
00146 assert( lhs.getNumCols() == m.getNumCols() );
00147 assert( lhs.getNumRows() == m.getNumRows() );
00148 assert( *((int *)(lhs.getApplicationData())) == ad );
00149 }
00150
00151
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
00166 {
00167 OsiSpxSolverInterface si;
00168 assert( eq( si.getInfinity(), soplex::infinity ) );
00169 }
00170
00171
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
00195 {
00196 OsiSpxSolverInterface fim;
00197 std::string fn = mpsDir+"exmip1";
00198 fim.readMps(fn.c_str(),"mps");
00199
00200
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
00227 {
00228
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
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
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
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
00275 {
00276 OsiSpxSolverInterface im(m);
00277 OsiCuts cuts;
00278
00279
00280 {
00281
00282 int nr=im.getNumRows();
00283 int nc=im.getNumCols();
00284 assert( nr == 5 );
00285 assert( nc == 8 );
00286
00287
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
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
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
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
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
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
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
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
00466 {
00467 const OsiSpxSolverInterface si(m);
00468 const CoinPackedMatrix * smP = si.getMatrixByRow();
00469
00470
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
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
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
00611
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
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
00732
00733 {
00734 OsiSpxSolverInterface m;
00735 OsiSolverInterfaceCommonUnitTest(&m, mpsDir,netlibDir);
00736 }
00737 }