00001
00060 #include "OSConfig.h"
00061 #include "OSnl2OS.h"
00062 #include "OSosrl2ampl.h"
00063 #include "OSiLReader.h"
00064 #include "OSiLWriter.h"
00065 #include "OSoLReader.h"
00066 #include "OSoLWriter.h"
00067 #include "OSrLReader.h"
00068 #include "OSrLWriter.h"
00069 #include "OSInstance.h"
00070 #include "OSOption.h"
00071 #include "OSResult.h"
00072 #include "OSOutput.h"
00073
00074 #include "OSDefaultSolver.h"
00075 #include "OSCoinSolver.h"
00076
00077 #ifdef COIN_HAS_LINDO
00078 # include "OSLindoSolver.h"
00079 #endif
00080
00081 #ifdef COIN_HAS_IPOPT
00082 # include "OSIpoptSolver.h"
00083 #endif
00084
00085 #ifdef COIN_HAS_BONMIN
00086 # include "OSBonminSolver.h"
00087 #endif
00088
00089 #ifdef COIN_HAS_COUENNE
00090 # include "OSCouenneSolver.h"
00091 #endif
00092
00093 #include "OSFileUtil.h"
00094 #include "OSSolverAgent.h"
00095 #include "OShL.h"
00096 #include "OSErrorClass.h"
00097 #include "CoinError.hpp"
00098 #include "OSCommandLine.h"
00099 #include "OSRunSolver.h"
00100 #include <sstream>
00101
00102 #ifdef HAVE_CSTRING
00103 # include <cstring>
00104 #else
00105 # ifdef HAVE_STRING_H
00106 # include <string.h>
00107 # else
00108 # error "don't have header file for string"
00109 # endif
00110 #endif
00111
00112 #include "CoinError.hpp"
00113 #include "CoinHelperFunctions.hpp"
00114
00115
00116 #include <iostream>
00117
00118 #include <asl.h>
00119
00120
00121
00122
00123 #define MAXCHARS 5000
00124
00125 typedef struct yy_buffer_state *YY_BUFFER_STATE;
00126 YY_BUFFER_STATE osss_scan_string(const char* osss, void* scanner );
00127
00128 void setyyextra(OSCommandLine *oscommandline, void* scanner);
00129 int ossslex(void* scanner );
00130 int ossslex_init(void** ptr);
00131 int ossslex_destroy (void* scanner );
00132
00133
00134 using std::cerr;
00135 using std::cout;
00136 using std::endl;
00137 using std::ostringstream;
00138
00139 void getAmplClientOptions(char *options, std::string *solverName,
00140 std::string *optionFile, std::string *serviceLocation);
00141
00142
00143
00144 int main(int argc, char **argv)
00145 {
00146 WindowsErrorPopupBlocker();
00147 char *stub;
00148 std::ostringstream outStr;
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 char *amplclient_options = NULL;
00162 DefaultSolver *solverType = NULL;
00163 std::string sSolverName = "";
00164 std::string osolFileName = "";
00165 std::string osol = "";
00166 std::string serviceLocation = "";
00167 std::string nlfile = "";
00168
00169 #ifndef NDEBUG
00170 outStr.str("");
00171 outStr.clear();
00172 outStr << "Here is the command line:";
00173 for (int i=0; i<argc; i++) outStr << " " << argv[i];
00174 outStr << endl;
00175 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00176 #endif
00177
00178 stub = argv[1];
00179
00180 amplclient_options = getenv("OSAmplClient_options");
00181 if( amplclient_options != NULL)
00182 {
00183 outStr.str("");
00184 outStr.clear();
00185 outStr << "HERE ARE THE AMPLCLIENT OPTIONS " << amplclient_options << endl;
00186 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_info, outStr.str());
00187 getAmplClientOptions(amplclient_options, &sSolverName, &osolFileName, &serviceLocation);
00188 }
00189
00190
00191
00192 unsigned int k;
00193 for(k = 0; k < sSolverName.length(); k++)
00194 {
00195 sSolverName[ k] = tolower( sSolverName[ k]);
00196 }
00197
00198
00199
00200 if(osolFileName.size() > 0)
00201 {
00202 FileUtil *fileUtil;
00203 fileUtil = new FileUtil();
00204 osol = fileUtil->getFileAsString( osolFileName.c_str() );
00205 delete fileUtil;
00206 }
00207
00208
00209
00210 ASL *cw, *rw, *asl;
00211 cw = ASL_alloc(ASL_read_fg);
00212 rw = ASL_alloc(ASL_read_fg);
00213 asl = cw;
00214
00215 jac0dim((char*)stub, (fint)strlen(stub));
00216
00217 OSnl2OS *nl2OS = new OSnl2OS(cw, rw, asl);
00218
00219
00220
00225 try
00226 {
00227 nl2OS->readNl(stub);
00228 nl2OS->setOsol(osol);
00229 nl2OS->createOSObjects() ;
00230 }
00231 catch(const ErrorClass& eclass)
00232 {
00233 outStr.str("");
00234 outStr.clear();
00235 outStr << "Error detected: " << eclass.errormsg << std::endl;
00236 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_error, outStr.str());
00237 return 0;
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 #ifndef NDEBUG
00250 OSiLWriter *osilwriter = NULL;
00251 osilwriter = new OSiLWriter();
00252 osilwriter->m_bWhiteSpace = true;
00253 std::string sModelInstanceName = "modelInstance.osil";
00254 FileUtil *fileUtil;
00255 fileUtil = new FileUtil();
00256 fileUtil->writeFileFromString(sModelInstanceName, osilwriter->writeOSiL(nl2OS->osinstance) );
00257 delete fileUtil;
00258 fileUtil = NULL;
00259 delete osilwriter;
00260 osilwriter = NULL;
00261 #endif
00262
00263
00264 if (nl2OS->osoption != NULL)
00265 {
00266
00267
00268
00269 #ifndef NDEBUG
00270 OSoLWriter *osolwriter = NULL;
00271 osolwriter = new OSoLWriter();
00272
00273 std::string sModelOptionName = "modelOptions.osol";
00274 fileUtil = new FileUtil();
00275 fileUtil->writeFileFromString(sModelOptionName, osolwriter->writeOSoL(nl2OS->osoption) );
00276 delete fileUtil;
00277 fileUtil = NULL;
00278 delete osolwriter;
00279 osolwriter = NULL;
00280 #endif
00281 }
00282
00283 OSrLReader *osrlreader = NULL;
00284 OSrLWriter *osrlwriter;
00285 osrlwriter = new OSrLWriter();
00286 OSResult *osresult = NULL;
00287 std::string osrl = "";
00288
00289 bool writeOK;
00290 OSosrl2ampl *solWriter = new OSosrl2ampl();
00291
00292 try
00293 {
00294 if(serviceLocation.size() == 0 )
00295 {
00296
00297 if (nl2OS->osoption == NULL)
00298 osrl = runSolver(sSolverName, osol, nl2OS->osinstance);
00299 else
00300 osrl = runSolver(sSolverName, nl2OS->osoption, nl2OS->osinstance);
00301 }
00302
00303
00304 else
00305 {
00306 OSSolverAgent* osagent = NULL;
00307 OSiLWriter *osilwriter = NULL;
00308 osilwriter = new OSiLWriter();
00309 std::string osil = osilwriter->writeOSiL(nl2OS->osinstance);
00311
00312
00313
00314
00315
00317
00318 osagent = new OSSolverAgent( serviceLocation);
00319 outStr.str("");
00320 outStr.clear();
00321 outStr << "Place remote synchronous call: " << serviceLocation << endl << endl << endl;
00322 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_info, outStr.str());
00323
00324 osrl = osagent->solve(osil, osol);
00325 if (osrl.size() == 0) throw ErrorClass("Nothing was returned from the server, please check service address");
00326 delete osilwriter;
00327 delete osagent;
00328 }
00329 }
00330 catch(const ErrorClass& eclass)
00331 {
00332 osresult = new OSResult();
00333 osresult->setGeneralMessage( eclass.errormsg);
00334 osresult->setGeneralStatusType( "error");
00335 osrl = osrlwriter->writeOSrL( osresult);
00336 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_error, osrl);
00337
00338
00339
00340 writeOK = solWriter->writeSolFile(osrl, nl2OS->getASL("asl"));
00341
00342 delete solWriter;
00343 solWriter = NULL;
00344
00345 delete osresult;
00346 osresult = NULL;
00347 return 0;
00348 }
00349
00350 try
00351 {
00352
00353 std::string sResultFileName = "solutionResult.osrl";
00354 FileUtil *fileUtil;
00355 fileUtil = new FileUtil();
00356 fileUtil->writeFileFromString(sResultFileName, osrl);
00357 delete fileUtil;
00358 std::string::size_type pos1 = osrl.find( "error");
00359 if(pos1 == std::string::npos)
00360 {
00361 std::string sReport = "model was solved";
00362 osrlreader = new OSrLReader();
00363 osresult = osrlreader->readOSrL( osrl);
00364
00365 writeOK = solWriter->writeSolFile(osrl, nl2OS->getASL("asl"));
00366
00367 delete osrlreader;
00368 osrlreader = NULL;
00369 }
00370 else
00371 {
00372 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_error, osrl);
00373 writeOK = solWriter->writeSolFile(osrl, nl2OS->getASL("asl"));
00374 }
00375 }
00376 catch(const ErrorClass& eclass)
00377 {
00378 outStr.str("");
00379 outStr.clear();
00380 outStr << "There was an error parsing the OSrL string" << endl << eclass.errormsg << endl << endl;
00381 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00382 }
00383
00384 if (solverType != NULL)
00385 {
00386
00387 delete solverType;
00388
00389 solverType = NULL;
00390 }
00391 delete osrlwriter;
00392
00393 osrlwriter = NULL;
00394 delete nl2OS;
00395
00396 nl2OS = NULL;
00397
00398 if (solWriter != NULL) delete solWriter;
00399 solWriter = NULL;
00400 return 0;
00401 }
00402
00403
00404
00405
00406 void getAmplClientOptions(char *amplclient_options, std::string *solverName,
00407 std::string *solverOptions, std::string *serviceLocation)
00408 {
00409 std::ostringstream outStr;
00410
00411
00412 OSCommandLine *oscommandline = new OSCommandLine();
00413
00414 void* scanner;
00415
00416 try
00417 {
00418
00419 ossslex_init( &scanner);
00420
00421 setyyextra( oscommandline, scanner);
00422
00423 osss_scan_string( amplclient_options, scanner);
00424
00425 ossslex( scanner);
00426 ossslex_destroy( scanner);
00427
00428
00429 *solverName = oscommandline->solverName;
00430 *solverOptions = oscommandline->osolFile;
00431 *serviceLocation = oscommandline->serviceLocation;
00432
00433 }
00434 catch(const ErrorClass& eclass)
00435 {
00436 outStr.str("");
00437 outStr.clear();
00438 outStr << "There was an error processing OSAmplClient options: " << endl << eclass.errormsg << endl << endl;
00439 osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00440 throw ErrorClass( eclass.errormsg) ;
00441 }
00442 }