00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef OsiGrbSolverInterface_H
00016 #define OsiGrbSolverInterface_H
00017
00018 #include <string>
00019 #include "OsiSolverInterface.hpp"
00020
00021 typedef struct _GRBmodel GRBmodel;
00022 typedef struct _GRBenv GRBenv;
00023
00029 class OsiGrbSolverInterface : virtual public OsiSolverInterface {
00030 friend void OsiGrbSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00031
00032 public:
00033
00034
00037
00038 virtual void initialSolve();
00039
00041 virtual void resolve();
00042
00044 virtual void branchAndBound();
00046
00047
00063
00064 bool setIntParam(OsiIntParam key, int value);
00065
00066 bool setDblParam(OsiDblParam key, double value);
00067
00068 bool setStrParam(OsiStrParam key, const std::string & value);
00069
00070 bool setHintParam(OsiHintParam key, bool yesNo = true, OsiHintStrength strength = OsiHintTry, void* = NULL);
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;
00077
00078 bool getHintParam(OsiHintParam key, bool& yesNo, OsiHintStrength& strength, void*& otherInformation) const;
00079
00080 bool getHintParam(OsiHintParam key, bool& yesNo, OsiHintStrength& strength) const;
00081
00082 bool getHintParam(OsiHintParam key, bool& yesNo) const;
00084
00085
00087
00088
00089 virtual bool isAbandoned() const;
00091 virtual bool isProvenOptimal() const;
00093 virtual bool isProvenPrimalInfeasible() const;
00095 virtual bool isProvenDualInfeasible() const;
00097 virtual bool isPrimalObjectiveLimitReached() const;
00099 virtual bool isDualObjectiveLimitReached() const;
00101 virtual bool isIterationLimitReached() const;
00103
00104
00107
00114 CoinWarmStart* getEmptyWarmStart() const;
00115
00117 virtual CoinWarmStart* getWarmStart() const;
00120 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00122
00123
00130
00131 virtual void markHotStart();
00133 virtual void solveFromHotStart();
00135 virtual void unmarkHotStart();
00137
00138
00153
00154 virtual int getNumCols() const;
00155
00157 virtual int getNumRows() const;
00158
00160 virtual int getNumElements() const;
00161
00163 virtual const double * getColLower() const;
00164
00166 virtual const double * getColUpper() const;
00167
00177 virtual const char * getRowSense() const;
00178
00187 virtual const double * getRightHandSide() const;
00188
00197 virtual const double * getRowRange() const;
00198
00200 virtual const double * getRowLower() const;
00201
00203 virtual const double * getRowUpper() const;
00204
00206 virtual const double * getObjCoefficients() const;
00207
00209 virtual double getObjSense() const;
00210
00212 virtual bool isContinuous(int colNumber) const;
00213
00215 virtual const CoinPackedMatrix * getMatrixByRow() const;
00216
00218 virtual const CoinPackedMatrix * getMatrixByCol() const;
00219
00221 virtual double getInfinity() const;
00223
00226
00227 virtual const double * getColSolution() const;
00228
00230 virtual const double * getRowPrice() const;
00231
00233 virtual const double * getReducedCost() const;
00234
00237 virtual const double * getRowActivity() const;
00238
00240 virtual double getObjValue() const;
00241
00244 virtual int getIterationCount() const;
00245
00263 virtual std::vector<double*> getDualRays(int maxNumRays,
00264 bool fullRay=false) const;
00276 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00278
00279
00280
00281
00284
00288 virtual void setObjCoeff(int elementIndex, double elementValue);
00289
00291 virtual void setObjCoeffSet(const int* indexFirst, const int* indexLast,
00292 const double* coeffList);
00293
00294 using OsiSolverInterface::setColLower;
00297 virtual void setColLower(int elementIndex, double elementValue);
00298
00299 using OsiSolverInterface::setColUpper;
00302 virtual void setColUpper(int elementIndex, double elementValue);
00303
00307 virtual void setColBounds(int elementIndex, double lower, double upper);
00308
00316 virtual void setColSetBounds(const int* indexFirst, const int* indexLast,
00317 const double* boundList);
00318
00321 virtual void setRowLower(int elementIndex, double elementValue);
00322
00325 virtual void setRowUpper(int elementIndex, double elementValue);
00326
00330 virtual void setRowBounds(int elementIndex, double lower, double upper);
00331
00333 virtual void setRowType(int index, char sense, double rightHandSide,
00334 double range);
00335
00343 virtual void setRowSetBounds(const int* indexFirst, const int* indexLast,
00344 const double* boundList);
00345
00355 virtual void setRowSetTypes(const int* indexFirst, const int* indexLast,
00356 const char* senseList, const double* rhsList, const double* rangeList);
00358
00359
00363 virtual void setContinuous(int index);
00365 virtual void setInteger(int index);
00368 virtual void setContinuous(const int* indices, int len);
00371 virtual void setInteger(const int* indices, int len);
00373
00374
00378 virtual void setRowName(int ndx, std::string name) ;
00379
00381 virtual void setColName(int ndx, std::string name) ;
00383
00384
00386 virtual void setObjSense(double s);
00387
00398 virtual void setColSolution(const double * colsol);
00399
00410 virtual void setRowPrice(const double * rowprice);
00411
00412
00417 using OsiSolverInterface::addCol;
00419 virtual void addCol(const CoinPackedVectorBase& vec, const double collb,
00420 const double colub, const double obj);
00421
00422 using OsiSolverInterface::addCols;
00424 virtual void addCols(const int numcols,
00425 const CoinPackedVectorBase * const * cols, const double* collb,
00426 const double* colub, const double* obj);
00428 virtual void deleteCols(const int num, const int * colIndices);
00429
00430 using OsiSolverInterface::addRow;
00432 virtual void addRow(const CoinPackedVectorBase& vec, const double rowlb,
00433 const double rowub);
00435 virtual void addRow(const CoinPackedVectorBase& vec, const char rowsen,
00436 const double rowrhs, const double rowrng);
00437
00438 using OsiSolverInterface::addRows;
00440 virtual void addRows(const int numrows,
00441 const CoinPackedVectorBase * const * rows, const double* rowlb,
00442 const double* rowub);
00444 virtual void addRows(const int numrows,
00445 const CoinPackedVectorBase * const * rows, const char* rowsen,
00446 const double* rowrhs, const double* rowrng);
00448 virtual void deleteRows(const int num, const int * rowIndices);
00450
00451
00452
00453
00467 virtual void loadProblem(const CoinPackedMatrix& matrix, const double* collb,
00468 const double* colub, const double* obj, const double* rowlb,
00469 const double* rowub);
00470
00478 virtual void assignProblem(CoinPackedMatrix*& matrix, double*& collb,
00479 double*& colub, double*& obj, double*& rowlb, double*& rowub);
00480
00493 virtual void loadProblem(const CoinPackedMatrix& matrix, const double* collb,
00494 const double* colub, const double* obj, const char* rowsen,
00495 const double* rowrhs, const double* rowrng);
00496
00504 virtual void assignProblem(CoinPackedMatrix*& matrix, double*& collb,
00505 double*& colub, double*& obj, char*& rowsen, double*& rowrhs,
00506 double*& rowrng);
00507
00510 virtual void loadProblem(const int numcols, const int numrows,
00511 const int* start, const int* index, const double* value,
00512 const double* collb, const double* colub, const double* obj,
00513 const double* rowlb, const double* rowub);
00514
00517 virtual void loadProblem(const int numcols, const int numrows,
00518 const int* start, const int* index, const double* value,
00519 const double* collb, const double* colub, const double* obj,
00520 const char* rowsen, const double* rowrhs, const double* rowrng);
00521
00522 using OsiSolverInterface::readMps;
00524 virtual int readMps(const char *filename, const char *extension = "mps");
00525
00530 virtual void writeMps(const char *filename, const char *extension = "mps",
00531 double objSense=0.0) const;
00532
00534
00535
00536
00542 enum keepCachedFlag
00543 {
00545 KEEPCACHED_NONE = 0,
00547 KEEPCACHED_COLUMN = 1,
00549 KEEPCACHED_ROW = 2,
00551 KEEPCACHED_MATRIX = 4,
00553 KEEPCACHED_RESULTS = 8,
00555 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00557 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00559 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00561 FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00563 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00565 FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00566 };
00567
00568 GRBmodel* getLpPtr(int keepCached = KEEPCACHED_NONE);
00569
00571
00572 GRBenv* getEnvironmentPtr() const;
00573
00575 bool isDemoLicense() const;
00577
00579 const char* getCtype() const;
00580
00590 static void incrementInstanceCounter();
00591
00600 static void decrementInstanceCounter();
00601
00603 static void setEnvironment(GRBenv* globalenv);
00604
00606 static unsigned int getNumInstances();
00608
00609
00612
00613 OsiGrbSolverInterface(bool use_local_env = false);
00614
00616 OsiGrbSolverInterface(GRBenv* localgrbenv);
00617
00619 virtual OsiSolverInterface * clone(bool copyData = true) const;
00620
00622 OsiGrbSolverInterface(const OsiGrbSolverInterface&);
00623
00625 OsiGrbSolverInterface& operator=(const OsiGrbSolverInterface& rhs);
00626
00628 virtual ~OsiGrbSolverInterface();
00629
00631 virtual void reset();
00633
00634
00651
00655 virtual int canDoSimplexInterface() const;
00656
00657 using OsiSolverInterface::enableSimplexInterface;
00661 virtual void enableSimplexInterface(int doingPrimal) {
00662 }
00663 ;
00664
00668 virtual void disableSimplexInterface() {
00669 }
00670 ;
00671
00675 virtual void enableFactorization() const {
00676 }
00677 ;
00678
00682 virtual void disableFactorization() const {
00683 }
00684 ;
00685
00687 virtual bool basisIsAvailable() const;
00688
00692 virtual void getBasisStatus(int* cstat, int* rstat) const;
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00713 void switchToLP();
00714
00716 void switchToMIP();
00717
00719
00720
00721 protected:
00722
00725
00726 virtual void applyRowCut(const OsiRowCut & rc);
00727
00731 virtual void applyColCut(const OsiColCut & cc);
00733
00734 private:
00737
00738 void resizeColSpace(int minsize);
00739
00741 void freeColSpace();
00742
00744 void resizeAuxColSpace(int minsize);
00745
00747 void resizeAuxColIndSpace();
00749
00752
00753 static GRBenv* globalenv_;
00755 static bool globalenv_is_ours;
00757 static unsigned int numInstances_;
00759
00762
00764 GRBmodel* getMutableLpPtr() const;
00765
00767 void gutsOfCopy(const OsiGrbSolverInterface & source);
00768
00770 void gutsOfConstructor();
00771
00773 void gutsOfDestructor();
00774
00776 void freeCachedColRim();
00777
00779 void freeCachedRowRim();
00780
00782 void freeCachedResults();
00783
00785 void freeCachedMatrix();
00786
00788 void freeCachedData(int keepCached = KEEPCACHED_NONE);
00789
00791 void freeAllMemory();
00792
00794 void convertToRangedRow(int rowidx, double rhs, double range);
00795
00797 void convertToNormalRow(int rowidx, char sense, double rhs);
00799
00800
00803
00804 mutable GRBenv* localenv_;
00805
00807 mutable GRBmodel* lp_;
00808
00810 int *hotStartCStat_;
00811 int hotStartCStatSize_;
00812 int *hotStartRStat_;
00813 int hotStartRStatSize_;
00814 int hotStartMaxIteration_;
00815
00817 int nameDisc_;
00818
00821
00822 mutable double *obj_;
00823
00825 mutable double *collower_;
00826
00828 mutable double *colupper_;
00829
00831 mutable char *rowsense_;
00832
00834 mutable double *rhs_;
00835
00837 mutable double *rowrange_;
00838
00840 mutable double *rowlower_;
00841
00843 mutable double *rowupper_;
00844
00846 mutable double *colsol_;
00847
00849 mutable double *rowsol_;
00850
00852 mutable double *redcost_;
00853
00855 mutable double *rowact_;
00856
00858 mutable CoinPackedMatrix *matrixByRow_;
00859
00861 mutable CoinPackedMatrix *matrixByCol_;
00863
00866
00867 mutable bool probtypemip_;
00868
00870 int colspace_;
00871
00873 char *coltype_;
00874
00876 int nauxcols;
00877
00879 int auxcolspace;
00880
00883 int* colmap_O2G;
00884
00889 int* colmap_G2O;
00890
00892 int auxcolindspace;
00893
00897 int* auxcolind;
00899 };
00900
00901
00907 void OsiGrbSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00908
00909 #endif