00001
00018 #include <cppad/cppad.hpp>
00019 #include "OSConfig.h"
00020 #include "OSCoinSolver.h"
00021 #include "OSResult.h"
00022 #include "OSiLReader.h"
00023 #include "OSiLWriter.h"
00024 #include "OSrLReader.h"
00025 #include "OSrLWriter.h"
00026 #include "OSInstance.h"
00027 #include "OSFileUtil.h"
00028 #include "OSDefaultSolver.h"
00029 #include "OSWSUtil.h"
00030 #include "OSSolverAgent.h"
00031 #include "OShL.h"
00032 #include "OSErrorClass.h"
00033 #include "OSmps2osil.h"
00034 #include "OSBase64.h"
00035 #include "OSErrorClass.h"
00036 #include "CglGomory.hpp"
00037 #include "CglSimpleRounding.hpp"
00038 #include "CglKnapsackCover.hpp"
00039 #include "OSMathUtil.h"
00040 #include "CbcModel.hpp"
00041
00042 #include<iostream>
00043 using std::cout;
00044 using std::endl;
00045
00046 int main( ){
00047 WindowsErrorPopupBlocker();
00048
00049 FileUtil *fileUtil = NULL;
00050 fileUtil = new FileUtil();
00051 const char dirsep = CoinFindDirSeparator();
00052
00053 std::string dataDir;
00054 dataDir = dirsep == '/' ? "../../data/" : "..\\..\\data\\";
00055 cout << "Start Building the Model" << endl;
00056 try{
00057
00058 std::string osilFileName;
00059 osilFileName = dataDir + "osilFiles" + dirsep + "p0033.osil";
00060 std::cout << "Try to read a sample file" << std::endl;
00061 std::cout << "The file is: " ;
00062 std::cout << osilFileName << std::endl;
00063 std::string osil = fileUtil->getFileAsString( osilFileName.c_str() );
00064 OSiLReader *osilreader = NULL;
00065 osilreader = new OSiLReader();
00066 OSInstance *osinstance;
00067 osinstance = osilreader->readOSiL( osil);
00068
00069 cout << "Done writing the Model" << endl;
00070
00071 CoinSolver *solver = NULL;
00072 solver = new CoinSolver();
00073 solver->sSolverName ="cbc";
00074 solver->osinstance = osinstance;
00075 solver->buildSolverInstance();
00076 solver->osiSolver->setHintParam(OsiDoReducePrint, true, OsiHintTry);
00077 solver->osiSolver->initialSolve();
00078 cout << "Here is the initial objective value " << solver->osiSolver->getObjValue() << endl;
00079
00080 CglKnapsackCover cover;
00081 CglSimpleRounding round;
00082 CglGomory gomory;
00083 CbcModel *model = new CbcModel( *solver->osiSolver);
00084
00085
00086 model->setMaximumNodes(100000);
00087
00088 model->addCutGenerator(&gomory, 1, "Gomory");
00089 model->addCutGenerator(&cover, 1, "Cover");
00090 model->addCutGenerator(&round, 1, "Round");
00091 model->branchAndBound();
00092
00093 OSResult *osresult = new OSResult();
00094
00095 double *x = NULL;
00096 double *y = NULL;
00097 double *z = NULL;
00098
00099 std::string *rcost = NULL;
00100
00101 if(osresult->setServiceName("Solved with Coin Solver: " + solver->sSolverName) != true)
00102 throw ErrorClass("OSResult error: setServiceName");
00103 if(osresult->setInstanceName( solver->osinstance->getInstanceName()) != true)
00104 throw ErrorClass("OSResult error: setInstanceName");
00105 if(osresult->setVariableNumber( solver->osinstance->getVariableNumber()) != true)
00106 throw ErrorClass("OSResult error: setVariableNumer");
00107 if(osresult->setObjectiveNumber( 1) != true)
00108 throw ErrorClass("OSResult error: setObjectiveNumber");
00109 if(osresult->setConstraintNumber( solver->osinstance->getConstraintNumber()) != true)
00110 throw ErrorClass("OSResult error: setConstraintNumber");
00111 if(osresult->setSolutionNumber( 1) != true)
00112 throw ErrorClass("OSResult error: setSolutionNumer");
00113 int solIdx = 0;
00114 std::string description = "";
00115 osresult->setGeneralStatusType("success");
00116 std::cout << "PROVEN OPTIMAL " << model->isProvenOptimal() << std::endl;
00117 int i;
00118 if (model->isProvenOptimal() == 1){
00119 osresult->setSolutionStatus(solIdx, "optimal", description);
00120
00121 x = new double[solver->osinstance->getVariableNumber() ];
00122 y = new double[solver->osinstance->getConstraintNumber() ];
00123 z = new double[1];
00124 rcost = new std::string[ solver->osinstance->getVariableNumber()];
00125
00126 *(z + 0) = model->getObjValue();
00127 osresult->setObjectiveValuesDense(solIdx, z);
00128 for(i=0; i < solver->osinstance->getVariableNumber(); i++){
00129 *(x + i) = model->getColSolution()[i];
00130 }
00131 osresult->setPrimalVariableValuesDense(solIdx, x );
00132
00133 for(i=0; i < solver->osinstance->getConstraintNumber(); i++){
00134 *(y + i) = model->getRowPrice()[ i];
00135 }
00136 osresult->setDualVariableValuesDense(solIdx, y);
00137
00138
00139 int numberOfOtherVariableResult = 1;
00140 int otherIdx = 0;
00141
00142 osresult->setNumberOfOtherVariableResults(solIdx, numberOfOtherVariableResult);
00143
00144 ostringstream outStr;
00145 int numberOfVar = solver->osinstance->getVariableNumber();
00146 for(i=0; i < numberOfVar; i++){
00147 outStr << model->getReducedCost()[ i];
00148 rcost[ i] = outStr.str();
00149 outStr.str("");
00150 }
00151 osresult->setAnOtherVariableResultDense(solIdx, otherIdx, "reduced costs", "", "the variable reduced costs",
00152 rcost);
00153
00154 }
00155 else{
00156 if(solver->osiSolver->isProvenPrimalInfeasible() == true)
00157 osresult->setSolutionStatus(solIdx, "infeasible", description);
00158 else
00159 if(solver->osiSolver->isProvenDualInfeasible() == true)
00160 osresult->setSolutionStatus(solIdx, "dualinfeasible", description);
00161 else
00162 osresult->setSolutionStatus(solIdx, "other", description);
00163 }
00164 OSrLWriter *osrlwriter = new OSrLWriter();
00165 std::cout << osrlwriter->writeOSrL( osresult) << std::endl;
00166 if(solver->osinstance->getVariableNumber() > 0){
00167 delete[] x;
00168 x = NULL;
00169 }
00170 if(solver->osinstance->getConstraintNumber()) delete[] y;
00171 y = NULL;
00172 delete[] z;
00173 z = NULL;
00174 if(solver->osinstance->getVariableNumber() > 0){
00175 delete[] rcost;
00176 rcost = NULL;
00177 }
00178
00179 delete osresult;
00180 osresult = NULL;
00181 delete osrlwriter;
00182 osrlwriter = NULL;
00183 delete solver;
00184 solver = NULL;
00185 delete osilreader;
00186 osilreader = NULL;
00187 delete fileUtil;
00188 fileUtil = NULL;
00189 delete model;
00190 model = NULL;
00191 cout << "Done with garbage collection" << endl;
00192 return 0;
00193 }
00194 catch(const ErrorClass& eclass){
00195 delete fileUtil;
00196 std::cout << eclass.errormsg << std::endl;
00197 return 0;
00198 }
00199 }
00200