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 "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
00162 bool setIntParam(OsiIntParam key, int value);
00163
00164 bool setDblParam(OsiDblParam key, double value);
00165
00166 bool setStrParam(OsiStrParam key, const std::string & value);
00167
00168 bool getIntParam(OsiIntParam key, int& value) const;
00169
00170 bool getDblParam(OsiDblParam key, double& value) const;
00171
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
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