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