Cbc
trunk
|
00001 // $Id$ 00002 // Copyright (C) 2000, International Business Machines 00003 // Corporation and others. All Rights Reserved. 00004 // This code is licensed under the terms of the Eclipse Public License (EPL). 00005 00006 #ifndef OsiCbcSolverInterface_H 00007 #define OsiCbcSolverInterface_H 00008 00009 #include <string> 00010 #include <cfloat> 00011 #include <map> 00012 #include "CbcModel.hpp" 00013 #include "CoinPackedMatrix.hpp" 00014 #include "OsiSolverInterface.hpp" 00015 #include "CbcStrategy.hpp" 00016 #include "CoinWarmStartBasis.hpp" 00017 00018 class OsiRowCut; 00019 class OsiClpSolverInterface; 00020 static const double OsiCbcInfinity = COIN_DBL_MAX; 00021 00022 //############################################################################# 00023 00030 class OsiCbcSolverInterface : 00031 virtual public OsiSolverInterface { 00032 friend void OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00033 00034 public: 00035 //--------------------------------------------------------------------------- 00038 00039 virtual void initialSolve(); 00040 00042 virtual void resolve(); 00043 00045 virtual void branchAndBound(); 00047 00048 //--------------------------------------------------------------------------- 00064 // Set an integer parameter 00065 bool setIntParam(OsiIntParam key, int value); 00066 // Set an double parameter 00067 bool setDblParam(OsiDblParam key, double value); 00068 // Set a string parameter 00069 bool setStrParam(OsiStrParam key, const std::string & value); 00070 // Get an integer parameter 00071 bool getIntParam(OsiIntParam key, int& value) const; 00072 // Get an double parameter 00073 bool getDblParam(OsiDblParam key, double& value) const; 00074 // Get a string parameter 00075 bool getStrParam(OsiStrParam key, std::string& value) const; 00076 // Set a hint parameter - overrides OsiSolverInterface 00077 virtual bool setHintParam(OsiHintParam key, bool yesNo=true, 00078 OsiHintStrength strength=OsiHintTry, 00079 void * otherInformation=NULL); 00081 virtual bool getHintParam(OsiHintParam key, bool& yesNo, 00082 OsiHintStrength& strength, 00083 void *& otherInformation) const; 00084 00085 using OsiSolverInterface::getHintParam ; 00087 virtual bool getHintParam(OsiHintParam key, bool& yesNo, 00088 OsiHintStrength& strength) const; 00090 00091 //--------------------------------------------------------------------------- 00093 00094 00095 virtual bool isAbandoned() const; 00097 virtual bool isProvenOptimal() const; 00099 virtual bool isProvenPrimalInfeasible() const; 00101 virtual bool isProvenDualInfeasible() const; 00103 virtual bool isPrimalObjectiveLimitReached() const; 00105 virtual bool isDualObjectiveLimitReached() const; 00107 virtual bool isIterationLimitReached() const; 00109 00110 //--------------------------------------------------------------------------- 00113 00121 virtual CoinWarmStart *getEmptyWarmStart () const; 00122 00124 virtual CoinWarmStart* getWarmStart() const; 00127 virtual bool setWarmStart(const CoinWarmStart* warmstart); 00129 00130 //--------------------------------------------------------------------------- 00137 00138 virtual void markHotStart(); 00140 virtual void solveFromHotStart(); 00142 virtual void unmarkHotStart(); 00144 00145 //--------------------------------------------------------------------------- 00160 00161 virtual int getNumCols() const; 00162 00164 virtual int getNumRows() const; 00165 00167 virtual int getNumElements() const ; 00168 00170 virtual const double * getColLower() const; 00171 00173 virtual const double * getColUpper() const; 00174 00184 virtual const char * getRowSense() const; 00185 00194 virtual const double * getRightHandSide() const ; 00195 00204 virtual const double * getRowRange() const ; 00205 00207 virtual const double * getRowLower() const ; 00208 00210 virtual const double * getRowUpper() const ; 00211 00213 virtual const double * getObjCoefficients() const; 00214 00216 virtual double getObjSense() const ; 00217 00219 virtual bool isContinuous(int colNumber) const; 00220 00221 00223 virtual const CoinPackedMatrix * getMatrixByRow() const; 00224 00226 virtual const CoinPackedMatrix * getMatrixByCol() const; 00227 00229 virtual double getInfinity() const; 00231 00234 00235 virtual const double * getColSolution() const; 00236 00238 virtual const double * getRowPrice() const; 00239 00241 virtual const double * getReducedCost() const; 00242 00245 virtual const double * getRowActivity() const; 00246 00248 virtual double getObjValue() const; 00249 00252 virtual int getIterationCount() const ; 00253 00271 virtual std::vector<double*> getDualRays(int maxNumRays, 00272 bool fullRay = false) const; 00284 virtual std::vector<double*> getPrimalRays(int maxNumRays) const; 00285 00287 00296 00299 virtual std::string dfltRowColName(char rc, 00300 int ndx, unsigned digits = 7) const ; 00301 00304 virtual std::string getObjName (unsigned maxLen = std::string::npos) const ; 00305 00308 virtual void setObjName (std::string name) ; 00309 00312 virtual std::string getRowName(int rowIndex, 00313 unsigned maxLen = std::string::npos) const ; 00314 00317 virtual const OsiNameVec &getRowNames() ; 00318 00321 virtual void setRowName(int ndx, std::string name) ; 00322 00325 virtual void setRowNames(OsiNameVec &srcNames, 00326 int srcStart, int len, int tgtStart) ; 00327 00330 virtual void deleteRowNames(int tgtStart, int len) ; 00331 00334 virtual std::string getColName(int colIndex, 00335 unsigned maxLen = std::string::npos) const ; 00336 00339 virtual const OsiNameVec &getColNames() ; 00340 00343 virtual void setColName(int ndx, std::string name) ; 00344 00347 virtual void setColNames(OsiNameVec &srcNames, 00348 int srcStart, int len, int tgtStart) ; 00349 00351 virtual void deleteColNames(int tgtStart, int len) ; 00352 00354 00356 00357 //--------------------------------------------------------------------------- 00358 00361 //------------------------------------------------------------------------- 00365 virtual void setObjCoeff( int elementIndex, double elementValue ); 00366 00367 using OsiSolverInterface::setColLower ; 00370 virtual void setColLower( int elementIndex, double elementValue ); 00371 00372 using OsiSolverInterface::setColUpper ; 00375 virtual void setColUpper( int elementIndex, double elementValue ); 00376 00378 virtual void setColBounds( int elementIndex, 00379 double lower, double upper ); 00380 00389 virtual void setColSetBounds(const int* indexFirst, 00390 const int* indexLast, 00391 const double* boundList); 00392 00395 virtual void setRowLower( int elementIndex, double elementValue ); 00396 00399 virtual void setRowUpper( int elementIndex, double elementValue ) ; 00400 00402 virtual void setRowBounds( int elementIndex, 00403 double lower, double upper ) ; 00404 00406 virtual void setRowType(int index, char sense, double rightHandSide, 00407 double range); 00408 00417 virtual void setRowSetBounds(const int* indexFirst, 00418 const int* indexLast, 00419 const double* boundList); 00420 00431 virtual void setRowSetTypes(const int* indexFirst, 00432 const int* indexLast, 00433 const char* senseList, 00434 const double* rhsList, 00435 const double* rangeList); 00437 00438 //------------------------------------------------------------------------- 00442 virtual void setContinuous(int index); 00444 virtual void setInteger(int index); 00447 virtual void setContinuous(const int* indices, int len); 00450 virtual void setInteger(const int* indices, int len); 00452 00453 //------------------------------------------------------------------------- 00455 virtual void setObjSense(double s ); 00456 00467 virtual void setColSolution(const double * colsol); 00468 00479 virtual void setRowPrice(const double * rowprice); 00480 00481 //------------------------------------------------------------------------- 00486 using OsiSolverInterface::addCol ; 00488 virtual void addCol(const CoinPackedVectorBase& vec, 00489 const double collb, const double colub, 00490 const double obj); 00492 virtual void addCol(int numberElements, const int * rows, const double * elements, 00493 const double collb, const double colub, 00494 const double obj) ; 00495 00496 using OsiSolverInterface::addCols ; 00498 virtual void addCols(const int numcols, 00499 const CoinPackedVectorBase * const * cols, 00500 const double* collb, const double* colub, 00501 const double* obj); 00503 virtual void deleteCols(const int num, const int * colIndices); 00504 00505 using OsiSolverInterface::addRow ; 00507 virtual void addRow(const CoinPackedVectorBase& vec, 00508 const double rowlb, const double rowub); 00510 virtual void addRow(const CoinPackedVectorBase& vec, 00511 const char rowsen, const double rowrhs, 00512 const double rowrng); 00513 00514 using OsiSolverInterface::addRows ; 00516 virtual void addRows(const int numrows, 00517 const CoinPackedVectorBase * const * rows, 00518 const double* rowlb, const double* rowub); 00520 virtual void addRows(const int numrows, 00521 const CoinPackedVectorBase * const * rows, 00522 const char* rowsen, const double* rowrhs, 00523 const double* rowrng); 00525 virtual void deleteRows(const int num, const int * rowIndices); 00526 00527 //----------------------------------------------------------------------- 00531 virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts); 00536 virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts); 00538 00539 00540 //--------------------------------------------------------------------------- 00541 00542 public: 00543 00557 virtual void loadProblem(const CoinPackedMatrix& matrix, 00558 const double* collb, const double* colub, 00559 const double* obj, 00560 const double* rowlb, const double* rowub); 00561 00569 virtual void assignProblem(CoinPackedMatrix*& matrix, 00570 double*& collb, double*& colub, double*& obj, 00571 double*& rowlb, double*& rowub); 00572 00585 virtual void loadProblem(const CoinPackedMatrix& matrix, 00586 const double* collb, const double* colub, 00587 const double* obj, 00588 const char* rowsen, const double* rowrhs, 00589 const double* rowrng); 00590 00598 virtual void assignProblem(CoinPackedMatrix*& matrix, 00599 double*& collb, double*& colub, double*& obj, 00600 char*& rowsen, double*& rowrhs, 00601 double*& rowrng); 00602 00605 virtual void loadProblem(const int numcols, const int numrows, 00606 const CoinBigIndex * start, const int* index, 00607 const double* value, 00608 const double* collb, const double* colub, 00609 const double* obj, 00610 const double* rowlb, const double* rowub); 00611 00614 virtual void loadProblem(const int numcols, const int numrows, 00615 const CoinBigIndex * start, const int* index, 00616 const double* value, 00617 const double* collb, const double* colub, 00618 const double* obj, 00619 const char* rowsen, const double* rowrhs, 00620 const double* rowrng); 00621 00622 using OsiSolverInterface::readMps ; 00625 virtual int readMps(const char *filename, 00626 const char *extension = "mps") ; 00627 00632 virtual void writeMps(const char *filename, 00633 const char *extension = "mps", 00634 double objSense=0.0) const; 00643 virtual int writeMpsNative(const char *filename, 00644 const char ** rowNames, const char ** columnNames, 00645 int formatType=0,int numberAcross=2, 00646 double objSense=0.0) const ; 00648 00653 00654 void newLanguage(CoinMessages::Language language); 00655 void setLanguage(CoinMessages::Language language) 00656 {newLanguage(language);} 00658 //--------------------------------------------------------------------------- 00659 00662 00663 inline CbcModel * getModelPtr() const 00664 { return modelPtr_;} 00666 inline OsiSolverInterface * getRealSolverPtr() const 00667 { return modelPtr_->solver();} 00669 inline void setCutoff(double value) 00670 { modelPtr_->setCutoff(value);} 00672 inline double getCutoff() const 00673 { return modelPtr_->getCutoff();} 00675 inline void setMaximumNodes( int value) 00676 { modelPtr_->setMaximumNodes(value);} 00678 inline int getMaximumNodes() const 00679 { return modelPtr_->getMaximumNodes();} 00681 inline void setMaximumSolutions( int value) 00682 { modelPtr_->setMaximumSolutions(value);} 00684 inline int getMaximumSolutions() const 00685 { return modelPtr_->getMaximumSolutions();} 00687 inline void setMaximumSeconds( double value) 00688 { modelPtr_->setMaximumSeconds(value);} 00690 inline double getMaximumSeconds() const 00691 { return modelPtr_->getMaximumSeconds();} 00693 inline bool isNodeLimitReached() const 00694 { return modelPtr_->isNodeLimitReached();} 00696 inline bool isSolutionLimitReached() const 00697 { return modelPtr_->isSolutionLimitReached();} 00699 inline int getNodeCount() const 00700 { return modelPtr_->getNodeCount();} 00702 inline int status() const 00703 { return modelPtr_->status();} 00710 virtual void passInMessageHandler(CoinMessageHandler * handler); 00712 00713 //--------------------------------------------------------------------------- 00714 00717 00718 OsiCbcSolverInterface (OsiSolverInterface * solver=NULL, 00719 CbcStrategy * strategy=NULL); 00720 00722 virtual OsiSolverInterface * clone(bool copyData = true) const; 00723 00725 OsiCbcSolverInterface (const OsiCbcSolverInterface &); 00726 #if 0 00727 00728 OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false); 00729 00731 void releaseCbc(); 00732 #endif 00733 00734 OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs); 00735 00737 virtual ~OsiCbcSolverInterface (); 00738 00740 //--------------------------------------------------------------------------- 00741 00742 protected: 00744 00745 00746 virtual void applyRowCut(const OsiRowCut& rc); 00747 00749 virtual void applyColCut(const OsiColCut& cc); 00751 00753 00754 mutable CbcModel * modelPtr_; 00756 }; 00757 // So unit test can find out if NDEBUG set 00758 bool OsiCbcHasNDEBUG(); 00759 00760 //############################################################################# 00762 void OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00763 00764 #endif