00001
00015 #include "OSRunSolver.h"
00016 #include "OSCoinSolver.h"
00017 #include "OSResult.h"
00018 #include "OSrLWriter.h"
00019 #include "OSInstance.h"
00020 #include "OSOption.h"
00021 #include "OSConfig.h"
00022 #include "OSDefaultSolver.h"
00023 #include "OSErrorClass.h"
00024
00025 #ifdef COIN_HAS_KNITRO
00026 #include "OSKnitroSolver.h"
00027 #endif
00028
00029 #ifdef COIN_HAS_LINDO
00030 #include "OSLindoSolver.h"
00031 #endif
00032
00033 #ifdef COIN_HAS_IPOPT
00034 # ifndef COIN_HAS_ASL
00035 # include "OSIpoptSolver.h"
00036 # undef COIN_HAS_ASL
00037 # else
00038 # include "OSIpoptSolver.h"
00039 # endif
00040 #endif
00041
00042 #ifdef COIN_HAS_BONMIN
00043 #include "OSBonminSolver.h"
00044 #endif
00045
00046 #ifdef COIN_HAS_COUENNE
00047 #include "OSCouenneSolver.h"
00048 #endif
00049
00050 #include <stdio.h>
00051 #include <map>
00052
00053
00054 using std::cout;
00055 using std::endl;
00056 using std::ostringstream;
00057 using std::string;
00058 using std::map;
00059
00060
00061 std::string runSolver(std::string solverName, std::string osol,
00062 OSInstance *osinstance)
00063 {
00064 DefaultSolver *solverType = NULL;
00065 solverType = selectSolver(solverName, osinstance);
00066 if (solverType == NULL)
00067 throw ErrorClass("No appropriate solver found");
00068
00069
00070 solverType->osinstance = osinstance;
00071 solverType->osol = osol;
00072 solverType->buildSolverInstance();
00073 solverType->setSolverOptions();
00074 solverType->solve();
00075 std::string resultString = solverType->osrl;
00076 if (solverType != NULL)
00077 delete solverType;
00078 solverType = NULL;
00079 return resultString;
00080 }
00081
00082
00083 std::string runSolver(std::string solverName, OSOption* osoption,
00084 OSInstance *osinstance)
00085 {
00086 DefaultSolver *solverType = NULL;
00087 solverType = selectSolver(solverName, osinstance);
00088 if (solverType == NULL)
00089 throw ErrorClass("No appropriate solver found");
00090
00091
00092 solverType->osinstance = osinstance;
00093 solverType->osoption = osoption;
00094 solverType->buildSolverInstance();
00095 solverType->setSolverOptions();
00096 solverType->solve();
00097 std::string resultString = solverType->osrl;
00098 if (solverType != NULL)
00099 delete solverType;
00100 solverType = NULL;
00101 return resultString;
00102 }
00103
00104
00105
00106 std::string runSolver(std::string solverName, std::string osol,
00107 std::string osil)
00108 {
00109 OSInstance* osinstance = new OSInstance();
00110 OSiLReader* osilreader = new OSiLReader();
00111
00112 DefaultSolver *solverType = NULL;
00113
00114 osinstance = osilreader->readOSiL(osil);
00115
00116 solverType = selectSolver(solverName, osinstance);
00117 if (solverType == NULL)
00118 throw ErrorClass("No appropriate solver found");
00119
00120
00121 solverType->osinstance = osinstance;
00122 solverType->osol = osol;
00123 solverType->buildSolverInstance();
00124 solverType->setSolverOptions();
00125 solverType->solve();
00126 std::string resultString = solverType->osrl;
00127 if (solverType != NULL)
00128 delete solverType;
00129 solverType = NULL;
00130 delete osilreader;
00131 osilreader = NULL;
00132 return resultString;
00133 }
00134
00135
00136 std::string runSolver(std::string solverName, OSOption* osoption,
00137 std::string osil)
00138 {
00139 OSInstance* osinstance = new OSInstance();
00140 OSiLReader* osilreader = new OSiLReader();
00141
00142 DefaultSolver *solverType = NULL;
00143
00144 osinstance = osilreader->readOSiL(osil);
00145
00146 solverType = selectSolver(solverName, osinstance);
00147 if (solverType == NULL)
00148 throw ErrorClass("No appropriate solver found");
00149
00150
00151 solverType->osinstance = osinstance;
00152 solverType->osoption = osoption;
00153 solverType->buildSolverInstance();
00154 solverType->setSolverOptions();
00155 solverType->solve();
00156 std::string resultString = solverType->osrl;
00157 if (solverType != NULL)
00158 delete solverType;
00159 solverType = NULL;
00160 delete osilreader;
00161 osilreader = NULL;
00162 return resultString;
00163 }
00164
00165
00166
00167 DefaultSolver* selectSolver(std::string solverName, OSInstance *osinstance)
00168 {
00169 DefaultSolver *solverType = NULL;
00170 try
00171 {
00172 if (solverName == "")
00173 {
00174 if (osinstance == NULL)
00175 throw ErrorClass(
00176 "there was a NULL instance sent to buildSolver");
00177
00178 if (osinstance->getNumberOfIntegerVariables()
00179 + osinstance->getNumberOfBinaryVariables() > 0)
00180 {
00181 if ((osinstance->getNumberOfNonlinearExpressions() > 0)
00182 || (osinstance->getNumberOfQuadraticTerms() > 0))
00183 {
00184 solverName = "bonmin";
00185 }
00186 else
00187 {
00188 solverName = "cbc";
00189 }
00190 }
00191 else
00192 {
00193 if ((osinstance->getNumberOfNonlinearExpressions() > 0)
00194 || (osinstance->getNumberOfQuadraticTerms() > 0))
00195 {
00196 solverName = "ipopt";
00197 }
00198 else
00199 {
00200 solverName = "clp";
00201 }
00202 }
00203 }
00204
00205
00206
00207 if (solverName.find("ipopt") != std::string::npos)
00208 {
00209
00210 #ifdef COIN_HAS_IPOPT
00211 solverType = new IpoptSolver();
00212 solverType->sSolverName = "ipopt";
00213 #else
00214 throw ErrorClass("the Ipopt solver requested is not present");
00215 #endif
00216 }
00217
00218 else if (solverName.find("lindo") != std::string::npos)
00219 {
00220
00221 #ifdef COIN_HAS_LINDO
00222 solverType = new LindoSolver();
00223 solverType->sSolverName = "lindo";
00224 #else
00225 throw ErrorClass( "the Lindo solver requested is not present");
00226 #endif
00227 }
00228
00229 else if (solverName.find("clp") != std::string::npos)
00230 {
00231 solverType = new CoinSolver();
00232 solverType->sSolverName = "clp";
00233 }
00234
00235 else if (solverName.find("cplex") != std::string::npos)
00236 {
00237 #ifdef COIN_HAS_CPX
00238 solverType = new CoinSolver();
00239 solverType->sSolverName = "cplex";
00240 #else
00241 throw ErrorClass( "the Cplex solver requested is not present");
00242 #endif
00243 }
00244
00245 else if (solverName.find("glpk") != std::string::npos)
00246 {
00247 #ifdef COIN_HAS_GLPK
00248 solverType = new CoinSolver();
00249 solverType->sSolverName = "glpk";
00250 #else
00251 throw ErrorClass( "the GLPK solver requested is not present");
00252 #endif
00253 }
00254
00255 else if (solverName.find("dylp") != std::string::npos)
00256 {
00257 #ifdef COIN_HAS_DYLP
00258 solverType = new CoinSolver();
00259 solverType->sSolverName = "dylp";
00260 #else
00261 throw ErrorClass( "the DyLP solver requested is not present");
00262 #endif
00263 }
00264
00265 else if (solverName.find("symphony") != std::string::npos)
00266 {
00267 #ifdef COIN_HAS_SYMPHONY
00268 solverType = new CoinSolver();
00269 solverType->sSolverName = "symphony";
00270 #else
00271 throw ErrorClass( "the SYMPHONY solver requested is not present");
00272 #endif
00273 }
00274
00275 else if (solverName.find("knitro") != std::string::npos)
00276 {
00277 #ifdef COIN_HAS_KNITRO
00278 solverType = new KnitroSolver();
00279 solverType->sSolverName = "knitro";
00280 #else
00281 throw ErrorClass( "the Knitro solver requested is not present");
00282 #endif
00283 }
00284
00285 else if (solverName.find("vol") != std::string::npos)
00286 {
00287 #ifdef COIN_HAS_VOL
00288 solverType = new CoinSolver();
00289 solverType->sSolverName = "vol";
00290 #else
00291 throw ErrorClass( "the Vol solver requested is not present");
00292 #endif
00293 }
00294
00295 else if (solverName.find("bonmin") != std::string::npos)
00296 {
00297
00298 #ifdef COIN_HAS_BONMIN
00299 solverType = new BonminSolver();
00300 solverType->sSolverName = "bonmin";
00301 #else
00302 throw ErrorClass( "the Bonmin solver requested is not present");
00303 #endif
00304 }
00305
00306 else if (solverName.find("couenne") != std::string::npos)
00307 {
00308
00309 #ifdef COIN_HAS_COUENNE
00310 solverType = new CouenneSolver();
00311 solverType->sSolverName = "couenne";
00312 #else
00313 throw ErrorClass( "the Couenne solver requested is not present");
00314 #endif
00315 }
00316
00317 else if (solverName.find("cbc") != std::string::npos)
00318 {
00319 solverType = new CoinSolver();
00320 solverType->sSolverName = "cbc";
00321 }
00322
00323 else if (solverName.find("gurobi") != std::string::npos)
00324 {
00325 #ifdef COIN_HAS_GRB
00326 solverType = new CoinSolver();
00327 solverType->sSolverName = "gurobi";
00328 #else
00329 throw ErrorClass( "the Gurobi solver requested is not present");
00330 #endif
00331 }
00332
00333 else if (solverName.find("mosek") != std::string::npos)
00334 {
00335 #ifdef COIN_HAS_MSK
00336 solverType = new CoinSolver();
00337 solverType->sSolverName = "mosek";
00338 #else
00339 throw ErrorClass( "the Mosek solver requested is not present");
00340 #endif
00341 }
00342
00343 else if (solverName.find("soplex") != std::string::npos)
00344 {
00345 #ifdef COIN_HAS_SOPLEX
00346 solverType = new CoinSolver();
00347 solverType->sSolverName = "soplex";
00348 #else
00349 throw ErrorClass( "the Soplex solver requested is not present");
00350 #endif
00351 }
00352
00353 else if (solverName.find("xpress") != std::string::npos)
00354 {
00355 #ifdef COIN_HAS_XPR
00356 solverType = new CoinSolver();
00357 solverType->sSolverName = "xpress";
00358 #else
00359 throw ErrorClass( "the Xpress solver requested is not present");
00360 #endif
00361 }
00362
00363 else
00364 {
00365 std::string errorMessage;
00366 errorMessage = "solver " + solverName + " is not supported";
00367 throw ErrorClass( errorMessage );
00368 }
00369
00370 return solverType;
00371 }
00372
00373 catch (const ErrorClass& eclass)
00374 {
00375 if (solverType != NULL)
00376 delete solverType;
00377 solverType = NULL;
00378 throw eclass;
00379 return NULL;
00380 }
00381
00382 }
00383
00384