Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

OsiClpSolverInterface.hpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 #ifndef OsiClpSolverInterface_H
00005 #define OsiClpSolverInterface_H
00006 
00007 #include <string>
00008 #include <cfloat>
00009 #include <map>
00010 
00011 #include "ClpSimplex.hpp"
00012 #include "CoinPackedMatrix.hpp"
00013 #include "OsiSolverInterface.hpp"
00014 #include "OsiSimplexInterface.hpp"
00015 #include "CoinWarmStartBasis.hpp"
00016 
00017 class OsiRowCut;
00018 #ifndef COIN_DBL_MAX
00019 static const double OsiClpInfinity = DBL_MAX;
00020 #else
00021 static const double OsiClpInfinity = COIN_DBL_MAX;
00022 #endif
00023 
00024 //#############################################################################
00025 
00035 class OsiClpSolverInterface :
00036    public OsiSolverInterface, public OsiSimplexInterface {
00037    friend void OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00038 
00039 public:
00040   //---------------------------------------------------------------------------
00043 
00044     virtual void initialSolve();
00045 
00047     virtual void resolve();
00048 
00050     virtual void branchAndBound() {
00051       throw CoinError("Sorry, Clp doesn't implement B&B",
00052                      "branchAndBound", "OsiClpSolverInterface");
00053     };
00055 
00057 
00058 
00064   virtual void enableSimplexInterface(bool doingPrimal);
00065 
00067   virtual void disableSimplexInterface();
00068 
00070   virtual bool basisIsAvailable() {return true;};
00071 
00081   virtual void getBasisStatus(int* cstat, int* rstat);
00082 
00085   virtual int setBasisStatus(const int* cstat, const int* rstat);
00086 
00091   virtual int pivot(int colIn, int colOut, int outStatus);
00092 
00103   virtual int primalPivotResult(int colIn, int sign, 
00104                                 int& colOut, int& outStatus, 
00105                                 double& t, CoinPackedVector* dx);
00106 
00113   virtual int dualPivotResult(int& colIn, int& sign, 
00114                               int colOut, int outStatus, 
00115                               double& t, CoinPackedVector* dx);
00116 
00118   virtual void getReducedGradient(double* columnReducedCosts, 
00119                                   double * duals,
00120                                   const double * c);
00121 
00124   virtual void setObjectiveAndRefresh(double* c);
00125 
00127   virtual void getBInvARow(int row, double* z);
00128 
00130   virtual void getBInvRow(int row, double* z);
00131 
00133   virtual void getBInvACol(int col, double* vec);
00134 
00136   virtual void getBInvCol(int col, double* vec);
00137 
00142   virtual void getBasics(int* index);
00143 
00145   //---------------------------------------------------------------------------
00161     // Set an integer parameter
00162     bool setIntParam(OsiIntParam key, int value);
00163     // Set an double parameter
00164     bool setDblParam(OsiDblParam key, double value);
00165     // Set a string parameter
00166     bool setStrParam(OsiStrParam key, const std::string & value);
00167     // Get an integer parameter
00168     bool getIntParam(OsiIntParam key, int& value) const;
00169     // Get an double parameter
00170     bool getDblParam(OsiDblParam key, double& value) const;
00171     // Get a string parameter
00172     bool getStrParam(OsiStrParam key, std::string& value) const;
00174 
00175   //---------------------------------------------------------------------------
00177 
00178 
00179     virtual bool isAbandoned() const;
00181     virtual bool isProvenOptimal() const;
00183     virtual bool isProvenPrimalInfeasible() const;
00185     virtual bool isProvenDualInfeasible() const;
00187     virtual bool isPrimalObjectiveLimitReached() const;
00189     virtual bool isDualObjectiveLimitReached() const;
00191     virtual bool isIterationLimitReached() const;
00193 
00194   //---------------------------------------------------------------------------
00197 
00205   virtual CoinWarmStart *getEmptyWarmStart () const;
00206 
00208     virtual CoinWarmStart* getWarmStart() const;
00211     virtual bool setWarmStart(const CoinWarmStart* warmstart);
00213 
00214   //---------------------------------------------------------------------------
00221 
00222     virtual void markHotStart();
00224     virtual void solveFromHotStart();
00226     virtual void unmarkHotStart();
00228 
00229   //---------------------------------------------------------------------------
00244 
00245       virtual int getNumCols() const {
00246         return modelPtr_->numberColumns(); }
00247   
00249       virtual int getNumRows() const {
00250         return modelPtr_->numberRows(); }
00251   
00253       virtual int getNumElements() const {
00254         int retVal = 0;
00255         const CoinPackedMatrix * matrix =modelPtr_->matrix();
00256         if ( matrix != NULL ) retVal=matrix->getNumElements();
00257         return retVal; }
00258 
00260       virtual const double * getColLower() const { return modelPtr_->columnLower(); }
00261   
00263       virtual const double * getColUpper() const { return modelPtr_->columnUpper(); }
00264   
00274         virtual const char * getRowSense() const;
00275   
00284       virtual const double * getRightHandSide() const ;
00285   
00294       virtual const double * getRowRange() const ;
00295   
00297       virtual const double * getRowLower() const { return modelPtr_->rowLower(); }
00298   
00300       virtual const double * getRowUpper() const { return modelPtr_->rowUpper(); }
00301   
00303       virtual const double * getObjCoefficients() const 
00304        { return modelPtr_->objective(); }
00305   
00307       virtual double getObjSense() const 
00308       { return modelPtr_->optimizationDirection(); }
00309   
00311       virtual bool isContinuous(int colNumber) const;
00312   
00313   
00315       virtual const CoinPackedMatrix * getMatrixByRow() const;
00316   
00318       virtual const CoinPackedMatrix * getMatrixByCol() const;
00319   
00321       virtual double getInfinity() const { return OsiClpInfinity; }
00323     
00326 
00327       virtual const double * getColSolution() const; 
00328   
00330       virtual const double * getRowPrice() const;
00331   
00333       virtual const double * getReducedCost() const; 
00334   
00337       virtual const double * getRowActivity() const; 
00338   
00340       virtual double getObjValue() const {
00341 #     if 0
00342         // This does not pass unitTest when getObjValue is called before solve.
00343         return modelPtr_->objectiveValue();
00344 #     else
00345         return OsiSolverInterface::getObjValue();
00346 #     endif
00347       }
00348   
00351       virtual int getIterationCount() const 
00352        { return modelPtr_->numberIterations(); }
00353   
00365       virtual std::vector<double*> getDualRays(int maxNumRays) const;
00377       virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00378   
00380 
00381 
00382   //---------------------------------------------------------------------------
00383 
00386     //-------------------------------------------------------------------------
00390        virtual void setObjCoeff( int elementIndex, double elementValue );
00391 
00394        virtual void setColLower( int elementIndex, double elementValue );
00395       
00398        virtual void setColUpper( int elementIndex, double elementValue );
00399 
00401       virtual void setColBounds( int elementIndex,
00402         double lower, double upper );
00403 
00412       virtual void setColSetBounds(const int* indexFirst,
00413                                    const int* indexLast,
00414                                    const double* boundList);
00415       
00418       virtual void setRowLower( int elementIndex, double elementValue ) {
00419         modelPtr_->rowLower()[elementIndex] = elementValue;
00420       }
00421       
00424       virtual void setRowUpper( int elementIndex, double elementValue ) {
00425         modelPtr_->rowUpper()[elementIndex] = elementValue;
00426       }
00427     
00429       virtual void setRowBounds( int elementIndex,
00430                                  double lower, double upper ) {
00431         modelPtr_->rowLower()[elementIndex] = lower;
00432         modelPtr_->rowUpper()[elementIndex] = upper;
00433       }
00434     
00436       virtual void setRowType(int index, char sense, double rightHandSide,
00437                               double range);
00438     
00447       virtual void setRowSetBounds(const int* indexFirst,
00448                                    const int* indexLast,
00449                                    const double* boundList);
00450     
00461       virtual void setRowSetTypes(const int* indexFirst,
00462                                   const int* indexLast,
00463                                   const char* senseList,
00464                                   const double* rhsList,
00465                                   const double* rangeList);
00467     
00468     //-------------------------------------------------------------------------
00472       virtual void setContinuous(int index);
00474       virtual void setInteger(int index);
00477       virtual void setContinuous(const int* indices, int len);
00480       virtual void setInteger(const int* indices, int len);
00482     
00483     //-------------------------------------------------------------------------
00485     virtual void setObjSense(double s ) 
00486      { modelPtr_->setOptimizationDirection( s < 0 ? -1 : 1); }
00487     
00498     virtual void setColSolution(const double * colsol);
00499     
00510     virtual void setRowPrice(const double * rowprice);
00511 
00512     //-------------------------------------------------------------------------
00518       virtual void addCol(const CoinPackedVectorBase& vec,
00519                              const double collb, const double colub,   
00520                              const double obj);
00522       virtual void addCols(const int numcols,
00523                            const CoinPackedVectorBase * const * cols,
00524                            const double* collb, const double* colub,   
00525                            const double* obj);
00527       virtual void deleteCols(const int num, const int * colIndices);
00528     
00530       virtual void addRow(const CoinPackedVectorBase& vec,
00531                           const double rowlb, const double rowub);
00533       virtual void addRow(const CoinPackedVectorBase& vec,
00534                           const char rowsen, const double rowrhs,   
00535                           const double rowrng);
00537       virtual void addRows(const int numrows,
00538                            const CoinPackedVectorBase * const * rows,
00539                            const double* rowlb, const double* rowub);
00541       virtual void addRows(const int numrows,
00542                            const CoinPackedVectorBase * const * rows,
00543                            const char* rowsen, const double* rowrhs,   
00544                            const double* rowrng);
00546       virtual void deleteRows(const int num, const int * rowIndices);
00547     
00548       //-----------------------------------------------------------------------
00552       virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
00554 
00555 
00556   //---------------------------------------------------------------------------
00557 
00558 public:
00559    
00573     virtual void loadProblem(const CoinPackedMatrix& matrix,
00574                              const double* collb, const double* colub,   
00575                              const double* obj,
00576                              const double* rowlb, const double* rowub);
00577                             
00585     virtual void assignProblem(CoinPackedMatrix*& matrix,
00586                              double*& collb, double*& colub, double*& obj,
00587                              double*& rowlb, double*& rowub);
00588                             
00601     virtual void loadProblem(const CoinPackedMatrix& matrix,
00602                            const double* collb, const double* colub,
00603                            const double* obj,
00604                            const char* rowsen, const double* rowrhs,   
00605                            const double* rowrng);
00606     
00614     virtual void assignProblem(CoinPackedMatrix*& matrix,
00615                              double*& collb, double*& colub, double*& obj,
00616                              char*& rowsen, double*& rowrhs,
00617                              double*& rowrng);
00618 
00621     virtual void loadProblem(const int numcols, const int numrows,
00622                              const int* start, const int* index,
00623                              const double* value,
00624                              const double* collb, const double* colub,   
00625                              const double* obj,
00626                              const double* rowlb, const double* rowub);
00627 
00630     virtual void loadProblem(const int numcols, const int numrows,
00631                              const int* start, const int* index,
00632                              const double* value,
00633                              const double* collb, const double* colub,   
00634                              const double* obj,
00635                              const char* rowsen, const double* rowrhs,   
00636                              const double* rowrng);
00639     virtual int readMps(const char *filename,
00640                          const char *extension = "mps") ;
00641 
00646     virtual void writeMps(const char *filename,
00647                           const char *extension = "mps",
00648                           double objSense=0.0) const;
00657     virtual int writeMpsNative(const char *filename, 
00658                   const char ** rowNames, const char ** columnNames,
00659                   int formatType=0,int numberAcross=2,
00660                          double objSense=0.0) const ;
00662 
00667 
00668   void newLanguage(CoinMessages::Language language);
00669   void setLanguage(CoinMessages::Language language)
00670   {newLanguage(language);};
00672   //---------------------------------------------------------------------------
00673 
00676 
00677   ClpSimplex * getModelPtr() const ;
00679 
00680   //---------------------------------------------------------------------------
00681 
00684 
00685     OsiClpSolverInterface ();
00686     
00688     virtual OsiSolverInterface * clone(bool copyData = true) const;
00689     
00691     OsiClpSolverInterface (const OsiClpSolverInterface &);
00692     
00694     OsiClpSolverInterface (ClpSimplex *);
00695 
00697     void releaseClp();
00698     
00700     OsiClpSolverInterface & operator=(const OsiClpSolverInterface& rhs);
00701     
00703     virtual ~OsiClpSolverInterface ();
00704 
00706     virtual void reset();
00708 
00709   //---------------------------------------------------------------------------
00710 
00711 protected:
00713 
00714 
00715     virtual void applyRowCut(const OsiRowCut& rc);
00716 
00718     virtual void applyColCut(const OsiColCut& cc);
00720 
00721   //---------------------------------------------------------------------------
00722 
00723 private:
00726 
00727     void gutsOfDestructor();
00728   
00730     void freeCachedResults() const;
00731 
00733     void extractSenseRhsRange() const;
00734 
00736     void fillParamMaps();
00738     CoinWarmStartBasis getBasis(ClpSimplex * model) const;
00740     void setBasis( const CoinWarmStartBasis & basis, ClpSimplex * model);
00742   
00745 
00746      mutable ClpSimplex * modelPtr_;
00748      double * linearObjective_;
00751 
00752       mutable char    *rowsense_;
00753   
00755       mutable double  *rhs_;
00756   
00760      mutable double  *rowrange_;
00761 
00764      mutable CoinWarmStartBasis* ws_;
00767      mutable double * rowActivity_;
00768      mutable double * columnActivity_;
00770      CoinWarmStartBasis basis_;
00772      int itlimOrig_;
00773 
00775      int lastAlgorithm_;
00776 
00778      bool notOwned_;
00779   
00781      mutable CoinPackedMatrix *matrixByRow_;  
00782 
00784      char * integerInformation_;
00785 
00786      std::map<OsiIntParam, ClpIntParam> intParamMap_;
00787      std::map<OsiDblParam, ClpDblParam> dblParamMap_;
00788      std::map<OsiStrParam, ClpStrParam> strParamMap_;
00789 
00791       ClpDataSave saveData_;
00793 };
00794 
00795 //#############################################################################
00803 void
00804 OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00805 
00806 #endif

Generated on Wed Dec 3 14:35:28 2003 for Osi by doxygen 1.3.5