source: stable/2.1/Cbc/examples/gamsTest.cpp @ 968

Last change on this file since 968 was 968, checked in by forrest, 11 years ago

fix gams tests

File size: 16.2 KB
Line 
1//Gams tests - provided by Stefan Vigerske
2#if defined(_MSC_VER)
3// Turn off compiler warning about long names
4#  pragma warning(disable:4786)
5#endif
6#include <cassert>
7#include <iostream>
8using namespace std;
9#include "CoinHelperFunctions.hpp"
10#include "CoinError.hpp"
11#include "CbcModel.hpp"
12#include "CbcBranchActual.hpp" //for CbcSOS
13#include "CbcBranchLotsize.hpp" //for CbcLotsize
14#include "OsiClpSolverInterface.hpp"
15#define testtol 1e-6
16/** model sos1a from the GAMS test library
17 * http://www.gams.com/testlib/libhtml/sos1a.htm */
18void sos1a(int& error_count, int& warning_count);
19/** model semicon1 from the GAMS test library
20 * http://www.gams.com/testlib/libhtml/semicon1.htm */
21void semicon1(int& error_count, int& warning_count);
22/** model semiint1 from the GAMS test library
23 * http://www.gams.com/testlib/libhtml/semiint1.htm */
24void semiint1(int& error_count, int& warning_count);
25int main (int argc, const char *argv[])
26{
27   // only in CoinUtils/trunk: WindowsErrorPopupBlocker();
28   int error_count = 0;
29   int warning_count = 0;
30   
31   sos1a(error_count, warning_count);
32   cout << "\n***********************\n" << endl;
33   semicon1(error_count, warning_count);
34   cout << "\n***********************\n" << endl;
35   semiint1(error_count, warning_count);
36   
37   cout << endl << "Finished - there have been " << error_count << " errors and " << warning_count << " warnings." << endl;
38   return error_count;
39}
40void sos1a(int& error_count, int& warning_count) {
41   OsiClpSolverInterface solver1;
42   
43   int numcols = 3;
44   int numrows = 1;
45   int nnz = 3;
46   CoinBigIndex *start = new int[numcols+1];
47   int* index = new int[nnz];
48   double* value = new double[nnz];
49   double *collb = new double[numcols];
50   double *colub = new double[numcols];
51   double *obj = new double[numcols];
52   double *rowlb = new double[numrows];
53   double *rowub = new double[numrows];
54   // objective
55   obj[0] = .9;  obj[1] = 1.;  obj[2] = 1.1;
56   
57   // column bounds
58   collb[0] = 0.;  colub[0] = .8;
59   collb[1] = 0.;  colub[1] = .6;
60   collb[2] = 0.;  colub[2] = .6;
61   // matrix
62   start[0] = 0;  index[0] = 0;  value[0] = 1.;
63   start[1] = 1;  index[1] = 0;  value[1] = 1.;
64   start[2] = 2;  index[2] = 0;  value[2] = 1.;
65   start[3] = 3;
66   
67   // row bounds
68   rowlb[0] = -solver1.getInfinity(); rowub[0] = 1.;
69   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
70   solver1.setObjSense(-1);
71   
72  CbcModel model(solver1);
73  CbcMain0(model);
74 
75  int which[3] = { 0, 1, 2 };
76   CbcObject* sosobject = new CbcSOS(&model, 3, which, NULL, 0, 1); 
77  model.addObjects(1, &sosobject);
78  delete sosobject;
79 
80  const char * argv2[]={"gamstest_sos1a","-solve","-quit"};
81  CbcMain1(3,argv2,model);
82  cout << endl;
83  if (!model.isProvenOptimal()) {
84     cerr << "Error: Model sos1a not solved to optimality." << endl;
85     ++error_count;
86     return; // other tests make no sense ---- memory leak here
87  }
88 
89  OsiSolverInterface* solver = model.solver();
90  assert(solver);
91 
92  cout << "Objective value model: " << model.getObjValue()
93    << "\t solver: " << solver->getObjValue()
94    << "\t expected: 0.72" << endl;
95  if (CoinAbs(model.getObjValue()-0.72)>testtol || CoinAbs(solver->getObjValue()-0.72)>testtol) {
96     cerr << "Error: Objective value incorrect." << endl;
97     ++error_count;
98  }
99 
100  cout << "Primal value variable 0 in model: " << model.bestSolution()[0]
101    << "\t in solver: " << solver->getColSolution()[0]
102    << "\t expected: 0.8" << endl;
103  if (CoinAbs(model.bestSolution()[0]-0.8)>testtol || CoinAbs(solver->getColSolution()[0]-0.8)>testtol) {
104     cerr << "Error: Primal value incorrect." << endl;
105     ++error_count;
106  }
107  cout << "Primal value variable 1 in model: " << model.bestSolution()[1]
108    << "\t in solver: " << solver->getColSolution()[1]
109    << "\t expected: 0.0" << endl;
110  if (CoinAbs(model.bestSolution()[1])>testtol || CoinAbs(solver->getColSolution()[1])>testtol) {
111     cerr << "Error: Primal value incorrect." << endl;
112     ++error_count;
113  }
114  cout << "Primal value variable 2 in model: " << model.bestSolution()[2]
115    << "\t in solver: " << solver->getColSolution()[2]
116    << "\t expected: 0.0" << endl;
117  if (CoinAbs(model.bestSolution()[2])>testtol || CoinAbs(solver->getColSolution()[2])>testtol) {
118     cerr << "Error: Primal value incorrect." << endl;
119     ++error_count;
120  }
121  delete[] start;
122   delete[] index;
123   delete[] value;
124   delete[] collb;
125   delete[] colub;
126   delete[] obj;
127   delete[] rowlb;
128   delete[] rowub;
129}
130void semicon1(int& error_count, int& warning_count) {
131   OsiClpSolverInterface solver1;
132   
133   int numcols = 4; // s, pup, plo, x
134   int numrows = 3; // bigx, smallx, f
135   int nnz = 6;
136   CoinBigIndex *start = new int[numcols+1];
137   int* index = new int[nnz];
138   double* value = new double[nnz];
139   double *collb = new double[numcols];
140   double *colub = new double[numcols];
141   double *obj = new double[numcols];
142   double *rowlb = new double[numrows];
143   double *rowub = new double[numrows];
144   // objective
145   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
146   
147   // column bounds
148   collb[0] = 0.;  colub[0] = 10.;
149   collb[1] = 0.;  colub[1] = solver1.getInfinity();
150   collb[2] = 0.;  colub[2] = solver1.getInfinity();
151   collb[3] = 0.;  colub[3] = solver1.getInfinity();
152   // matrix
153   start[0] = 0;  index[0] = 2;  value[0] =  1.;
154   start[1] = 1;  index[1] = 0;  value[1] = -1.;
155   start[2] = 2;  index[2] = 1;  value[2] =  1.;
156   start[3] = 3;  index[3] = 0;  value[3] =  1.;
157                  index[4] = 1;  value[4] =  1.;
158                  index[5] = 2;  value[5] =  1.;
159   start[4] = nnz;
160   
161   // row bounds
162   rowlb[0] = -solver1.getInfinity(); rowub[0] = 8.9;
163   rowlb[1] = 8.9;  rowub[1] = solver1.getInfinity();
164   rowlb[2] = 10.;  rowub[2] = 10.;
165   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
166   for (int testcase = 0; testcase < 5; ++testcase) {
167      CbcModel model(solver1);
168      CbcMain0(model);
169     
170      double points[4] = { 0., 0., 0., 10. };
171      double objval;
172      double primalval[4];
173      double redcost[4];
174      double row2marg;
175      redcost[1] = 1.0;
176      redcost[2] = 1.0;
177      redcost[3] = 0.0;
178      switch(testcase) {
179         case 0:
180            points[2] = 0.;
181            objval = 0.;
182            primalval[0] = 1.1;
183            primalval[1] = 0.0;
184            primalval[2] = 0.0;
185            primalval[3] = 8.9;
186            redcost[0] = 0.0;
187            row2marg = 0.0; 
188            break;
189         case 1:
190            points[2] = 1.;
191            objval = 0.;
192            primalval[0] = 1.1;
193            primalval[1] = 0.0;
194            primalval[2] = 0.0;
195            primalval[3] = 8.9;
196            redcost[0] = 0.0;
197            row2marg = 0.0; 
198            break;
199         case 2:
200            points[2] = 1.5;
201            objval = 0.4;
202            primalval[0] = 1.5;
203            primalval[1] = 0.0;
204            primalval[2] = 0.4;
205            primalval[3] = 8.5;
206            redcost[0] = 1.0;
207            row2marg = -1.0; 
208            break;
209         case 3:
210            points[2] = 2.1;
211            objval = 1.0;
212            primalval[0] = 2.1;
213            primalval[1] = 0.0;
214            primalval[2] = 1.0;
215            primalval[3] = 7.9;
216            redcost[0] = 1.0;
217            row2marg = -1.0; 
218            break;
219         case 4:
220            points[2] = 2.8;
221            objval = 1.1;
222            primalval[0] = 0.0;
223            primalval[1] = 1.1;
224            primalval[2] = 0.0;
225            primalval[3] = 10.0;
226            redcost[0] = -1.0;
227            row2marg = 1.0; 
228            break;
229      }
230     
231      CbcObject* semiconobject = new CbcLotsize(&model, 0, 2, points, true); 
232      model.addObjects(1, &semiconobject);
233      delete semiconobject;
234     
235      cout << "\nSolving semicon1 model for lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
236      const char * argv2[]={"gamstest_semicon1","-solve","-quit"};
237      CbcMain1(3,argv2,model);
238      cout << endl;
239      if (!model.isProvenOptimal()) {
240         cerr << "Error: Model semicon1 not solved to optimality." << endl;
241         ++error_count;
242         continue; // other tests make no sense
243      }
244      OsiSolverInterface* solver = model.solver();
245      assert(solver);
246      cout << "Objective value in model: " << model.getObjValue()
247      << "\t in solver: " << solver->getObjValue()
248      << "\t expected: " << objval << endl;
249      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
250         cerr << "Error: Objective value incorrect." << endl;
251         ++error_count;
252      }
253      for (int i=0; i<numcols; ++i) {
254         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
255        << "\t in solver: " << solver->getColSolution()[i]
256        << "\t expected: " << primalval[i]
257        << endl;
258      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
259         cerr << "Error: Primal value incorrect." << endl;
260         ++error_count;
261      }
262      }
263      for (int i=0; i<numcols; ++i) {
264         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
265        << "\t in solver: " << solver->getReducedCost()[i]
266        << "\t expected: " << redcost[i]
267        << endl;
268      if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
269         cerr << "Warning: Reduced cost incorrect." << endl;
270         ++warning_count;
271      }
272      }
273     
274      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
275      << "\t in solver: " << solver->getRowPrice()[2]
276        << "\t expected: " << row2marg << endl;
277    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
278       cerr << "Warning: Row price incorrect." << endl;
279       ++warning_count;
280    }
281   
282   }
283   
284   delete[] start;
285   delete[] index;
286   delete[] value;
287   delete[] collb;
288   delete[] colub;
289   delete[] obj;
290   delete[] rowlb;
291   delete[] rowub;
292}
293void semiint1(int& error_count, int& warning_count) {
294   OsiClpSolverInterface solver1;
295   
296   int numcols = 4; // s, pup, plo, x
297   int numrows = 3; // bigx, smallx, f
298   int nnz = 6;
299   CoinBigIndex *start = new int[numcols+1];
300   int* index = new int[nnz];
301   double* value = new double[nnz];
302   double *collb = new double[numcols];
303   double *colub = new double[numcols];
304   double *obj = new double[numcols];
305   double *rowlb = new double[numrows];
306   double *rowub = new double[numrows];
307   // objective
308   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
309   
310   // column bounds
311   collb[0] = 0.;  colub[0] = 10.;
312   collb[1] = 0.;  colub[1] = solver1.getInfinity();
313   collb[2] = 0.;  colub[2] = solver1.getInfinity();
314   collb[3] = 0.;  colub[3] = solver1.getInfinity();
315   // matrix
316   start[0] = 0;  index[0] = 2;  value[0] =  1.;
317   start[1] = 1;  index[1] = 0;  value[1] = -1.;
318   start[2] = 2;  index[2] = 1;  value[2] =  1.;
319   start[3] = 3;  index[3] = 0;  value[3] =  1.;
320                  index[4] = 1;  value[4] =  1.;
321                  index[5] = 2;  value[5] =  1.;
322   start[4] = nnz;
323   
324   // row bounds
325   rowlb[0] = -solver1.getInfinity(); rowub[0] = 7.9;
326   rowlb[1] = 7.9;  rowub[1] = solver1.getInfinity();
327   rowlb[2] = 10.;  rowub[2] = 10.;
328   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
329   solver1.setInteger(0); 
330   
331   for (int testcase = 0; testcase < 6; ++testcase) {
332      CbcModel model(solver1);
333      CbcMain0(model);
334     
335      double points[4] = { 0., 0., 0., 10. };
336      double objval;
337      double primalval[4];
338      double redcost[4];
339      double row2marg;
340      redcost[2] = 1.0;
341      redcost[3] = 0.0;
342      switch(testcase) {
343         case 0:
344            points[2] = 0.;
345            objval = 0.;
346            primalval[0] = 2.0;
347            primalval[1] = 0.0;
348            primalval[2] = 0.0;
349            primalval[3] = 8.0;
350            redcost[0] = 0.0;
351            redcost[1] = 1.0;
352            row2marg = 0.0; 
353            break;
354         case 1:
355            points[2] = 1.;
356            objval = 0.1;
357            primalval[0] = 2.0;
358            primalval[1] = 0.1;
359            primalval[2] = 0.0;
360            primalval[3] = 8.0;
361            redcost[0] = -1.0;
362            redcost[1] =  0.0;
363            row2marg = 1.0; 
364            break;
365         case 2:
366            points[2] = 2.;
367            objval = 0.1;
368            primalval[0] = 2.0;
369            primalval[1] = 0.1;
370            primalval[2] = 0.0;
371            primalval[3] = 8.0;
372            redcost[0] = -1.0;
373            redcost[1] =  0.0;
374            row2marg = 1.0; 
375            break;
376         case 3:
377            points[2] = 3.;
378            objval = 0.9;
379            primalval[0] = 3.0;
380            primalval[1] = 0.0;
381            primalval[2] = 0.9;
382            primalval[3] = 7.0;
383            redcost[0] = 1.0;
384            redcost[1] = 1.0;
385            row2marg = -1.0; 
386            break;
387         case 4:
388            points[2] = 4.;
389            objval = 1.9;
390            primalval[0] = 4.0;
391            primalval[1] = 0.0;
392            primalval[2] = 1.9;
393            primalval[3] = 6.0;
394            redcost[0] = 1.0;
395            redcost[1] = 1.0;
396            row2marg = -1.0; 
397            break;
398         case 5:
399            points[2] = 5.;
400            objval = 2.1;
401            primalval[0] = 0.0;
402            primalval[1] = 2.1;
403            primalval[2] = 0.0;
404            primalval[3] = 10.0;
405            redcost[0] = -1.0;
406            redcost[1] =  0.0;
407            row2marg = 1.0; 
408            break;
409      }
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;
422      }
423     
424      cout << "\nSolving semiint1 model for integer lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
425      const char * argv2[]={"gamstest_semiint1","-solve","-quit"};
426      CbcMain1(3,argv2,model);
427      cout << endl;
428      if (!model.isProvenOptimal()) {
429         cerr << "Error: Model semiint1 not solved to optimality." << endl;
430         ++error_count;
431         continue; // other tests make no sense
432      }
433      OsiSolverInterface* solver = model.solver();
434      assert(solver);
435      cout << "Objective value in model: " << model.getObjValue()
436      << "\t in solver: " << solver->getObjValue()
437      << "\t expected: " << objval << endl;
438      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
439         cerr << "Error: Objective value incorrect." << endl;
440         ++error_count;
441      }
442      for (int i=0; i<numcols; ++i) {
443         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
444        << "\t in solver: " << solver->getColSolution()[i]
445        << "\t expected: " << primalval[i]
446        << endl;
447      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
448         cerr << "Error: Primal value incorrect." << endl;
449         ++error_count;
450      }
451      }
452      for (int i=0; i<numcols; ++i) {
453         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
454        << "\t in solver: " << solver->getReducedCost()[i]
455        << "\t expected: " << redcost[i]
456        << endl;
457      if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
458         cerr << "Warning: Reduced cost incorrect." << endl;
459         ++warning_count;
460      }
461      }
462     
463      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
464      << "\t in solver: " << solver->getRowPrice()[2]
465        << "\t expected: " << row2marg << endl;
466    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
467       cerr << "Warning: Row price incorrect." << endl;
468       ++warning_count;
469    }
470   
471   }
472   
473   delete[] start;
474   delete[] index;
475   delete[] value;
476   delete[] collb;
477   delete[] colub;
478   delete[] obj;
479   delete[] rowlb;
480   delete[] rowub;
481}
Note: See TracBrowser for help on using the repository browser.