My Project
OSCoinSolver.cpp
Go to the documentation of this file.
1
20#define DEBUG
21
22#include "OSCoinSolver.h"
23#include "OSInstance.h"
24#include "OSFileUtil.h"
25#include "CoinTime.hpp"
26#include "CglPreProcess.hpp"
27#include "CglGomory.hpp"
28#include "CglSimpleRounding.hpp"
29#include "CglMixedIntegerRounding2.hpp"
30#include "CglKnapsackCover.hpp"
31#include "CglFlowCover.hpp"
32#include "CbcModel.hpp"
33#include "CbcBranchActual.hpp" //for CbcSOS
34
35#include "OsiClpSolverInterface.hpp"
36#include "OsiSymSolverInterface.hpp"
37#include "OsiVolSolverInterface.hpp"
38
39#include "OSDataStructures.h"
40#include "OSParameters.h"
41#include "OSCommonUtil.h"
42#include "OSMathUtil.h"
43
44#include<map>
45
46#include <iostream>
47#ifdef HAVE_CTIME
48# include <ctime>
49#else
50# ifdef HAVE_TIME_H
51# include <time.h>
52# else
53# error "don't have header file for time"
54# endif
55#endif
56using std::cout;
57using std::endl;
58using std::ostringstream;
59
60
61
63osiSolver(NULL),
64m_osilreader(NULL),
65m_osolreader(NULL),
66m_CoinPackedMatrix(NULL),
67cbc_argv( NULL),
68num_cbc_argv( 0),
69cpuTime( 0)
70
71{
72osrlwriter = new OSrLWriter();
73}
74
76 #ifdef DEBUG
77 cout << "inside CoinSolver destructor" << endl;
78 #endif
79 if(m_osilreader != NULL) delete m_osilreader;
80 m_osilreader = NULL;
81 if(m_osolreader != NULL) delete m_osolreader;
82 m_osolreader = NULL;
83 delete m_CoinPackedMatrix;
84 m_CoinPackedMatrix = NULL;
85 delete osiSolver;
86 if(osiSolver != NULL) osiSolver = NULL;
87 delete osrlwriter;
88 osrlwriter = NULL;
89 delete osresult;
90 osresult = NULL;
91 if(num_cbc_argv > 0){
92 int i;
93 for(i = 0; i < num_cbc_argv; i++){
94 //delete cbc_argv[ i];
95 }
96 //delete[] cbc_argv;
97 cbc_argv = NULL;
98 }
99 cout << "leaving CoinSolver destructor" << endl;
100}
101
102
104 try{
105 osresult = new OSResult();
106 if(osil.length() == 0 && osinstance == NULL) throw ErrorClass("there is no instance");
107 clock_t start, finish;
108 double duration;
109 start = clock();
110 if(osinstance == NULL){
111 m_osilreader = new OSiLReader();
113 }
114 finish = clock();
115 duration = (double) (finish - start) / CLOCKS_PER_SEC;
116 cout << "Parsing took (seconds): "<< duration << endl;
117 cout << "Start Solve with a Coin Solver" << endl;
118 // get the type of solver requested from OSoL string
119 bool solverIsDefined = false;
120 std::cout << "SOLVER NAME = " << sSolverName << std::endl;
121 if( sSolverName.find("clp") != std::string::npos){
122 solverIsDefined = true;
123 osiSolver = new OsiClpSolverInterface();
124 }
125 else{
126 if( sSolverName.find("vol") != std::string::npos){
127 #ifdef COIN_HAS_VOL
128 solverIsDefined = true;
129 osiSolver = new OsiVolSolverInterface();
130 #endif
131 }
132 else{
133 if( sSolverName.find( "cplex") != std::string::npos){
134 #ifdef COIN_HAS_CPX
135 solverIsDefined = true;
136 osiSolver = new OsiCpxSolverInterface();
137 #endif
138 }
139 else{
140 if(sSolverName.find( "glpk") != std::string::npos){
141 #ifdef COIN_HAS_GLPK
142 solverIsDefined = true;
143 osiSolver = new OsiGlpkSolverInterface();
144 #endif
145 }
146 else{
147 if(sSolverName.find( "dylp") != std::string::npos){
148 #ifdef COIN_HAS_DYLP
149 solverIsDefined = true;
150 osiSolver = new OsiDylpSolverInterface();
151 #endif
152 }
153 else{
154 if( sSolverName.find( "symphony") != std::string::npos) {
155 #ifdef COIN_HAS_SYMPHONY
156 solverIsDefined = true;
157 osiSolver = new OsiSymSolverInterface();
158 #endif
159 }
160 else{
161 // default solver is CBC
162 solverIsDefined = true;
163 osiSolver = new OsiClpSolverInterface();
164 }
165 }
166 }
167 }
168 }
169 }
170
171 if(solverIsDefined == false) throw ErrorClass("a supported solver was not defined");
172 if(osinstance->getConstraintNumber() <= 0)throw ErrorClass("Coin solver Needs Constraints");
173 if(osinstance->getVariableNumber() <= 0)throw ErrorClass("Coin solver requires decision variables");
174 if(osinstance->getObjectiveNumber() <= 0) throw ErrorClass("Coin solver needs an objective function");
175 if(osinstance->getLinearConstraintCoefficientNumber() <= 0) throw ErrorClass("Coin solver needs linear constraints");
176 if(!setCoinPackedMatrix() ) throw ErrorClass("Problem generating coin packed matrix");
181 );
182 //dataEchoCheck();
183 if(osinstance->getObjectiveNumber() == 0) throw ErrorClass("there is no objective function");
184 if( osinstance->getObjectiveMaxOrMins()[0] == "min") osiSolver->setObjSense(1.0);
185 else osiSolver->setObjSense(-1.0);
186 // set the integer variables
187 int *intIndex = NULL;
188 int i = 0;
189 int k = 0;
190 char *varType;
192 if(numOfIntVars > 0) {
193 intIndex = new int[ numOfIntVars];
194 varType = osinstance->getVariableTypes();
195 for(i = 0; i < osinstance->getVariableNumber(); i++){
196 if( (varType[i] == 'B') || (varType[i]) == 'I' ) {
197 intIndex[k++] = i;
198 }
199 }
200 osiSolver->setInteger( intIndex, numOfIntVars);
201 }
202 if(numOfIntVars > 0){
203 delete[] intIndex;
204 intIndex = NULL;
205 }
207 }
208 catch(const ErrorClass& eclass){
209 std::cout << "THERE IS AN ERROR" << std::endl;
213 throw ErrorClass( osrl) ;
214 }
215}//end buildSolverInstance()
216
217
218
220
221
222
223 // the osi maps
224 // the OsiHintParamameter Map
225 std::map<std::string, OsiHintParam> hintParamMap;
226 hintParamMap["OsiDoPresolveInInitial"] = OsiDoPresolveInInitial;
227 hintParamMap["OsiDoDualInInitial"] = OsiDoDualInInitial;
228 hintParamMap["OsiDoPresolveInResolve"] = OsiDoPresolveInResolve;
229 hintParamMap["OsiDoDualInResolve"] = OsiDoDualInResolve;
230 hintParamMap["OsiDoScale"] = OsiDoScale;
231 hintParamMap["OsiDoCrash"] = OsiDoCrash;
232 hintParamMap["OsiDoReducePrint"] = OsiDoReducePrint;
233 hintParamMap["OsiDoInBranchAndCut"] = OsiDoInBranchAndCut;
234 hintParamMap["OsiLastHintParam"] = OsiLastHintParam;
235 //
236 // the OsiHintStrength Map
237 std::map<std::string, OsiHintStrength> hintStrengthMap;
238 hintStrengthMap["OsiHintIgnore"] = OsiHintIgnore;
239 hintStrengthMap["OsiHintTry"] = OsiHintTry;
240 hintStrengthMap["OsiHintDo"] = OsiHintDo;
241 hintStrengthMap["OsiForceDo"] = OsiForceDo;
242 //
243 // the OsiStrParam Map
244 std::map<std::string, OsiStrParam> strParamMap;
245 strParamMap["OsiProbName"] = OsiProbName;
246 strParamMap["OsiSolverName"] = OsiSolverName;
247 strParamMap["OsiLastStrParam"] = OsiLastStrParam;
248 //
249 // the OsiDblParam Map
250 std::map<std::string, OsiDblParam> dblParamMap;
251 dblParamMap["OsiDualObjectiveLimit"] = OsiDualObjectiveLimit;
252 dblParamMap["OsiPrimalObjectiveLimit"] = OsiPrimalObjectiveLimit;
253 dblParamMap["OsiDualTolerance"] = OsiDualTolerance;
254 dblParamMap["OsiPrimalTolerance"] = OsiPrimalTolerance;
255 dblParamMap["OsiObjOffset"] = OsiObjOffset;
256 dblParamMap["OsiLastDblParam"] = OsiLastDblParam;
257 //
258 //
259 // the OsiIntParam Map
260 std::map<std::string, OsiIntParam> intParamMap;
261 intParamMap["OsiMaxNumIteration"] = OsiMaxNumIteration;
262 intParamMap["OsiMaxNumIterationHotStart"] = OsiMaxNumIterationHotStart;
263 intParamMap["OsiNameDiscipline"] = OsiNameDiscipline;
264 intParamMap["OsiLastIntParam"] = OsiLastIntParam;
265 //
266 //
267 // initialize low level of printing
268
269
270 /*
271 * start default settings -- these get set
272 * even when the OSOption object is NULL
273 *
274 * */
275 OsiHintStrength hintStrength = OsiHintTry; //don't want too much output
276 osiSolver->setHintParam(OsiDoReducePrint, true, hintStrength);
277 osiSolver->setDblParam(OsiObjOffset, osinstance->getObjectiveConstants()[0]);
278 /*
279 * end default settings
280 *
281 * */
282
283 //
284 try{
285 if(osoption == NULL && osol.length() > 0)
286 {
287 m_osolreader = new OSoLReader();
289 }
290
291 if(osoption != NULL){
292
293 std::cout << "number of solver options " << osoption->getNumberOfSolverOptions() << std::endl;
294 if( osoption->getNumberOfSolverOptions() <= 0) return;
295 this->bSetSolverOptions = true;
296 std::vector<SolverOption*> optionsVector;
297 //get the osi options
298 optionsVector = osoption->getSolverOptions( "osi");
299 int num_osi_options = optionsVector.size();
300 int i;
301 char *pEnd;
302 bool yesNo;
303
304 for(i = 0; i < num_osi_options; i++){
305 std::cout << "osi solver option " << optionsVector[ i]->name << std::endl;
306 if (optionsVector[ i]->type == "OsiHintStrength" ){
307 if( hintStrengthMap.find( optionsVector[ i]->name ) != hintStrengthMap.end() ){
308 hintStrength = hintStrengthMap[ optionsVector[ i]->name] ;
309 }
310 }
311 }
312 for(i = 0; i < num_osi_options; i++){
313 std::cout << "osi solver option " << optionsVector[ i]->name << std::endl;
314
315 if (optionsVector[ i]->type == "OsiHintParam" ){
316
317 if( optionsVector[ i]->value == "true" ) {
318 yesNo = true;
319 }
320 else{
321 yesNo = false;
322 }
323 if( hintParamMap.find( optionsVector[ i]->name ) != hintParamMap.end() ){
324
325 osiSolver->setHintParam( hintParamMap[ optionsVector[ i]->name] , yesNo, hintStrength);
326 }
327
328 }
329 else if(optionsVector[ i]->type == "OsiStrParam" ){
330
331 if( strParamMap.find( optionsVector[ i]->name ) != strParamMap.end() ){
332
333 osiSolver->setStrParam( strParamMap[ optionsVector[ i]->name] , optionsVector[ i]->value);
334 }
335
336 }
337 else if(optionsVector[ i]->type == "OsiDblParam" ){
338
339 if( dblParamMap.find( optionsVector[ i]->name ) != dblParamMap.end() ){
340
341 osiSolver->setDblParam( dblParamMap[ optionsVector[ i]->name] , os_strtod( optionsVector[ i]->value.c_str(), &pEnd ));
342 }
343
344 }
345 else if(optionsVector[ i]->type == "OsiIntParam" ){
346
347
348 if( intParamMap.find( optionsVector[ i]->name ) != intParamMap.end() ){
349
350 osiSolver->setIntParam( intParamMap[ optionsVector[ i]->name] , atoi( optionsVector[ i]->value.c_str() ) );
351 }
352
353 }
354 }
355
356 // treat Cbc separately to take advantage of CbcMain1()
357
358
359
360
361
362 //if(optionsVector.size() > 0) optionsVector.clear();
363// if( !optionsVector.empty() ) optionsVector.clear(); //HIG: This must eventually come out
364
365 if( sSolverName.find( "cbc") != std::string::npos) {
366 // get Cbc options
367 optionsVector = osoption->getSolverOptions( "cbc");
368 int num_cbc_options = optionsVector.size();
369 char *cstr;
370 std::string cbc_option;
371 // we are going to add a log level option -- it can be overridden
372 num_cbc_argv = optionsVector.size() + 2;
373 cbc_argv = new const char*[ num_cbc_argv];
374
375 // the first option
376 cbc_option = "OS";
377 cstr = new char [cbc_option.size() + 1];
378 strcpy (cstr, cbc_option.c_str());
379 cbc_argv[ 0] = cstr;
380
381
382 for(i = 0; i < num_cbc_options; i++){
383 std::cout << "cbc solver option " << optionsVector[ i]->name << std::endl;
384 std::cout << "cbc solver value " << optionsVector[ i]->value << std::endl;
385 if(optionsVector[ i]->value.length() > 0){
386 cbc_option = "-" + optionsVector[ i]->name +"="+optionsVector[ i]->value;
387 }
388 else{
389 cbc_option = "-" + optionsVector[ i]->name ;
390 }
391 cstr = new char [cbc_option.size() + 1];
392 strcpy (cstr, cbc_option.c_str());
393 cbc_argv[i + 1] = cstr;
394 }
395
396 // the quit option
397 cbc_option = "-quit";
398 cstr = new char [cbc_option.size() + 1];
399 strcpy (cstr, cbc_option.c_str());
400 cbc_argv[ num_cbc_argv - 1] = cstr;
401
402 }//end of cbc if
403
404 // also need to treat SYMPHONY differently
405
406
407 // set some OSI options
408 #ifdef COIN_HAS_SYMPHONY
409 //if(optionsVector.size() > 0) optionsVector.clear();
410 if( !optionsVector.empty() ) optionsVector.clear();
411 //first the number of processors -- applies only to SYMPHONY
412 if( sSolverName.find( "symphony") != std::string::npos) {
413 OsiSymSolverInterface * si =
414 dynamic_cast<OsiSymSolverInterface *>(osiSolver) ;
415
416 optionsVector = osoption->getSolverOptions( "symphony");
417 int num_sym_options = optionsVector.size();
418
419
420 for(i = 0; i < num_sym_options; i++){
421 std::cout << "symphony solver option " << optionsVector[ i]->name << std::endl;
422 std::cout << "symphony solver value " << optionsVector[ i]->value << std::endl;
423 if( optionsVector[ i]->name == "max_active_nodes"){
424 si->setSymParam("max_active_nodes", optionsVector[ i]->value);
425 }
426 else{
427 //ignore for now
428 }
429 }
430 }
431 #endif //symphony end
432
433
434 //now set initial values
435 int n,m,k;
436 if (osoption != NULL)
438 else
439 m = 0;
440#ifdef DEBUG
441 cout << "number of variables initialed: " << m << endl;
442#endif
443
444 if (m > 0)
445 {
446#ifdef DEBUG
447 cout << "get initial values " << endl;
448#endif
450 double* denseInitVarVector;
451 denseInitVarVector = new double[n];
452 bool* initialed;
453 initialed = new bool[n];
454
455 for(k = 0; k < n; k++)
456 initialed[k] = false;
457
458 InitVarValue** initVarVector = osoption->getInitVarValuesSparse();
459#ifdef DEBUG
460 cout << "done " << endl;
461#endif
462
463 double initval;
464 for(k = 0; k < m; k++)
465 { cout << "process component " << k << " -- index " << initVarVector[k]->idx << endl;
466 i = initVarVector[k]->idx;
467 if (initVarVector[k]->idx > n)
468 throw ErrorClass ("Illegal index value in variable initialization");
469
470 initval = initVarVector[k]->value;
472 { if (osinstance->instanceData->variables->var[k]->lb > initval)
473 throw ErrorClass ("Initial value outside of bounds");
474 }
475 else
477 { if (osinstance->instanceData->variables->var[k]->ub < initval)
478 throw ErrorClass ("Initial value outside of bounds");
479 }
480 else
481 { if ((osinstance->instanceData->variables->var[k]->lb > initval) ||
482 (osinstance->instanceData->variables->var[k]->ub < initval))
483 throw ErrorClass ("Initial value outside of bounds");
484 }
485
486 denseInitVarVector[initVarVector[k]->idx] = initval;
487 initialed[initVarVector[k]->idx] = true;
488 }
489
490 double default_initval;
491 default_initval = 0.0;
492
493 for(k = 0; k < n; k++)
494 { cout << "verify component " << k << endl;
495 if (!initialed[k])
497 if (osinstance->instanceData->variables->var[k]->lb <= default_initval)
498 denseInitVarVector[k] = default_initval;
499 else
500 denseInitVarVector[k] = osinstance->instanceData->variables->var[k]->lb;
501 else
503 if (osinstance->instanceData->variables->var[k]->ub >= default_initval)
504 denseInitVarVector[k] = default_initval;
505 else
506 denseInitVarVector[k] = osinstance->instanceData->variables->var[k]->ub;
507 else
508 if ((osinstance->instanceData->variables->var[k]->lb <= default_initval) &&
509 (osinstance->instanceData->variables->var[k]->ub >= default_initval))
510 denseInitVarVector[k] = default_initval;
511 else
512 if (osinstance->instanceData->variables->var[k]->lb > default_initval)
513 denseInitVarVector[k] = osinstance->instanceData->variables->var[k]->lb;
514 else
515 denseInitVarVector[k] = osinstance->instanceData->variables->var[k]->ub;
516 denseInitVarVector[k] = default_initval;
517 denseInitVarVector[k] = osinstance->instanceData->variables->var[k]->lb;
518 }
519#ifdef DEBUG
520 cout << "set initial values: " << endl;
521 for (k=0; k < n; k++)
522 cout << " " << k << ": " << denseInitVarVector[k] << endl;
523#endif
524 osiSolver->setColSolution( denseInitVarVector);
525 delete[] denseInitVarVector;
526 delete[] initialed;
527#ifdef DEBUG
528 cout << "done " << endl;
529#endif
530
531 } // end if (m > 0)
532 }// end of osoption if
533
534
535 }//end of try
536 catch(const ErrorClass& eclass){
537 std::cout << "THERE IS AN ERROR" << std::endl;
541 throw ErrorClass( osrl) ;
542 }
543}//end setSolverOptions()
544
545
548 try{
549 int maxGap = 0;
550 m_CoinPackedMatrix = new CoinPackedMatrix(
551 columnMajor, //Column or Row Major
552 columnMajor? osinstance->getConstraintNumber() : osinstance->getVariableNumber(), //Minor Dimension
553 columnMajor? osinstance->getVariableNumber() : osinstance->getConstraintNumber(), //Major Dimension
554 osinstance->getLinearConstraintCoefficientNumber(), //Number of nonzeroes
556 columnMajor? osinstance->getLinearConstraintCoefficientsInColumnMajor()->indexes : osinstance->getLinearConstraintCoefficientsInRowMajor()->indexes, //Pointer to start of minor dimension indexes -- change to allow for row storage
558 0, 0, maxGap );
559
560 return true;
561 }
562 catch(const ErrorClass& eclass){
566 throw ;
567 }
568} // end setCoinPackedMatrix
569
570void CoinSolver::solve() throw (ErrorClass) {
571 // make sure the solver instance exists
572 if( this->bCallbuildSolverInstance == false) buildSolverInstance();
573 if( this->bSetSolverOptions == false) setSolverOptions();
574
575 // first check the various solvers and see if they are of the proper problem type
577 // throw an exception if we have a solver that cannot do integer programming
578 if( sSolverName.find("clp") != std::string::npos) throw ErrorClass( "Clp cannot do integer programming");
579 if( sSolverName.find("vol") != std::string::npos) throw ErrorClass( "Vol cannot do integer programming");
580 if( sSolverName.find("dylp") != std::string::npos) throw ErrorClass( "DyLP cannot do integer programming");
581 if( sSolverName.find("ipopt") != std::string::npos) throw ErrorClass( "Ipopt cannot do integer programming");
582 }
585 throw ErrorClass( "This COIN-OR Solver is not configured for nonlinear programming");
586 }
587 // if we are throw an exception if the problem is nonlinear
588
589 // resultHeader information
590 if(osresult->setServiceName("Solved with Coin Solver: " + sSolverName) != true)
591 throw ErrorClass("OSResult error: setServiceName");
593 throw ErrorClass("OSResult error: setInstanceName");
594 //if(osresult->setJobID( osresultdata->jobID) != true)
595 // throw ErrorClass("OSResult error: setJobID");
596 //if(osresult->setGeneralMessage( osresultdata->message) != true)
597 // throw ErrorClass("OSResult error: setGeneralMessage");
598 // set basic problem parameters
600 throw ErrorClass("OSResult error: setVariableNumer");
601 if(osresult->setObjectiveNumber( 1) != true)
602 throw ErrorClass("OSResult error: setObjectiveNumber");
604 throw ErrorClass("OSResult error: setConstraintNumber");
605 if(osresult->setSolutionNumber( 1) != true)
606 throw ErrorClass("OSResult error: setSolutionNumer");
607 //
608 try{
609 double start = CoinCpuTime();
610 try{
611 if( sSolverName.find( "cbc") != std::string::npos){
612 //if( osinstance->getNumberOfIntegerVariables() + osinstance->getNumberOfBinaryVariables() > 0){
613 // just use simple branch and bound for anything but cbc
614 CbcModel model( *osiSolver);
615 CbcMain0( model);
616
617
618 // make sure we define cbc_argv if not done already when reading options
619 if(num_cbc_argv <= 0){
620 char *cstr;
621 std::string cbc_option;
622 num_cbc_argv = 4;
623 cbc_argv = new const char*[ num_cbc_argv];
624
625 // the first option
626 cbc_option = "OS";
627 cstr = new char [cbc_option.size() + 1];
628 strcpy (cstr, cbc_option.c_str());
629 cbc_argv[ 0] = cstr;
630
631
632 // the log option -- by default minimal printing
633 cbc_option = "-log=0";
634 cstr = new char [cbc_option.size() + 1];
635 strcpy (cstr, cbc_option.c_str());
636 cbc_argv[ 1] = cstr;
637
638
639 // the solve option
640 cbc_option = "-solve";
641 cstr = new char [cbc_option.size() + 1];
642 strcpy (cstr, cbc_option.c_str());
643 cbc_argv[ 2] = cstr;
644
645 // the quit option
646 cbc_option = "-quit";
647 cstr = new char [cbc_option.size() + 1];
648 strcpy (cstr, cbc_option.c_str());
649 cbc_argv[ 3] = cstr;
650
651 }
652 std::cout << "CALLING THE CBC SOLVER CBCMAIN1()" << std::endl;
653 int i;
654 for(i = 0; i < num_cbc_argv; i++){
655 std::cout << "Cbc Option: " << cbc_argv[ i] << std::endl;
656 }
657 CbcMain1( num_cbc_argv, cbc_argv, model);
658
659 //do the garbage collection on cbc_argv
660 for(i = 0; i < num_cbc_argv; i++){
661 delete[] cbc_argv[ i];
662 cbc_argv[i] = NULL;
663 }
664 delete[] cbc_argv;
665 cbc_argv = NULL;
666
667
668 // create a solver
669 OsiSolverInterface *solver = model.solver();
670 cpuTime = CoinCpuTime() - start;
671
672 writeResult( solver);
673 }
674 else{ // use other solvers
675 //if an LP just do initial solve
677 osiSolver->branchAndBound();
678 }
679 else{
680 osiSolver->initialSolve();
681 }
682 cpuTime = CoinCpuTime() - start;
683
685 }
686
687
688 }
689 catch(CoinError e){
690 std::string errmsg;
691 errmsg = "Coin Solver Error: " + e.message() + "\n" + " see method "
692 + e.methodName() + " in class " + e.className();
693 throw ErrorClass( errmsg );
694 }
695
696 }
697 catch(const ErrorClass& eclass){
701 throw ;
702 }
703} // end solve
704
705std::string CoinSolver::getCoinSolverType(std::string lcl_osol){
706// this is deprecated, but keep it around
707 try{
708 if( lcl_osol.find( "clp") != std::string::npos){
709 return "coin_solver_glpk";
710 }
711 else{
712 if( lcl_osol.find( "cbc") != std::string::npos){
713 return "coin_solver_cpx";
714 }
715 else{
716 if( lcl_osol.find( "cpx") != std::string::npos){
717 return "coin_solver_clp";
718 }
719 else{
720 if(lcl_osol.find( "glpk") != std::string::npos){
721 return "";
722 }
723 else throw ErrorClass("a supported solver was not defined");
724 }
725 }
726 }
727 }
728 catch(const ErrorClass& eclass){
732 throw ;
733 }
734} // end getCoinSolverType
735
737 int i;
738 // print out problem parameters
739 cout << "This is problem: " << osinstance->getInstanceName() << endl;
740 cout << "The problem source is: " << osinstance->getInstanceSource() << endl;
741 cout << "The problem description is: " << osinstance->getInstanceDescription() << endl;
742 cout << "number of variables = " << osinstance->getVariableNumber() << endl;
743 cout << "number of Rows = " << osinstance->getConstraintNumber() << endl;
744
745 // print out the variable information
746 if(osinstance->getVariableNumber() > 0){
747 for(i = 0; i < osinstance->getVariableNumber(); i++){
748 if(osinstance->getVariableNames() != NULL) cout << "variable Names " << osinstance->getVariableNames()[ i] << endl;
749 if(osinstance->getVariableTypes() != NULL) cout << "variable Types " << osinstance->getVariableTypes()[ i] << endl;
750 if(osinstance->getVariableLowerBounds() != NULL) cout << "variable Lower Bounds " << osinstance->getVariableLowerBounds()[ i] << endl;
751 if(osinstance->getVariableUpperBounds() != NULL) cout << "variable Upper Bounds " << osinstance->getVariableUpperBounds()[i] << endl;
752 }
753 }
754
755 // print out objective function information
757 if( osinstance->getObjectiveMaxOrMins()[0] == "min") cout << "problem is a minimization" << endl;
758 else cout << "problem is a maximization" << endl;
759 for(i = 0; i < osinstance->getVariableNumber(); i++){
760 cout << "OBJ COEFFICIENT = " << osinstance->getDenseObjectiveCoefficients()[0][i] << endl;
761 }
762 }
763 // print out constraint information
765 for(i = 0; i < osinstance->getConstraintNumber(); i++){
766 if(osinstance->getConstraintNames() != NULL) cout << "row name = " << osinstance->getConstraintNames()[i] << endl;
767 if(osinstance->getConstraintLowerBounds() != NULL) cout << "row lower bound = " << osinstance->getConstraintLowerBounds()[i] << endl;
768 if(osinstance->getConstraintUpperBounds() != NULL) cout << "row upper bound = " << osinstance->getConstraintUpperBounds()[i] << endl;
769 }
770 }
771
772 // print out linear constraint data
773 if(m_CoinPackedMatrix != NULL) m_CoinPackedMatrix->dumpMatrix();
774} // end dataEchoCheck
775
776
777
778void CoinSolver::writeResult(OsiSolverInterface *solver){
779 double *x = NULL;
780 double *y = NULL;
781 double *z = NULL;
782 int i = 0;
783 std::string *rcost = NULL;
784 int solIdx = 0;
785 int n, m;
786 std::string description = "";
788// osresult->resultHeader->time = os_dtoa_format( cpuTime);
789 osresult->addTimingInformation("cpuTime","total","second","",cpuTime);
790 if (solver->isProvenOptimal() == true){
791 osresult->setSolutionStatus(solIdx, "optimal", description);
792 /* Retrieve the solution */
793 x = new double[osinstance->getVariableNumber() ];
794 y = new double[osinstance->getConstraintNumber() ];
795 z = new double[1];
798 rcost = new std::string[ osinstance->getVariableNumber()];
799 //
800 *(z + 0) = solver->getObjValue();
801 osresult->setObjectiveValues(solIdx, z, 1);
802 for(i=0; i < osinstance->getVariableNumber(); i++){
803 *(x + i) = solver->getColSolution()[i];
804 }
805 osresult->setPrimalVariableValues(solIdx, x, n);
806 // Symphony does not get dual prices
807 if( sSolverName.find( "symphony") == std::string::npos && osinstance->getNumberOfIntegerVariables() == 0 && osinstance->getNumberOfBinaryVariables() == 0) {
808 for(i=0; i < osinstance->getConstraintNumber(); i++){
809 *(y + i) = solver->getRowPrice()[ i];
810 }
812 }
813 //
814 //
815 // now put the reduced costs into the osrl
816 // Symphony does not get reduced costs
817 if( sSolverName.find( "symphony") == std::string::npos && osinstance->getNumberOfIntegerVariables() == 0 && osinstance->getNumberOfBinaryVariables() == 0){
818 int numberOfOtherVariableResults = 1;
819 int otherIdx = 0;
820 // first set the number of Other Variable Results
821 osresult->setNumberOfOtherVariableResults(solIdx, numberOfOtherVariableResults);
822 ostringstream outStr;
823 int numberOfVar = osinstance->getVariableNumber();
824 for(i=0; i < numberOfVar; i++){
825 rcost[ i] = os_dtoa_format( solver->getReducedCost()[ i]);
826 }
827 osresult->setAnOtherVariableResult(solIdx, otherIdx, "reduced costs", "the variable reduced costs", rcost, osinstance->getVariableNumber());
828 // end of settiing reduced costs
829 }
830 }
831 else{
832 if(solver->isProvenPrimalInfeasible() == true)
833 osresult->setSolutionStatus(solIdx, "infeasible", description);
834 else
835 if(solver->isProvenDualInfeasible() == true)
836 osresult->setSolutionStatus(solIdx, "dualinfeasible", description);
837 else
838 osresult->setSolutionStatus(solIdx, "other", description);
839 }
841 if(osinstance->getVariableNumber() > 0) delete[] x;
842 x = NULL;
843 if(osinstance->getConstraintNumber()) delete[] y;
844 y = NULL;
845 delete[] z;
846 z = NULL;
847 if(osinstance->getVariableNumber() > 0){
848 delete[] rcost;
849 rcost = NULL;
850 }
851}
852
std::string os_dtoa_format(double x)
Definition: OSMathUtil.cpp:154
double os_strtod(const char *s00, char **se)
Definition: OSdtoa.cpp:2541
const char ** cbc_argv
when Cbc is the solver, these are the arguments sent to Cbc Solve
Definition: OSCoinSolver.h:134
virtual void setSolverOptions()
The implementation of the corresponding virtual function.
virtual void buildSolverInstance()
The implementation of the corresponding virtual function.
int num_cbc_argv
the number of arguments in the argument list to the Cbc Solver
Definition: OSCoinSolver.h:138
CoinPackedMatrix * m_CoinPackedMatrix
m_CoinPackedMatrix is a Coin Packed Matrix ojbect
Definition: OSCoinSolver.h:126
std::string getCoinSolverType(std::string osol_)
Get the solver type, e.g. clp or glpk.
OSiLReader * m_osilreader
m_osilreader is an OSiLReader object used to create an osinstance from an osil string if needed
Definition: OSCoinSolver.h:101
OsiSolverInterface * osiSolver
osiSolver is the osi solver object – in this case clp, glpk, cbc, cplex, symphony or dylp
Definition: OSCoinSolver.h:93
CoinSolver()
The class constructor.
~CoinSolver()
The class destructor.
OSoLReader * m_osolreader
m_osolreader is an OSoLReader object used to create an osoption from an osol string if needed
Definition: OSCoinSolver.h:107
void writeResult(OsiSolverInterface *solver)
OSrLWriter * osrlwriter
osrlwriter object used to write osrl from an OSResult object
Definition: OSCoinSolver.h:129
virtual void solve()
The implementation of the corresponding virtual function.
void dataEchoCheck()
Print out problem parameters.
bool setCoinPackedMatrix()
Create a CoinPackedMatrix.
double cpuTime
Definition: OSCoinSolver.h:140
std::string sSolverName
sSolverName is the name of the Coin solver used, e.g.
std::string osol
osol holds the options for the solver
bool bSetSolverOptions
bSetSolverOptions is set to true if setSolverOptions has been called, false otherwise
std::string osrl
osrl holds the solution or result of the model
OSInstance * osinstance
osinstance holds the problem instance in-memory as an OSInstance object
bool bCallbuildSolverInstance
bCallbuildSolverInstance is set to true if buildSolverService has been called
std::string osil
osil holds the problem instance as a std::string
OSOption * osoption
osoption holds the solver options in-memory as an OSOption object
OSResult * osresult
osresult holds the solution or result of the model in-memory as an OSResult object
used for throwing exceptions.
Definition: OSErrorClass.h:32
std::string errormsg
errormsg is the error that is causing the exception to be thrown
Definition: OSErrorClass.h:42
the InitVarValue class.
Definition: OSOption.h:1160
double value
initial value
Definition: OSOption.h:1170
int idx
variable index
Definition: OSOption.h:1164
Variables * variables
variables is a pointer to a Variables object
Definition: OSInstance.h:2185
Objectives * objectives
objectives is a pointer to a Objectives object
Definition: OSInstance.h:2188
double * getConstraintLowerBounds()
Get constraint lower bounds.
int getNumberOfQuadraticTerms()
Get the number of specified (usually nonzero) qTerms in the quadratic coefficients.
double * getVariableUpperBounds()
Get variable upper bounds.
int getNumberOfIntegerVariables()
getNumberOfIntegerVariables
int getNumberOfBinaryVariables()
getNumberOfBinaryVariables
bool getLinearConstraintCoefficientMajor()
Get whether the constraint coefficients is in column major (true) or row major (false).
std::string getInstanceDescription()
Get instance description.
std::string getInstanceSource()
Get instance source.
int getConstraintNumber()
Get number of constraints.
int getLinearConstraintCoefficientNumber()
Get number of specified (usually nonzero) linear constraint coefficient values.
SparseMatrix * getLinearConstraintCoefficientsInRowMajor()
Get linear constraint coefficients in row major.
char * getVariableTypes()
Get variable initial values.
SparseMatrix * getLinearConstraintCoefficientsInColumnMajor()
Get linear constraint coefficients in column major.
double ** getDenseObjectiveCoefficients()
getDenseObjectiveCoefficients.
InstanceData * instanceData
A pointer to an InstanceData object.
Definition: OSInstance.h:2278
int getNumberOfNonlinearExpressions()
Get number of nonlinear expressions.
double * getObjectiveConstants()
Get objective constants.
double * getVariableLowerBounds()
Get variable lower bounds.
int getVariableNumber()
Get number of variables.
std::string * getVariableNames()
Get variable names.
std::string getInstanceName()
Get instance name.
std::string * getConstraintNames()
Get constraint names.
std::string * getObjectiveMaxOrMins()
Get objective maxOrMins.
double * getConstraintUpperBounds()
Get constraint upper bounds.
int getObjectiveNumber()
Get number of objectives.
InitVarValue ** getInitVarValuesSparse()
Get the initial values associated with the variables in sparse form.
Definition: OSOption.cpp:2719
int getNumberOfInitVarValues()
Get the number of initial variable values.
Definition: OSOption.cpp:2051
std::vector< SolverOption * > getSolverOptions(std::string solver_name)
Get the options associated with a given solver.
Definition: OSOption.cpp:4508
int getNumberOfSolverOptions()
Get the number of solver options.
Definition: OSOption.cpp:2207
The Result Class.
Definition: OSResult.h:2549
bool setGeneralMessage(std::string message)
Set the general message.
bool setAnOtherVariableResult(int solIdx, int otherIdx, std::string name, std::string description, int *indexes, std::string *s, int n)
Set the [i]th optimization solution's other (non-standard/solver specific)variable-related results,...
Definition: OSResult.cpp:1080
bool setPrimalVariableValues(int solIdx, double *x, int n)
Set the [i]th optimization solution's primal variable values, where i equals the given solution index...
Definition: OSResult.cpp:1028
bool setDualVariableValues(int solIdx, double *lbValues, double *ubValues, int n)
Set the [i]th optimization solution's dual variable values, where i equals the given solution index.
Definition: OSResult.cpp:1184
bool setSolutionNumber(int number)
set the number of solutions.
Definition: OSResult.cpp:4740
bool setInstanceName(std::string instanceName)
Set instance name.
bool setNumberOfOtherVariableResults(int solIdx, int numberOfOtherVariableResults)
Set the [i]th optimization solution's other (non-standard/solver specific) variable-related results,...
Definition: OSResult.cpp:5236
bool setGeneralStatusType(std::string type)
Set the general status type, which can be: success, error, warning.
bool setObjectiveNumber(int objectiveNumber)
Set the objective number.
Definition: OSResult.cpp:4721
bool setObjectiveValues(int solIdx, double *objectiveValues, int n)
Set the [i]th optimization solution's objective values, where i equals the given solution index.
Definition: OSResult.cpp:1130
bool setServiceName(std::string serviceName)
Set service name.
bool setVariableNumber(int variableNumber)
Set the variable number.
Definition: OSResult.cpp:4712
bool setSolutionStatus(int solIdx, std::string type, std::string description)
Set the [i]th optimization solution status, where i equals the given solution index.
bool addTimingInformation(std::string type, std::string category, std::string unit, std::string description, double value)
Add timing information.
Definition: OSResult.cpp:4487
bool setConstraintNumber(int constraintNumber)
Set the constraint number.
Definition: OSResult.cpp:4731
Used to read an OSiL string.
Definition: OSiLReader.h:38
OSInstance * readOSiL(const std::string &osil)
parse the OSiL model instance.
Definition: OSiLReader.cpp:53
Used to read an OSoL string.
Definition: OSoLReader.h:38
OSOption * readOSoL(const std::string &osol)
parse the OSoL solver options.
Definition: OSoLReader.cpp:76
Take an OSResult object and write a string that validates against OSrL.
Definition: OSrLWriter.h:31
std::string writeOSrL(OSResult *theosresult)
create an osrl string from an OSResult object
Definition: OSrLWriter.cpp:45
int numberOfObjectives
numberOfObjectives is the number of objective functions in the instance
Definition: OSInstance.h:201
Objective ** obj
coef is pointer to an array of ObjCoef object pointers
Definition: OSInstance.h:205
int * indexes
indexes holds an integer array of rowIdx (or colIdx) elements in coefMatrix (AMatrix).
Definition: OSGeneral.h:258
int * starts
starts holds an integer array of start elements in coefMatrix (AMatrix), which points to the start of...
Definition: OSGeneral.h:252
double * values
values holds a double array of value elements in coefMatrix (AMatrix), which contains nonzero element...
Definition: OSGeneral.h:264
double ub
ub corresponds to the optional attribute that holds the variable upper bound.
Definition: OSInstance.h:61
double lb
lb corresponds to the optional attribute that holds the variable lower bound.
Definition: OSInstance.h:56
Variable ** var
Here we define a pointer to an array of var pointers.
Definition: OSInstance.h:97
const double OSDBL_MAX
Definition: OSParameters.h:93
This file defines the OSInstance class along with its supporting classes.