// Copyright (C) 2002, International Business Machines // Corporation and others. All Rights Reserved. #include "CoinPragma.hpp" #include #include #include #include #include #include #include "CoinPragma.hpp" #include "CoinHelperFunctions.hpp" #include "CoinSort.hpp" // History since 1.0 at end #define CLPVERSION "1.06.00" #include "CoinMpsIO.hpp" #include "CoinFileIO.hpp" #include "ClpFactorization.hpp" #include "CoinTime.hpp" #include "ClpSimplex.hpp" #include "ClpSimplexOther.hpp" #include "ClpSolve.hpp" #include "ClpPackedMatrix.hpp" #include "ClpPlusMinusOneMatrix.hpp" #include "ClpNetworkMatrix.hpp" #include "ClpDualRowSteepest.hpp" #include "ClpDualRowDantzig.hpp" #include "ClpLinearObjective.hpp" #include "ClpPrimalColumnSteepest.hpp" #include "ClpPrimalColumnDantzig.hpp" #include "ClpPresolve.hpp" #include "CbcOrClpParam.hpp" #include "CoinSignal.hpp" #ifdef DMALLOC #include "dmalloc.h" #endif #ifdef WSSMP_BARRIER #define FOREIGN_BARRIER #endif #ifdef UFL_BARRIER #define FOREIGN_BARRIER #endif #ifdef TAUCS_BARRIER #define FOREIGN_BARRIER #endif static double totalTime=0.0; static bool maskMatches(const int * starts, char ** masks, std::string & check); static ClpSimplex * currentModel = NULL; extern "C" { static void signal_handler(int whichSignal) { if (currentModel!=NULL) currentModel->setMaximumIterations(0); // stop at next iterations return; } } //############################################################################# #ifdef NDEBUG #undef NDEBUG #endif int mainTest (int argc, const char *argv[],int algorithm, ClpSimplex empty, bool doPresolve,int switchOff,bool doVector); static void statistics(ClpSimplex * originalModel, ClpSimplex * model); static void generateCode(const char * fileName,int type); // Returns next valid field int CbcOrClpRead_mode=1; FILE * CbcOrClpReadCommand=stdin; int main (int argc, const char *argv[]) { // next {} is just to make sure all memory should be freed - for debug { double time1 = CoinCpuTime(),time2; // Set up all non-standard stuff //int numberModels=1; ClpSimplex * models = new ClpSimplex[1]; // default action on import int allowImportErrors=0; int keepImportNames=1; int doIdiot=-1; int outputFormat=2; int slpValue=-1; int cppValue=-1; int printOptions=0; int printMode=0; int presolveOptions=0; int doCrash=0; int doVector=0; int doSprint=-1; // set reasonable defaults int preSolve=5; bool preSolveFile=false; models->setPerturbation(50); models->messageHandler()->setPrefix(false); const char dirsep = CoinFindDirSeparator(); std::string directory; std::string dirSample; std::string dirNetlib; std::string dirMiplib; if (dirsep == '/') { directory = "./"; dirSample = "../../Data/Sample/"; dirNetlib = "../../Data/Netlib/"; dirMiplib = "../../Data/miplib3/"; } else { directory = ".\\"; dirSample = "..\\..\\Data\\Sample\\"; dirNetlib = "..\\..\\Data\\Netlib\\"; dirMiplib = "..\\..\\Data\\miplib3\\"; } std::string defaultDirectory = directory; std::string importFile =""; std::string exportFile ="default.mps"; std::string importBasisFile =""; int basisHasValues=0; int substitution=3; int dualize=3; // dualize if looks promising std::string exportBasisFile ="default.bas"; std::string saveFile ="default.prob"; std::string restoreFile ="default.prob"; std::string solutionFile ="stdout"; std::string solutionSaveFile ="solution.file"; std::string printMask=""; CbcOrClpParam parameters[CBCMAXPARAMETERS]; int numberParameters ; establishParams(numberParameters,parameters) ; parameters[whichParam(BASISIN,numberParameters,parameters)].setStringValue(importBasisFile); parameters[whichParam(BASISOUT,numberParameters,parameters)].setStringValue(exportBasisFile); parameters[whichParam(PRINTMASK,numberParameters,parameters)].setStringValue(printMask); parameters[whichParam(DIRECTORY,numberParameters,parameters)].setStringValue(directory); parameters[whichParam(DIRSAMPLE,numberParameters,parameters)].setStringValue(dirSample); parameters[whichParam(DIRNETLIB,numberParameters,parameters)].setStringValue(dirNetlib); parameters[whichParam(DIRMIPLIB,numberParameters,parameters)].setStringValue(dirMiplib); parameters[whichParam(DUALBOUND,numberParameters,parameters)].setDoubleValue(models->dualBound()); parameters[whichParam(DUALTOLERANCE,numberParameters,parameters)].setDoubleValue(models->dualTolerance()); parameters[whichParam(EXPORT,numberParameters,parameters)].setStringValue(exportFile); parameters[whichParam(IDIOT,numberParameters,parameters)].setIntValue(doIdiot); parameters[whichParam(IMPORT,numberParameters,parameters)].setStringValue(importFile); parameters[whichParam(SOLVERLOGLEVEL,numberParameters,parameters)].setIntValue(models->logLevel()); parameters[whichParam(MAXFACTOR,numberParameters,parameters)].setIntValue(models->factorizationFrequency()); parameters[whichParam(MAXITERATION,numberParameters,parameters)].setIntValue(models->maximumIterations()); parameters[whichParam(OUTPUTFORMAT,numberParameters,parameters)].setIntValue(outputFormat); parameters[whichParam(PRESOLVEPASS,numberParameters,parameters)].setIntValue(preSolve); parameters[whichParam(PERTVALUE,numberParameters,parameters)].setIntValue(models->perturbation()); parameters[whichParam(PRIMALTOLERANCE,numberParameters,parameters)].setDoubleValue(models->primalTolerance()); parameters[whichParam(PRIMALWEIGHT,numberParameters,parameters)].setDoubleValue(models->infeasibilityCost()); parameters[whichParam(RESTORE,numberParameters,parameters)].setStringValue(restoreFile); parameters[whichParam(SAVE,numberParameters,parameters)].setStringValue(saveFile); parameters[whichParam(TIMELIMIT,numberParameters,parameters)].setDoubleValue(models->maximumSeconds()); parameters[whichParam(SOLUTION,numberParameters,parameters)].setStringValue(solutionFile); parameters[whichParam(SAVESOL,numberParameters,parameters)].setStringValue(solutionSaveFile); parameters[whichParam(SPRINT,numberParameters,parameters)].setIntValue(doSprint); parameters[whichParam(SUBSTITUTION,numberParameters,parameters)].setIntValue(substitution); parameters[whichParam(DUALIZE,numberParameters,parameters)].setIntValue(dualize); parameters[whichParam(PRESOLVETOLERANCE,numberParameters,parameters)].setDoubleValue(1.0e-8); int verbose=0; // total number of commands read int numberGoodCommands=0; bool * goodModels = new bool[1]; // Hidden stuff for barrier int choleskyType = 0; int gamma=0; int scaleBarrier=0; int doKKT=0; int crossover=2; // do crossover unless quadratic int iModel=0; goodModels[0]=false; //models[0].scaling(1); //models[0].setDualBound(1.0e6); //models[0].setDualTolerance(1.0e-7); //ClpDualRowSteepest steep; //models[0].setDualRowPivotAlgorithm(steep); //models[0].setPrimalTolerance(1.0e-7); //ClpPrimalColumnSteepest steepP; //models[0].setPrimalColumnPivotAlgorithm(steepP); std::string field; std::cout<<"Coin LP version "<1) { printf("command line - "); for (int i=0;i0;i--) { if (field[i]=='?') numberQuery++; else break; } field=field.substr(0,length-numberQuery); } // find out if valid command int iParam; int numberMatches=0; int firstMatch=-1; for ( iParam=0; iParam>1; } } if (iParam