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 #ifdef COIN_HAS_CSDP
00051 #include "OSCsdpSolver.h"
00052 #endif
00053
00054 #include <stdio.h>
00055 #include <map>
00056
00057
00058 using std::endl;
00059 using std::ostringstream;
00060 using std::string;
00061 using std::map;
00062
00063
00064
00065 std::string runSolver(std::string solverName, std::string osol,
00066 OSInstance *osinstance)
00067 {
00068 DefaultSolver *solverType = NULL;
00069 try
00070 {
00071 solverType = selectSolver(solverName, osinstance);
00072 if (solverType == NULL)
00073 throw ErrorClass("No appropriate solver found");
00074
00075 solverType->osinstance = osinstance;
00076 solverType->osol = osol;
00077 solverType->buildSolverInstance();
00078 solverType->setSolverOptions();
00079 solverType->solve();
00080 std::string resultString = solverType->osrl;
00081
00082 if (solverType != NULL)
00083 delete solverType;
00084 solverType = NULL;
00085 return resultString;
00086 }
00087 catch (const ErrorClass& eclass)
00088 {
00089 if (solverType != NULL)
00090 delete solverType;
00091 solverType = NULL;
00092 throw eclass;
00093 return "";
00094 }
00095 }
00096
00097
00098 std::string runSolver(std::string solverName, OSOption* osoption,
00099 OSInstance *osinstance)
00100 {
00101 DefaultSolver *solverType = NULL;
00102 try
00103 {
00104 solverType = selectSolver(solverName, osinstance);
00105 if (solverType == NULL)
00106 throw ErrorClass("No appropriate solver found");
00107
00108 solverType->osinstance = osinstance;
00109 solverType->osoption = osoption;
00110 solverType->buildSolverInstance();
00111 solverType->setSolverOptions();
00112 solverType->solve();
00113 std::string resultString = solverType->osrl;
00114 if (solverType != NULL)
00115 delete solverType;
00116 solverType = NULL;
00117 return resultString;
00118 }
00119 catch (const ErrorClass& eclass)
00120 {
00121 if (solverType != NULL)
00122 delete solverType;
00123 solverType = NULL;
00124 throw eclass;
00125 return "";
00126 }
00127 }
00128
00129
00130 std::string runSolver(std::string solverName, std::string osol,
00131 std::string osil)
00132 {
00133 OSiLReader* osilreader = new OSiLReader();
00134 OSInstance* osinstance = new OSInstance();
00135 DefaultSolver *solverType = NULL;
00136
00137 try
00138 {
00139 osinstance = osilreader->readOSiL(osil);
00140
00141 solverType = selectSolver(solverName, osinstance);
00142 if (solverType == NULL)
00143 throw ErrorClass("No appropriate solver found");
00144
00145 solverType->osinstance = osinstance;
00146 solverType->osol = osol;
00147 solverType->buildSolverInstance();
00148 solverType->setSolverOptions();
00149 solverType->solve();
00150 std::string resultString = solverType->osrl;
00151 if (solverType != NULL)
00152 delete solverType;
00153 solverType = NULL;
00154 delete osilreader;
00155 osilreader = NULL;
00156 return resultString;
00157 }
00158 catch (const ErrorClass& eclass)
00159 {
00160 if (solverType != NULL)
00161 delete solverType;
00162 solverType = NULL;
00163 delete osilreader;
00164 osilreader = NULL;
00165 throw eclass;
00166 return "";
00167 }
00168 }
00169
00170
00171 std::string runSolver(std::string solverName, OSOption* osoption,
00172 std::string osil)
00173 {
00174 OSiLReader* osilreader = new OSiLReader();
00175 OSInstance* osinstance = new OSInstance();
00176 DefaultSolver *solverType = NULL;
00177
00178 try
00179 {
00180 osinstance = osilreader->readOSiL(osil);
00181
00182 solverType = selectSolver(solverName, osinstance);
00183 if (solverType == NULL)
00184 throw ErrorClass("No appropriate solver found");
00185
00186 solverType->osinstance = osinstance;
00187 solverType->osoption = osoption;
00188 solverType->buildSolverInstance();
00189 solverType->setSolverOptions();
00190 solverType->solve();
00191 std::string resultString = solverType->osrl;
00192 if (solverType != NULL)
00193 delete solverType;
00194 solverType = NULL;
00195 delete osilreader;
00196 osilreader = NULL;
00197 return resultString;
00198 }
00199 catch (const ErrorClass& eclass)
00200 {
00201 if (solverType != NULL)
00202 delete solverType;
00203 solverType = NULL;
00204 delete osilreader;
00205 osilreader = NULL;
00206 throw eclass;
00207 return "";
00208 }
00209 }
00210
00211
00212 DefaultSolver* selectSolver(std::string solverName, OSInstance *osinstance)
00213 {
00214 DefaultSolver *solverType = NULL;
00215 try
00216 {
00217 if (solverName == "")
00218 {
00219 if (osinstance == NULL)
00220 throw ErrorClass(
00221 "there was a NULL instance sent to buildSolver");
00222
00223
00224
00225
00226
00227
00228 if (osinstance->getNumberOfIntegerVariables()
00229 + osinstance->getNumberOfBinaryVariables() > 0)
00230 {
00231 if ((osinstance->getNumberOfNonlinearExpressions() > 0)
00232 || (osinstance->getNumberOfQuadraticTerms() > 0))
00233 {
00234 solverName = "bonmin";
00235 }
00236 else
00237 {
00238 solverName = "cbc";
00239 }
00240 }
00241 else
00242 {
00243 if ((osinstance->getNumberOfNonlinearExpressions() > 0)
00244 || (osinstance->getNumberOfQuadraticTerms() > 0))
00245 {
00246 solverName = "ipopt";
00247 }
00248 else
00249 {
00250 solverName = "clp";
00251 }
00252 }
00253 }
00254
00255
00256
00257 if (solverName.find("ipopt") != std::string::npos)
00258 {
00259
00260 #ifdef COIN_HAS_IPOPT
00261 solverType = new IpoptSolver();
00262 solverType->sSolverName = "ipopt";
00263 #else
00264 throw ErrorClass("the Ipopt solver requested is not present");
00265 #endif
00266 }
00267
00268 else if (solverName.find("lindo") != std::string::npos)
00269 {
00270
00271 #ifdef COIN_HAS_LINDO
00272 solverType = new LindoSolver();
00273 solverType->sSolverName = "lindo";
00274 #else
00275 throw ErrorClass( "the Lindo solver requested is not present");
00276 #endif
00277 }
00278
00279 else if (solverName.find("clp") != std::string::npos)
00280 {
00281 solverType = new CoinSolver();
00282 solverType->sSolverName = "clp";
00283 }
00284
00285 else if (solverName.find("cplex") != std::string::npos)
00286 {
00287 #ifdef COIN_HAS_CPX
00288 solverType = new CoinSolver();
00289 solverType->sSolverName = "cplex";
00290 #else
00291 throw ErrorClass( "the Cplex solver requested is not present");
00292 #endif
00293 }
00294
00295 else if (solverName.find("glpk") != std::string::npos)
00296 {
00297 #ifdef COIN_HAS_GLPK
00298 solverType = new CoinSolver();
00299 solverType->sSolverName = "glpk";
00300 #else
00301 throw ErrorClass( "the GLPK solver requested is not present");
00302 #endif
00303 }
00304
00305 else if (solverName.find("dylp") != std::string::npos)
00306 {
00307 #ifdef COIN_HAS_DYLP
00308 solverType = new CoinSolver();
00309 solverType->sSolverName = "dylp";
00310 #else
00311 throw ErrorClass( "the DyLP solver requested is not present");
00312 #endif
00313 }
00314
00315 else if (solverName.find("symphony") != std::string::npos)
00316 {
00317 #ifdef COIN_HAS_SYMPHONY
00318 solverType = new CoinSolver();
00319 solverType->sSolverName = "symphony";
00320 #else
00321 throw ErrorClass( "the SYMPHONY solver requested is not present");
00322 #endif
00323 }
00324
00325 else if (solverName.find("knitro") != std::string::npos)
00326 {
00327 #ifdef COIN_HAS_KNITRO
00328 solverType = new KnitroSolver();
00329 solverType->sSolverName = "knitro";
00330 #else
00331 throw ErrorClass( "the Knitro solver requested is not present");
00332 #endif
00333 }
00334
00335 else if (solverName.find("vol") != std::string::npos)
00336 {
00337 #ifdef COIN_HAS_VOL
00338 solverType = new CoinSolver();
00339 solverType->sSolverName = "vol";
00340 #else
00341 throw ErrorClass( "the Vol solver requested is not present");
00342 #endif
00343 }
00344
00345 else if (solverName.find("bonmin") != std::string::npos)
00346 {
00347
00348 #ifdef COIN_HAS_BONMIN
00349 solverType = new BonminSolver();
00350 solverType->sSolverName = "bonmin";
00351 #else
00352 throw ErrorClass( "the Bonmin solver requested is not present");
00353 #endif
00354 }
00355
00356 else if (solverName.find("couenne") != std::string::npos)
00357 {
00358
00359 #ifdef COIN_HAS_COUENNE
00360 solverType = new CouenneSolver();
00361 solverType->sSolverName = "couenne";
00362 #else
00363 throw ErrorClass( "the Couenne solver requested is not present");
00364 #endif
00365 }
00366
00367 else if (solverName.find("cbc") != std::string::npos)
00368 {
00369 solverType = new CoinSolver();
00370 solverType->sSolverName = "cbc";
00371 }
00372
00373 else if (solverName.find("gurobi") != std::string::npos)
00374 {
00375 #ifdef COIN_HAS_GRB
00376 solverType = new CoinSolver();
00377 solverType->sSolverName = "gurobi";
00378 #else
00379 throw ErrorClass( "the Gurobi solver requested is not present");
00380 #endif
00381 }
00382
00383 else if (solverName.find("mosek") != std::string::npos)
00384 {
00385 #ifdef COIN_HAS_MSK
00386 solverType = new CoinSolver();
00387 solverType->sSolverName = "mosek";
00388 #else
00389 throw ErrorClass( "the Mosek solver requested is not present");
00390 #endif
00391 }
00392
00393 else if (solverName.find("soplex") != std::string::npos)
00394 {
00395 #ifdef COIN_HAS_SOPLEX
00396 solverType = new CoinSolver();
00397 solverType->sSolverName = "soplex";
00398 #else
00399 throw ErrorClass( "the Soplex solver requested is not present");
00400 #endif
00401 }
00402
00403 else if (solverName.find("xpress") != std::string::npos)
00404 {
00405 #ifdef COIN_HAS_XPR
00406 solverType = new CoinSolver();
00407 solverType->sSolverName = "xpress";
00408 #else
00409 throw ErrorClass( "the Xpress solver requested is not present");
00410 #endif
00411 }
00412
00413 else if (solverName.find("csdp") != std::string::npos)
00414 {
00415 #ifdef COIN_HAS_CSDP
00416 solverType = new CsdpSolver();
00417 solverType->sSolverName = "csdp";
00418
00419 #else
00420 throw ErrorClass( "the CSDP solver requested is not present");
00421 #endif
00422 }
00423
00424 else
00425 {
00426 std::string errorMessage;
00427 errorMessage = "solver " + solverName + " is not supported";
00428 throw ErrorClass( errorMessage );
00429 }
00430
00431 return solverType;
00432 }
00433
00434 catch (const ErrorClass& eclass)
00435 {
00436 if (solverType != NULL)
00437 delete solverType;
00438 solverType = NULL;
00439 throw eclass;
00440 return NULL;
00441 }
00442
00443 }
00444
00445