OsiGrbSolverInterface.hpp

Go to the documentation of this file.
00001 //-----------------------------------------------------------------------------
00002 // name:     OSI Interface for Gurobi
00003 // template: OSI Cplex Interface written by T. Achterberg
00004 // author:   Stefan Vigerske
00005 //           Humboldt University Berlin
00006 // date:     09/02/2009
00007 // license:  this file may be freely distributed under the terms of EPL
00008 // comments: please scan this file for '???' and read the comments
00009 //-----------------------------------------------------------------------------
00010 // Copyright (C) 2009 Humboldt University Berlin and others.
00011 // All Rights Reserved.
00012 
00013 // $Id: OsiGrbSolverInterface.hpp 1830 2011-11-26 16:46:55Z stefan $
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     // Set an integer parameter
00064     bool setIntParam(OsiIntParam key, int value);
00065     // Set an double parameter
00066     bool setDblParam(OsiDblParam key, double value);
00067     // Set a string parameter
00068     bool setStrParam(OsiStrParam key, const std::string & value);
00069     // Set a hint parameter
00070     bool setHintParam(OsiHintParam key, bool yesNo = true, OsiHintStrength strength = OsiHintTry, void* = NULL);
00071     // Get an integer parameter
00072     bool getIntParam(OsiIntParam key, int& value) const;
00073     // Get an double parameter
00074     bool getDblParam(OsiDblParam key, double& value) const;
00075     // Get a string parameter
00076     bool getStrParam(OsiStrParam key, std::string& value) const;
00077     // Get a hint parameter
00078     bool getHintParam(OsiHintParam key, bool& yesNo, OsiHintStrength& strength, void*& otherInformation) const;
00079     // Get a hint parameter
00080     bool getHintParam(OsiHintParam key, bool& yesNo, OsiHintStrength& strength) const;
00081     // Get a hint parameter
00082     bool getHintParam(OsiHintParam key, bool& yesNo) const;
00083   // Set mipstart option (pass column solution to CPLEX before MIP start)
00084   void setMipStart(bool value) { domipstart = value; }
00085   // Get mipstart option value
00086   bool getMipStart() const { return domipstart; }
00088 
00089     //---------------------------------------------------------------------------
00091 
00092 
00093     virtual bool isAbandoned() const;
00095     virtual bool isProvenOptimal() const;
00097     virtual bool isProvenPrimalInfeasible() const;
00099     virtual bool isProvenDualInfeasible() const;
00101     virtual bool isPrimalObjectiveLimitReached() const;
00103     virtual bool isDualObjectiveLimitReached() const;
00105     virtual bool isIterationLimitReached() const;
00107 
00108     //---------------------------------------------------------------------------
00111 
00118     CoinWarmStart* getEmptyWarmStart() const;
00119 
00121     virtual CoinWarmStart* getWarmStart() const;
00124     virtual bool setWarmStart(const CoinWarmStart* warmstart);
00126 
00127     //---------------------------------------------------------------------------
00134 
00135     virtual void markHotStart();
00137     virtual void solveFromHotStart();
00139     virtual void unmarkHotStart();
00141 
00142     //---------------------------------------------------------------------------
00157 
00158     virtual int getNumCols() const;
00159 
00161     virtual int getNumRows() const;
00162 
00164     virtual int getNumElements() const;
00165 
00167     virtual const double * getColLower() const;
00168 
00170     virtual const double * getColUpper() const;
00171 
00181     virtual const char * getRowSense() const;
00182 
00191     virtual const double * getRightHandSide() const;
00192 
00201     virtual const double * getRowRange() const;
00202 
00204     virtual const double * getRowLower() const;
00205 
00207     virtual const double * getRowUpper() const;
00208 
00210     virtual const double * getObjCoefficients() const;
00211 
00213     virtual double getObjSense() const;
00214 
00216     virtual bool isContinuous(int colNumber) const;
00217 
00219     virtual const CoinPackedMatrix * getMatrixByRow() const;
00220 
00222     virtual const CoinPackedMatrix * getMatrixByCol() const;
00223 
00225     virtual double getInfinity() const;
00227 
00230 
00231     virtual const double * getColSolution() const;
00232 
00234     virtual const double * getRowPrice() const;
00235 
00237     virtual const double * getReducedCost() const;
00238 
00241     virtual const double * getRowActivity() const;
00242 
00244     virtual double getObjValue() const;
00245 
00248     virtual int getIterationCount() const;
00249 
00267     virtual std::vector<double*> getDualRays(int maxNumRays,
00268                          bool fullRay=false) const;
00280     virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00282 
00283 
00284     //---------------------------------------------------------------------------
00285 
00288     //-------------------------------------------------------------------------
00292     virtual void setObjCoeff(int elementIndex, double elementValue);
00293 
00295     virtual void setObjCoeffSet(const int* indexFirst, const int* indexLast,
00296             const double* coeffList);
00297 
00298     using OsiSolverInterface::setColLower;
00301     virtual void setColLower(int elementIndex, double elementValue);
00302 
00303     using OsiSolverInterface::setColUpper;
00306     virtual void setColUpper(int elementIndex, double elementValue);
00307 
00311     virtual void setColBounds(int elementIndex, double lower, double upper);
00312 
00320     virtual void setColSetBounds(const int* indexFirst, const int* indexLast,
00321             const double* boundList);
00322 
00325     virtual void setRowLower(int elementIndex, double elementValue);
00326 
00329     virtual void setRowUpper(int elementIndex, double elementValue);
00330 
00334     virtual void setRowBounds(int elementIndex, double lower, double upper);
00335 
00337     virtual void setRowType(int index, char sense, double rightHandSide,
00338             double range);
00339 
00347     virtual void setRowSetBounds(const int* indexFirst, const int* indexLast,
00348             const double* boundList);
00349 
00359     virtual void setRowSetTypes(const int* indexFirst, const int* indexLast,
00360             const char* senseList, const double* rhsList, const double* rangeList);
00362 
00363     //-------------------------------------------------------------------------
00367     virtual void setContinuous(int index);
00369     virtual void setInteger(int index);
00372     virtual void setContinuous(const int* indices, int len);
00375     virtual void setInteger(const int* indices, int len);
00377 
00378   //-------------------------------------------------------------------------
00382   virtual void setRowName(int ndx, std::string name) ;
00383 
00385   virtual void setColName(int ndx, std::string name) ;
00387 
00388     //-------------------------------------------------------------------------
00390     virtual void setObjSense(double s);
00391 
00402     virtual void setColSolution(const double * colsol);
00403 
00414     virtual void setRowPrice(const double * rowprice);
00415 
00416     //-------------------------------------------------------------------------
00421     using OsiSolverInterface::addCol;
00423     virtual void addCol(const CoinPackedVectorBase& vec, const double collb,
00424             const double colub, const double obj);
00425 
00426     using OsiSolverInterface::addCols;
00428     virtual void addCols(const int numcols,
00429             const CoinPackedVectorBase * const * cols, const double* collb,
00430             const double* colub, const double* obj);
00432     virtual void deleteCols(const int num, const int * colIndices);
00433 
00434     using OsiSolverInterface::addRow;
00436     virtual void addRow(const CoinPackedVectorBase& vec, const double rowlb,
00437             const double rowub);
00439     virtual void addRow(const CoinPackedVectorBase& vec, const char rowsen,
00440             const double rowrhs, const double rowrng);
00441 
00442     using OsiSolverInterface::addRows;
00444     virtual void addRows(const int numrows,
00445             const CoinPackedVectorBase * const * rows, const double* rowlb,
00446             const double* rowub);
00448     virtual void addRows(const int numrows,
00449             const CoinPackedVectorBase * const * rows, const char* rowsen,
00450             const double* rowrhs, const double* rowrng);
00452     virtual void deleteRows(const int num, const int * rowIndices);
00454 
00455 
00456     //---------------------------------------------------------------------------
00457 
00471     virtual void loadProblem(const CoinPackedMatrix& matrix, const double* collb,
00472             const double* colub, const double* obj, const double* rowlb,
00473             const double* rowub);
00474 
00482     virtual void assignProblem(CoinPackedMatrix*& matrix, double*& collb,
00483             double*& colub, double*& obj, double*& rowlb, double*& rowub);
00484 
00497     virtual void loadProblem(const CoinPackedMatrix& matrix, const double* collb,
00498             const double* colub, const double* obj, const char* rowsen,
00499             const double* rowrhs, const double* rowrng);
00500 
00508     virtual void assignProblem(CoinPackedMatrix*& matrix, double*& collb,
00509             double*& colub, double*& obj, char*& rowsen, double*& rowrhs,
00510             double*& rowrng);
00511 
00514     virtual void loadProblem(const int numcols, const int numrows,
00515             const int* start, const int* index, const double* value,
00516             const double* collb, const double* colub, const double* obj,
00517             const double* rowlb, const double* rowub);
00518 
00521     virtual void loadProblem(const int numcols, const int numrows,
00522             const int* start, const int* index, const double* value,
00523             const double* collb, const double* colub, const double* obj,
00524             const char* rowsen, const double* rowrhs, const double* rowrng);
00525 
00526     using OsiSolverInterface::readMps;
00528     virtual int readMps(const char *filename, const char *extension = "mps");
00529 
00534     virtual void writeMps(const char *filename, const char *extension = "mps",
00535             double objSense=0.0) const;
00536 
00538 
00539     //---------------------------------------------------------------------------
00540 
00546     enum keepCachedFlag
00547     {
00549         KEEPCACHED_NONE = 0,
00551         KEEPCACHED_COLUMN = 1,
00553         KEEPCACHED_ROW = 2,
00555         KEEPCACHED_MATRIX = 4,
00557         KEEPCACHED_RESULTS = 8,
00559         KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00561         KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00563         FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00565         FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00567         FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00569         FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00570     };
00571 
00572     GRBmodel* getLpPtr(int keepCached = KEEPCACHED_NONE);
00573 
00575 
00576     GRBenv* getEnvironmentPtr() const;
00577 
00579   bool isDemoLicense() const;
00581 
00583     const char* getCtype() const;
00584 
00594     static void incrementInstanceCounter();
00595 
00604     static void decrementInstanceCounter();
00605     
00607     static void setEnvironment(GRBenv* globalenv);
00608 
00610     static unsigned int getNumInstances();
00612 
00613 
00616 
00617     OsiGrbSolverInterface(bool use_local_env = false);
00618 
00620     OsiGrbSolverInterface(GRBenv* localgrbenv);
00621 
00623     virtual OsiSolverInterface * clone(bool copyData = true) const;
00624 
00626     OsiGrbSolverInterface(const OsiGrbSolverInterface&);
00627 
00629     OsiGrbSolverInterface& operator=(const OsiGrbSolverInterface& rhs);
00630 
00632     virtual ~OsiGrbSolverInterface();
00633 
00635     virtual void reset();
00637 
00638     /***************************************************************************/
00655 
00659     virtual int canDoSimplexInterface() const;
00660 
00661     using OsiSolverInterface::enableSimplexInterface;
00665     virtual void enableSimplexInterface(int doingPrimal) {
00666     }
00667     ;
00668 
00672     virtual void disableSimplexInterface() {
00673     }
00674     ;
00675 
00679     virtual void enableFactorization() const {
00680     }
00681     ;
00682 
00686     virtual void disableFactorization() const {
00687     }
00688     ;
00689 
00691     virtual bool basisIsAvailable() const;
00692 
00696     virtual void getBasisStatus(int* cstat, int* rstat) const;
00697 
00698     //  ///Get a row of the tableau (slack part in slack if not NULL)
00699     //  virtual void getBInvARow(int row, double* z, double * slack=NULL) const;
00700     //
00701     //  ///Get a row of the basis inverse
00702     //  virtual void getBInvRow(int row, double* z) const;
00703     //
00704     //  ///Get a column of the tableau
00705     //  virtual void getBInvACol(int col, double* vec) const;
00706     //
00707     //  ///Get a column of the basis inverse
00708     //  virtual void getBInvCol(int col, double* vec) const;
00709     //
00710     //  /**  Get indices of the pivot variable in each row
00711     //      (order of indices corresponds to the
00712     //      order of elements in a vector retured by getBInvACol() and
00713     //      getBInvCol()).
00714     //  */
00715     //  virtual void getBasics(int* index) const;
00717     void switchToLP();
00718 
00720     void switchToMIP();
00721 
00723     /***************************************************************************/
00724 
00725        /***************************************************************************/
00726 
00749     virtual OsiSolverInterface::ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00750             double effectivenessLb = 0.0);
00751 
00752 protected:
00753 
00756 
00757     virtual void applyRowCut(const OsiRowCut & rc);
00758 
00762     virtual void applyColCut(const OsiColCut & cc);
00764 
00765 private:
00768 
00769     void resizeColSpace(int minsize);
00770 
00772     void freeColSpace();
00773 
00775     void resizeAuxColSpace(int minsize);
00776 
00778     void resizeAuxColIndSpace();
00780 
00783 
00784     static GRBenv* globalenv_;
00786     static bool globalenv_is_ours;
00788     static unsigned int numInstances_;
00790 
00793 
00795     GRBmodel* getMutableLpPtr() const;
00796 
00798     void gutsOfCopy(const OsiGrbSolverInterface & source);
00799 
00801     void gutsOfConstructor();
00802 
00804     void gutsOfDestructor();
00805 
00807     void freeCachedColRim();
00808 
00810     void freeCachedRowRim();
00811 
00813     void freeCachedResults();
00814 
00816     void freeCachedMatrix();
00817 
00819     void freeCachedData(int keepCached = KEEPCACHED_NONE);
00820 
00822     void freeAllMemory();
00823 
00825     void convertToRangedRow(int rowidx, double rhs, double range);
00826 
00828     void convertToNormalRow(int rowidx, char sense, double rhs);
00830 
00831 
00834 
00835     mutable GRBenv* localenv_;
00836     
00838     mutable GRBmodel* lp_;  
00839 
00841     int *hotStartCStat_;
00842     int hotStartCStatSize_;
00843     int *hotStartRStat_;
00844     int hotStartRStatSize_;
00845     int hotStartMaxIteration_;
00846 
00848   int nameDisc_;
00849 
00852 
00853     mutable double *obj_;
00854 
00856     mutable double *collower_;
00857 
00859     mutable double *colupper_;
00860 
00862     mutable char *rowsense_;
00863 
00865     mutable double *rhs_;
00866 
00868     mutable double *rowrange_;
00869 
00871     mutable double *rowlower_;
00872 
00874     mutable double *rowupper_;
00875 
00877     mutable double *colsol_;
00878 
00880     mutable double *rowsol_;
00881 
00883     mutable double *redcost_;
00884 
00886     mutable double *rowact_;
00887 
00889     mutable CoinPackedMatrix *matrixByRow_;
00890 
00892     mutable CoinPackedMatrix *matrixByCol_;
00894 
00897 
00898   mutable bool probtypemip_;
00899 
00901   bool domipstart;
00902 
00904   int colspace_;
00905 
00907     char *coltype_;
00908 
00910     int nauxcols;
00911 
00913     int auxcolspace;
00914 
00917     int* colmap_O2G;
00918 
00923     int* colmap_G2O;
00924 
00926     int auxcolindspace;
00927 
00931     int* auxcolind;
00933 };
00934 
00935 //#############################################################################
00937 void OsiGrbSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00938 
00939 #endif

Generated on 12 Feb 2015 for Dip-All by  doxygen 1.6.1