//===========================================================================// int main(int argc, char** argv) { try { //--- //--- create the utility class for parsing parameters //--- UtilParameters utilParam(argc, argv); bool doCut = utilParam.GetSetting("doCut", true); bool doPriceCut = utilParam.GetSetting("doPriceCut", false); bool doDirect = utilParam.GetSetting("doDirect", false); UtilTimer timer; double timeSetupReal = 0.0; double timeSetupCpu = 0.0; double timeSolveReal = 0.0; double timeSolveCpu = 0.0; //--- //--- start overall timer //--- timer.start(); //--- //--- create the user application (a DecompApp) //--- MCF_DecompApp mmkp(utilParam); //--- //--- create the algorithm (a DecompAlgo) //--- DecompAlgo* algo = NULL; assert(doCut + doPriceCut == 1); //--- //--- create the CPM algorithm object //--- if (doCut) { algo = new DecompAlgoC(&mmkp, utilParam); } //--- //--- create the PC algorithm object //--- if (doPriceCut) { algo = new DecompAlgoPC(&mmkp, utilParam); } if (doCut && doDirect) { timer.stop(); timeSetupCpu = timer.getCpuTime(); timeSetupReal = timer.getRealTime(); //--- //--- solve //--- timer.start(); algo->solveDirect(); timer.stop(); timeSolveCpu = timer.getCpuTime(); timeSolveReal = timer.getRealTime(); } else { //--- //--- create the driver AlpsDecomp model //--- int status = 0; AlpsDecompModel alpsModel(utilParam, algo); timer.stop(); timeSetupCpu = timer.getCpuTime(); timeSetupReal = timer.getRealTime(); //--- //--- solve //--- timer.start(); status = alpsModel.solve(); timer.stop(); timeSolveCpu = timer.getCpuTime(); timeSolveReal = timer.getRealTime(); //--- //--- sanity check //--- cout << setiosflags(ios::fixed | ios::showpoint); cout << "Status= " << status << " BestLB= " << setw(10) << UtilDblToStr(alpsModel.getGlobalLB(), 5) << " BestUB= " << setw(10) << UtilDblToStr(alpsModel.getGlobalUB(), 5) << " Nodes= " << setw(6) << alpsModel.getNumNodesProcessed() << " SetupCPU= " << timeSetupCpu << " SolveCPU= " << timeSolveCpu << " TotalCPU= " << timeSetupCpu + timeSolveCpu << " SetupReal= " << timeSetupReal << " SolveReal= " << timeSolveReal << " TotalReal= " << timeSetupReal + timeSolveReal << endl; //--- //--- free local memory //--- delete algo; } } catch (CoinError& ex) { cerr << "COIN Exception [ " << ex.message() << " ]" << " at " << ex.fileName() << ":L" << ex.lineNumber() << " in " << ex.className() << "::" << ex.methodName() << endl; return 1; } return 0; }
//===========================================================================// int main(int argc, char ** argv){ try{ //--- //--- create the utility class for parsing parameters //--- UtilParameters utilParam(argc, argv); bool doGenRandom = utilParam.GetSetting("doGenRandom", false); int randSeed = utilParam.GetSetting("randSeed", 1 ); int randNumAtms = utilParam.GetSetting("randNumAtms", 5 ); int randNumDates = utilParam.GetSetting("randNumDates", 10 ); bool doCut = utilParam.GetSetting("doCut", true); bool doPriceCut = utilParam.GetSetting("doPriceCut", false); bool doDirect = utilParam.GetSetting("doDirect", false); UtilTimer timer; double timeSetupReal = 0.0; double timeSetupCpu = 0.0; double timeSolveReal = 0.0; double timeSolveCpu = 0.0; //--- //--- start overall timer //--- timer.start(); if(doGenRandom){ //--- //--- generate a random instance //--- ATM_Instance instance; instance.generateRandom(randNumAtms, randNumDates, randSeed); } else{ //--- //--- create the user application (a DecompApp) //--- ATM_DecompApp atm(utilParam); //--- //--- create the algorithm (a DecompAlgo) //--- DecompAlgo * algo = NULL; assert(doCut + doPriceCut == 1); //--- //--- create the CPM algorithm object //--- if(doCut) algo = new DecompAlgoC(&atm, utilParam); //--- //--- create the PC algorithm object //--- if(doPriceCut) algo = new DecompAlgoPC(&atm, utilParam); if(doCut && doDirect){ timer.stop(); timeSetupCpu = timer.getCpuTime(); timeSetupReal = timer.getRealTime(); //--- //--- solve //--- timer.start(); algo->solveDirect(); timer.stop(); timeSolveCpu = timer.getCpuTime(); timeSolveReal = timer.getRealTime(); } else{ //--- //--- create the driver AlpsDecomp model //--- int status = 0; AlpsDecompModel alpsModel(utilParam, algo); timer.stop(); timeSetupCpu = timer.getCpuTime(); timeSetupReal = timer.getRealTime(); //--- //--- solve //--- timer.start(); status = alpsModel.solve(); timer.stop(); timeSolveCpu = timer.getCpuTime(); timeSolveReal = timer.getRealTime(); //TODO: move doDirect solve into alpsModel so access // solution the same way? //--- //--- sanity check //--- cout << setiosflags(ios::fixed|ios::showpoint); cout << "Status= " << status << " BestLB= " << setw(10) << UtilDblToStr(alpsModel.getGlobalLB(),2) << " BestUB= " << setw(10) << UtilDblToStr(alpsModel.getGlobalUB(),2) << " Nodes= " << setw(6) << alpsModel.getNumNodesProcessed() << " SetupCPU= " << timeSetupCpu << " SolveCPU= " << timeSolveCpu << " TotalCPU= " << timeSetupCpu + timeSolveCpu << " SetupReal= " << timeSetupReal << " SolveReal= " << timeSolveReal << " TotalReal= " << timeSetupReal + timeSolveReal << endl; //--- //--- now, initialize direct solve with best //--- solution to PC //--- TODO: only useful if stop early on time or nodes //--- TODO: cbc currently doesn't use warm-start, only cpx //--- //DecompAlgo * algoC = new DecompAlgoC(&atm, &utilParam); //algoC->solveDirect(algo->getXhatIPBest()); //delete algoC; } //--- //--- free local memory //--- delete algo; } } catch(CoinError & ex){ cerr << "COIN Exception [ " << ex.message() << " ]" << " at " << ex.fileName() << ":L" << ex.lineNumber() << " in " << ex.className() << "::" << ex.methodName() << endl; } return 0; }
//===========================================================================// int main(int argc, char ** argv){ try{ //--- //--- create the utility class for parsing parameters //--- UtilParameters utilParam(argc, argv); bool useAlps = utilParam.GetSetting("useAlps", true); bool doCut = utilParam.GetSetting("doCut", true); bool doPrice = utilParam.GetSetting("doPrice", false); bool doPriceCut = utilParam.GetSetting("doPriceCut", false); bool doRelaxCut = utilParam.GetSetting("doRelaxCut", false); bool doModelI = utilParam.GetSetting("doModelI", true); bool doModelJ = utilParam.GetSetting("doModelJ", false); bool doModelK = utilParam.GetSetting("doModelK", false); AlpsTimer timer; double timeSetupReal = 0.0; double timeSetupCpu = 0.0; double timeSolveReal = 0.0; double timeSolveCpu = 0.0; timer.start(); //--- //--- create the user application (a DecompApp) //--- AP3_DecompApp ap3(utilParam); ap3.createModel(); //--- //--- create the algorithm(s) (a DecompAlgo) //--- DecompAlgoC2 * cut = NULL; DecompAlgoPC2 * priceI = NULL; DecompAlgoPC2 * priceJ = NULL; DecompAlgoPC2 * priceK = NULL; DecompAlgoPC2 * pcI = NULL; DecompAlgoPC2 * pcJ = NULL; DecompAlgoPC2 * pcK = NULL; DecompAlgoRC * rcI = NULL; DecompAlgoRC * rcJ = NULL; DecompAlgoRC * rcK = NULL; if(doCut){ cut = new DecompAlgoC2(&ap3, &utilParam); } if(doPrice){ CoinAssertHint(doModelI || doModelJ || doModelK, "Error: must pick some base model to price"); if(doModelI){ priceI = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true, AP3_DecompApp::MODEL_I); } if(doModelJ){ priceJ = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true, AP3_DecompApp::MODEL_J); } if(doModelK){ priceK = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true, AP3_DecompApp::MODEL_K); } } if(doPriceCut){ CoinAssertHint(doModelI || doModelJ || doModelK, "Error: must pick some base model to price"); if(doModelI){ pcI = new DecompAlgoPC2(&ap3, &utilParam, AP3_DecompApp::MODEL_I); } if(doModelJ){ pcJ = new DecompAlgoPC2(&ap3, &utilParam, AP3_DecompApp::MODEL_J); } if(doModelK){ pcK = new DecompAlgoPC2(&ap3, &utilParam, AP3_DecompApp::MODEL_K); } } if(doRelaxCut){ CoinAssertHint(doModelI || doModelJ || doModelK, "Error: must pick some base model to price"); if(doModelI){ rcI = new DecompAlgoRC(&ap3, &utilParam, AP3_DecompApp::MODEL_I); } if(doModelJ){ rcJ = new DecompAlgoRC(&ap3, &utilParam, AP3_DecompApp::MODEL_J); } if(doModelK){ rcK = new DecompAlgoRC(&ap3, &utilParam, AP3_DecompApp::MODEL_K); } } if(useAlps){ //--- //--- create the driver AlpsDecomp model //--- AlpsDecompModel alpsModel(utilParam); if(cut) alpsModel.addDecompAlgo(cut); if(priceI) alpsModel.addDecompAlgo(priceI); if(priceJ) alpsModel.addDecompAlgo(priceJ); if(priceK) alpsModel.addDecompAlgo(priceK); if(pcI) alpsModel.addDecompAlgo(pcI); if(pcJ) alpsModel.addDecompAlgo(pcJ); if(pcK) alpsModel.addDecompAlgo(pcK); if(rcI) alpsModel.addDecompAlgo(rcI); if(rcJ) alpsModel.addDecompAlgo(rcJ); if(rcK) alpsModel.addDecompAlgo(rcK); timer.stop(); timeSetupCpu = timer.getCpuTime(); timeSetupReal = timer.getWallClock(); timer.start(); alpsModel.solve(); timer.stop(); timeSolveCpu = timer.getCpuTime(); timeSolveReal = timer.getWallClock(); //--- //--- sanity check //--- cout << "Instance = " << ap3.getInstanceName() << " Solution = " << alpsModel.getBestObj() << " SetupCPU = " << timeSetupCpu << " SolveCPU = " << timeSolveCpu << endl; double diff = alpsModel.getBestObj() - ap3.getKnownOptimalBound(); CoinAssert(UtilIsZero(diff)); }else{ //--- //--- just solve the bounding problem (root node) //--- } if(cut) delete cut; if(priceI) delete priceI; if(priceJ) delete priceJ; if(priceK) delete priceK; if(pcI) delete pcI; if(pcJ) delete pcJ; if(pcK) delete pcK; if(rcI) delete rcI; if(rcJ) delete rcJ; if(rcK) delete rcK; } catch(CoinError & ex){ cerr << "COIN Exception:" << ex.message() << endl << " from method " << ex.methodName() << endl << " from class " << ex.className() << endl; } }