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

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

modify test

File size: 21.9 KB
Line 
1#if defined(_MSC_VER)
2// Turn off compiler warning about long names
3#  pragma warning(disable:4786)
4#endif
5#include <cassert>
6#include <iostream>
7using namespace std;
8#include "CoinHelperFunctions.hpp"
9#include "CoinError.hpp"
10#include "CbcModel.hpp"
11#include "CbcBranchActual.hpp" //for CbcSOS
12#include "CbcBranchLotsize.hpp" //for CbcLotsize
13#include "OsiClpSolverInterface.hpp"
14#define testtol 1e-6
15/** model sos1a from the GAMS test library
16 * http://www.gams.com/testlib/libhtml/sos1a.htm */
17void 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);
21/** model semicon1 from the GAMS test library
22 * http://www.gams.com/testlib/libhtml/semicon1.htm */
23void semicon1(int& error_count, int& warning_count);
24/** model semiint1 from the GAMS test library
25 * http://www.gams.com/testlib/libhtml/semiint1.htm */
26void semiint1(int& error_count, int& warning_count);
27int main (int argc, const char *argv[])
28{
29   // only in CoinUtils/trunk: WindowsErrorPopupBlocker();
30   int error_count = 0;
31   int warning_count = 0;
32   
33   sos1a(error_count, warning_count);
34   cout << "\n***********************\n" << endl;
35   sos2a(error_count, warning_count);
36   cout << "\n***********************\n" << endl;
37   semicon1(error_count, warning_count);
38   cout << "\n***********************\n" << endl;
39   semiint1(error_count, warning_count);
40   
41   cout << endl << "Finished - there have been " << error_count << " errors and " << warning_count << " warnings." << endl;
42   return error_count;
43}
44void sos1a(int& error_count, int& warning_count) {
45   OsiClpSolverInterface solver1;
46   
47   int numcols = 3;
48   int numrows = 1;
49   int nnz = 3;
50   CoinBigIndex *start = new int[numcols+1];
51   int* index = new int[nnz];
52   double* value = new double[nnz];
53   double *collb = new double[numcols];
54   double *colub = new double[numcols];
55   double *obj = new double[numcols];
56   double *rowlb = new double[numrows];
57   double *rowub = new double[numrows];
58   // objective
59   obj[0] = .9;  obj[1] = 1.;  obj[2] = 1.1;
60   
61   // column bounds
62   collb[0] = 0.;  colub[0] = .8;
63   collb[1] = 0.;  colub[1] = .6;
64   collb[2] = 0.;  colub[2] = .6;
65   // matrix
66   start[0] = 0;  index[0] = 0;  value[0] = 1.;
67   start[1] = 1;  index[1] = 0;  value[1] = 1.;
68   start[2] = 2;  index[2] = 0;  value[2] = 1.;
69   start[3] = 3;
70   
71   // row bounds
72   rowlb[0] = -solver1.getInfinity(); rowub[0] = 1.;
73   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
74   solver1.setObjSense(-1);
75   
76  CbcModel model(solver1);
77  CbcMain0(model);
78 
79  int which[3] = { 0, 1, 2 };
80   CbcObject* sosobject = new CbcSOS(&model, 3, which, NULL, 0, 1); 
81  model.addObjects(1, &sosobject);
82  delete sosobject;
83 
84  const char * argv2[]={"gamstest_sos1a","-solve","-quit"};
85  CbcMain1(3,argv2,model);
86  cout << endl;
87  if (!model.isProvenOptimal()) {
88     cerr << "Error: Model sos1a not solved to optimality." << endl;
89     ++error_count;
90     return; // other tests make no sense ---- memory leak here
91  }
92 
93  OsiSolverInterface* solver = model.solver();
94  assert(solver);
95 
96  cout << "Objective value model: " << model.getObjValue()
97    << "\t solver: " << solver->getObjValue()
98    << "\t expected: 0.72" << endl;
99  if (CoinAbs(model.getObjValue()-0.72)>testtol || CoinAbs(solver->getObjValue()-0.72)>testtol) {
100     cerr << "Error: Objective value incorrect." << endl;
101     ++error_count;
102  }
103 
104  cout << "Primal value variable 0 in model: " << model.bestSolution()[0]
105    << "\t in solver: " << solver->getColSolution()[0]
106    << "\t expected: 0.8" << endl;
107  if (CoinAbs(model.bestSolution()[0]-0.8)>testtol || CoinAbs(solver->getColSolution()[0]-0.8)>testtol) {
108     cerr << "Error: Primal value incorrect." << endl;
109     ++error_count;
110  }
111  cout << "Primal value variable 1 in model: " << model.bestSolution()[1]
112    << "\t in solver: " << solver->getColSolution()[1]
113    << "\t expected: 0.0" << endl;
114  if (CoinAbs(model.bestSolution()[1])>testtol || CoinAbs(solver->getColSolution()[1])>testtol) {
115     cerr << "Error: Primal value incorrect." << endl;
116     ++error_count;
117  }
118  cout << "Primal value variable 2 in model: " << model.bestSolution()[2]
119    << "\t in solver: " << solver->getColSolution()[2]
120    << "\t expected: 0.0" << endl;
121  if (CoinAbs(model.bestSolution()[2])>testtol || CoinAbs(solver->getColSolution()[2])>testtol) {
122     cerr << "Error: Primal value incorrect." << endl;
123     ++error_count;
124  }
125  delete[] start;
126   delete[] index;
127   delete[] value;
128   delete[] collb;
129   delete[] colub;
130   delete[] obj;
131   delete[] rowlb;
132   delete[] rowub;
133}
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}
269void semicon1(int& error_count, int& warning_count) {
270   OsiClpSolverInterface solver1;
271   
272   int numcols = 4; // s, pup, plo, x
273   int numrows = 3; // bigx, smallx, f
274   int nnz = 6;
275   CoinBigIndex *start = new int[numcols+1];
276   int* index = new int[nnz];
277   double* value = new double[nnz];
278   double *collb = new double[numcols];
279   double *colub = new double[numcols];
280   double *obj = new double[numcols];
281   double *rowlb = new double[numrows];
282   double *rowub = new double[numrows];
283   // objective
284   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
285   
286   // column bounds
287   collb[0] = 0.;  colub[0] = 10.;
288   collb[1] = 0.;  colub[1] = solver1.getInfinity();
289   collb[2] = 0.;  colub[2] = solver1.getInfinity();
290   collb[3] = 0.;  colub[3] = solver1.getInfinity();
291   // matrix
292   start[0] = 0;  index[0] = 2;  value[0] =  1.;
293   start[1] = 1;  index[1] = 0;  value[1] = -1.;
294   start[2] = 2;  index[2] = 1;  value[2] =  1.;
295   start[3] = 3;  index[3] = 0;  value[3] =  1.;
296                  index[4] = 1;  value[4] =  1.;
297                  index[5] = 2;  value[5] =  1.;
298   start[4] = nnz;
299   
300   // row bounds
301   rowlb[0] = -solver1.getInfinity(); rowub[0] = 8.9;
302   rowlb[1] = 8.9;  rowub[1] = solver1.getInfinity();
303   rowlb[2] = 10.;  rowub[2] = 10.;
304   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
305   for (int testcase = 0; testcase < 5; ++testcase) {
306      CbcModel model(solver1);
307      CbcMain0(model);
308     
309      double points[4] = { 0., 0., 0., 10. };
310      double objval;
311      double primalval[4];
312      double redcost[4];
313      double row2marg;
314      redcost[1] = 1.0;
315      redcost[2] = 1.0;
316      redcost[3] = 0.0;
317      switch(testcase) {
318         case 0:
319            points[2] = 0.;
320            objval = 0.;
321            primalval[0] = 1.1;
322            primalval[1] = 0.0;
323            primalval[2] = 0.0;
324            primalval[3] = 8.9;
325            redcost[0] = 0.0;
326            row2marg = 0.0; 
327            break;
328         case 1:
329            points[2] = 1.;
330            objval = 0.;
331            primalval[0] = 1.1;
332            primalval[1] = 0.0;
333            primalval[2] = 0.0;
334            primalval[3] = 8.9;
335            redcost[0] = 0.0;
336            row2marg = 0.0; 
337            break;
338         case 2:
339            points[2] = 1.5;
340            objval = 0.4;
341            primalval[0] = 1.5;
342            primalval[1] = 0.0;
343            primalval[2] = 0.4;
344            primalval[3] = 8.5;
345            redcost[0] = 1.0;
346            row2marg = -1.0; 
347            break;
348         case 3:
349            points[2] = 2.1;
350            objval = 1.0;
351            primalval[0] = 2.1;
352            primalval[1] = 0.0;
353            primalval[2] = 1.0;
354            primalval[3] = 7.9;
355            redcost[0] = 1.0;
356            row2marg = -1.0; 
357            break;
358         case 4:
359            points[2] = 2.8;
360            objval = 1.1;
361            primalval[0] = 0.0;
362            primalval[1] = 1.1;
363            primalval[2] = 0.0;
364            primalval[3] = 10.0;
365            redcost[0] = -1.0;
366            row2marg = 1.0; 
367            break;
368      }
369     
370      CbcObject* semiconobject = new CbcLotsize(&model, 0, 2, points, true); 
371      model.addObjects(1, &semiconobject);
372      delete semiconobject;
373     
374      cout << "\nSolving semicon1 model for lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
375      const char * argv2[]={"gamstest_semicon1","-solve","-quit"};
376      CbcMain1(3,argv2,model);
377      cout << endl;
378      if (!model.isProvenOptimal()) {
379         cerr << "Error: Model semicon1 not solved to optimality." << endl;
380         ++error_count;
381         continue; // other tests make no sense
382      }
383      OsiSolverInterface* solver = model.solver();
384      assert(solver);
385      cout << "Objective value in model: " << model.getObjValue()
386      << "\t in solver: " << solver->getObjValue()
387      << "\t expected: " << objval << endl;
388      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
389         cerr << "Error: Objective value incorrect." << endl;
390         ++error_count;
391      }
392      for (int i=0; i<numcols; ++i) {
393         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
394        << "\t in solver: " << solver->getColSolution()[i]
395        << "\t expected: " << primalval[i]
396        << endl;
397      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
398         cerr << "Error: Primal value incorrect." << endl;
399         ++error_count;
400      }
401      }
402      for (int i=0; i<numcols; ++i) {
403         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
404        << "\t in solver: " << solver->getReducedCost()[i]
405        << "\t expected: " << redcost[i]
406        << endl;
407      if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
408         cerr << "Warning: Reduced cost incorrect." << endl;
409         ++warning_count;
410      }
411      }
412     
413      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
414      << "\t in solver: " << solver->getRowPrice()[2]
415        << "\t expected: " << row2marg << endl;
416    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
417       cerr << "Warning: Row price incorrect." << endl;
418       ++warning_count;
419    }
420   
421   }
422   
423   delete[] start;
424   delete[] index;
425   delete[] value;
426   delete[] collb;
427   delete[] colub;
428   delete[] obj;
429   delete[] rowlb;
430   delete[] rowub;
431}
432void semiint1(int& error_count, int& warning_count) {
433   OsiClpSolverInterface solver1;
434   
435   int numcols = 4; // s, pup, plo, x
436   int numrows = 3; // bigx, smallx, f
437   int nnz = 6;
438   CoinBigIndex *start = new int[numcols+1];
439   int* index = new int[nnz];
440   double* value = new double[nnz];
441   double *collb = new double[numcols];
442   double *colub = new double[numcols];
443   double *obj = new double[numcols];
444   double *rowlb = new double[numrows];
445   double *rowub = new double[numrows];
446   // objective
447   obj[0] = 0;  obj[1] = 1.;  obj[2] = 1;   obj[3] = 0;
448   
449   // column bounds
450   collb[0] = 0.;  colub[0] = 10.;
451   collb[1] = 0.;  colub[1] = solver1.getInfinity();
452   collb[2] = 0.;  colub[2] = solver1.getInfinity();
453   collb[3] = 0.;  colub[3] = solver1.getInfinity();
454   // matrix
455   start[0] = 0;  index[0] = 2;  value[0] =  1.;
456   start[1] = 1;  index[1] = 0;  value[1] = -1.;
457   start[2] = 2;  index[2] = 1;  value[2] =  1.;
458   start[3] = 3;  index[3] = 0;  value[3] =  1.;
459                  index[4] = 1;  value[4] =  1.;
460                  index[5] = 2;  value[5] =  1.;
461   start[4] = nnz;
462   
463   // row bounds
464   rowlb[0] = -solver1.getInfinity(); rowub[0] = 7.9;
465   rowlb[1] = 7.9;  rowub[1] = solver1.getInfinity();
466   rowlb[2] = 10.;  rowub[2] = 10.;
467   solver1.loadProblem(numcols, numrows, start, index, value, collb, colub, obj, rowlb, rowub);
468   solver1.setInteger(0); 
469   
470   for (int testcase = 0; testcase < 6; ++testcase) {
471      CbcModel model(solver1);
472      CbcMain0(model);
473     
474      double points[10];
475       points[0]=0.;
476      int nrpoints = 0;
477      double objval;
478      double primalval[4];
479      double redcost[4];
480      double row2marg;
481      redcost[2] = 1.0;
482      redcost[3] = 0.0;
483      switch(testcase) {
484         case 0:
485            nrpoints = 0; // pure integer case
486            objval = 0.1;
487            primalval[0] = 2.0;
488            primalval[1] = 0.1;
489            primalval[2] = 0.0;
490            primalval[3] = 8;
491            redcost[0] = -1.0;
492            redcost[1] =  0.0;
493            row2marg = 1.0; 
494            break;
495         case 1:
496            nrpoints = 0; // pure integer case too
497            objval = 0.1;
498            primalval[0] = 2.0;
499            primalval[1] = 0.1;
500            primalval[2] = 0.0;
501            primalval[3] = 8.0;
502            redcost[0] = -1.0;
503            redcost[1] =  0.0;
504            row2marg = 1.0; 
505            break;
506         case 2:
507             for (nrpoints=1; nrpoints<10; ++nrpoints)
508                points[nrpoints]=nrpoints+1;
509            objval = 0.1;
510            primalval[0] = 2.0;
511            primalval[1] = 0.1;
512            primalval[2] = 0.0;
513            primalval[3] = 8.0;
514            redcost[0] = -1.0;
515            redcost[1] =  0.0;
516            row2marg = 1.0; 
517            break;
518         case 3:
519               for (nrpoints=1; nrpoints<9; ++nrpoints)
520                  points[nrpoints]=nrpoints+2;
521            objval = 0.9;
522            primalval[0] = 3.0;
523            primalval[1] = 0.0;
524            primalval[2] = 0.9;
525            primalval[3] = 7.0;
526            redcost[0] = 1.0;
527            redcost[1] = 1.0;
528            row2marg = -1.0; 
529            break;
530         case 4:
531              for (nrpoints=1; nrpoints<8; ++nrpoints)
532                 points[nrpoints]=nrpoints+3;
533            objval = 1.9;
534            primalval[0] = 4.0;
535            primalval[1] = 0.0;
536            primalval[2] = 1.9;
537            primalval[3] = 6.0;
538            redcost[0] = 1.0;
539            redcost[1] = 1.0;
540            row2marg = -1.0; 
541            break;
542         case 5:
543            for (nrpoints=1; nrpoints<7; ++nrpoints)
544                   points[nrpoints]=nrpoints+4;
545            objval = 2.1;
546            primalval[0] = 0.0;
547            primalval[1] = 2.1;
548            primalval[2] = 0.0;
549            primalval[3] = 10.0;
550            redcost[0] = -1.0;
551            redcost[1] =  0.0;
552            row2marg = 1.0; 
553            break;
554      }
555      if (nrpoints) {
556         CbcObject* semiintobject = new CbcLotsize(&model, 0, nrpoints, points);
557         model.addObjects(1, &semiintobject);
558         delete semiintobject;
559      }
560     
561      cout << "\nSolving semiint1 model for integer lotsize variable being either 0 or between " << points[2] << " and 10.\n" << endl; 
562      const char * argv2[]={"gamstest_semiint1","-solve","-quit"};
563      CbcMain1(3,argv2,model);
564      cout << endl;
565      if (!model.isProvenOptimal()) {
566         cerr << "Error: Model semiint1 not solved to optimality." << endl;
567         ++error_count;
568         continue; // other tests make no sense
569      }
570      OsiSolverInterface* solver = model.solver();
571      assert(solver);
572      cout << "Objective value in model: " << model.getObjValue()
573      << "\t in solver: " << solver->getObjValue()
574      << "\t expected: " << objval << endl;
575      if (CoinAbs(model.getObjValue()-objval)>testtol || CoinAbs(solver->getObjValue()-objval)>testtol) {
576         cerr << "Error: Objective value incorrect." << endl;
577         ++error_count;
578      }
579      for (int i=0; i<numcols; ++i) {
580         cout << "Primal value variable " << i << " in model: " << model.bestSolution()[i]
581        << "\t in solver: " << solver->getColSolution()[i]
582        << "\t expected: " << primalval[i]
583        << endl;
584      if (CoinAbs(model.bestSolution()[i]-primalval[i])>testtol || CoinAbs(solver->getColSolution()[i]-primalval[i])>testtol) {
585         cerr << "Error: Primal value incorrect." << endl;
586         ++error_count;
587      }
588      }
589      for (int i=0; i<numcols; ++i) {
590         cout << "Reduced cost variable " << i << " in model: " << model.getReducedCost()[i]
591        << "\t in solver: " << solver->getReducedCost()[i]
592        << "\t expected: " << redcost[i]
593        << endl;
594      if (CoinAbs(model.getReducedCost()[i]-redcost[i])>testtol || CoinAbs(solver->getReducedCost()[i]-redcost[i])>testtol) {
595         cerr << "Warning: Reduced cost incorrect." << endl;
596         ++warning_count;
597      }
598      }
599     
600      cout << "Row 2 marginal (price) in model: " << model.getRowPrice()[2] 
601      << "\t in solver: " << solver->getRowPrice()[2]
602        << "\t expected: " << row2marg << endl;
603    if (CoinAbs(model.getRowPrice()[2]-row2marg)>testtol || CoinAbs(solver->getRowPrice()[2]-row2marg)>testtol) {
604       cerr << "Warning: Row price incorrect." << endl;
605       ++warning_count;
606    }
607   
608   }
609   
610   delete[] start;
611   delete[] index;
612   delete[] value;
613   delete[] collb;
614   delete[] colub;
615   delete[] obj;
616   delete[] rowlb;
617   delete[] rowub;
618}
Note: See TracBrowser for help on using the repository browser.