OsiCbcSolverInterface.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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   // Set an integer parameter
00067   bool setIntParam(OsiIntParam key, int value);
00068   // Set an double parameter
00069   bool setDblParam(OsiDblParam key, double value);
00070   // Set a string parameter
00071   bool setStrParam(OsiStrParam key, const std::string & value);
00072   // Get an integer parameter
00073   bool getIntParam(OsiIntParam key, int& value) const;
00074   // Get an double parameter
00075   bool getDblParam(OsiDblParam key, double& value) const;
00076   // Get a string parameter
00077   bool getStrParam(OsiStrParam key, std::string& value) const;
00078   // Set a hint parameter - overrides OsiSolverInterface
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 // So unit test can find out if NDEBUG set
00760 bool OsiCbcHasNDEBUG();
00761 
00762 //#############################################################################
00770 int
00771 OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00772 
00773 #endif

Generated on Tue Jun 14 23:14:03 2011 for Cbc by  doxygen 1.4.7