Changeset 978 for stable


Ignore:
Timestamp:
Jun 12, 2008 4:42:46 AM (11 years ago)
Author:
forrest
Message:

modify test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • stable/2.1/Cbc/examples/gamsTest.cpp

    r968 r978  
    1 //Gams tests - provided by Stefan Vigerske
    21#if defined(_MSC_VER)
    32// Turn off compiler warning about long names
     
    1716 * http://www.gams.com/testlib/libhtml/sos1a.htm */
    1817void sos1a(int& error_count, int& warning_count);
     18/** model sos2a from the GAMS test library
     19 * http://www.gams.com/testlib/libhtml/sos2a.htm */
     20void sos2a(int& error_count, int& warning_count);
    1921/** model semicon1 from the GAMS test library
    2022 * http://www.gams.com/testlib/libhtml/semicon1.htm */
     
    3032   
    3133   sos1a(error_count, warning_count);
     34   cout << "\n***********************\n" << endl;
     35   sos2a(error_count, warning_count);
    3236   cout << "\n***********************\n" << endl;
    3337   semicon1(error_count, warning_count);
     
    128132   delete[] rowub;
    129133}
     134void sos2a(int& error_count, int& warning_count) {
     135   OsiClpSolverInterface solver1;
     136   
     137   int numcols = 7; // w1, w2, w3, x, fx, fplus, fminus
     138   int numrows = 5; // wsum, xdef, fxdef, gapplus, gapminus
     139   int nnz = 15;
     140   CoinBigIndex *start = new int[numcols+1];
     141   int* index = new int[nnz];
     142   double* value = new double[nnz];
     143   double *collb = new double[numcols];
     144   double *colub = new double[numcols];
     145   double *obj = new double[numcols];
     146   double *rowlb = new double[numrows];
     147   double *rowub = new double[numrows];
     148   // objective
     149   obj[0] = 0.;  obj[1] = 0.;  obj[2] = 0.;  obj[3] = 0.;
     150   obj[4] = 0.;  obj[5] = 1.;  obj[6] = 1.;
     151   
     152   // column bounds
     153   collb[0] = 0.;  colub[0] = solver1.getInfinity();
     154   collb[1] = 0.;  colub[1] = solver1.getInfinity();
     155   collb[2] = 0.;  colub[2] = solver1.getInfinity();
     156   collb[3] = -solver1.getInfinity();  colub[3] = solver1.getInfinity();
     157   collb[4] = -solver1.getInfinity();  colub[4] = solver1.getInfinity();
     158   collb[5] = 0.;  colub[5] = solver1.getInfinity();
     159   collb[6] = 0.;  colub[6] = solver1.getInfinity();
     160   // matrix
     161   start[0] = 0;  index[0] = 0;  value[0] = 1.;
     162                  index[1] = 1;  value[1] = 1.;
     163                  index[2] = 2;  value[2] = 1.;
     164   start[1] = 3;  index[3] = 0;  value[3] = 1.;
     165                  index[4] = 1;  value[4] = 2.;
     166                  index[5] = 2;  value[5] = 2.;
     167   start[2] = 6;  index[6] = 0;  value[6] = 1.;
     168                  index[7] = 1;  value[7] = 3.;
     169                  index[8] = 2;  value[8] = 3.;
     170   start[3] = 9;  index[9] = 1;  value[9] =-1.;
     171   start[4] =10;  index[10]= 2;  value[10]=-1.;
     172                  index[11]= 3;  value[11]=-1.;
     173                  index[12]= 4;  value[12]= 1.;
     174   start[5] =13;  index[13]= 3;  value[13]= 1.;
     175   start[6] =14;  index[14]= 4;  value[14]= 1.;
     176   start[7] =15;
     177   
     178   // row bounds
     179   rowlb[0] =  1. ; rowub[0] = 1.;
     180   rowlb[1] =  0. ; rowub[1] = 0.;
     181   rowlb[2] =  0. ; rowub[2] = 0.;
     182   rowlb[3] = -1.3; rowub[3] = solver1.getInfinity();
     183   rowlb[4] =  1.3; rowub[4] = solver1.getInfinity();
     184   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
     185    double* primalval = new double[numcols];
     186    double* redcost   = new double[numcols];
     187    double optvalue;
     188   for (int testcase = 0; testcase < 2; ++testcase) {
     189      switch(testcase) {
     190         case 0:
     191            solver1.setColLower(0, 0.);
     192            optvalue = 0.;
     193           primalval[0] = .7;  redcost[0] = 0.;
     194           primalval[1] = .3;  redcost[1] = 0.;
     195           primalval[2] =0. ;  redcost[2] = 0.;
     196           primalval[3] =1.3;  redcost[3] = 0.;
     197           primalval[4] =1.3;  redcost[4] = 0.;
     198           primalval[5] =0. ;  redcost[5] = 1.;
     199           primalval[6] =0. ;  redcost[6] = 1.;
     200            break;
     201         case 1:
     202            solver1.setColLower(0, .8);
     203            optvalue = 0.1;
     204           primalval[0] = .8;  redcost[0] = 1.;
     205           primalval[1] = .2;  redcost[1] = 0.;
     206           primalval[2] =0. ;  redcost[2] =-1.;
     207           primalval[3] =1.2;  redcost[3] = 0.;
     208           primalval[4] =1.2;  redcost[4] = 0.;
     209           primalval[5] =0. ;  redcost[5] = 1.;
     210           primalval[6] =0.1;  redcost[6] = 0.;
     211            break;
     212      }
     213      CbcModel model(solver1);
     214      CbcMain0(model);
     215      int which[3] = { 0, 1, 2 };
     216      CbcObject* sosobject = new CbcSOS(&model, 3, which, NULL, 0, 2);
     217      model.addObjects(1, &sosobject);
     218      delete sosobject;
     219      const char * argv2[]={"gamstest_sos2a","-solve","-quit"};
     220     cout << "\nSolving sos2a model with w1 having lower bound " << solver1.getColLower()[0] << endl;
     221      CbcMain1(3,argv2,model);
     222      cout << endl;
     223      if (!model.isProvenOptimal()) {
     224         cerr << "Error: Model sos2a not solved to optimality." << endl;
     225         ++error_count;
     226         continue; // other tests make no sense
     227      }
     228      OsiSolverInterface* solver = model.solver();
     229      assert(solver);
     230      cout << "Objective value model: " << model.getObjValue()
     231      << "\t solver: " << solver->getObjValue()
     232      << "\t expected: " << optvalue << endl;
     233      if (CoinAbs(model.getObjValue()-optvalue)>testtol || CoinAbs(solver->getObjValue()-optvalue)>testtol) {
     234         cerr << "Error: Objective value incorrect." << endl;
     235         ++error_count;
     236      }
     237      for (int i=0; i<numcols; ++i) {
     238         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
     239            << "\t in solver: " << solver->getColSolution()[i]
     240            << "\t expected: " << primalval[i]
     241            << endl;
     242         if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
     243            cerr << "Error: Primal value incorrect." << endl;
     244            ++error_count;
     245         }
     246      }
     247      for (int i=0; i<numcols; ++i) {
     248         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
     249            << "\t in solver: " << solver->getReducedCost()[i]
     250            << "\t expected: " << redcost[i]
     251            << endl;
     252         if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
     253            cerr << "Warning: Reduced cost incorrect." << endl;
     254            ++warning_count;
     255         }
     256      }
     257   }
     258  delete[] start;
     259   delete[] index;
     260   delete[] value;
     261   delete[] collb;
     262   delete[] colub;
     263   delete[] obj;
     264   delete[] rowlb;
     265   delete[] rowub;
     266   delete[] primalval;
     267   delete[] redcost;
     268}
    130269void semicon1(int& error_count, int& warning_count) {
    131270   OsiClpSolverInterface solver1;
     
    333472      CbcMain0(model);
    334473     
    335       double points[4] = { 0., 0., 0., 10. };
     474      double points[10];
     475       points[0]=0.;
     476      int nrpoints = 0;
    336477      double objval;
    337478      double primalval[4];
     
    342483      switch(testcase) {
    343484         case 0:
    344             points[2] = 0.;
    345             objval = 0.;
     485            nrpoints = 0; // pure integer case
     486            objval = 0.1;
    346487            primalval[0] = 2.0;
    347             primalval[1] = 0.0;
     488            primalval[1] = 0.1;
    348489            primalval[2] = 0.0;
    349             primalval[3] = 8.0;
    350             redcost[0] = 0.0;
    351             redcost[1] = 1.0;
    352             row2marg = 0.0;
     490            primalval[3] = 8;
     491            redcost[0] = -1.0;
     492            redcost[1] =  0.0;
     493            row2marg = 1.0;
    353494            break;
    354495         case 1:
    355             points[2] = 1.;
     496            nrpoints = 0; // pure integer case too
    356497            objval = 0.1;
    357498            primalval[0] = 2.0;
     
    364505            break;
    365506         case 2:
    366             points[2] = 2.;
     507             for (nrpoints=1; nrpoints<10; ++nrpoints)
     508                points[nrpoints]=nrpoints+1;
    367509            objval = 0.1;
    368510            primalval[0] = 2.0;
     
    375517            break;
    376518         case 3:
    377             points[2] = 3.;
     519               for (nrpoints=1; nrpoints<9; ++nrpoints)
     520                  points[nrpoints]=nrpoints+2;
    378521            objval = 0.9;
    379522            primalval[0] = 3.0;
     
    386529            break;
    387530         case 4:
    388             points[2] = 4.;
     531              for (nrpoints=1; nrpoints<8; ++nrpoints)
     532                 points[nrpoints]=nrpoints+3;
    389533            objval = 1.9;
    390534            primalval[0] = 4.0;
     
    397541            break;
    398542         case 5:
    399             points[2] = 5.;
     543            for (nrpoints=1; nrpoints<7; ++nrpoints)
     544                   points[nrpoints]=nrpoints+4;
    400545            objval = 2.1;
    401546            primalval[0] = 0.0;
     
    408553            break;
    409554      }
    410       if (testcase!=3) {
    411         CbcObject* semiintobject = new CbcLotsize(&model, 0, 2, points, true);
    412         model.addObjects(1, &semiintobject);
    413         delete semiintobject;
    414       } else {
    415         // Do alternate way
    416         double points2[]={0.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};
    417         int numberPoints = (int) sizeof(points2)/sizeof(double);
    418         CbcObject* semiintobject = new CbcLotsize(&model, 0, numberPoints,
    419                                                   points2);
    420         model.addObjects(1, &semiintobject);
    421         delete semiintobject;
     555      if (nrpoints) {
     556         CbcObject* semiintobject = new CbcLotsize(&model, 0, nrpoints, points);
     557         model.addObjects(1, &semiintobject);
     558         delete semiintobject;
    422559      }
    423560     
Note: See TracChangeset for help on using the changeset viewer.