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 #ifndef COIN_DBL_MAX 00021 static const double OsiCbcInfinity = DBL_MAX; 00022 #else 00023 static const double OsiCbcInfinity = COIN_DBL_MAX; 00024 #endif 00025 00026 //############################################################################# 00027 00034 class OsiCbcSolverInterface : 00035 virtual public OsiSolverInterface { 00036 friend int OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00037 00038 public: 00039 //--------------------------------------------------------------------------- 00042 00043 virtual void initialSolve(); 00044 00046 virtual void resolve(); 00047 00049 virtual void branchAndBound(); 00051 00052 //--------------------------------------------------------------------------- 00068 // Set an integer parameter 00069 bool setIntParam(OsiIntParam key, int value); 00070 // Set an double parameter 00071 bool setDblParam(OsiDblParam key, double value); 00072 // Set a string parameter 00073 bool setStrParam(OsiStrParam key, const std::string & value); 00074 // Get an integer parameter 00075 bool getIntParam(OsiIntParam key, int& value) const; 00076 // Get an double parameter 00077 bool getDblParam(OsiDblParam key, double& value) const; 00078 // Get a string parameter 00079 bool getStrParam(OsiStrParam key, std::string& value) const; 00080 // Set a hint parameter - overrides OsiSolverInterface 00081 virtual bool setHintParam(OsiHintParam key, bool yesNo=true, 00082 OsiHintStrength strength=OsiHintTry, 00083 void * otherInformation=NULL); 00085 virtual bool getHintParam(OsiHintParam key, bool& yesNo, 00086 OsiHintStrength& strength, 00087 void *& otherInformation) const; 00088 00089 using OsiSolverInterface::getHintParam ; 00091 virtual bool getHintParam(OsiHintParam key, bool& yesNo, 00092 OsiHintStrength& strength) const; 00094 00095 //--------------------------------------------------------------------------- 00097 00098 00099 virtual bool isAbandoned() const; 00101 virtual bool isProvenOptimal() const; 00103 virtual bool isProvenPrimalInfeasible() const; 00105 virtual bool isProvenDualInfeasible() const; 00107 virtual bool isPrimalObjectiveLimitReached() const; 00109 virtual bool isDualObjectiveLimitReached() const; 00111 virtual bool isIterationLimitReached() const; 00113 00114 //--------------------------------------------------------------------------- 00117 00125 virtual CoinWarmStart *getEmptyWarmStart () const; 00126 00128 virtual CoinWarmStart* getWarmStart() const; 00131 virtual bool setWarmStart(const CoinWarmStart* warmstart); 00133 00134 //--------------------------------------------------------------------------- 00141 00142 virtual void markHotStart(); 00144 virtual void solveFromHotStart(); 00146 virtual void unmarkHotStart(); 00148 00149 //--------------------------------------------------------------------------- 00164 00165 virtual int getNumCols() const; 00166 00168 virtual int getNumRows() const; 00169 00171 virtual int getNumElements() const ; 00172 00174 virtual const double * getColLower() const; 00175 00177 virtual const double * getColUpper() const; 00178 00188 virtual const char * getRowSense() const; 00189 00198 virtual const double * getRightHandSide() const ; 00199 00208 virtual const double * getRowRange() const ; 00209 00211 virtual const double * getRowLower() const ; 00212 00214 virtual const double * getRowUpper() const ; 00215 00217 virtual const double * getObjCoefficients() const; 00218 00220 virtual double getObjSense() const ; 00221 00223 virtual bool isContinuous(int colNumber) const; 00224 00225 00227 virtual const CoinPackedMatrix * getMatrixByRow() const; 00228 00230 virtual const CoinPackedMatrix * getMatrixByCol() const; 00231 00233 virtual double getInfinity() const; 00235 00238 00239 virtual const double * getColSolution() const; 00240 00242 virtual const double * getRowPrice() const; 00243 00245 virtual const double * getReducedCost() const; 00246 00249 virtual const double * getRowActivity() const; 00250 00252 virtual double getObjValue() const; 00253 00256 virtual int getIterationCount() const ; 00257 00275 virtual std::vector<double*> getDualRays(int maxNumRays, 00276 bool fullRay = false) const; 00288 virtual std::vector<double*> getPrimalRays(int maxNumRays) const; 00289 00291 00300 00303 virtual std::string dfltRowColName(char rc, 00304 int ndx, unsigned digits = 7) const ; 00305 00308 virtual std::string getObjName (unsigned maxLen = std::string::npos) const ; 00309 00312 virtual void setObjName (std::string name) ; 00313 00316 virtual std::string getRowName(int rowIndex, 00317 unsigned maxLen = std::string::npos) const ; 00318 00321 virtual const OsiNameVec &getRowNames() ; 00322 00325 virtual void setRowName(int ndx, std::string name) ; 00326 00329 virtual void setRowNames(OsiNameVec &srcNames, 00330 int srcStart, int len, int tgtStart) ; 00331 00334 virtual void deleteRowNames(int tgtStart, int len) ; 00335 00338 virtual std::string getColName(int colIndex, 00339 unsigned maxLen = std::string::npos) const ; 00340 00343 virtual const OsiNameVec &getColNames() ; 00344 00347 virtual void setColName(int ndx, std::string name) ; 00348 00351 virtual void setColNames(OsiNameVec &srcNames, 00352 int srcStart, int len, int tgtStart) ; 00353 00355 virtual void deleteColNames(int tgtStart, int len) ; 00356 00358 00360 00361 //--------------------------------------------------------------------------- 00362 00365 //------------------------------------------------------------------------- 00369 virtual void setObjCoeff( int elementIndex, double elementValue ); 00370 00371 using OsiSolverInterface::setColLower ; 00374 virtual void setColLower( int elementIndex, double elementValue ); 00375 00376 using OsiSolverInterface::setColUpper ; 00379 virtual void setColUpper( int elementIndex, double elementValue ); 00380 00382 virtual void setColBounds( int elementIndex, 00383 double lower, double upper ); 00384 00393 virtual void setColSetBounds(const int* indexFirst, 00394 const int* indexLast, 00395 const double* boundList); 00396 00399 virtual void setRowLower( int elementIndex, double elementValue ); 00400 00403 virtual void setRowUpper( int elementIndex, double elementValue ) ; 00404 00406 virtual void setRowBounds( int elementIndex, 00407 double lower, double upper ) ; 00408 00410 virtual void setRowType(int index, char sense, double rightHandSide, 00411 double range); 00412 00421 virtual void setRowSetBounds(const int* indexFirst, 00422 const int* indexLast, 00423 const double* boundList); 00424 00435 virtual void setRowSetTypes(const int* indexFirst, 00436 const int* indexLast, 00437 const char* senseList, 00438 const double* rhsList, 00439 const double* rangeList); 00441 00442 //------------------------------------------------------------------------- 00446 virtual void setContinuous(int index); 00448 virtual void setInteger(int index); 00451 virtual void setContinuous(const int* indices, int len); 00454 virtual void setInteger(const int* indices, int len); 00456 00457 //------------------------------------------------------------------------- 00459 virtual void setObjSense(double s ); 00460 00471 virtual void setColSolution(const double * colsol); 00472 00483 virtual void setRowPrice(const double * rowprice); 00484 00485 //------------------------------------------------------------------------- 00490 using OsiSolverInterface::addCol ; 00492 virtual void addCol(const CoinPackedVectorBase& vec, 00493 const double collb, const double colub, 00494 const double obj); 00496 virtual void addCol(int numberElements, const int * rows, const double * elements, 00497 const double collb, const double colub, 00498 const double obj) ; 00499 00500 using OsiSolverInterface::addCols ; 00502 virtual void addCols(const int numcols, 00503 const CoinPackedVectorBase * const * cols, 00504 const double* collb, const double* colub, 00505 const double* obj); 00507 virtual void deleteCols(const int num, const int * colIndices); 00508 00509 using OsiSolverInterface::addRow ; 00511 virtual void addRow(const CoinPackedVectorBase& vec, 00512 const double rowlb, const double rowub); 00514 virtual void addRow(const CoinPackedVectorBase& vec, 00515 const char rowsen, const double rowrhs, 00516 const double rowrng); 00517 00518 using OsiSolverInterface::addRows ; 00520 virtual void addRows(const int numrows, 00521 const CoinPackedVectorBase * const * rows, 00522 const double* rowlb, const double* rowub); 00524 virtual void addRows(const int numrows, 00525 const CoinPackedVectorBase * const * rows, 00526 const char* rowsen, const double* rowrhs, 00527 const double* rowrng); 00529 virtual void deleteRows(const int num, const int * rowIndices); 00530 00531 //----------------------------------------------------------------------- 00535 virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts); 00540 virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts); 00542 00543 00544 //--------------------------------------------------------------------------- 00545 00546 public: 00547 00561 virtual void loadProblem(const CoinPackedMatrix& matrix, 00562 const double* collb, const double* colub, 00563 const double* obj, 00564 const double* rowlb, const double* rowub); 00565 00573 virtual void assignProblem(CoinPackedMatrix*& matrix, 00574 double*& collb, double*& colub, double*& obj, 00575 double*& rowlb, double*& rowub); 00576 00589 virtual void loadProblem(const CoinPackedMatrix& matrix, 00590 const double* collb, const double* colub, 00591 const double* obj, 00592 const char* rowsen, const double* rowrhs, 00593 const double* rowrng); 00594 00602 virtual void assignProblem(CoinPackedMatrix*& matrix, 00603 double*& collb, double*& colub, double*& obj, 00604 char*& rowsen, double*& rowrhs, 00605 double*& rowrng); 00606 00609 virtual void loadProblem(const int numcols, const int numrows, 00610 const CoinBigIndex * start, const int* index, 00611 const double* value, 00612 const double* collb, const double* colub, 00613 const double* obj, 00614 const double* rowlb, const double* rowub); 00615 00618 virtual void loadProblem(const int numcols, const int numrows, 00619 const CoinBigIndex * start, const int* index, 00620 const double* value, 00621 const double* collb, const double* colub, 00622 const double* obj, 00623 const char* rowsen, const double* rowrhs, 00624 const double* rowrng); 00625 00626 using OsiSolverInterface::readMps ; 00629 virtual int readMps(const char *filename, 00630 const char *extension = "mps") ; 00631 00636 virtual void writeMps(const char *filename, 00637 const char *extension = "mps", 00638 double objSense=0.0) const; 00647 virtual int writeMpsNative(const char *filename, 00648 const char ** rowNames, const char ** columnNames, 00649 int formatType=0,int numberAcross=2, 00650 double objSense=0.0) const ; 00652 00657 00658 void newLanguage(CoinMessages::Language language); 00659 void setLanguage(CoinMessages::Language language) 00660 {newLanguage(language);} 00662 //--------------------------------------------------------------------------- 00663 00666 00667 inline CbcModel * getModelPtr() const 00668 { return modelPtr_;} 00670 inline OsiSolverInterface * getRealSolverPtr() const 00671 { return modelPtr_->solver();} 00673 inline void setCutoff(double value) 00674 { modelPtr_->setCutoff(value);} 00676 inline double getCutoff() const 00677 { return modelPtr_->getCutoff();} 00679 inline void setMaximumNodes( int value) 00680 { modelPtr_->setMaximumNodes(value);} 00682 inline int getMaximumNodes() const 00683 { return modelPtr_->getMaximumNodes();} 00685 inline void setMaximumSolutions( int value) 00686 { modelPtr_->setMaximumSolutions(value);} 00688 inline int getMaximumSolutions() const 00689 { return modelPtr_->getMaximumSolutions();} 00691 inline void setMaximumSeconds( double value) 00692 { modelPtr_->setMaximumSeconds(value);} 00694 inline double getMaximumSeconds() const 00695 { return modelPtr_->getMaximumSeconds();} 00697 inline bool isNodeLimitReached() const 00698 { return modelPtr_->isNodeLimitReached();} 00700 inline bool isSolutionLimitReached() const 00701 { return modelPtr_->isSolutionLimitReached();} 00703 inline int getNodeCount() const 00704 { return modelPtr_->getNodeCount();} 00706 inline int status() const 00707 { return modelPtr_->status();} 00714 virtual void passInMessageHandler(CoinMessageHandler * handler); 00716 00717 //--------------------------------------------------------------------------- 00718 00721 00722 OsiCbcSolverInterface (OsiSolverInterface * solver=NULL, 00723 CbcStrategy * strategy=NULL); 00724 00726 virtual OsiSolverInterface * clone(bool copyData = true) const; 00727 00729 OsiCbcSolverInterface (const OsiCbcSolverInterface &); 00730 #if 0 00731 00732 OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false); 00733 00735 void releaseCbc(); 00736 #endif 00737 00738 OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs); 00739 00741 virtual ~OsiCbcSolverInterface (); 00742 00744 //--------------------------------------------------------------------------- 00745 00746 protected: 00748 00749 00750 virtual void applyRowCut(const OsiRowCut& rc); 00751 00753 virtual void applyColCut(const OsiColCut& cc); 00755 00757 00758 mutable CbcModel * modelPtr_; 00760 }; 00761 // So unit test can find out if NDEBUG set 00762 bool OsiCbcHasNDEBUG(); 00763 00764 //############################################################################# 00772 int 00773 OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00774 00775 #endif