148 std::ostringstream outStr;
152 clock_t start, finish;
161 duration = (double) (finish - start) / CLOCKS_PER_SEC;
165 throw ErrorClass(
"Solver cannot handle multiple objectives --- please delete all but one");
178 throw ErrorClass(
"This OSSolverService was built without solver vol");
185 throw ErrorClass(
"This OSSolverService was built without solver cplex");
192 throw ErrorClass(
"This OSSolverService was built without solver gurobi");
199 throw ErrorClass(
"This OSSolverService was built without solver mosek");
203 #ifdef COIN_HAS_SOPLEX
206 throw ErrorClass(
"This OSSolverService was built without solver soplex");
213 throw ErrorClass(
"This OSSolverService was built without solver xpress");
218 osiSolver =
new OsiGlpkSolverInterface();
220 throw ErrorClass(
"This OSSolverService was built without solver glpk");
225 osiSolver =
new OsiDylpSolverInterface();
227 throw ErrorClass(
"This OSSolverService was built without solver dylp");
231 #ifdef COIN_HAS_SYMPHONY
234 throw ErrorClass(
"This OSSolverService was built without solver symphony");
246 throw ErrorClass(
"Solver selected is not supported by this version of OSSolverService");
249 if ( (
osinstance->getNumberOfNonlinearExpressions() > 0) )
251 throw ErrorClass(
"This COIN-OR Solver is not configured for nonlinear programming");
253 if ((
osinstance->getNumberOfQuadraticTerms() > 0) &&
257 throw ErrorClass(
"This COIN-OR Solver is not configured for quadratic programming");
263 throw ErrorClass(
"Clp cannot do integer programming");
265 throw ErrorClass(
"Vol cannot do integer programming");
267 throw ErrorClass(
"DyLP cannot do integer programming");
268 if(
sSolverName.find(
"soplex") != std::string::npos)
269 throw ErrorClass(
"SoPlex cannot do integer programming");
272 if(
osinstance->getNumberOfSemiIntegerVariables() +
osinstance->getNumberOfSemiContinuousVariables() > 0)
274 throw ErrorClass(
"Semi-integer and semi-continuous variables not supported");
285 if(
osinstance->getNumberOfStringVariables() > 0)
293 osinstance->getDenseObjectiveCoefficients()[0],
305 if (numOfIntVars > 0)
307 int *intIndex = NULL;
311 intIndex =
new int[ numOfIntVars];
313 for(i = 0; i <
osinstance->getVariableNumber(); i++)
315 if( (varType[i] ==
'B') || (varType[i]) ==
'I' )
320 osiSolver->setInteger( intIndex, numOfIntVars);
327 int nq =
osinstance->getNumberOfQuadraticTerms();
330 if ( (
sSolverName.find(
"clp") != std::string::npos) )
338 outStr <<
"original arrays:" << std::endl;
339 outStr <<
" var One indexes:";
340 for (
int i=0; i<nq; i++)
343 outStr <<
" var Two indexes:";
344 for (
int i=0; i<nq; i++)
347 outStr <<
" coefficients: ";
348 for (
int i=0; i<nq; i++)
356 int* colStarts =
new int[ncols+1];
357 for (
int i=0; i<=ncols; i++)
361 for (
int i=0; i<nq; i++)
364 throw ErrorClass(
"Clp solver cannot handle quadratic terms in the constraints");
370 for (
int i=0; i<ncols; i++)
371 colStarts[i+1] += colStarts[i];
379 for (
int i=0; i< ncols-1; i++)
381 swapLoc = colStarts[i+1];
382 for (
int j=colStarts[i]; j<colStarts[i+1]; j++)
386 while ( (qterms->
varOneIndexes[swapLoc] != i) && (swapLoc < nq))
402 outStr <<
"swapping locations " << j <<
" and " << swapLoc << std::endl;
404 outStr <<
"after swap:" << std::endl;
405 outStr <<
" var One indexes:";
406 for (
int i=0; i<nq; i++)
409 outStr <<
" var Two indexes:";
410 for (
int i=0; i<nq; i++)
413 outStr <<
" coefficients: ";
414 for (
int i=0; i<nq; i++)
422 throw ErrorClass(
"Sorting of quadratic terms failed in OSCoinSolver");
429 outStr <<
"terminal arrays:" << std::endl;
430 outStr <<
" var One indexes:";
431 for (
int i=0; i<nq; i++)
434 outStr <<
" var Two indexes:";
435 for (
int i=0; i<nq; i++)
438 outStr <<
" coefficients: ";
439 for (
int i=0; i<nq; i++)
447 throw ErrorClass(
"Quadratic terms not implemented yet");
457 osresult->setGeneralStatusType(
"error");
467 std::ostringstream outStr;
475 std::map<std::string, OsiHintParam> hintParamMap;
476 hintParamMap[
"OsiDoPresolveInInitial"] = OsiDoPresolveInInitial;
477 hintParamMap[
"OsiDoDualInInitial"] = OsiDoDualInInitial;
478 hintParamMap[
"OsiDoPresolveInResolve"] = OsiDoPresolveInResolve;
479 hintParamMap[
"OsiDoDualInResolve"] = OsiDoDualInResolve;
480 hintParamMap[
"OsiDoScale"] = OsiDoScale;
481 hintParamMap[
"OsiDoCrash"] = OsiDoCrash;
482 hintParamMap[
"OsiDoReducePrint"] = OsiDoReducePrint;
483 hintParamMap[
"OsiDoInBranchAndCut"] = OsiDoInBranchAndCut;
484 hintParamMap[
"OsiLastHintParam"] = OsiLastHintParam;
487 std::map<std::string, OsiHintStrength> hintStrengthMap;
488 hintStrengthMap[
"OsiHintIgnore"] = OsiHintIgnore;
489 hintStrengthMap[
"OsiHintTry"] = OsiHintTry;
490 hintStrengthMap[
"OsiHintDo"] = OsiHintDo;
491 hintStrengthMap[
"OsiForceDo"] = OsiForceDo;
494 std::map<std::string, OsiStrParam> strParamMap;
495 strParamMap[
"OsiProbName"] = OsiProbName;
496 strParamMap[
"OsiSolverName"] = OsiSolverName;
497 strParamMap[
"OsiLastStrParam"] = OsiLastStrParam;
500 std::map<std::string, OsiDblParam> dblParamMap;
501 dblParamMap[
"OsiDualObjectiveLimit"] = OsiDualObjectiveLimit;
502 dblParamMap[
"OsiPrimalObjectiveLimit"] = OsiPrimalObjectiveLimit;
503 dblParamMap[
"OsiDualTolerance"] = OsiDualTolerance;
504 dblParamMap[
"OsiPrimalTolerance"] = OsiPrimalTolerance;
505 dblParamMap[
"OsiObjOffset"] = OsiObjOffset;
506 dblParamMap[
"OsiLastDblParam"] = OsiLastDblParam;
509 std::map<std::string, OsiIntParam> intParamMap;
510 intParamMap[
"OsiMaxNumIteration"] = OsiMaxNumIteration;
511 intParamMap[
"OsiMaxNumIterationHotStart"] = OsiMaxNumIterationHotStart;
512 intParamMap[
"OsiNameDiscipline"] = OsiNameDiscipline;
513 intParamMap[
"OsiLastIntParam"] = OsiLastIntParam;
520 OsiHintStrength hintStrength = OsiHintTry;
521 osiSolver->setHintParam(OsiDoReducePrint,
true, hintStrength);
527#ifdef COIN_HAS_SYMPHONY
528 if(
sSolverName.find(
"symphony") != std::string::npos)
530 OsiSymSolverInterface * si =
531 dynamic_cast<OsiSymSolverInterface *
>(
osiSolver) ;
532 si->setSymParam(
"verbosity", -2);
557 outStr <<
"number of solver options " <<
osoption->getNumberOfSolverOptions() << std::endl;
560 if(
osoption->getNumberOfSolverOptions() > 0)
563 std::vector<SolverOption*> optionsVector;
566 optionsVector =
osoption->getSolverOptions(
"osi",
true);
567 int num_osi_options = optionsVector.size();
575 for(i = 0; i < num_osi_options; i++)
580 outStr <<
"osi solver option " << optionsVector[ i]->name << std::endl;
581 outStr <<
"osi solver value " << optionsVector[ i]->value << std::endl;
585 if (optionsVector[ i]->type ==
"OsiHintStrength" )
587 if( hintStrengthMap.find( optionsVector[ i]->name ) != hintStrengthMap.end() )
589 hintStrength = hintStrengthMap[ optionsVector[ i]->name] ;
597 for(i = 0; i < num_osi_options; i++)
602 outStr <<
"osi solver option " << optionsVector[ i]->name << std::endl;
603 outStr <<
"osi solver value " << optionsVector[ i]->value << std::endl;
607 if (optionsVector[ i]->type ==
"OsiHintParam" )
609 if( optionsVector[ i]->value ==
"true" )
617 if( hintParamMap.find( optionsVector[ i]->name ) != hintParamMap.end() )
619 osiSolver->setHintParam( hintParamMap[ optionsVector[ i]->name] , yesNo, hintStrength);
622 else if(optionsVector[ i]->type ==
"OsiStrParam" )
624 if( strParamMap.find( optionsVector[ i]->name ) != strParamMap.end() )
626 osiSolver->setStrParam( strParamMap[ optionsVector[ i]->name] , optionsVector[ i]->value);
629 else if(optionsVector[ i]->type ==
"OsiDblParam" )
631 if( dblParamMap.find( optionsVector[ i]->name ) != dblParamMap.end() )
633 osiSolver->setDblParam( dblParamMap[ optionsVector[ i]->name] ,
os_strtod( optionsVector[ i]->value.c_str(), &pEnd ));
637 else if(optionsVector[ i]->type ==
"OsiIntParam" )
639 if( intParamMap.find( optionsVector[ i]->name ) != intParamMap.end() )
641 osiSolver->setIntParam( intParamMap[ optionsVector[ i]->name] , atoi( optionsVector[ i]->value.c_str() ) );
644 else if (optionsVector[ i]->type ==
"bool" )
646 if( optionsVector[ i]->name ==
"primalSimplex" )
648 if (optionsVector[ i]->value !=
"false")
649 osiSolver->enableSimplexInterface((optionsVector[ i]->value !=
"false"));
659 if(optionsVector.size() > 0) optionsVector.clear();
660 optionsVector =
osoption->getSolverOptions(
"cbc",
true);
662 int num_cbc_options = optionsVector.size();
664 std::string cbc_option;
670 cstr =
new char [cbc_option.size() + 1];
671 strcpy (cstr, cbc_option.c_str());
674 for(i = 0; i < num_cbc_options; i++)
679 outStr <<
"cbc solver option " << optionsVector[ i]->name << std::endl;
680 outStr <<
"cbc solver value " << optionsVector[ i]->name << std::endl;
685 if(optionsVector[ i]->value.length() > 0 )
687 cbc_option =
"-" + optionsVector[ i]->name +
"="+optionsVector[ i]->value;
691 cbc_option =
"-" + optionsVector[ i]->name ;
693 cstr =
new char [cbc_option.size() + 1];
694 strcpy (cstr, cbc_option.c_str());
699 cbc_option =
"-solve";
700 cstr =
new char [cbc_option.size() + 1];
701 strcpy (cstr, cbc_option.c_str());
705 cbc_option =
"-quit";
706 cstr =
new char [cbc_option.size() + 1];
707 strcpy (cstr, cbc_option.c_str());
714 else if(
sSolverName.find(
"clp") != std::string::npos)
717 if(optionsVector.size() > 0) optionsVector.clear();
718 optionsVector =
osoption->getSolverOptions(
"clp",
true);
720 int num_cbc_options = optionsVector.size();
721 if (num_cbc_options > 0)
724 std::string cbc_option;
730 cstr =
new char [cbc_option.size() + 1];
731 strcpy (cstr, cbc_option.c_str());
734 for(i = 0; i < num_cbc_options; i++)
739 outStr <<
"clp solver option " << optionsVector[ i]->name << std::endl;
740 outStr <<
"clp solver value " << optionsVector[ i]->name << std::endl;
745 if(optionsVector[ i]->value.length() > 0 )
747 cbc_option =
"-" + optionsVector[ i]->name +
"="+optionsVector[ i]->value;
751 cbc_option =
"-" + optionsVector[ i]->name ;
753 cstr =
new char [cbc_option.size() + 1];
754 strcpy (cstr, cbc_option.c_str());
759 cbc_option =
"-solve";
760 cstr =
new char [cbc_option.size() + 1];
761 strcpy (cstr, cbc_option.c_str());
765 cbc_option =
"-quit";
766 cstr =
new char [cbc_option.size() + 1];
767 strcpy (cstr, cbc_option.c_str());
774 else if(
sSolverName.find(
"symphony") != std::string::npos)
776#ifdef COIN_HAS_SYMPHONY
777 if(optionsVector.size() > 0) optionsVector.clear();
779 OsiSymSolverInterface * si =
780 dynamic_cast<OsiSymSolverInterface *
>(
osiSolver) ;
782 optionsVector =
osoption->getSolverOptions(
"symphony",
true);
783 int num_sym_options = optionsVector.size();
784 for(i = 0; i < num_sym_options; i++)
789 outStr <<
"symphony solver option " << optionsVector[ i]->name << std::endl;
790 outStr <<
"symphony solver value " << optionsVector[ i]->name << std::endl;
793 if (optionsVector[ i]->type ==
"OsiStrParam" || optionsVector[ i]->type ==
"string")
795 if (!si->setSymParam(optionsVector[ i]->name, optionsVector[ i]->value))
796 throw ErrorClass (
"Failed to set Symphony solver option "+optionsVector[ i]->name);
798 else if (optionsVector[ i]->type ==
"OsiDblParam" || optionsVector[ i]->type ==
"double")
800 if (!si->setSymParam(optionsVector[ i]->name,
os_strtod( optionsVector[ i]->value.c_str(), &pEnd )))
801 throw ErrorClass (
"Failed to set Symphony solver option "+optionsVector[ i]->name);
803 else if (optionsVector[ i]->type ==
"OsiIntParam" || optionsVector[ i]->type ==
"integer")
805 if (!si->setSymParam(optionsVector[ i]->name, atoi( optionsVector[ i]->value.c_str() ) ))
806 throw ErrorClass (
"Failed to set Symphony solver option "+optionsVector[ i]->name);
816 m =
osoption->getNumberOfInitVarValues();
822 outStr <<
"number of variables initialed: " << m << std::endl;
832 double* denseInitVarVector;
833 denseInitVarVector =
new double[n];
835 initialed =
new bool[n];
837 for(k = 0; k < n; k++)
838 initialed[k] =
false;
846 for(k = 0; k < m; k++)
848 i = initVarVector[k]->
idx;
849 if (initVarVector[k]->idx >= n)
850 throw ErrorClass (
"Illegal index value in variable initialization");
852 initval = initVarVector[k]->
value;
855 if (
osinstance->instanceData->variables->var[k]->lb > initval)
856 throw ErrorClass (
"Initial value outside of bounds");
860 if (
osinstance->instanceData->variables->var[k]->ub < initval)
861 throw ErrorClass (
"Initial value outside of bounds");
865 if ((
osinstance->instanceData->variables->var[k]->lb > initval) ||
866 (
osinstance->instanceData->variables->var[k]->ub < initval))
867 throw ErrorClass (
"Initial value outside of bounds");
870 denseInitVarVector[initVarVector[k]->
idx] = initval;
871 initialed[initVarVector[k]->idx] =
true;
874 double default_initval;
875 default_initval = 0.0;
877 for(k = 0; k < n; k++)
882 if (
osinstance->instanceData->variables->var[k]->lb <= default_initval)
883 denseInitVarVector[k] = default_initval;
885 denseInitVarVector[k] =
osinstance->instanceData->variables->var[k]->lb;
887 if (
osinstance->instanceData->variables->var[k]->ub >= default_initval)
888 denseInitVarVector[k] = default_initval;
890 denseInitVarVector[k] =
osinstance->instanceData->variables->var[k]->ub;
891 else if ((
osinstance->instanceData->variables->var[k]->lb <= default_initval) &&
892 (
osinstance->instanceData->variables->var[k]->ub >= default_initval))
893 denseInitVarVector[k] = default_initval;
894 else if (
osinstance->instanceData->variables->var[k]->lb > default_initval)
895 denseInitVarVector[k] =
osinstance->instanceData->variables->var[k]->lb;
897 denseInitVarVector[k] =
osinstance->instanceData->variables->var[k]->ub;
905 outStr <<
"set initial values: " << std::endl;
906 for (k=0; k < n; k++)
907 outStr <<
" " << k <<
": " << denseInitVarVector[k] << std::endl;
910 osiSolver->setColSolution( denseInitVarVector);
911 delete[] denseInitVarVector;
926 ((
osoption->optimization->variables != NULL &&
927 osoption->optimization->variables->initialBasisStatus != NULL) ||
928 (
osoption->optimization->constraints != NULL &&
929 osoption->optimization->constraints->initialBasisStatus != NULL)) )
943 int nsBas,naBas,nsUpp,naUpp,nsLow,naLow,nvar,ncon;
945 CoinWarmStartBasis* warmstart =
new CoinWarmStartBasis();
948 warmstart->setSize(nvar, ncon);
951 if (
osoption->optimization->variables != NULL &&
952 osoption->optimization->variables->initialBasisStatus != NULL )
964 if (
osoption->optimization->constraints != NULL &&
965 osoption->optimization->constraints->initialBasisStatus != NULL )
981 tmpBas =
new int[nsBas];
983 for (
int i=0; i<nsBas; i++)
984 warmstart->setStructStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x01);
989 tmpBas =
new int[naBas];
991 for (
int i=0; i<naBas; i++)
992 warmstart->setArtifStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x01);
998 tmpBas =
new int[nsUpp];
1000 for (
int i=0; i<nsUpp; i++)
1001 warmstart->setStructStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x02);
1006 tmpBas =
new int[naUpp];
1008 for (
int i=0; i<naUpp; i++)
1009 warmstart->setArtifStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x02);
1015 tmpBas =
new int[nsLow];
1017 for (
int i=0; i<nsLow; i++)
1018 warmstart->setStructStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x03);
1023 tmpBas =
new int[naLow];
1025 for (
int i=0; i<naLow; i++)
1026 warmstart->setArtifStatus(tmpBas[i], (CoinWarmStartBasis::Status)0x03);
1047 osresult->setGeneralStatusType(
"error");
1370 std::vector<int> freeVars;
1371 std::vector<int> basicVars;
1372 std::vector<int> nonBasicLower;
1373 std::vector<int> nonBasicUpper;
1374 std::vector<int>::iterator vit;
1376 basisIdx =
new int*[ 4];
1379 int numberOfVar = solver->getNumCols();
1380 int numberOfCon = solver->getNumRows();
1381 int numOfIntVars =
osinstance->getNumberOfIntegerVariables() +
osinstance->getNumberOfBinaryVariables();
1382 std::string *rcost = NULL;
1383 if ( numberOfVar > 0 ) x =
new double[numberOfVar];
1384 if ( numberOfCon > 0 ) y =
new double[numberOfCon ];
1385 if ( numberOfVar > 0 ) idx =
new int[ numberOfVar];
1386 if ( numberOfVar > 0 ) rcost =
new std::string[numberOfVar];
1390 bool supportsBasis =
false;
1391 if ( (
sSolverName.find(
"clp") != std::string::npos)
1392 || (
sSolverName.find(
"cbc") != std::string::npos)
1393 || (
sSolverName.find(
"cplex") != std::string::npos)
1394 || (
sSolverName.find(
"gurobi") != std::string::npos) )
1396 if (numOfIntVars == 0)
1398 if (numberOfVar > 0) cbasis =
new int[numberOfVar];
1399 if (numberOfCon > 0) rbasis =
new int[numberOfCon];
1400 supportsBasis =
true;
1406 int numberOfOtherVariableResults = 1;
1408 std::string description =
"";
1412 osresult->setGeneralStatusType(
"normal");
1416 if (solver->isProvenOptimal() ==
true)
1418 osresult->setSolutionStatus(solIdx,
"optimal", description);
1419 if ( supportsBasis )
1421 solver->getBasisStatus( cbasis, rbasis);
1427 if(solver->isProvenPrimalInfeasible() ==
true)
1428 osresult->setSolutionStatus(solIdx,
"infeasible",
"the problem is primal infeasible");
1431 if(solver->isProvenDualInfeasible() ==
true)
1432 osresult->setSolutionStatus(solIdx,
"unbounded",
"the problem is unbounded");
1435 if(solver->isPrimalObjectiveLimitReached() ==
true)
1437 osresult->setSolutionStatus(solIdx,
"other",
"primal objective limit reached");
1438 if ( supportsBasis )
1440 solver->getBasisStatus( cbasis, rbasis);
1445 if(solver->isDualObjectiveLimitReached() ==
true)
1447 osresult->setSolutionStatus(solIdx,
"other",
"dual objective limit reached");
1448 if ( supportsBasis )
1450 solver->getBasisStatus( cbasis, rbasis);
1455 if(solver->isIterationLimitReached() ==
true)
1457 osresult->setSolutionStatus(solIdx,
"other",
"iteration limit reached");
1458 if ( supportsBasis )
1460 solver->getBasisStatus( cbasis, rbasis);
1465 if(solver->isAbandoned() ==
true)
1466 osresult->setSolutionStatus(solIdx,
"other",
"there are numerical difficulties");
1468 if( solver->getNumCols() == 0)
osresult->setSolutionMessage(solIdx,
"Warning: this problem has zero decision variables!");
1470 osresult->setSolutionStatus(solIdx,
"other", description);
1480 *(z + 0) = solver->getObjValue();
1482 osresult->setObjectiveValuesDense(solIdx, z);
1484 for(i=0; i < numberOfVar; i++)
1486 *(x + i) = solver->getColSolution()[i];
1490 if( (cbasis != NULL) && (solver->isProvenOptimal() ==
true) )
1492 switch (cbasis[ i] )
1497 freeVars.push_back( i);
1504 basicVars.push_back( i);
1511 nonBasicUpper.push_back( i );
1518 nonBasicLower.push_back( i) ;
1522 throw ErrorClass(
"unknown result from Osi getBasisStatus when getting variable basis status");
1531 if(freeVars.size() > 0)
1536 basisIdx[ 0] =
new int[ freeVars.size()];
1538 for(vit = freeVars.begin(); vit < freeVars.end(); vit++)
1540 basisIdx[0][ kount++] = *vit;
1544 delete[] basisIdx[ 0];
1548 if(basicVars.size() > 0)
1552 basisIdx[ 1] =
new int[ basicVars.size()];
1554 for(vit = basicVars.begin(); vit < basicVars.end(); vit++)
1556 basisIdx[1][ kount++] = *vit;
1560 delete[] basisIdx[ 1];
1564 if(nonBasicUpper.size() > 0)
1568 basisIdx[ 2] =
new int[ nonBasicUpper.size()];
1570 for(vit = nonBasicUpper.begin(); vit < nonBasicUpper.end(); vit++)
1572 basisIdx[2][ kount++] = *vit;
1576 delete[] basisIdx[ 2];
1577 nonBasicUpper.clear();
1581 if(nonBasicLower.size() > 0)
1585 basisIdx[ 3] =
new int[ nonBasicLower.size()];
1587 for(vit = nonBasicLower.begin(); vit < nonBasicLower.end(); vit++)
1589 basisIdx[3][ kount++] = *vit;
1593 delete[] basisIdx[ 3];
1594 nonBasicLower.clear();
1598 osresult->setPrimalVariableValuesDense(solIdx, x);
1600 if(
sSolverName.find(
"symphony") == std::string::npos &&
osinstance->getNumberOfIntegerVariables() == 0 &&
osinstance->getNumberOfBinaryVariables() == 0)
1602 for(i = 0; i < numberOfCon; i++)
1604 *(y + i) = solver->getRowPrice()[ i];
1607 if((rbasis != NULL) && (solver->isProvenOptimal() ==
true) )
1609 switch (rbasis[ i] )
1614 freeVars.push_back( i);
1621 basicVars.push_back( i);
1628 nonBasicUpper.push_back( i );
1635 nonBasicLower.push_back( i) ;
1639 throw ErrorClass(
"unknown result from Osi getBasisStatus when getting row basis status");
1648 osresult->setDualVariableValuesDense(solIdx, y);
1652 if(freeVars.size() > 0)
1656 basisIdx[ 0] =
new int[ freeVars.size()];
1658 for(vit = freeVars.begin(); vit < freeVars.end(); vit++)
1660 basisIdx[0][ kount++] = *vit;
1664 delete[] basisIdx[ 0];
1668 if(basicVars.size() > 0)
1672 basisIdx[ 1] =
new int[ basicVars.size()];
1674 for(vit = basicVars.begin(); vit < basicVars.end(); vit++)
1676 basisIdx[1][ kount++] = *vit;
1680 delete[] basisIdx[ 1];
1684 if(nonBasicUpper.size() > 0)
1689 basisIdx[ 2] =
new int[ nonBasicUpper.size()];
1691 for(vit = nonBasicUpper.begin(); vit < nonBasicUpper.end(); vit++)
1693 basisIdx[2][ kount++] = *vit;
1697 delete[] basisIdx[ 2];
1698 nonBasicUpper.clear();
1701 if(nonBasicLower.size() > 0)
1705 basisIdx[ 3] =
new int[ nonBasicLower.size()];
1707 for(vit = nonBasicLower.begin(); vit < nonBasicLower.end(); vit++)
1709 basisIdx[3][ kount++] = *vit;
1713 delete[] basisIdx[ 3];
1714 nonBasicLower.clear();
1725 if(
sSolverName.find(
"symphony") == std::string::npos &&
osinstance->getNumberOfIntegerVariables() == 0 &&
osinstance->getNumberOfBinaryVariables() == 0)
1728 if(numOfIntVars <= 0)
1730 osresult->setNumberOfOtherVariableResults(solIdx, numberOfOtherVariableResults);
1731 for(i=0; i < numberOfVar; i++)
1735 osresult->setAnOtherVariableResultSparse(solIdx, otherIdx,
"reduced_costs",
"",
"the variable reduced costs", idx, rcost, solver->getNumCols(),
"",
"double",
"");
1741 temp << solver->getIterationCount();
1742 if (!
osresult->setAnOtherSolutionResult(0,
"iterations",temp.str(),
"",
"",0,NULL))
1743 throw ErrorClass(
"error setting iteration count");
1835 osresult->setGeneralStatusType(
"error");
1849 std::string *rcost = NULL;
1851 if( model->getNumCols() > 0 ) x =
new double[model->getNumCols() ];
1852 if( model->getNumRows() > 0 ) y =
new double[model->getNumRows() ];
1853 if( model->getNumCols() > 0 ) idx =
new int[ model->getNumCols() ];
1855 if( model->getNumCols() > 0 ) rcost =
new std::string[ model->getNumCols()];
1857 int numberOfOtherVariableResults = 1;
1859 int numberOfVar = model->getNumCols();
1860 int numOfIntVars =
osinstance->getNumberOfIntegerVariables() +
osinstance->getNumberOfBinaryVariables();
1863 std::string description =
"";
1864 osresult->setGeneralStatusType(
"normal");
1870 int numberIntegerInfeasibilities = 0;
1871 int numberObjectInfeasibilities = 0;
1872 bool isFeasible =
false;
1873 isFeasible = model->feasibleSolution( numberIntegerInfeasibilities,
1874 numberObjectInfeasibilities);
1875 std::string statusMsg;
1876 if(isFeasible ==
true)
1878 statusMsg =
"feasible";
1882 statusMsg =
"infeasible";
1886 if (model->isProvenOptimal() ==
true )
1888 osresult->setSolutionStatus(solIdx,
"optimal", description);
1892 if(model->isProvenInfeasible() ==
true)
1893 osresult->setSolutionStatus(solIdx,
"infeasible",
"the integer program is infeasible");
1896 if(model->isProvenDualInfeasible() ==
true)
1897 osresult->setSolutionStatus(solIdx,
"infeasible",
"the continuous relaxation is dual infeasible");
1900 if(model->isContinuousUnbounded() ==
true)
1901 osresult->setSolutionStatus(solIdx, statusMsg,
"the continuous relaxation is unbounded");
1904 if(model->isNodeLimitReached() ==
true)
1905 osresult->setSolutionStatus(solIdx, statusMsg,
"node limit reached");
1908 if(model->isSecondsLimitReached() ==
true)
1909 osresult->setSolutionStatus(solIdx, statusMsg,
"time limit reached");
1912 if(model->isSolutionLimitReached() ==
true)
1913 osresult->setSolutionStatus(solIdx, statusMsg,
"solution limit reached");
1916 if(model->isAbandoned() ==
true)
1917 osresult->setSolutionStatus(solIdx, statusMsg,
"there are numerical difficulties");
1919 osresult->setSolutionStatus(solIdx, statusMsg,
"unknown");
1929 if(numOfIntVars > 0) *(z + 0) = model->getObjValue();
1930 osresult->setObjectiveValuesDense(solIdx, z);
1931 for(i=0; i < model->getNumCols(); i++)
1933 *(x + i) = model->getColSolution()[i];
1936 osresult->setPrimalVariableValuesDense(solIdx, x);
1937 for(i=0; i < model->getNumRows(); i++)
1939 *(y + i) = model->getRowPrice()[ i];
1941 if(numOfIntVars <= 0)
osresult->setDualVariableValuesDense(solIdx, y);
1944 if(numOfIntVars <= 0)
1946 osresult->setNumberOfOtherVariableResults(solIdx, numberOfOtherVariableResults);
1947 for(i=0; i < numberOfVar; i++)
1951 osresult->setAnOtherVariableResultSparse(solIdx, otherIdx,
"reduced_costs",
"",
"the variable reduced costs", idx, rcost, model->getNumCols());
1956 if(model->getNumCols() > 0)
delete[] x;
1958 if(model->getNumRows() > 0)
delete[] y;
1962 if(model->getNumCols() > 0)