00001
00002
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 "CoinWarmStartBasis.hpp"
00015 #include "ClpEventHandler.hpp"
00016 #include "CoinIndexedVector.hpp"
00017
00018 class OsiRowCut;
00019 class OsiClpUserSolver;
00020 class CoinSet;
00021 #ifndef COIN_DBL_MAX
00022 static const double OsiClpInfinity = DBL_MAX;
00023 #else
00024 static const double OsiClpInfinity = COIN_DBL_MAX;
00025 #endif
00026
00027
00028
00035 class OsiClpSolverInterface :
00036 virtual public OsiSolverInterface {
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();
00052
00054
00055
00061 virtual void enableSimplexInterface(bool doingPrimal);
00062
00064 virtual void disableSimplexInterface();
00068 virtual int canDoSimplexInterface() const;
00075 virtual void enableFactorization() const;
00077 virtual void disableFactorization() const;
00078
00094 void setupForRepeatedUse(int senseOfAdventure=0, int printOut=0);
00096 virtual void synchronizeModel();
00097
00098 void setSpecialOptionsMutable(unsigned int value) const;
00099
00104 virtual bool basisIsAvailable() const;
00105
00121 virtual void getBasisStatus(int* cstat, int* rstat) const;
00122
00133 virtual int setBasisStatus(const int* cstat, const int* rstat);
00134
00142 virtual int pivot(int colIn, int colOut, int outStatus);
00143
00155 virtual int primalPivotResult(int colIn, int sign,
00156 int& colOut, int& outStatus,
00157 double& t, CoinPackedVector* dx);
00158
00165 virtual int dualPivotResult(int& colIn, int& sign,
00166 int colOut, int outStatus,
00167 double& t, CoinPackedVector* dx);
00168
00170 virtual void getReducedGradient(double* columnReducedCosts,
00171 double * duals,
00172 const double * c);
00173
00176 virtual void setObjectiveAndRefresh(double* c);
00177
00179 virtual void getBInvARow(int row, double* z, double * slack=NULL) const;
00180
00185 virtual void getBInvARow(int row, CoinIndexedVector * z, CoinIndexedVector * slack=NULL,
00186 bool keepScaled=false) const;
00187
00189 virtual void getBInvRow(int row, double* z) const;
00190
00192 virtual void getBInvACol(int col, double* vec) const ;
00193
00195 virtual void getBInvACol(int col, CoinIndexedVector * vec) const ;
00196
00201 virtual void getBInvACol(CoinIndexedVector * vec) const ;
00202
00204 virtual void getBInvCol(int col, double* vec) const ;
00205
00210 virtual void getBasics(int* index) const;
00211
00213
00229
00230 bool setIntParam(OsiIntParam key, int value);
00231
00232 bool setDblParam(OsiDblParam key, double value);
00233
00234 bool setStrParam(OsiStrParam key, const std::string & value);
00235
00236 bool getIntParam(OsiIntParam key, int& value) const;
00237
00238 bool getDblParam(OsiDblParam key, double& value) const;
00239
00240 bool getStrParam(OsiStrParam key, std::string& value) const;
00241
00242 virtual bool setHintParam(OsiHintParam key, bool yesNo=true,
00243 OsiHintStrength strength=OsiHintTry,
00244 void * otherInformation=NULL);
00246
00247
00249
00250
00251 virtual bool isAbandoned() const;
00253 virtual bool isProvenOptimal() const;
00255 virtual bool isProvenPrimalInfeasible() const;
00257 virtual bool isProvenDualInfeasible() const;
00259 virtual bool isPrimalObjectiveLimitReached() const;
00261 virtual bool isDualObjectiveLimitReached() const;
00263 virtual bool isIterationLimitReached() const;
00265
00266
00269
00277 virtual CoinWarmStart *getEmptyWarmStart () const;
00278
00280 virtual CoinWarmStart* getWarmStart() const;
00283 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00293 virtual CoinWarmStart* getPointerToWarmStart(bool & mustDelete) ;
00294
00296
00297
00304
00305 virtual void markHotStart();
00307 virtual void solveFromHotStart();
00309 virtual void unmarkHotStart();
00311
00312
00327
00328 virtual int getNumCols() const {
00329 return modelPtr_->numberColumns(); }
00330
00332 virtual int getNumRows() const {
00333 return modelPtr_->numberRows(); }
00334
00336 virtual int getNumElements() const {
00337 int retVal = 0;
00338 const CoinPackedMatrix * matrix =modelPtr_->matrix();
00339 if ( matrix != NULL ) retVal=matrix->getNumElements();
00340 return retVal; }
00341
00344 virtual std::string getRowName(int rowIndex,
00345 unsigned maxLen = std::string::npos) const;
00346
00349 virtual std::string getColName(int colIndex,
00350 unsigned maxLen = std::string::npos) const;
00351
00352
00354 virtual const double * getColLower() const { return modelPtr_->columnLower(); }
00355
00357 virtual const double * getColUpper() const { return modelPtr_->columnUpper(); }
00358
00368 virtual const char * getRowSense() const;
00369
00378 virtual const double * getRightHandSide() const ;
00379
00388 virtual const double * getRowRange() const ;
00389
00391 virtual const double * getRowLower() const { return modelPtr_->rowLower(); }
00392
00394 virtual const double * getRowUpper() const { return modelPtr_->rowUpper(); }
00395
00397 virtual const double * getObjCoefficients() const
00398 { return modelPtr_->objective(); }
00399
00401 virtual double getObjSense() const
00402 { return modelPtr_->optimizationDirection(); }
00403
00405 virtual bool isContinuous(int colNumber) const;
00407 virtual bool isBinary(int colIndex) const;
00408
00413 virtual bool isInteger(int colIndex) const;
00414
00416 virtual bool isIntegerNonBinary(int colIndex) const;
00417
00419 virtual bool isFreeBinary(int colIndex) const;
00425 virtual const char * getColType(bool refresh=false) const;
00426
00427
00429 virtual const CoinPackedMatrix * getMatrixByRow() const;
00430
00432 virtual const CoinPackedMatrix * getMatrixByCol() const;
00433
00435 virtual CoinPackedMatrix * getMutableMatrixByCol() const;
00436
00438 virtual double getInfinity() const { return OsiClpInfinity; }
00440
00443
00444 virtual const double * getColSolution() const;
00445
00447 virtual const double * getRowPrice() const;
00448
00450 virtual const double * getReducedCost() const;
00451
00454 virtual const double * getRowActivity() const;
00455
00457 virtual double getObjValue() const;
00458
00461 virtual int getIterationCount() const
00462 { return modelPtr_->numberIterations(); }
00463
00475 virtual std::vector<double*> getDualRays(int maxNumRays) const;
00487 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00488
00490
00491
00492
00493
00496
00500 virtual void setObjCoeff( int elementIndex, double elementValue );
00501
00504 virtual void setColLower( int elementIndex, double elementValue );
00505
00508 virtual void setColUpper( int elementIndex, double elementValue );
00509
00511 virtual void setColBounds( int elementIndex,
00512 double lower, double upper );
00513
00522 virtual void setColSetBounds(const int* indexFirst,
00523 const int* indexLast,
00524 const double* boundList);
00525
00528 virtual void setRowLower( int elementIndex, double elementValue );
00529
00532 virtual void setRowUpper( int elementIndex, double elementValue ) ;
00533
00535 virtual void setRowBounds( int elementIndex,
00536 double lower, double upper ) ;
00537
00539 virtual void setRowType(int index, char sense, double rightHandSide,
00540 double range);
00541
00550 virtual void setRowSetBounds(const int* indexFirst,
00551 const int* indexLast,
00552 const double* boundList);
00553
00564 virtual void setRowSetTypes(const int* indexFirst,
00565 const int* indexLast,
00566 const char* senseList,
00567 const double* rhsList,
00568 const double* rangeList);
00573 virtual void setObjective(const double * array);
00574
00579 virtual void setColLower(const double * array);
00580
00585 virtual void setColUpper(const double * array);
00586
00587
00589
00590 virtual void setRowName(int rowIndex, std::string name) ;
00591
00592
00594
00595 virtual void setColName(int colIndex, std::string name) ;
00596
00598
00599
00603 virtual void setContinuous(int index);
00605 virtual void setInteger(int index);
00608 virtual void setContinuous(const int* indices, int len);
00611 virtual void setInteger(const int* indices, int len);
00613 inline int numberSOS() const
00614 { return numberSOS_;}
00616 inline const CoinSet * setInfo() const
00617 { return setInfo_;}
00627 virtual int findIntegersAndSOS(bool justCount);
00629
00630
00632 virtual void setObjSense(double s )
00633 { modelPtr_->setOptimizationDirection( s < 0 ? -1 : 1); }
00634
00645 virtual void setColSolution(const double * colsol);
00646
00657 virtual void setRowPrice(const double * rowprice);
00658
00659
00664
00665 using OsiSolverInterface::addCol ;
00667 virtual void addCol(const CoinPackedVectorBase& vec,
00668 const double collb, const double colub,
00669 const double obj);
00671 virtual void addCol(int numberElements, const int * rows, const double * elements,
00672 const double collb, const double colub,
00673 const double obj) ;
00675 virtual void addCols(const int numcols,
00676 const CoinPackedVectorBase * const * cols,
00677 const double* collb, const double* colub,
00678 const double* obj);
00680 virtual void addCols(const int numcols,
00681 const int * columnStarts, const int * rows, const double * elements,
00682 const double* collb, const double* colub,
00683 const double* obj);
00685 virtual void deleteCols(const int num, const int * colIndices);
00686
00687 using OsiSolverInterface::addRow ;
00689 virtual void addRow(const CoinPackedVectorBase& vec,
00690 const double rowlb, const double rowub);
00692 virtual void addRow(const CoinPackedVectorBase& vec,
00693 const char rowsen, const double rowrhs,
00694 const double rowrng);
00696 virtual void addRow(int numberElements, const int * columns, const double * element,
00697 const double rowlb, const double rowub) ;
00699 virtual void addRows(const int numrows,
00700 const CoinPackedVectorBase * const * rows,
00701 const double* rowlb, const double* rowub);
00703 virtual void addRows(const int numrows,
00704 const CoinPackedVectorBase * const * rows,
00705 const char* rowsen, const double* rowrhs,
00706 const double* rowrng);
00707
00709 virtual void addRows(const int numrows,
00710 const int * rowStarts, const int * columns, const double * element,
00711 const double* rowlb, const double* rowub);
00713 void modifyCoefficient(int row, int column, double newElement,
00714 bool keepZero=false)
00715 {modelPtr_->modifyCoefficient(row,column,newElement, keepZero);}
00716
00718 virtual void deleteRows(const int num, const int * rowIndices);
00721 virtual void saveBaseModel() ;
00725 virtual void restoreBaseModel(int numberRows);
00726
00727
00731 virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
00736 virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts);
00738
00739
00740
00741
00742 public:
00743
00757 virtual void loadProblem(const CoinPackedMatrix& matrix,
00758 const double* collb, const double* colub,
00759 const double* obj,
00760 const double* rowlb, const double* rowub);
00761
00769 virtual void assignProblem(CoinPackedMatrix*& matrix,
00770 double*& collb, double*& colub, double*& obj,
00771 double*& rowlb, double*& rowub);
00772
00785 virtual void loadProblem(const CoinPackedMatrix& matrix,
00786 const double* collb, const double* colub,
00787 const double* obj,
00788 const char* rowsen, const double* rowrhs,
00789 const double* rowrng);
00790
00798 virtual void assignProblem(CoinPackedMatrix*& matrix,
00799 double*& collb, double*& colub, double*& obj,
00800 char*& rowsen, double*& rowrhs,
00801 double*& rowrng);
00802
00805 virtual void loadProblem(const int numcols, const int numrows,
00806 const CoinBigIndex * start, const int* index,
00807 const double* value,
00808 const double* collb, const double* colub,
00809 const double* obj,
00810 const double* rowlb, const double* rowub);
00811
00814 virtual void loadProblem(const int numcols, const int numrows,
00815 const CoinBigIndex * start, const int* index,
00816 const double* value,
00817 const double* collb, const double* colub,
00818 const double* obj,
00819 const char* rowsen, const double* rowrhs,
00820 const double* rowrng);
00822 virtual int loadFromCoinModel ( CoinModel & modelObject, bool keepSolution=false);
00823
00824 using OsiSolverInterface::readMps ;
00827 virtual int readMps(const char *filename,
00828 const char *extension = "mps") ;
00831 int readMps(const char *filename,bool keepNames,bool allowErrors);
00832
00837 virtual void writeMps(const char *filename,
00838 const char *extension = "mps",
00839 double objSense=0.0) const;
00848 virtual int writeMpsNative(const char *filename,
00849 const char ** rowNames, const char ** columnNames,
00850 int formatType=0,int numberAcross=2,
00851 double objSense=0.0) const ;
00853 virtual int readLp(const char *filename, const double epsilon = 1e-5);
00859 virtual void writeLp(const char *filename,
00860 const char *extension = "lp",
00861 double epsilon = 1e-5,
00862 int numberAcross = 10,
00863 int decimals = 5,
00864 double objSense = 0.0,
00865 bool useRowNames = true) const;
00870 virtual void writeLp(FILE *fp,
00871 double epsilon = 1e-5,
00872 int numberAcross = 10,
00873 int decimals = 5,
00874 double objSense = 0.0,
00875 bool useRowNames = true) const;
00881 virtual void replaceMatrixOptional(const CoinPackedMatrix & matrix);
00883 virtual void replaceMatrix(const CoinPackedMatrix & matrix) ;
00885
00890
00891 void newLanguage(CoinMessages::Language language);
00892 void setLanguage(CoinMessages::Language language)
00893 {newLanguage(language);}
00895 void generateCpp( FILE * fp);
00897
00898
00901
00902 ClpSimplex * getModelPtr() const ;
00904 inline ClpSimplex * swapModelPtr(ClpSimplex * newModel)
00905 { ClpSimplex * model = modelPtr_; modelPtr_=newModel;return model;}
00907 inline unsigned int specialOptions() const
00908 { return specialOptions_;}
00909 void setSpecialOptions(unsigned int value);
00911 inline int cleanupScaling() const
00912 { return cleanupScaling_;}
00925 inline void setCleanupScaling(int value)
00926 { cleanupScaling_=value;}
00929 inline double smallestElementInCut() const
00930 { return smallestElementInCut_;}
00933 inline void setSmallestElementInCut(double value)
00934 { smallestElementInCut_=value;}
00941 inline double smallestChangeInCut() const
00942 { return smallestChangeInCut_;}
00949 inline void setSmallestChangeInCut(double value)
00950 { smallestChangeInCut_=value;}
00952 inline void setSolveOptions(const ClpSolve & options)
00953 { solveOptions_ = options;}
00955 int tightenBounds();
00957
00958
00959
00962
00963 OsiClpSolverInterface ();
00964
00966 virtual OsiSolverInterface * clone(bool copyData = true) const;
00967
00969 OsiClpSolverInterface (const OsiClpSolverInterface &);
00970
00972 OsiClpSolverInterface (ClpSimplex * rhs, bool reallyOwn=false);
00973
00975 void releaseClp();
00976
00978 OsiClpSolverInterface & operator=(const OsiClpSolverInterface& rhs);
00979
00981 virtual ~OsiClpSolverInterface ();
00982
00984 virtual void reset();
00986
00987
00988
00989 protected:
00991
00992
00993 virtual void applyRowCut(const OsiRowCut& rc);
00994
00996 virtual void applyColCut(const OsiColCut& cc);
00998
00999
01000
01001 protected:
01004
01005 void gutsOfDestructor();
01006
01008 void freeCachedResults() const;
01009
01011 void freeCachedResults0() const;
01012
01014 void freeCachedResults1() const;
01015
01017 void extractSenseRhsRange() const;
01018
01020 void fillParamMaps();
01029 CoinWarmStartBasis getBasis(ClpSimplex * model) const;
01038 void setBasis( const CoinWarmStartBasis & basis, ClpSimplex * model);
01040 void crunch();
01042 void redoScaleFactors(int numberRows,const CoinBigIndex * starts,
01043 const int * indices, const double * elements);
01044 public:
01047 void setBasis( const CoinWarmStartBasis & basis);
01049 inline void setBasis( )
01050 { setBasis(basis_,modelPtr_);}
01052 void deleteScaleFactors();
01054 inline const double * upRange() const
01055 { return rowActivity_;}
01056 inline const double * downRange() const
01057 { return columnActivity_;}
01059 inline void passInRanges(int * array)
01060 { whichRange_=array;}
01062 void setSOSData(int numberSOS,const char * type,
01063 const int * start,const int * indices, const double * weights=NULL);
01064 protected:
01066
01069
01070 mutable ClpSimplex * modelPtr_;
01072 double * linearObjective_;
01075
01076 mutable char *rowsense_;
01077
01079 mutable double *rhs_;
01080
01084 mutable double *rowrange_;
01085
01088 mutable CoinWarmStartBasis* ws_;
01091 mutable double * rowActivity_;
01092 mutable double * columnActivity_;
01094 int numberSOS_;
01096 CoinSet * setInfo_;
01098 ClpSimplex * smallModel_;
01100 ClpFactorization * factorization_;
01103 double smallestElementInCut_;
01107 double smallestChangeInCut_;
01109 char * spareArrays_;
01111 CoinWarmStartBasis basis_;
01113 int itlimOrig_;
01114
01116 mutable int lastAlgorithm_;
01117
01119 bool notOwned_;
01120
01122 mutable CoinPackedMatrix *matrixByRow_;
01123
01125 char * integerInformation_;
01126
01131 int * whichRange_;
01132
01133
01134
01135
01136
01138 mutable ClpDataSave saveData_;
01140 ClpSolve solveOptions_;
01153 int cleanupScaling_;
01172 mutable unsigned int specialOptions_;
01174 ClpSimplex * baseModel_;
01176 int lastNumberRows_;
01178 ClpSimplex * continuousModel_;
01180 CoinDoubleArrayWithLength rowScale_;
01182 CoinDoubleArrayWithLength columnScale_;
01184 };
01185
01186 class OsiClpDisasterHandler : public ClpDisasterHandler {
01187 public:
01191
01192 virtual void intoSimplex();
01194 virtual bool check() const ;
01196 virtual void saveInfo();
01198
01199
01204 OsiClpDisasterHandler(OsiClpSolverInterface * model = NULL);
01206 virtual ~OsiClpDisasterHandler();
01207
01208 OsiClpDisasterHandler(const OsiClpDisasterHandler&);
01209
01210 OsiClpDisasterHandler& operator=(const OsiClpDisasterHandler&);
01212 virtual ClpDisasterHandler * clone() const;
01213
01215
01220 void setOsiModel(OsiClpSolverInterface * model);
01222 inline OsiClpSolverInterface * osiModel() const
01223 { return osiModel_;}
01225 inline void setWhereFrom(int value)
01226 { whereFrom_=value;}
01228 inline int whereFrom() const
01229 { return whereFrom_;}
01231 inline void setPhase(int value)
01232 { phase_=value;}
01234 inline int phase() const
01235 { return phase_;}
01237 inline bool inTrouble() const
01238 { return inTrouble_;}
01240
01241
01242 protected:
01246
01247 OsiClpSolverInterface * osiModel_;
01255 int whereFrom_;
01263 int phase_;
01265 bool inTrouble_;
01266
01268 };
01269
01270
01278 void
01279 OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
01280 #endif