00001
00016 #include "OSConfig.h"
00017 #include "OSCommandLine.h"
00018 #include "OSServiceMethods.h"
00019 #include "OSResult.h"
00020 #include "OSiLReader.h"
00021 #include "OSiLWriter.h"
00022 #include "OSoLReader.h"
00023 #include "OSrLReader.h"
00024 #include "OSrLWriter.h"
00025 #include "OSInstance.h"
00026 #include "OSOption.h"
00027 #include "OSoLWriter.h"
00028 #include "OSFileUtil.h"
00029 #include "OSConfig.h"
00030 #include "OSDefaultSolver.h"
00031 #include "OSWSUtil.h"
00032 #include "OSSolverAgent.h"
00033 #include "OShL.h"
00034 #include "OSErrorClass.h"
00035 #include "OSmps2osil.h"
00036 #include "OSBase64.h"
00037 #include "OSRunSolver.h"
00038
00039 #ifdef COIN_HAS_ASL
00040 #include "OSnl2osil.h"
00041 #endif
00042
00043 #ifdef COIN_HAS_GAMSUTILS
00044 #include "OSgams2osil.hpp"
00045 #endif
00046
00047 #ifdef COIN_HAS_IPOPT
00048 # ifndef COIN_HAS_ASL
00049 # include "OSIpoptSolver.h"
00050 # undef COIN_HAS_ASL
00051 # else
00052 # include "OSIpoptSolver.h"
00053 # endif
00054 #endif
00055
00056 #ifdef COIN_HAS_BONMIN
00057 #include "OSBonminSolver.h"
00058 #endif
00059
00060 #ifdef COIN_HAS_COUENNE
00061 #include "OSCouenneSolver.h"
00062 #endif
00063
00064 #ifdef COIN_HAS_LINDO
00065 #include "OSLindoSolver.h"
00066 #endif
00067
00068 #ifdef COIN_HAS_KNITRO
00069 #include "OSKnitroSolver.h"
00070 #endif
00071
00072 #include "OSOptionsStruc.h"
00073
00074 #include<stdio.h>
00075 #include <map>
00076
00077
00078 using std::cout;
00079 using std::endl;
00080 using std::ostringstream;
00081 using std::string;
00082 using std::map;
00083
00084 #define DEBUG_CL_INTERFACE
00085
00086 OSServiceMethods::OSServiceMethods(): resultString("")
00087 {
00088 #ifdef DEBUG_OSSERVICEMETHODS
00089 cout << "Inside the OSServiceMethods Constructor" << endl;
00090 #endif
00091 }
00092
00093
00094 OSServiceMethods::~OSServiceMethods()
00095 {
00096 #ifdef DEBUG_OSSERVICEMETHODS
00097 cout << "Inside the OSServiceMethods Destructor" << endl;
00098 #endif
00099 }
00100
00101
00102 OSServiceMethods::OSServiceMethods(OSCommandLine *oscommandline): resultString("")
00103 {
00104 #ifdef DEBUG_OSSERVICEMETHODS
00105 cout << "Inside the OSServiceMethods Constructor" << endl;
00106 #endif
00107
00108 FileUtil *fileUtil = NULL;
00109 OSiLReader *osilreader = NULL;
00110 OSoLReader *osolreader = NULL;
00111 OSiLWriter *osilwriter = NULL;
00112 OSoLWriter *osolwriter = NULL;
00113 OSmps2osil *mps2osil = NULL;
00114
00115 #ifdef COIN_HAS_ASL
00116
00117 OSnl2osil *nl2osil = NULL;
00118 #endif
00119
00120 #ifdef COIN_HAS_GAMSUTILS
00121 OSgams2os *gams2os = NULL;
00122 #endif
00123
00124 try
00125 {
00126 fileUtil = new FileUtil();
00127
00134 if ( (oscommandline->printModel || oscommandline->printRowNumberAsString != "" || oscommandline->osilOutputFile != "") ||
00135 ((oscommandline->serviceMethod[0] = 's') && (oscommandline->osilFile == "")))
00136 {
00142 if (oscommandline->osilFile != "")
00143 {
00144 osilreader = new OSiLReader();
00145 oscommandline->osil = fileUtil->getFileAsString(
00146 (oscommandline->osilFile).c_str());
00147 oscommandline->osinstance = osilreader->readOSiL(oscommandline->osil);
00148 if (oscommandline->osolFile != "")
00149 {
00150 oscommandline->osol = fileUtil->getFileAsString(
00151 (oscommandline->osolFile).c_str());
00152 osolreader = new OSoLReader();
00153 oscommandline->osoption = osolreader->readOSoL(oscommandline->osol);
00154 }
00155 }
00156 else if (oscommandline->mpsFile != "")
00157 {
00158 mps2osil = new OSmps2osil(oscommandline->mpsFile);
00159 mps2osil->createOSInstance();
00160 oscommandline->osinstance = mps2osil->osinstance;
00161 if (oscommandline->osolFile != "")
00162 {
00163 oscommandline->osol = fileUtil->getFileAsString(
00164 (oscommandline->osolFile).c_str());
00165 osolreader = new OSoLReader();
00166 oscommandline->osoption = osolreader->readOSoL(oscommandline->osol);
00167 }
00168 }
00169 else if (oscommandline->nlFile != "")
00170 {
00171 #ifdef COIN_HAS_ASL
00172
00173
00174
00175
00176 nl2osil = new OSnl2osil(oscommandline->nlFile);
00177 nl2osil->createOSInstance();
00178 oscommandline->osinstance = nl2osil->osinstance;
00179 #else
00180 throw ErrorClass(
00181 "nl file specified locally but ASL not present");
00182 #endif
00183 }
00184 else if (oscommandline->gamsControlFile != "")
00185 {
00186 #ifdef COIN_HAS_GAMSUTILS
00187 gams2os = new OSgams2os(oscommandline);
00188 gams2os->createOSObjects();
00189 osinstance = gams2os->osinstance;
00190 osoption = gams2os->osoption;
00191 #else
00192 throw ErrorClass(
00193 "a Gams Control specified locally but GAMSIP not present");
00194 #endif
00195 }
00196 else
00197 {
00198 if (oscommandline->osolFile != "" && oscommandline->serviceLocation != "")
00199 {
00200 oscommandline->osol = fileUtil->getFileAsString(
00201 (oscommandline->osolFile).c_str());
00202 osolreader = new OSoLReader();
00203 oscommandline->osoption = osolreader->readOSoL(oscommandline->osol);
00204 if (oscommandline->solverName != "")
00205 oscommandline->osoption->setSolverToInvoke(oscommandline->solverName);
00206 }
00207 if (oscommandline->osol.find( "<instanceLocation") == std::string::npos)
00208 throw ErrorClass(
00209 "Error: no optimization instance found");
00210 }
00211
00212
00213 if (oscommandline->solverName != "")
00214 {
00215 if (oscommandline->osol == "" && oscommandline->osolFile != "")
00216 oscommandline->osol = fileUtil->getFileAsString(
00217 (oscommandline->osolFile).c_str());
00218 oscommandline->osoption->setSolverToInvoke(oscommandline->solverName);
00219 }
00220
00221
00222 if (oscommandline->serviceLocation != "" && oscommandline->osil == "")
00223 {
00224 osilwriter= new OSiLWriter();
00225 oscommandline->osil = osilwriter->writeOSiL(oscommandline->osinstance);
00226 }
00227 if (oscommandline->serviceLocation != "" && oscommandline->osoption != NULL)
00228 {
00229 osolwriter= new OSoLWriter();
00230 oscommandline->osol = osolwriter->writeOSoL(oscommandline->osoption);
00231 }
00232 }
00233
00234
00235 if (fileUtil != NULL) delete fileUtil;
00236 fileUtil = NULL;
00237 if (osilreader != NULL) delete osilreader;
00238 osilreader = NULL;
00239 if (osolreader != NULL) delete osolreader;
00240 osolreader = NULL;
00241 if (osilwriter != NULL) delete osilwriter;
00242 osilwriter = NULL;
00243 if (osolwriter != NULL) delete osolwriter;
00244 osolwriter = NULL;
00245 if (mps2osil != NULL) delete mps2osil;
00246 mps2osil = NULL;
00247
00248 #ifdef COIN_HAS_ASL
00249
00250
00251 if (nl2osil != NULL) delete nl2osil;
00252 nl2osil = NULL;
00253 #endif
00254
00255 #ifdef COIN_HAS_GAMSUTILS
00256 if (gams2os != NULL) delete gams2os;
00257 gams2os = NULL;
00258 #endif
00259 }
00260 catch(const ErrorClass& eclass)
00261 {
00262 if (fileUtil != NULL) delete fileUtil;
00263 fileUtil = NULL;
00264 if (osilreader != NULL) delete osilreader;
00265 osilreader = NULL;
00266 if (osolreader != NULL) delete osolreader;
00267 osolreader = NULL;
00268 if (osilwriter != NULL) delete osilwriter;
00269 osilwriter = NULL;
00270 if (osolwriter != NULL) delete osolwriter;
00271 osolwriter = NULL;
00272 if (mps2osil != NULL) delete mps2osil;
00273 mps2osil = NULL;
00274
00275 #ifdef COIN_HAS_ASL
00276 if (nl2osil != NULL) delete nl2osil;
00277 nl2osil = NULL;
00278 #endif
00279
00280 #ifdef COIN_HAS_GAMSUTILS
00281 if (gams2os != NULL) delete gams2os;
00282 gams2os = NULL;
00283 #endif
00284
00285 throw ErrorClass(eclass.errormsg);
00286 }
00287 }
00288
00289 bool OSServiceMethods::executeServiceMethod(OSCommandLine *oscommandline)
00290 {
00291 OSSolverAgent* osagent = NULL;
00297 try
00298 {
00299
00300
00302 if (oscommandline->serviceLocation == "")
00303 if (oscommandline->serviceMethod == "solve")
00304
00305 int junk;
00306 else
00307 throw ErrorClass("No service location (URL) specified. Only \"solve\" is available locally");
00308
00310 else
00311 {
00312 osagent = new OSSolverAgent(oscommandline->serviceLocation);
00313
00314 if (oscommandline->serviceMethod == "solve")
00315 resultString = osagent->solve(oscommandline->osil, oscommandline->osol);
00316
00317 else if (oscommandline->serviceMethod == "send")
00318 {
00319 if (oscommandline->osol.find( "<jobID") == std::string::npos)
00320 {
00321 OSoLReader *osolreader = NULL;
00322 osolreader = new OSoLReader();
00323 OSoLWriter *osolwriter = NULL;
00324 osolwriter = new OSoLWriter();
00325 try
00326 {
00327
00328 if (oscommandline->osol != "")
00329 oscommandline->osoption = osolreader->readOSoL(oscommandline->osol);
00330 oscommandline->osoption->setJobID(osagent->getJobID(""));
00331
00332
00333 oscommandline->osol = osolwriter->writeOSoL(oscommandline->osoption);
00334
00335 delete osolreader;
00336 osolreader = NULL;
00337 delete osolwriter;
00338 osolwriter = NULL;
00339 }
00340 catch (const ErrorClass& eclass)
00341 {
00342 delete osolreader;
00343 osolreader = NULL;
00344 delete osolwriter;
00345 osolwriter = NULL;
00346 throw ErrorClass(eclass.errormsg);
00347 }
00348 }
00349 bool sendResult;
00350 sendResult = osagent->send(oscommandline->osil, oscommandline->osol);
00351 if (sendResult == false)
00352 throw ErrorClass("send() method failed");
00353 }
00354
00355 else if (oscommandline->serviceMethod == "retrieve")
00356 {
00357 if (oscommandline->osol.find( "<jobID") == std::string::npos)
00358 throw ErrorClass("there is no JobID to retrieve");
00359 resultString = osagent->retrieve(oscommandline->osol);
00360 }
00361
00362 else if (oscommandline->serviceMethod == "getJobID")
00363 resultString = osagent->getJobID(oscommandline->osol);
00364
00365 else if (oscommandline->serviceMethod == "knock")
00366 resultString = osagent->knock(oscommandline->osplInput, oscommandline->osol);
00367
00368 else if (oscommandline->serviceMethod == "kill")
00369 {
00370 if (oscommandline->osol.find( "<jobID") == std::string::npos)
00371 throw ErrorClass("there is no JobID to kill");
00372 resultString = osagent->kill(oscommandline->osol);
00373 }
00374 else
00375 throw ErrorClass("serviceMethod not recognized");
00376
00377 delete osagent;
00378 osagent = NULL;
00379 }
00380 return true;
00381 }
00382 catch (const ErrorClass& eclass)
00383 {
00384 OSResult *osresult = NULL;
00385 OSrLWriter *osrlwriter = NULL;
00386 osrlwriter = new OSrLWriter();
00387 osresult = new OSResult();
00388 osresult->setGeneralMessage(eclass.errormsg);
00389 osresult->setGeneralStatusType("error");
00390 resultString = osrlwriter->writeOSrL(osresult);
00391
00392 delete osresult;
00393 osresult = NULL;
00394 delete osrlwriter;
00395 osrlwriter = NULL;
00396
00397 if (osagent != NULL) delete osagent;
00398 osagent = NULL;
00399 return false;
00400 }
00401
00402
00403 }
00404
00405
00406 void getOSiLFromNl(OSCommandLine *oscommandline)
00407 {
00408 #if 0
00409 try
00410 {
00411 #ifdef COIN_HAS_ASL
00412 OSnl2os *nl2os = NULL;
00413 nl2os = new OSnl2os(oscommandline);
00414 nl2os->createOSObjects();
00415 OSiLWriter *osilwriter = NULL;
00416 osilwriter = new OSiLWriter();
00417 oscommandline->osil = osilwriter->writeOSiL(nl2os->osinstance);
00418 if (nl2os->osoption != NULL)
00419 {
00420 OSoLWriter *osolwriter = NULL;
00421 osolwriter = new OSoLWriter();
00422 oscommandline->osol = osolwriter->writeOSoL(nl2os->osoption);
00423 delete osolwriter;
00424 osolwriter = NULL;
00425 }
00426 delete nl2os;
00427 nl2os = NULL;
00428 delete osilwriter;
00429 osilwriter = NULL;
00430 #else
00431 throw ErrorClass(
00432 "trying to convert nl to osil without AMPL ASL configured");
00433 #endif
00434 }
00435 catch (const ErrorClass& eclass)
00436 {
00437 std::cout << eclass.errormsg << std::endl;
00438 throw ErrorClass(eclass.errormsg);
00439 }
00440 #endif
00441 }
00442
00443
00444 void getOSiLFromGams(OSCommandLine *oscommandline)
00445 {
00446 try
00447 {
00448 #ifdef COIN_HAS_GAMSIO
00449 OSgams2os *gams2os = NULL;
00450 gams2os = new OSgams2os(oscommandline);
00451 gams2os->createOSObjects();
00452 OSiLWriter *osilwriter = NULL;
00453 osilwriter = new OSiLWriter();
00454 oscommandline->osil = osilwriter->writeOSiL(gams2os->osinstance);
00455 if (gams2os->osoption != NULL)
00456 {
00457 OSoLWriter *osolwriter = NULL;
00458 osolwriter = new OSoLWriter();
00459 oscommandline->osol = osolwriter->writeOSoL(gams2os->osoption);
00460 delete osolwriter;
00461 osolwriter = NULL;
00462 }
00463 delete gams2os;
00464 gams2os = NULL;
00465 delete osilwriter;
00466 osilwriter = NULL;
00467 #else
00468 throw ErrorClass(
00469 "trying to convert Gams control file to osil without GAMSUTILS configured");
00470 #endif
00471 }
00472 catch (const ErrorClass& eclass)
00473 {
00474 std::cout << eclass.errormsg << std::endl;
00475 throw ErrorClass(eclass.errormsg);
00476 }
00477 }
00478
00479
00480 void getOSiLFromMps(OSCommandLine *oscommandline)
00481 {
00482 try
00483 {
00484 OSmps2osil *mps2osil = NULL;
00485 mps2osil = new OSmps2osil(oscommandline->mpsFile);
00486 mps2osil->createOSInstance();
00487 OSiLWriter *osilwriter = NULL;
00488 osilwriter = new OSiLWriter();
00489 oscommandline->osil = osilwriter->writeOSiL(mps2osil->osinstance);
00490 delete mps2osil;
00491 mps2osil = NULL;
00492 delete osilwriter;
00493 osilwriter = NULL;
00494 }
00495 catch (const ErrorClass& eclass)
00496 {
00497 std::cout << eclass.errormsg << std::endl;
00498 throw ErrorClass(eclass.errormsg);
00499 }
00500
00501 }
00502
00503