00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef OsiGlpkSolverInterface_H
00011 #define OsiGlpkSolverInterface_H
00012
00013 #include <string>
00014 #include "OsiSolverInterface.hpp"
00015 #include "CoinPackedMatrix.hpp"
00016 #include "CoinWarmStartBasis.hpp"
00017
00023 #ifndef LPX
00024 #define LPX glp_prob
00025 typedef struct { double _opaque_prob[100]; } glp_prob;
00026 #endif
00027
00028 class OsiGlpkSolverInterface : virtual public OsiSolverInterface {
00029 friend void OsiGlpkSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00030
00031 public:
00032
00033
00036
00037 virtual void initialSolve();
00038
00040 virtual void resolve();
00041
00043 virtual void branchAndBound();
00045
00046
00062
00063 bool setIntParam(OsiIntParam key, int value);
00064
00065 bool setDblParam(OsiDblParam key, double value);
00066
00067 bool setStrParam(OsiStrParam key, const std::string & value);
00068
00069 bool setHintParam(OsiHintParam key, bool sense = true,
00070 OsiHintStrength strength = OsiHintTry, void *info = 0) ;
00071
00072 bool getIntParam(OsiIntParam key, int& value) const;
00073
00074 bool getDblParam(OsiDblParam key, double& value) const;
00075
00076 bool getStrParam(OsiStrParam key, std::string& value) const;
00078
00079
00081
00082
00083 virtual bool isAbandoned() const;
00085 virtual bool isProvenOptimal() const;
00087 virtual bool isProvenPrimalInfeasible() const;
00089 virtual bool isProvenDualInfeasible() const;
00091 virtual bool isPrimalObjectiveLimitReached() const;
00093 virtual bool isDualObjectiveLimitReached() const;
00095 virtual bool isIterationLimitReached() const;
00097 virtual bool isTimeLimitReached() const;
00099 virtual bool isFeasible() const;
00101
00102
00111 inline CoinWarmStart *getEmptyWarmStart () const
00112 { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
00114 virtual CoinWarmStart* getWarmStart() const;
00117 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00119
00120
00127
00128 virtual void markHotStart();
00130 virtual void solveFromHotStart();
00132 virtual void unmarkHotStart();
00134
00135
00150
00151 virtual int getNumCols() const;
00152
00154 virtual int getNumRows() const;
00155
00157 virtual int getNumElements() const;
00158
00160 virtual const double * getColLower() const;
00161
00163 virtual const double * getColUpper() const;
00164
00174 virtual const char * getRowSense() const;
00175
00184 virtual const double * getRightHandSide() const;
00185
00194 virtual const double * getRowRange() const;
00195
00197 virtual const double * getRowLower() const;
00198
00200 virtual const double * getRowUpper() const;
00201
00203 virtual const double * getObjCoefficients() const;
00204
00206 virtual double getObjSense() const;
00207
00209 virtual bool isContinuous(int colNumber) const;
00210
00211 #if 0
00213 virtual bool isBinary(int columnNumber) const;
00214
00219 virtual bool isInteger(int columnNumber) const;
00220
00222 virtual bool isIntegerNonBinary(int columnNumber) const;
00223
00225 virtual bool isFreeBinary(int columnNumber) const;
00226 #endif
00227
00229 virtual const CoinPackedMatrix * getMatrixByRow() const;
00230
00232 virtual const CoinPackedMatrix * getMatrixByCol() const;
00233
00235 virtual double getInfinity() const;
00237
00240
00241 virtual const double * getColSolution() const;
00242
00244 virtual const double * getRowPrice() const;
00245
00247 virtual const double * getReducedCost() const;
00248
00251 virtual const double * getRowActivity() const;
00252
00254 virtual double getObjValue() const;
00255
00258 virtual int getIterationCount() const;
00259
00271 virtual std::vector<double*> getDualRays(int maxNumRays,
00272 bool fullRay=false) const;
00290 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00291
00292 #if 0
00293
00295 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00296 const;
00297 #endif
00298
00299
00300
00301
00302
00305
00309 virtual void setObjCoeff( int elementIndex, double elementValue );
00310
00311 using OsiSolverInterface::setColLower ;
00314 virtual void setColLower( int elementIndex, double elementValue );
00315
00316 using OsiSolverInterface::setColUpper ;
00319 virtual void setColUpper( int elementIndex, double elementValue );
00320
00324 virtual void setColBounds( int elementIndex,
00325 double lower, double upper );
00326
00335 virtual void setColSetBounds(const int* indexFirst,
00336 const int* indexLast,
00337 const double* boundList);
00338
00341 virtual void setRowLower( int elementIndex, double elementValue );
00342
00345 virtual void setRowUpper( int elementIndex, double elementValue );
00346
00350 virtual void setRowBounds( int elementIndex,
00351 double lower, double upper );
00352
00354 virtual void setRowType(int index, char sense, double rightHandSide,
00355 double range);
00356
00365 virtual void setRowSetBounds(const int* indexFirst,
00366 const int* indexLast,
00367 const double* boundList);
00368
00379 virtual void setRowSetTypes(const int* indexFirst,
00380 const int* indexLast,
00381 const char* senseList,
00382 const double* rhsList,
00383 const double* rangeList);
00385
00386
00390 virtual void setContinuous(int index);
00392 virtual void setInteger(int index);
00395 virtual void setContinuous(const int* indices, int len);
00398 virtual void setInteger(const int* indices, int len);
00400
00401
00403 virtual void setObjSense(double s);
00404
00415 virtual void setColSolution(const double * colsol);
00416
00427 virtual void setRowPrice(const double * rowprice);
00428
00429
00434
00435 using OsiSolverInterface::addCol ;
00437 virtual void addCol(const CoinPackedVectorBase& vec,
00438 const double collb, const double colub,
00439 const double obj);
00440
00441 using OsiSolverInterface::addCols ;
00443 virtual void addCols(const int numcols,
00444 const CoinPackedVectorBase * const * cols,
00445 const double* collb, const double* colub,
00446 const double* obj);
00448 virtual void deleteCols(const int num, const int * colIndices);
00449
00450 using OsiSolverInterface::addRow ;
00452 virtual void addRow(const CoinPackedVectorBase& vec,
00453 const double rowlb, const double rowub);
00455 virtual void addRow(const CoinPackedVectorBase& vec,
00456 const char rowsen, const double rowrhs,
00457 const double rowrng);
00458
00459 using OsiSolverInterface::addRows ;
00461 virtual void addRows(const int numrows,
00462 const CoinPackedVectorBase * const * rows,
00463 const double* rowlb, const double* rowub);
00465 virtual void addRows(const int numrows,
00466 const CoinPackedVectorBase * const * rows,
00467 const char* rowsen, const double* rowrhs,
00468 const double* rowrng);
00470 virtual void deleteRows(const int num, const int * rowIndices);
00471
00472 #if 0
00473
00474
00496 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00497 double effectivenessLb = 0.0);
00498 #endif
00499
00500
00501
00502
00503
00517 virtual void loadProblem(const CoinPackedMatrix& matrix,
00518 const double* collb, const double* colub,
00519 const double* obj,
00520 const double* rowlb, const double* rowub);
00521
00529 virtual void assignProblem(CoinPackedMatrix*& matrix,
00530 double*& collb, double*& colub, double*& obj,
00531 double*& rowlb, double*& rowub);
00532
00545 virtual void loadProblem(const CoinPackedMatrix& matrix,
00546 const double* collb, const double* colub,
00547 const double* obj,
00548 const char* rowsen, const double* rowrhs,
00549 const double* rowrng);
00550
00558 virtual void assignProblem(CoinPackedMatrix*& matrix,
00559 double*& collb, double*& colub, double*& obj,
00560 char*& rowsen, double*& rowrhs,
00561 double*& rowrng);
00562
00565 virtual void loadProblem(const int numcols, const int numrows,
00566 const int* start, const int* index,
00567 const double* value,
00568 const double* collb, const double* colub,
00569 const double* obj,
00570 const double* rowlb, const double* rowub);
00571
00574 virtual void loadProblem(const int numcols, const int numrows,
00575 const int* start, const int* index,
00576 const double* value,
00577 const double* collb, const double* colub,
00578 const double* obj,
00579 const char* rowsen, const double* rowrhs,
00580 const double* rowrng);
00581
00582 using OsiSolverInterface::readMps ;
00584 virtual int readMps(const char *filename,
00585 const char *extension = "mps");
00586
00591 virtual void writeMps(const char *filename,
00592 const char *extension = "mps",
00593 double objSense=0.0) const;
00595
00596
00597
00604
00607 void setObjName (std::string name) ;
00608
00614 void setRowName(int ndx, std::string name) ;
00615
00621 void setColName(int ndx, std::string name) ;
00622
00624
00625
00626
00629 enum keepCachedFlag
00630 {
00632 KEEPCACHED_NONE = 0,
00634 KEEPCACHED_COLUMN = 1,
00636 KEEPCACHED_ROW = 2,
00638 KEEPCACHED_MATRIX = 4,
00640 KEEPCACHED_RESULTS = 8,
00642 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00644 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00646 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00648 FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00650 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00652 FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00653 };
00654
00656 LPX * getModelPtr();
00657
00659
00668 static void incrementInstanceCounter() { ++numInstances_; }
00669
00677 static void decrementInstanceCounter();
00678
00680 static unsigned int getNumInstances() { return numInstances_; }
00682
00683
00686
00687 OsiGlpkSolverInterface();
00688
00690 virtual OsiSolverInterface * clone(bool copyData = true) const;
00691
00693 OsiGlpkSolverInterface( const OsiGlpkSolverInterface& );
00694
00696 OsiGlpkSolverInterface& operator=( const OsiGlpkSolverInterface& rhs );
00697
00699 virtual ~OsiGlpkSolverInterface();
00700
00702 virtual void reset();
00704
00705 protected:
00706
00709
00710 virtual void applyRowCut( const OsiRowCut & rc );
00711
00715 virtual void applyColCut( const OsiColCut & cc );
00716
00718 LPX * getMutableModelPtr() const;
00719
00721
00722 private:
00725
00727 void gutsOfCopy( const OsiGlpkSolverInterface & source );
00728
00730 void gutsOfConstructor();
00731
00733 void gutsOfDestructor();
00734
00736 void freeCachedColRim();
00737
00739 void freeCachedRowRim();
00740
00742 void freeCachedResults();
00743
00745 void freeCachedMatrix();
00746
00748 void freeCachedData( int keepCached = KEEPCACHED_NONE );
00749
00751 void freeAllMemory();
00752
00754 void printBounds();
00755
00757 void fillColBounds() const;
00759
00760
00763
00764 mutable LPX* lp_;
00765
00767 static unsigned int numInstances_;
00768
00769
00770
00771
00772 int bbWasLast_;
00773
00774
00776 int maxIteration_;
00778 int hotStartMaxIteration_;
00780 int nameDisc_;
00781
00782
00784 double dualObjectiveLimit_;
00786 double primalObjectiveLimit_;
00788 double dualTolerance_;
00790 double primalTolerance_;
00792 double objOffset_;
00793
00794
00796 std::string probName_;
00797
00799 mutable void *info_[OsiLastHintParam] ;
00800
00801
00803
00805 int hotStartCStatSize_;
00807 int *hotStartCStat_;
00809 double *hotStartCVal_;
00811 double *hotStartCDualVal_;
00812
00814 int hotStartRStatSize_;
00816 int *hotStartRStat_;
00818 double *hotStartRVal_;
00820 double *hotStartRDualVal_;
00821
00822
00824 bool isIterationLimitReached_;
00826 bool isTimeLimitReached_;
00828 bool isAbandoned_;
00834 bool isObjLowerLimitReached_;
00840 bool isObjUpperLimitReached_;
00842 bool isPrimInfeasible_;
00844 bool isDualInfeasible_;
00846 bool isFeasible_;
00847
00850
00852 mutable int iter_used_;
00853
00855 mutable double *obj_;
00856
00858 mutable double *collower_;
00859
00861 mutable double *colupper_;
00862
00864 mutable char *ctype_;
00865
00867 mutable char *rowsense_;
00868
00870 mutable double *rhs_;
00871
00873 mutable double *rowrange_;
00874
00876 mutable double *rowlower_;
00877
00879 mutable double *rowupper_;
00880
00882 mutable double *colsol_;
00883
00885 mutable double *rowsol_;
00886
00888 mutable double *redcost_;
00889
00891 mutable double *rowact_;
00892
00894 mutable CoinPackedMatrix *matrixByRow_;
00895
00897 mutable CoinPackedMatrix *matrixByCol_;
00899
00900 };
00901
00902
00904 void OsiGlpkSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00905
00906 #endif // OsiGlpkSolverInterface_H