- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# /home/coin/SVN-release/Cgl-0.55.0/Osi/src/OsiCbc/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
    00267   virtual std::vector<double*> getDualRays(int maxNumRays) const;
    00279   virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
    00280
    00282
    00291
    00294     virtual std::string dfltRowColName(char rc,
    00295                                  int ndx, unsigned digits = 7) const ;
    00296
    00299     virtual std::string getObjName (unsigned maxLen = std::string::npos) const ;
    00300
    00303     virtual void setObjName (std::string name) ;
    00304
    00307     virtual std::string getRowName(int rowIndex,
    00308                                    unsigned maxLen = std::string::npos) const ;
    00309
    00312     virtual const OsiNameVec &getRowNames() ;
    00313
    00316     virtual void setRowName(int ndx, std::string name) ;
    00317
    00320     virtual void setRowNames(OsiNameVec &srcNames,
    00321                      int srcStart, int len, int tgtStart) ;
    00322
    00325     virtual void deleteRowNames(int tgtStart, int len) ;
    00326
    00329     virtual std::string getColName(int colIndex,
    00330                                    unsigned maxLen = std::string::npos) const ;
    00331
    00334     virtual const OsiNameVec &getColNames() ;
    00335
    00338     virtual void setColName(int ndx, std::string name) ;
    00339
    00342     virtual void setColNames(OsiNameVec &srcNames,
    00343                      int srcStart, int len, int tgtStart) ;
    00344
    00346     virtual void deleteColNames(int tgtStart, int len) ;
    00347
    00349
    00351
    00352   //---------------------------------------------------------------------------
    00353
    00356   //-------------------------------------------------------------------------
    00360   virtual void setObjCoeff( int elementIndex, double elementValue );
    00361
    00362   using OsiSolverInterface::setColLower ;
    00365   virtual void setColLower( int elementIndex, double elementValue );
    00366
    00367   using OsiSolverInterface::setColUpper ;
    00370   virtual void setColUpper( int elementIndex, double elementValue );
    00371
    00373   virtual void setColBounds( int elementIndex,
    00374                              double lower, double upper );
    00375
    00384   virtual void setColSetBounds(const int* indexFirst,
    00385                                const int* indexLast,
    00386                                const double* boundList);
    00387
    00390   virtual void setRowLower( int elementIndex, double elementValue );
    00391
    00394   virtual void setRowUpper( int elementIndex, double elementValue ) ;
    00395
    00397   virtual void setRowBounds( int elementIndex,
    00398                              double lower, double upper ) ;
    00399
    00401   virtual void setRowType(int index, char sense, double rightHandSide,
    00402                           double range);
    00403
    00412   virtual void setRowSetBounds(const int* indexFirst,
    00413                                const int* indexLast,
    00414                                const double* boundList);
    00415
    00426   virtual void setRowSetTypes(const int* indexFirst,
    00427                               const int* indexLast,
    00428                               const char* senseList,
    00429                               const double* rhsList,
    00430                               const double* rangeList);
    00432
    00433   //-------------------------------------------------------------------------
    00437   virtual void setContinuous(int index);
    00439   virtual void setInteger(int index);
    00442   virtual void setContinuous(const int* indices, int len);
    00445   virtual void setInteger(const int* indices, int len);
    00447
    00448   //-------------------------------------------------------------------------
    00450   virtual void setObjSense(double s );
    00451
    00462   virtual void setColSolution(const double * colsol);
    00463
    00474   virtual void setRowPrice(const double * rowprice);
    00475
    00476   //-------------------------------------------------------------------------
    00481   using OsiSolverInterface::addCol ;
    00483   virtual void addCol(const CoinPackedVectorBase& vec,
    00484                       const double collb, const double colub,
    00485                       const double obj);
    00487   virtual void addCol(int numberElements, const int * rows, const double * elements,
    00488                       const double collb, const double colub,
    00489                       const double obj) ;
    00490
    00491   using OsiSolverInterface::addCols ;
    00493   virtual void addCols(const int numcols,
    00494                        const CoinPackedVectorBase * const * cols,
    00495                        const double* collb, const double* colub,
    00496                        const double* obj);
    00498   virtual void deleteCols(const int num, const int * colIndices);
    00499
    00500   using OsiSolverInterface::addRow ;
    00502   virtual void addRow(const CoinPackedVectorBase& vec,
    00503                       const double rowlb, const double rowub);
    00505   virtual void addRow(const CoinPackedVectorBase& vec,
    00506                       const char rowsen, const double rowrhs,
    00507                       const double rowrng);
    00508
    00509   using OsiSolverInterface::addRows ;
    00511   virtual void addRows(const int numrows,
    00512                        const CoinPackedVectorBase * const * rows,
    00513                        const double* rowlb, const double* rowub);
    00515   virtual void addRows(const int numrows,
    00516                        const CoinPackedVectorBase * const * rows,
    00517                        const char* rowsen, const double* rowrhs,
    00518                        const double* rowrng);
    00520   virtual void deleteRows(const int num, const int * rowIndices);
    00521
    00522   //-----------------------------------------------------------------------
    00526   virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
    00531   virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts);
    00533
    00534
    00535   //---------------------------------------------------------------------------
    00536
    00537 public:
    00538
    00552   virtual void loadProblem(const CoinPackedMatrix& matrix,
    00553                            const double* collb, const double* colub,
    00554                            const double* obj,
    00555                            const double* rowlb, const double* rowub);
    00556
    00564   virtual void assignProblem(CoinPackedMatrix*& matrix,
    00565                              double*& collb, double*& colub, double*& obj,
    00566                              double*& rowlb, double*& rowub);
    00567
    00580   virtual void loadProblem(const CoinPackedMatrix& matrix,
    00581                            const double* collb, const double* colub,
    00582                            const double* obj,
    00583                            const char* rowsen, const double* rowrhs,
    00584                            const double* rowrng);
    00585
    00593   virtual void assignProblem(CoinPackedMatrix*& matrix,
    00594                              double*& collb, double*& colub, double*& obj,
    00595                              char*& rowsen, double*& rowrhs,
    00596                              double*& rowrng);
    00597
    00600   virtual void loadProblem(const int numcols, const int numrows,
    00601                            const CoinBigIndex * start, const int* index,
    00602                            const double* value,
    00603                            const double* collb, const double* colub,
    00604                            const double* obj,
    00605                            const double* rowlb, const double* rowub);
    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 char* rowsen, const double* rowrhs,
    00615                            const double* rowrng);
    00616
    00617   using OsiSolverInterface::readMps ;
    00620   virtual int readMps(const char *filename,
    00621                       const char *extension = "mps") ;
    00622
    00627   virtual void writeMps(const char *filename,
    00628                         const char *extension = "mps",
    00629                         double objSense=0.0) const;
    00638   virtual int writeMpsNative(const char *filename,
    00639                              const char ** rowNames, const char ** columnNames,
    00640                              int formatType=0,int numberAcross=2,
    00641                              double objSense=0.0) const ;
    00643
    00648
    00649   void newLanguage(CoinMessages::Language language);
    00650   void setLanguage(CoinMessages::Language language)
    00651   {newLanguage(language);}
    00653   //---------------------------------------------------------------------------
    00654
    00657
    00658   inline CbcModel * getModelPtr() const
    00659   { return modelPtr_;}
    00661   inline OsiSolverInterface * getRealSolverPtr() const
    00662   { return modelPtr_->solver();}
    00664   inline void setCutoff(double value)
    00665   { modelPtr_->setCutoff(value);}
    00667   inline double getCutoff() const
    00668   { return modelPtr_->getCutoff();}
    00670   inline void setMaximumNodes( int value)
    00671   { modelPtr_->setMaximumNodes(value);}
    00673   inline int getMaximumNodes() const
    00674   { return modelPtr_->getMaximumNodes();}
    00676   inline void setMaximumSolutions( int value)
    00677   { modelPtr_->setMaximumSolutions(value);}
    00679   inline int getMaximumSolutions() const
    00680   { return modelPtr_->getMaximumSolutions();}
    00682   inline void setMaximumSeconds( double value)
    00683   { modelPtr_->setMaximumSeconds(value);}
    00685   inline double getMaximumSeconds() const
    00686   { return modelPtr_->getMaximumSeconds();}
    00688   inline bool isNodeLimitReached() const
    00689   { return modelPtr_->isNodeLimitReached();}
    00691   inline bool isSolutionLimitReached() const
    00692   { return modelPtr_->isSolutionLimitReached();}
    00694   inline int getNodeCount() const
    00695   { return modelPtr_->getNodeCount();}
    00697     inline int status() const
    00698   { return modelPtr_->status();}
    00705   virtual void passInMessageHandler(CoinMessageHandler * handler);
    00707
    00708   //---------------------------------------------------------------------------
    00709
    00712
    00713   OsiCbcSolverInterface (OsiSolverInterface * solver=NULL,
    00714                          CbcStrategy * strategy=NULL);
    00715
    00717   virtual OsiSolverInterface * clone(bool copyData = true) const;
    00718
    00720   OsiCbcSolverInterface (const OsiCbcSolverInterface &);
    00721 #if 0
    00723   OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false);
    00724
    00726   void releaseCbc();
    00727 #endif
    00729   OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs);
    00730
    00732   virtual ~OsiCbcSolverInterface ();
    00733
    00735   //---------------------------------------------------------------------------
    00736
    00737 protected:
    00739
    00740
    00741   virtual void applyRowCut(const OsiRowCut& rc);
    00742
    00744   virtual void applyColCut(const OsiColCut& cc);
    00746
    00748
    00749   mutable CbcModel * modelPtr_;
    00751 };
    00752 // So unit test can find out if NDEBUG set
    00753 bool OsiCbcHasNDEBUG();
    00754
    00755 //#############################################################################
    00763 int
    00764 OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
    00765
    00766 #endif