source: trunk/Cbc/test/gamsTest.cpp @ 1574

Last change on this file since 1574 was 1574, checked in by lou, 8 years ago

Change to EPL license notice.

File size: 24.2 KB
Line 
1// $Id$
2// Copyright (C) 2008, Stefan Vigerske, International Business Machines
3// Corporation and others.  All Rights Reserved.
4// This code is licensed under the terms of the Eclipse Public License (EPL).
5
6#if defined(_MSC_VER)
7// Turn off compiler warning about long names
8#  pragma warning(disable:4786)
9#endif
10#include <cassert>
11#include <iostream>
12using namespace std;
13#include "CoinHelperFunctions.hpp"
14#include "CoinError.hpp"
15#include "CbcModel.hpp"
16#include "CbcBranchActual.hpp" //for CbcSOS
17#include "CbcBranchLotsize.hpp" //for CbcLotsize
18#include "OsiClpSolverInterface.hpp"
19#define testtol 1e-6
20/** model sos1a from the GAMS test library
21 * http://www.gams.com/testlib/libhtml/sos1a.htm */
22void sos1a(int& error_count, int& warning_count);
23/** model sos2a from the GAMS test library
24 * http://www.gams.com/testlib/libhtml/sos2a.htm */
25void sos2a(int& error_count, int& warning_count);
26/** model semicon1 from the GAMS test library
27 * http://www.gams.com/testlib/libhtml/semicon1.htm */
28void semicon1(int& error_count, int& warning_count);
29/** model semiint1 from the GAMS test library
30 * http://www.gams.com/testlib/libhtml/semiint1.htm */
31void semiint1(int& error_count, int& warning_count);
32int main (int argc, const char *argv[])
33{
34   WindowsErrorPopupBlocker();
35   // only in CoinUtils/trunk: WindowsErrorPopupBlocker();
36   int error_count = 0;
37   int warning_count = 0;
38   
39   sos1a(error_count, warning_count);
40   cout << "\n***********************\n" << endl;
41   sos2a(error_count, warning_count);
42   cout << "\n***********************\n" << endl;
43   semicon1(error_count, warning_count);
44   cout << "\n***********************\n" << endl;
45   semiint1(error_count, warning_count);
46   
47   cout << endl << "Finished - there have been " << error_count << " errors and " << warning_count << " warnings." << endl;
48   return error_count;
49}
50void sos1a(int& error_count, int& warning_count) {
51   OsiClpSolverInterface solver1;
52   
53   int numcols = 3;
54   int numrows = 1;
55   int nnz = 3;
56   CoinBigIndex *start = new int[numcols+1];
57   int* index = new int[nnz];
58   double* value = new double[nnz];
59   double *collb = new double[numcols];
60   double *colub = new double[numcols];
61   double *obj = new double[numcols];
62   double *rowlb = new double[numrows];
63   double *rowub = new double[numrows];
64   // objective
65   obj[0] = .9;  obj[1] = 1.;  obj[2] = 1.1;
66   
67   // column bounds
68   collb[0] = 0.;  colub[0] = .8;
69   collb[1] = 0.;  colub[1] = .6;
70   collb[2] = 0.;  colub[2] = .6;
71   // matrix
72   start[0] = 0;  index[0] = 0;  value[0] = 1.;
73   start[1] = 1;  index[1] = 0;  value[1] = 1.;
74   start[2] = 2;  index[2] = 0;  value[2] = 1.;
75   start[3] = 3;
76   
77   // row bounds
78   rowlb[0] = -solver1.getInfinity(); rowub[0] = 1.;
79   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
80   solver1.setObjSense(-1);
81   
82  CbcModel model(solver1);
83  CbcMain0(model);
84 
85  int which[3] = { 0, 1, 2 };
86   CbcObject* sosobject = new CbcSOS(&model, 3, which, NULL, 0, 1); 
87  model.addObjects(1, &sosobject);
88  delete sosobject;
89 
90  const char * argv2[]={"gamstest_sos1a","-solve","-quit"};
91  CbcMain1(3,argv2,model);
92  cout << endl;
93  if (!model.isProvenOptimal()) {
94     cerr << "Error: Model sos1a not solved to optimality." << endl;
95     ++error_count;
96     return; // other tests make no sense ---- memory leak here
97  }
98 
99  OsiSolverInterface* solver = model.solver();
100  assert(solver);
101 
102  cout << "Objective value model: " << model.getObjValue()
103    << "\t solver: " << solver->getObjValue()
104    << "\t expected: 0.72" << endl;
105  if (CoinAbs(model.getObjValue()-0.72)>testtol || CoinAbs(solver->getObjValue()-0.72)>testtol) {
106     cerr << "Error: Objective value incorrect." << endl;
107     ++error_count;
108  }
109 
110  cout << "Primal value variable 0 in model: " << model.bestSolution()[0]
111    << "\t in solver: " << solver->getColSolution()[0]
112    << "\t expected: 0.8" << endl;
113  if (CoinAbs(model.bestSolution()[0]-0.8)>testtol || CoinAbs(solver->getColSolution()[0]-0.8)>testtol) {
114     cerr << "Error: Primal value incorrect." << endl;
115     ++error_count;
116  }
117  cout << "Primal value variable 1 in model: " << model.bestSolution()[1]
118    << "\t in solver: " << solver->getColSolution()[1]
119    << "\t expected: 0.0" << endl;
120  if (CoinAbs(model.bestSolution()[1])>testtol || CoinAbs(solver->getColSolution()[1])>testtol) {
121     cerr << "Error: Primal value incorrect." << endl;
122     ++error_count;
123  }
124  cout << "Primal value variable 2 in model: " << model.bestSolution()[2]
125    << "\t in solver: " << solver->getColSolution()[2]
126    << "\t expected: 0.0" << endl;
127  if (CoinAbs(model.bestSolution()[2])>testtol || CoinAbs(solver->getColSolution()[2])>testtol) {
128     cerr << "Error: Primal value incorrect." << endl;
129     ++error_count;
130  }
131  delete[] start;
132   delete[] index;
133   delete[] value;
134   delete[] collb;
135   delete[] colub;
136   delete[] obj;
137   delete[] rowlb;
138   delete[] rowub;
139}
140void sos2a(int& error_count, int& warning_count) {
141   OsiClpSolverInterface solver1;
142   
143   int numcols = 7; // w1, w2, w3, x, fx, fplus, fminus
144   int numrows = 5; // wsum, xdef, fxdef, gapplus, gapminus
145   int nnz = 15;
146   CoinBigIndex *start = new int[numcols+1];
147   int* index = new int[nnz];
148   double* value = new double[nnz];
149   double *collb = new double[numcols];
150   double *colub = new double[numcols];
151   double *obj = new double[numcols];
152   double *rowlb = new double[numrows];
153   double *rowub = new double[numrows];
154   // objective
155   obj[0] = 0.;  obj[1] = 0.;  obj[2] = 0.;  obj[3] = 0.;
156   obj[4] = 0.;  obj[5] = 1.;  obj[6] = 1.;
157   
158   // column bounds
159   collb[0] = 0.;  colub[0] = solver1.getInfinity();
160   collb[1] = 0.;  colub[1] = solver1.getInfinity();
161   collb[2] = 0.;  colub[2] = solver1.getInfinity();
162   collb[3] = -solver1.getInfinity();  colub[3] = solver1.getInfinity();
163   collb[4] = -solver1.getInfinity();  colub[4] = solver1.getInfinity();
164   collb[5] = 0.;  colub[5] = solver1.getInfinity();
165   collb[6] = 0.;  colub[6] = solver1.getInfinity();
166   // matrix
167   start[0] = 0;  index[0] = 0;  value[0] = 1.;
168                  index[1] = 1;  value[1] = 1.;
169                  index[2] = 2;  value[2] = 1.;
170   start[1] = 3;  index[3] = 0;  value[3] = 1.;
171                  index[4] = 1;  value[4] = 2.;
172                  index[5] = 2;  value[5] = 2.;
173   start[2] = 6;  index[6] = 0;  value[6] = 1.;
174                  index[7] = 1;  value[7] = 3.;
175                  index[8] = 2;  value[8] = 3.;
176   start[3] = 9;  index[9] = 1;  value[9] =-1.;
177   start[4] =10;  index[10]= 2;  value[10]=-1.;
178                  index[11]= 3;  value[11]=-1.;
179                  index[12]= 4;  value[12]= 1.;
180   start[5] =13;  index[13]= 3;  value[13]= 1.;
181   start[6] =14;  index[14]= 4;  value[14]= 1.;
182   start[7] =15;
183   
184   // row bounds
185   rowlb[0] =  1. ; rowub[0] = 1.;
186   rowlb[1] =  0. ; rowub[1] = 0.;
187   rowlb[2] =  0. ; rowub[2] = 0.;
188   rowlb[3] = -1.3; rowub[3] = solver1.getInfinity();
189   rowlb[4] =  1.3; rowub[4] = solver1.getInfinity();
190   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
191    double* primalval = new double[numcols];
192    double* redcost   = new double[numcols];
193    double optvalue = solver1.getInfinity();
194   for (int testcase = 0; testcase < 2; ++testcase) {
195      switch(testcase) {
196         case 0:
197            solver1.setColLower(0, 0.);
198            optvalue = 0.;
199           primalval[0] = .7;  redcost[0] = 0.;
200           primalval[1] = .3;  redcost[1] = 0.;
201           primalval[2] =0. ;  redcost[2] = 0.;
202           primalval[3] =1.3;  redcost[3] = 0.;
203           primalval[4] =1.3;  redcost[4] = 0.;
204           primalval[5] =0. ;  redcost[5] = 1.;
205           primalval[6] =0. ;  redcost[6] = 1.;
206            break;
207         case 1:
208            solver1.setColLower(0, .8);
209            optvalue = 0.1;
210           primalval[0] = .8;  redcost[0] = 1.;
211           primalval[1] = .2;  redcost[1] = 0.;
212           primalval[2] =0. ;  redcost[2] =-1.;
213           primalval[3] =1.2;  redcost[3] = 0.;
214           primalval[4] =1.2;  redcost[4] = 0.;
215           primalval[5] =0. ;  redcost[5] = 1.;
216           primalval[6] =0.1;  redcost[6] = 0.;
217            break;
218      }
219      CbcModel model(solver1);
220      CbcMain0(model);
221      int which[3] = { 0, 1, 2 };
222      CbcObject* sosobject = new CbcSOS(&model, 3, which, NULL, 0, 2); 
223      model.addObjects(1, &sosobject);
224      delete sosobject;
225      const char * argv2[]={"gamstest_sos2a","-solve","-quit"};
226     cout << "\nSolving sos2a model with w1 having lower bound " << solver1.getColLower()[0] << endl; 
227      CbcMain1(3,argv2,model);
228      cout << endl;
229      if (!model.isProvenOptimal()) {
230         cerr << "Error: Model sos2a not solved to optimality." << endl;
231         ++error_count;
232         continue; // other tests make no sense
233      }
234      OsiSolverInterface* solver = model.solver();
235      assert(solver);
236      cout << "Objective value model: " << model.getObjValue()
237      << "\t solver: " << solver->getObjValue()
238      << "\t expected: " << optvalue << endl;
239      if (CoinAbs(model.getObjValue()-optvalue)>testtol || CoinAbs(solver->getObjValue()-optvalue)>testtol) {
240         cerr << "Error: Objective value incorrect." << endl;
241         ++error_count;
242      }
243      for (int i=0; i<numcols; ++i) {
244         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
245            << "\t in solver: " << solver->getColSolution()[i]
246            << "\t expected: " << primalval[i]
247            << endl;
248         if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
249            cerr << "Error: Primal value incorrect." << endl;
250            ++error_count;
251         }
252      }
253      for (int i=0; i<numcols; ++i) {
254         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
255            << "\t in solver: " << solver->getReducedCost()[i]
256            << "\t expected: " << redcost[i]
257            << endl;
258         if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
259            cerr << "Warning: Reduced cost incorrect." << endl;
260            ++warning_count;
261         }
262      }
263   }
264  delete[] start;
265   delete[] index;
266   delete[] value;
267   delete[] collb;
268   delete[] colub;
269   delete[] obj;
270   delete[] rowlb;
271   delete[] rowub;
272   delete[] primalval;
273   delete[] redcost;
274}
275void semicon1(int& error_count, int& warning_count) {
276   OsiClpSolverInterface solver1;
277   
278   int numcols = 4; // s, pup, plo, x
279   int numrows = 3; // bigx, smallx, f
280   int nnz = 6;
281   CoinBigIndex *start = new int[numcols+1];
282   int* index = new int[nnz];
283   double* value = new double[nnz];
284   double *collb = new double[numcols];
285   double *colub = new double[numcols];
286   double *obj = new double[numcols];
287   double *rowlb = new double[numrows];
288   double *rowub = new double[numrows];
289   // objective
290   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
291   
292   // column bounds
293   collb[0] = 0.;  colub[0] = 10.;
294   collb[1] = 0.;  colub[1] = solver1.getInfinity();
295   collb[2] = 0.;  colub[2] = solver1.getInfinity();
296   collb[3] = 0.;  colub[3] = solver1.getInfinity();
297   // matrix
298   start[0] = 0;  index[0] = 2;  value[0] =  1.;
299   start[1] = 1;  index[1] = 0;  value[1] = -1.;
300   start[2] = 2;  index[2] = 1;  value[2] =  1.;
301   start[3] = 3;  index[3] = 0;  value[3] =  1.;
302                  index[4] = 1;  value[4] =  1.;
303                  index[5] = 2;  value[5] =  1.;
304   start[4] = nnz;
305   
306   // row bounds
307   rowlb[0] = -solver1.getInfinity(); rowub[0] = 8.9;
308   rowlb[1] = 8.9;  rowub[1] = solver1.getInfinity();
309   rowlb[2] = 10.;  rowub[2] = 10.;
310   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
311   for (int testcase = 0; testcase < 5; ++testcase) {
312      CbcModel model(solver1);
313      CbcMain0(model);
314     
315      double points[4] = { 0., 0., 0., 10. };
316      double objval;
317      double primalval[4];
318      double redcost[4];
319      double row2marg;
320      redcost[1] = 1.0;
321      redcost[2] = 1.0;
322      redcost[3] = 0.0;
323      switch(testcase) {
324         case 0:
325            points[2] = 0.;
326            objval = 0.;
327            primalval[0] = 1.1;
328            primalval[1] = 0.0;
329            primalval[2] = 0.0;
330            primalval[3] = 8.9;
331            redcost[0] = 0.0;
332            row2marg = 0.0; 
333            break;
334         case 1:
335            points[2] = 1.;
336            objval = 0.;
337            primalval[0] = 1.1;
338            primalval[1] = 0.0;
339            primalval[2] = 0.0;
340            primalval[3] = 8.9;
341            redcost[0] = 0.0;
342            row2marg = 0.0; 
343            break;
344         case 2:
345            points[2] = 1.5;
346            objval = 0.4;
347            primalval[0] = 1.5;
348            primalval[1] = 0.0;
349            primalval[2] = 0.4;
350            primalval[3] = 8.5;
351            redcost[0] = 1.0;
352            row2marg = -1.0; 
353            break;
354         case 3:
355            points[2] = 2.1;
356            objval = 1.0;
357            primalval[0] = 2.1;
358            primalval[1] = 0.0;
359            primalval[2] = 1.0;
360            primalval[3] = 7.9;
361            redcost[0] = 1.0;
362            row2marg = -1.0; 
363            break;
364         case 4:
365            points[2] = 2.8;
366            objval = 1.1;
367            primalval[0] = 0.0;
368            primalval[1] = 1.1;
369            primalval[2] = 0.0;
370            primalval[3] = 10.0;
371            redcost[0] = -1.0;
372            row2marg = 1.0; 
373            break;
374         default:  // to please the compile
375                 redcost[0] = 0.;
376                 row2marg = 0.;
377                 objval = 0.;
378      }
379     
380      CbcObject* semiconobject = new CbcLotsize(&model, 0, 2, points, true); 
381      model.addObjects(1, &semiconobject);
382      delete semiconobject;
383     
384      cout << "\nSolving semicon1 model for lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
385      const char * argv2[]={"gamstest_semicon1","-solve","-quit"};
386      CbcMain1(3,argv2,model);
387      cout << endl;
388      if (!model.isProvenOptimal()) {
389         cerr << "Error: Model semicon1 not solved to optimality." << endl;
390         ++error_count;
391         continue; // other tests make no sense
392      }
393      OsiSolverInterface* solver = model.solver();
394      assert(solver);
395      cout << "Objective value in model: " << model.getObjValue()
396      << "\t in solver: " << solver->getObjValue()
397      << "\t expected: " << objval << endl;
398      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
399         cerr << "Error: Objective value incorrect." << endl;
400         ++error_count;
401      }
402      for (int i=0; i<numcols; ++i) {
403         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
404        << "\t in solver: " << solver->getColSolution()[i]
405        << "\t expected: " << primalval[i]
406        << endl;
407      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
408         cerr << "Error: Primal value incorrect." << endl;
409         ++error_count;
410      }
411      }
412      cout << "Reduced cost variable " << 0 << " in model: " << model.getReducedCost()[0]
413        << "\t in solver: " << solver->getReducedCost()[0]
414        << "\t expected: " << redcost[0]
415        << endl;
416      if (CoinAbs(model.getReducedCost()[0]-redcost[0])>testtol || CoinAbs(solver->getReducedCost()[0]-redcost[0])>testtol) {
417      cerr << "Warning: Reduced cost incorrect." << endl;
418      ++warning_count;
419      }
420      cout << "Reduced cost variable " << 3 << " in model: " << model.getReducedCost()[3]
421        << "\t in solver: " << solver->getReducedCost()[3]
422        << "\t expected: " << redcost[3]
423        << endl;
424      if (CoinAbs(model.getReducedCost()[3]-redcost[3])>testtol || CoinAbs(solver->getReducedCost()[3]-redcost[3])>testtol) {
425      cerr << "Warning: Reduced cost incorrect." << endl;
426      ++warning_count;
427      }
428      cout << "Reduced cost variable 1 plus - dual of row 0 in model: " << model.getReducedCost()[1]-model.getRowPrice()[0]
429        << "\t expected: " << redcost[1]
430        << endl;
431      if (CoinAbs(model.getReducedCost()[1]-model.getRowPrice()[0]-redcost[1])>testtol) {
432      cerr << "Warning: Reduced cost or row margin incorrect." << endl;
433      ++warning_count;
434      }
435      cout << "Reduced cost variable 2 plus + dual of row 1 in model: " << model.getReducedCost()[2]+model.getRowPrice()[1]
436        << "\t expected: " << redcost[2]
437        << endl;
438      if (CoinAbs(model.getReducedCost()[2]+model.getRowPrice()[1]-redcost[2])>testtol) {
439      cerr << "Warning: Reduced cost or row margin incorrect." << endl;
440      ++warning_count;
441      }
442     
443      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
444      << "\t in solver: " << solver->getRowPrice()[2]
445        << "\t expected: " << row2marg << endl;
446    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
447       cerr << "Warning: Row price incorrect." << endl;
448       ++warning_count;
449    }
450   
451   }
452   
453   delete[] start;
454   delete[] index;
455   delete[] value;
456   delete[] collb;
457   delete[] colub;
458   delete[] obj;
459   delete[] rowlb;
460   delete[] rowub;
461}
462void semiint1(int& error_count, int& warning_count) {
463   OsiClpSolverInterface solver1;
464   
465   int numcols = 4; // s, pup, plo, x
466   int numrows = 3; // bigx, smallx, f
467   int nnz = 6;
468   CoinBigIndex *start = new int[numcols+1];
469   int* index = new int[nnz];
470   double* value = new double[nnz];
471   double *collb = new double[numcols];
472   double *colub = new double[numcols];
473   double *obj = new double[numcols];
474   double *rowlb = new double[numrows];
475   double *rowub = new double[numrows];
476   // objective
477   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
478   
479   // column bounds
480   collb[0] = 0.;  colub[0] = 10.;
481   collb[1] = 0.;  colub[1] = solver1.getInfinity();
482   collb[2] = 0.;  colub[2] = solver1.getInfinity();
483   collb[3] = 0.;  colub[3] = solver1.getInfinity();
484   // matrix
485   start[0] = 0;  index[0] = 2;  value[0] =  1.;
486   start[1] = 1;  index[1] = 0;  value[1] = -1.;
487   start[2] = 2;  index[2] = 1;  value[2] =  1.;
488   start[3] = 3;  index[3] = 0;  value[3] =  1.;
489                  index[4] = 1;  value[4] =  1.;
490                  index[5] = 2;  value[5] =  1.;
491   start[4] = nnz;
492   
493   // row bounds
494   rowlb[0] = -solver1.getInfinity(); rowub[0] = 7.9;
495   rowlb[1] = 7.9;  rowub[1] = solver1.getInfinity();
496   rowlb[2] = 10.;  rowub[2] = 10.;
497   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
498   solver1.setInteger(0); 
499   
500   for (int testcase = 0; testcase < 6; ++testcase) {
501      CbcModel model(solver1);
502      CbcMain0(model);
503     
504      double points[10];
505       points[0]=0.;
506      int nrpoints = 0;
507      double objval;
508      double primalval[4];
509      double redcost[4];
510      double row2marg;
511      redcost[2] = 1.0;
512      redcost[3] = 0.0;
513      switch(testcase) {
514         case 0:
515            nrpoints = 0; // pure integer case
516            objval = 0.1;
517            primalval[0] = 2.0;
518            primalval[1] = 0.1;
519            primalval[2] = 0.0;
520            primalval[3] = 8;
521            redcost[0] = -1.0;
522            redcost[1] =  0.0;
523            row2marg = 1.0; 
524            break;
525         case 1:
526            nrpoints = 0; // pure integer case too
527            objval = 0.1;
528            primalval[0] = 2.0;
529            primalval[1] = 0.1;
530            primalval[2] = 0.0;
531            primalval[3] = 8.0;
532            redcost[0] = -1.0;
533            redcost[1] =  0.0;
534            row2marg = 1.0; 
535            break;
536         case 2:
537             for (nrpoints=1; nrpoints<10; ++nrpoints)
538                points[nrpoints]=nrpoints+1;
539            objval = 0.1;
540            primalval[0] = 2.0;
541            primalval[1] = 0.1;
542            primalval[2] = 0.0;
543            primalval[3] = 8.0;
544            redcost[0] = -1.0;
545            redcost[1] =  0.0;
546            row2marg = 1.0; 
547            break;
548         case 3:
549               for (nrpoints=1; nrpoints<9; ++nrpoints)
550                  points[nrpoints]=nrpoints+2;
551            objval = 0.9;
552            primalval[0] = 3.0;
553            primalval[1] = 0.0;
554            primalval[2] = 0.9;
555            primalval[3] = 7.0;
556            redcost[0] = 1.0;
557            redcost[1] = 1.0;
558            row2marg = -1.0; 
559            break;
560         case 4:
561              for (nrpoints=1; nrpoints<8; ++nrpoints)
562                 points[nrpoints]=nrpoints+3;
563            objval = 1.9;
564            primalval[0] = 4.0;
565            primalval[1] = 0.0;
566            primalval[2] = 1.9;
567            primalval[3] = 6.0;
568            redcost[0] = 1.0;
569            redcost[1] = 1.0;
570            row2marg = -1.0; 
571            break;
572         case 5:
573            for (nrpoints=1; nrpoints<7; ++nrpoints)
574                   points[nrpoints]=nrpoints+4;
575            objval = 2.1;
576            primalval[0] = 0.0;
577            primalval[1] = 2.1;
578            primalval[2] = 0.0;
579            primalval[3] = 10.0;
580            redcost[0] = -1.0;
581            redcost[1] =  0.0;
582            row2marg = 1.0; 
583            break;
584         default:  // to please the compile
585                 redcost[0] = 0.;
586                 redcost[1] = 0.;
587                 row2marg = 0.;
588                 objval = 0.;
589      }
590      if (nrpoints) {
591         CbcObject* semiintobject = new CbcLotsize(&model, 0, nrpoints, points);
592         model.addObjects(1, &semiintobject);
593         delete semiintobject;
594      }
595     
596      cout << "\nSolving semiint1 model for integer lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
597      const char * argv2[]={"gamstest_semiint1","-solve","-quit"};
598      CbcMain1(3,argv2,model);
599      cout << endl;
600      if (!model.isProvenOptimal()) {
601         cerr << "Error: Model semiint1 not solved to optimality." << endl;
602         ++error_count;
603         continue; // other tests make no sense
604      }
605      OsiSolverInterface* solver = model.solver();
606      assert(solver);
607      cout << "Objective value in model: " << model.getObjValue()
608      << "\t in solver: " << solver->getObjValue()
609      << "\t expected: " << objval << endl;
610      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
611         cerr << "Error: Objective value incorrect." << endl;
612         ++error_count;
613      }
614      for (int i=0; i<numcols; ++i) {
615         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
616        << "\t in solver: " << solver->getColSolution()[i]
617        << "\t expected: " << primalval[i]
618        << endl;
619      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
620         cerr << "Error: Primal value incorrect." << endl;
621         ++error_count;
622      }
623      }
624      cout << "Reduced cost variable " << 0 << " in model: " << model.getReducedCost()[0]
625        << "\t in solver: " << solver->getReducedCost()[0]
626        << "\t expected: " << redcost[0]
627        << endl;
628      if (CoinAbs(model.getReducedCost()[0]-redcost[0])>testtol || CoinAbs(solver->getReducedCost()[0]-redcost[0])>testtol) {
629      cerr << "Warning: Reduced cost incorrect." << endl;
630      ++warning_count;
631      }
632      cout << "Reduced cost variable " << 3 << " in model: " << model.getReducedCost()[3]
633        << "\t in solver: " << solver->getReducedCost()[3]
634        << "\t expected: " << redcost[3]
635        << endl;
636      if (CoinAbs(model.getReducedCost()[3]-redcost[3])>testtol || CoinAbs(solver->getReducedCost()[3]-redcost[3])>testtol) {
637      cerr << "Warning: Reduced cost incorrect." << endl;
638      ++warning_count;
639      }
640      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
641      << "\t in solver: " << solver->getRowPrice()[2]
642        << "\t expected: " << row2marg << endl;
643      if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
644         cerr << "Warning: Row price incorrect." << endl;
645         ++warning_count;
646      }
647     
648      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
649      << "\t in solver: " << solver->getRowPrice()[2]
650        << "\t expected: " << row2marg << endl;
651    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
652       cerr << "Warning: Row price incorrect." << endl;
653       ++warning_count;
654    }
655   
656   }
657   
658   delete[] start;
659   delete[] index;
660   delete[] value;
661   delete[] collb;
662   delete[] colub;
663   delete[] obj;
664   delete[] rowlb;
665   delete[] rowub;
666}
Note: See TracBrowser for help on using the repository browser.