00001
00002
00003
00004 #ifndef OsiCbcSolverInterface_H
00005 #define OsiCbcSolverInterface_H
00006
00007 #include <string>
00008 #include <cfloat>
00009 #include <map>
00010 #include "CbcModel.hpp"
00011 #include "CoinPackedMatrix.hpp"
00012 #include "OsiSolverInterface.hpp"
00013 #include "CbcStrategy.hpp"
00014 #include "CoinWarmStartBasis.hpp"
00015
00016 class OsiRowCut;
00017 class OsiClpSolverInterface;
00018 #ifndef COIN_DBL_MAX
00019 static const double OsiCbcInfinity = DBL_MAX;
00020 #else
00021 static const double OsiCbcInfinity = COIN_DBL_MAX;
00022 #endif
00023
00024
00025
00032 class OsiCbcSolverInterface :
00033 virtual public OsiSolverInterface {
00034 friend int OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00035
00036 public:
00037
00040
00041 virtual void initialSolve();
00042
00044 virtual void resolve();
00045
00047 virtual void branchAndBound();
00049
00050
00066
00067 bool setIntParam(OsiIntParam key, int value);
00068
00069 bool setDblParam(OsiDblParam key, double value);
00070
00071 bool setStrParam(OsiStrParam key, const std::string & value);
00072
00073 bool getIntParam(OsiIntParam key, int& value) const;
00074
00075 bool getDblParam(OsiDblParam key, double& value) const;
00076
00077 bool getStrParam(OsiStrParam key, std::string& value) const;
00078
00079 virtual bool setHintParam(OsiHintParam key, bool yesNo=true,
00080 OsiHintStrength strength=OsiHintTry,
00081 void * otherInformation=NULL);
00083 virtual bool getHintParam(OsiHintParam key, bool& yesNo,
00084 OsiHintStrength& strength,
00085 void *& otherInformation) const;
00086
00087 using OsiSolverInterface::getHintParam ;
00089 virtual bool getHintParam(OsiHintParam key, bool& yesNo,
00090 OsiHintStrength& strength) const;
00092
00093
00095
00096
00097 virtual bool isAbandoned() const;
00099 virtual bool isProvenOptimal() const;
00101 virtual bool isProvenPrimalInfeasible() const;
00103 virtual bool isProvenDualInfeasible() const;
00105 virtual bool isPrimalObjectiveLimitReached() const;
00107 virtual bool isDualObjectiveLimitReached() const;
00109 virtual bool isIterationLimitReached() const;
00111
00112
00115
00123 virtual CoinWarmStart *getEmptyWarmStart () const;
00124
00126 virtual CoinWarmStart* getWarmStart() const;
00129 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00131
00132
00139
00140 virtual void markHotStart();
00142 virtual void solveFromHotStart();
00144 virtual void unmarkHotStart();
00146
00147
00162
00163 virtual int getNumCols() const;
00164
00166 virtual int getNumRows() const;
00167
00169 virtual int getNumElements() const ;
00170
00172 virtual const double * getColLower() const;
00173
00175 virtual const double * getColUpper() const;
00176
00186 virtual const char * getRowSense() const;
00187
00196 virtual const double * getRightHandSide() const ;
00197
00206 virtual const double * getRowRange() const ;
00207
00209 virtual const double * getRowLower() const ;
00210
00212 virtual const double * getRowUpper() const ;
00213
00215 virtual const double * getObjCoefficients() const;
00216
00218 virtual double getObjSense() const ;
00219
00221 virtual bool isContinuous(int colNumber) const;
00222
00223
00225 virtual const CoinPackedMatrix * getMatrixByRow() const;
00226
00228 virtual const CoinPackedMatrix * getMatrixByCol() const;
00229
00231 virtual double getInfinity() const;
00233
00236
00237 virtual const double * getColSolution() const;
00238
00240 virtual const double * getRowPrice() const;
00241
00243 virtual const double * getReducedCost() const;
00244
00247 virtual const double * getRowActivity() const;
00248
00250 virtual double getObjValue() const;
00251
00254 virtual int getIterationCount() const ;
00255
00273 virtual std::vector<double*> getDualRays(int maxNumRays,
00274 bool fullRay = false) const;
00286 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00287
00289
00298
00301 virtual std::string dfltRowColName(char rc,
00302 int ndx, unsigned digits = 7) const ;
00303
00306 virtual std::string getObjName (unsigned maxLen = std::string::npos) const ;
00307
00310 virtual void setObjName (std::string name) ;
00311
00314 virtual std::string getRowName(int rowIndex,
00315 unsigned maxLen = std::string::npos) const ;
00316
00319 virtual const OsiNameVec &getRowNames() ;
00320
00323 virtual void setRowName(int ndx, std::string name) ;
00324
00327 virtual void setRowNames(OsiNameVec &srcNames,
00328 int srcStart, int len, int tgtStart) ;
00329
00332 virtual void deleteRowNames(int tgtStart, int len) ;
00333
00336 virtual std::string getColName(int colIndex,
00337 unsigned maxLen = std::string::npos) const ;
00338
00341 virtual const OsiNameVec &getColNames() ;
00342
00345 virtual void setColName(int ndx, std::string name) ;
00346
00349 virtual void setColNames(OsiNameVec &srcNames,
00350 int srcStart, int len, int tgtStart) ;
00351
00353 virtual void deleteColNames(int tgtStart, int len) ;
00354
00356
00358
00359
00360
00363
00367 virtual void setObjCoeff( int elementIndex, double elementValue );
00368
00369 using OsiSolverInterface::setColLower ;
00372 virtual void setColLower( int elementIndex, double elementValue );
00373
00374 using OsiSolverInterface::setColUpper ;
00377 virtual void setColUpper( int elementIndex, double elementValue );
00378
00380 virtual void setColBounds( int elementIndex,
00381 double lower, double upper );
00382
00391 virtual void setColSetBounds(const int* indexFirst,
00392 const int* indexLast,
00393 const double* boundList);
00394
00397 virtual void setRowLower( int elementIndex, double elementValue );
00398
00401 virtual void setRowUpper( int elementIndex, double elementValue ) ;
00402
00404 virtual void setRowBounds( int elementIndex,
00405 double lower, double upper ) ;
00406
00408 virtual void setRowType(int index, char sense, double rightHandSide,
00409 double range);
00410
00419 virtual void setRowSetBounds(const int* indexFirst,
00420 const int* indexLast,
00421 const double* boundList);
00422
00433 virtual void setRowSetTypes(const int* indexFirst,
00434 const int* indexLast,
00435 const char* senseList,
00436 const double* rhsList,
00437 const double* rangeList);
00439
00440
00444 virtual void setContinuous(int index);
00446 virtual void setInteger(int index);
00449 virtual void setContinuous(const int* indices, int len);
00452 virtual void setInteger(const int* indices, int len);
00454
00455
00457 virtual void setObjSense(double s );
00458
00469 virtual void setColSolution(const double * colsol);
00470
00481 virtual void setRowPrice(const double * rowprice);
00482
00483
00488 using OsiSolverInterface::addCol ;
00490 virtual void addCol(const CoinPackedVectorBase& vec,
00491 const double collb, const double colub,
00492 const double obj);
00494 virtual void addCol(int numberElements, const int * rows, const double * elements,
00495 const double collb, const double colub,
00496 const double obj) ;
00497
00498 using OsiSolverInterface::addCols ;
00500 virtual void addCols(const int numcols,
00501 const CoinPackedVectorBase * const * cols,
00502 const double* collb, const double* colub,
00503 const double* obj);
00505 virtual void deleteCols(const int num, const int * colIndices);
00506
00507 using OsiSolverInterface::addRow ;
00509 virtual void addRow(const CoinPackedVectorBase& vec,
00510 const double rowlb, const double rowub);
00512 virtual void addRow(const CoinPackedVectorBase& vec,
00513 const char rowsen, const double rowrhs,
00514 const double rowrng);
00515
00516 using OsiSolverInterface::addRows ;
00518 virtual void addRows(const int numrows,
00519 const CoinPackedVectorBase * const * rows,
00520 const double* rowlb, const double* rowub);
00522 virtual void addRows(const int numrows,
00523 const CoinPackedVectorBase * const * rows,
00524 const char* rowsen, const double* rowrhs,
00525 const double* rowrng);
00527 virtual void deleteRows(const int num, const int * rowIndices);
00528
00529
00533 virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
00538 virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts);
00540
00541
00542
00543
00544 public:
00545
00559 virtual void loadProblem(const CoinPackedMatrix& matrix,
00560 const double* collb, const double* colub,
00561 const double* obj,
00562 const double* rowlb, const double* rowub);
00563
00571 virtual void assignProblem(CoinPackedMatrix*& matrix,
00572 double*& collb, double*& colub, double*& obj,
00573 double*& rowlb, double*& rowub);
00574
00587 virtual void loadProblem(const CoinPackedMatrix& matrix,
00588 const double* collb, const double* colub,
00589 const double* obj,
00590 const char* rowsen, const double* rowrhs,
00591 const double* rowrng);
00592
00600 virtual void assignProblem(CoinPackedMatrix*& matrix,
00601 double*& collb, double*& colub, double*& obj,
00602 char*& rowsen, double*& rowrhs,
00603 double*& rowrng);
00604
00607 virtual void loadProblem(const int numcols, const int numrows,
00608 const CoinBigIndex * start, const int* index,
00609 const double* value,
00610 const double* collb, const double* colub,
00611 const double* obj,
00612 const double* rowlb, const double* rowub);
00613
00616 virtual void loadProblem(const int numcols, const int numrows,
00617 const CoinBigIndex * start, const int* index,
00618 const double* value,
00619 const double* collb, const double* colub,
00620 const double* obj,
00621 const char* rowsen, const double* rowrhs,
00622 const double* rowrng);
00623
00624 using OsiSolverInterface::readMps ;
00627 virtual int readMps(const char *filename,
00628 const char *extension = "mps") ;
00629
00634 virtual void writeMps(const char *filename,
00635 const char *extension = "mps",
00636 double objSense=0.0) const;
00645 virtual int writeMpsNative(const char *filename,
00646 const char ** rowNames, const char ** columnNames,
00647 int formatType=0,int numberAcross=2,
00648 double objSense=0.0) const ;
00650
00655
00656 void newLanguage(CoinMessages::Language language);
00657 void setLanguage(CoinMessages::Language language)
00658 {newLanguage(language);}
00660
00661
00664
00665 inline CbcModel * getModelPtr() const
00666 { return modelPtr_;}
00668 inline OsiSolverInterface * getRealSolverPtr() const
00669 { return modelPtr_->solver();}
00671 inline void setCutoff(double value)
00672 { modelPtr_->setCutoff(value);}
00674 inline double getCutoff() const
00675 { return modelPtr_->getCutoff();}
00677 inline void setMaximumNodes( int value)
00678 { modelPtr_->setMaximumNodes(value);}
00680 inline int getMaximumNodes() const
00681 { return modelPtr_->getMaximumNodes();}
00683 inline void setMaximumSolutions( int value)
00684 { modelPtr_->setMaximumSolutions(value);}
00686 inline int getMaximumSolutions() const
00687 { return modelPtr_->getMaximumSolutions();}
00689 inline void setMaximumSeconds( double value)
00690 { modelPtr_->setMaximumSeconds(value);}
00692 inline double getMaximumSeconds() const
00693 { return modelPtr_->getMaximumSeconds();}
00695 inline bool isNodeLimitReached() const
00696 { return modelPtr_->isNodeLimitReached();}
00698 inline bool isSolutionLimitReached() const
00699 { return modelPtr_->isSolutionLimitReached();}
00701 inline int getNodeCount() const
00702 { return modelPtr_->getNodeCount();}
00704 inline int status() const
00705 { return modelPtr_->status();}
00712 virtual void passInMessageHandler(CoinMessageHandler * handler);
00714
00715
00716
00719
00720 OsiCbcSolverInterface (OsiSolverInterface * solver=NULL,
00721 CbcStrategy * strategy=NULL);
00722
00724 virtual OsiSolverInterface * clone(bool copyData = true) const;
00725
00727 OsiCbcSolverInterface (const OsiCbcSolverInterface &);
00728 #if 0
00730 OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false);
00731
00733 void releaseCbc();
00734 #endif
00736 OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs);
00737
00739 virtual ~OsiCbcSolverInterface ();
00740
00742
00743
00744 protected:
00746
00747
00748 virtual void applyRowCut(const OsiRowCut& rc);
00749
00751 virtual void applyColCut(const OsiColCut& cc);
00753
00755
00756 mutable CbcModel * modelPtr_;
00758 };
00759
00760 bool OsiCbcHasNDEBUG();
00761
00762
00770 int
00771 OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00772
00773 #endif