Cbc trunk
OsiCbcSolverInterface.hpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines