Osi trunk
|
00001 //----------------------------------------------------------------------------- 00002 // name: OSI Interface for CPLEX 00003 // author: Tobias Pfender 00004 // Konrad-Zuse-Zentrum Berlin (Germany) 00005 // email: pfender@zib.de 00006 // date: 09/25/2000 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) 2000, Tobias Pfender, International Business Machines 00011 // Corporation and others. All Rights Reserved. 00012 00013 #ifndef OsiCpxSolverInterface_H 00014 #define OsiCpxSolverInterface_H 00015 00016 #include "OsiSolverInterface.hpp" 00017 00018 typedef struct cpxlp* CPXLPptr; 00019 typedef struct cpxenv* CPXENVptr; 00020 00026 class OsiCpxSolverInterface : virtual public OsiSolverInterface { 00027 friend void OsiCpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00028 00029 public: 00030 00031 //--------------------------------------------------------------------------- 00034 00035 virtual void initialSolve(); 00036 00038 virtual void resolve(); 00039 00041 virtual void branchAndBound(); 00043 00044 //--------------------------------------------------------------------------- 00060 // Set an integer parameter 00061 bool setIntParam(OsiIntParam key, int value); 00062 // Set an double parameter 00063 bool setDblParam(OsiDblParam key, double value); 00064 // Set a string parameter 00065 bool setStrParam(OsiStrParam key, const std::string & value); 00066 // Get an integer parameter 00067 bool getIntParam(OsiIntParam key, int& value) const; 00068 // Get an double parameter 00069 bool getDblParam(OsiDblParam key, double& value) const; 00070 // Get a string parameter 00071 bool getStrParam(OsiStrParam key, std::string& value) const; 00073 00074 //--------------------------------------------------------------------------- 00076 00077 00078 virtual bool isAbandoned() const; 00080 virtual bool isProvenOptimal() const; 00082 virtual bool isProvenPrimalInfeasible() const; 00084 virtual bool isProvenDualInfeasible() const; 00086 virtual bool isPrimalObjectiveLimitReached() const; 00088 virtual bool isDualObjectiveLimitReached() const; 00090 virtual bool isIterationLimitReached() const; 00092 00093 //--------------------------------------------------------------------------- 00096 00103 CoinWarmStart *getEmptyWarmStart () const; 00104 00106 virtual CoinWarmStart* getWarmStart() const; 00109 virtual bool setWarmStart(const CoinWarmStart* warmstart); 00111 00112 //--------------------------------------------------------------------------- 00119 00120 virtual void markHotStart(); 00122 virtual void solveFromHotStart(); 00124 virtual void unmarkHotStart(); 00126 00127 //--------------------------------------------------------------------------- 00142 00143 virtual int getNumCols() const; 00144 00146 virtual int getNumRows() const; 00147 00149 virtual int getNumElements() const; 00150 00152 virtual const double * getColLower() const; 00153 00155 virtual const double * getColUpper() const; 00156 00166 virtual const char * getRowSense() const; 00167 00176 virtual const double * getRightHandSide() const; 00177 00186 virtual const double * getRowRange() const; 00187 00189 virtual const double * getRowLower() const; 00190 00192 virtual const double * getRowUpper() const; 00193 00195 virtual const double * getObjCoefficients() const; 00196 00198 virtual double getObjSense() const; 00199 00201 virtual bool isContinuous(int colNumber) const; 00202 00203 #if 0 00204 00205 virtual bool isBinary(int columnNumber) const; 00206 00211 virtual bool isInteger(int columnNumber) const; 00212 00214 virtual bool isIntegerNonBinary(int columnNumber) const; 00215 00217 virtual bool isFreeBinary(int columnNumber) const; 00218 #endif 00219 00221 virtual const CoinPackedMatrix * getMatrixByRow() const; 00222 00224 virtual const CoinPackedMatrix * getMatrixByCol() const; 00225 00227 virtual double getInfinity() const; 00229 00232 00233 virtual const double * getColSolution() const; 00234 00236 virtual const double * getRowPrice() const; 00237 00239 virtual const double * getReducedCost() const; 00240 00243 virtual const double * getRowActivity() const; 00244 00246 virtual double getObjValue() const; 00247 00250 virtual int getIterationCount() const; 00251 00269 virtual std::vector<double*> getDualRays(int maxNumRays, 00270 bool fullRay = false) const; 00282 virtual std::vector<double*> getPrimalRays(int maxNumRays) const; 00283 00284 #if 0 00285 00287 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05) 00288 const; 00289 #endif 00290 00291 00292 00293 //--------------------------------------------------------------------------- 00294 00297 //------------------------------------------------------------------------- 00301 virtual void setObjCoeff( int elementIndex, double elementValue ); 00302 00304 virtual void setObjCoeffSet(const int* indexFirst, 00305 const int* indexLast, 00306 const double* coeffList); 00307 00308 using OsiSolverInterface::setColLower ; 00311 virtual void setColLower( int elementIndex, double elementValue ); 00312 00313 using OsiSolverInterface::setColUpper ; 00316 virtual void setColUpper( int elementIndex, double elementValue ); 00317 00321 virtual void setColBounds( int elementIndex, 00322 double lower, double upper ); 00323 00331 virtual void setColSetBounds(const int* indexFirst, 00332 const int* indexLast, 00333 const double* boundList); 00334 00337 virtual void setRowLower( int elementIndex, double elementValue ); 00338 00341 virtual void setRowUpper( int elementIndex, double elementValue ); 00342 00346 virtual void setRowBounds( int elementIndex, 00347 double lower, double upper ); 00348 00350 virtual void setRowType(int index, char sense, double rightHandSide, 00351 double range); 00352 00360 virtual void setRowSetBounds(const int* indexFirst, 00361 const int* indexLast, 00362 const double* boundList); 00363 00373 virtual void setRowSetTypes(const int* indexFirst, 00374 const int* indexLast, 00375 const char* senseList, 00376 const double* rhsList, 00377 const double* rangeList); 00379 00380 //------------------------------------------------------------------------- 00384 virtual void setContinuous(int index); 00386 virtual void setInteger(int index); 00389 virtual void setContinuous(const int* indices, int len); 00392 virtual void setInteger(const int* indices, int len); 00394 00395 //------------------------------------------------------------------------- 00397 virtual void setObjSense(double s); 00398 00409 virtual void setColSolution(const double * colsol); 00410 00421 virtual void setRowPrice(const double * rowprice); 00422 00423 //------------------------------------------------------------------------- 00428 using OsiSolverInterface::addCol ; 00430 virtual void addCol(const CoinPackedVectorBase& vec, 00431 const double collb, const double colub, 00432 const double obj); 00433 00434 using OsiSolverInterface::addCols ; 00436 virtual void addCols(const int numcols, 00437 const CoinPackedVectorBase * const * cols, 00438 const double* collb, const double* colub, 00439 const double* obj); 00441 virtual void deleteCols(const int num, const int * colIndices); 00442 00443 using OsiSolverInterface::addRow ; 00445 virtual void addRow(const CoinPackedVectorBase& vec, 00446 const double rowlb, const double rowub); 00448 virtual void addRow(const CoinPackedVectorBase& vec, 00449 const char rowsen, const double rowrhs, 00450 const double rowrng); 00451 00452 using OsiSolverInterface::addRows ; 00454 virtual void addRows(const int numrows, 00455 const CoinPackedVectorBase * const * rows, 00456 const double* rowlb, const double* rowub); 00458 virtual void addRows(const int numrows, 00459 const CoinPackedVectorBase * const * rows, 00460 const char* rowsen, const double* rowrhs, 00461 const double* rowrng); 00463 virtual void deleteRows(const int num, const int * rowIndices); 00464 00465 #if 0 00466 // ??? implemented in OsiSolverInterface 00467 //----------------------------------------------------------------------- 00489 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs, 00490 double effectivenessLb = 0.0); 00491 #endif 00492 00493 00494 00495 //--------------------------------------------------------------------------- 00496 00510 virtual void loadProblem(const CoinPackedMatrix& matrix, 00511 const double* collb, const double* colub, 00512 const double* obj, 00513 const double* rowlb, const double* rowub); 00514 00522 virtual void assignProblem(CoinPackedMatrix*& matrix, 00523 double*& collb, double*& colub, double*& obj, 00524 double*& rowlb, double*& rowub); 00525 00538 virtual void loadProblem(const CoinPackedMatrix& matrix, 00539 const double* collb, const double* colub, 00540 const double* obj, 00541 const char* rowsen, const double* rowrhs, 00542 const double* rowrng); 00543 00551 virtual void assignProblem(CoinPackedMatrix*& matrix, 00552 double*& collb, double*& colub, double*& obj, 00553 char*& rowsen, double*& rowrhs, 00554 double*& rowrng); 00555 00558 virtual void loadProblem(const int numcols, const int numrows, 00559 const int* start, const int* index, 00560 const double* value, 00561 const double* collb, const double* colub, 00562 const double* obj, 00563 const double* rowlb, const double* rowub); 00564 00567 virtual void loadProblem(const int numcols, const int numrows, 00568 const int* start, const int* index, 00569 const double* value, 00570 const double* collb, const double* colub, 00571 const double* obj, 00572 const char* rowsen, const double* rowrhs, 00573 const double* rowrng); 00574 00575 using OsiSolverInterface::readMps ; 00577 virtual int readMps(const char *filename, 00578 const char *extension = "mps"); 00579 00584 virtual void writeMps(const char *filename, 00585 const char *extension = "mps", 00586 double objSense=0.0) const; 00587 00589 00597 void passInMessageHandler(CoinMessageHandler * handler); 00599 00600 //--------------------------------------------------------------------------- 00601 00607 enum keepCachedFlag 00608 { 00610 KEEPCACHED_NONE = 0, 00612 KEEPCACHED_COLUMN = 1, 00614 KEEPCACHED_ROW = 2, 00616 KEEPCACHED_MATRIX = 4, 00618 KEEPCACHED_RESULTS = 8, 00620 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX, 00622 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS, 00624 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN, 00626 FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW, 00628 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX, 00630 FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS 00631 }; 00632 CPXLPptr getLpPtr( int keepCached = KEEPCACHED_NONE ); 00633 00635 00636 CPXENVptr getEnvironmentPtr(); 00638 00640 const char* getCtype() const; 00641 00644 00645 OsiCpxSolverInterface(); 00646 00648 virtual OsiSolverInterface * clone(bool copyData = true) const; 00649 00651 OsiCpxSolverInterface( const OsiCpxSolverInterface& ); 00652 00654 OsiCpxSolverInterface& operator=( const OsiCpxSolverInterface& rhs ); 00655 00657 virtual ~OsiCpxSolverInterface(); 00658 00660 virtual void reset(); 00662 00663 /***************************************************************************/ 00683 00687 virtual int canDoSimplexInterface() const; 00688 00689 using OsiSolverInterface::enableSimplexInterface ; 00693 virtual void enableSimplexInterface(int doingPrimal) {}; 00694 00698 virtual void disableSimplexInterface() {}; 00699 00703 virtual void enableFactorization() const {}; 00704 00708 virtual void disableFactorization() const {}; 00709 00711 virtual bool basisIsAvailable() const; 00712 00716 virtual void getBasisStatus(int* cstat, int* rstat) const; 00717 00719 virtual void getBInvARow(int row, double* z, double * slack=NULL) const; 00720 00722 virtual void getBInvRow(int row, double* z) const; 00723 00725 virtual void getBInvACol(int col, double* vec) const; 00726 00728 virtual void getBInvCol(int col, double* vec) const; 00729 00735 virtual void getBasics(int* index) const; 00737 void switchToLP(); 00738 00740 void switchToMIP(); 00741 00743 /***************************************************************************/ 00744 00745 protected: 00746 00749 00750 virtual void applyRowCut( const OsiRowCut & rc ); 00751 00755 virtual void applyColCut( const OsiColCut & cc ); 00757 00758 private: 00761 00762 void resizeColType( int minsize ); 00763 00765 void freeColType(); 00767 00768 00771 00773 CPXLPptr getMutableLpPtr() const; 00774 00776 void gutsOfCopy( const OsiCpxSolverInterface & source ); 00777 00779 void gutsOfConstructor(); 00780 00782 void gutsOfDestructor(); 00783 00785 void freeCachedColRim(); 00786 00788 void freeCachedRowRim(); 00789 00791 void freeCachedResults(); 00792 00794 void freeCachedMatrix(); 00795 00797 void freeCachedData( int keepCached = KEEPCACHED_NONE ); 00798 00800 void freeAllMemory(); 00801 00802 00804 void printBounds(); 00806 00807 00810 00811 mutable CPXENVptr env_; 00813 mutable CPXLPptr lp_; 00814 00816 int *hotStartCStat_; 00817 int hotStartCStatSize_; 00818 int *hotStartRStat_; 00819 int hotStartRStatSize_; 00820 int hotStartMaxIteration_; 00821 00824 00825 mutable double *obj_; 00826 00828 mutable double *collower_; 00829 00831 mutable double *colupper_; 00832 00834 mutable char *rowsense_; 00835 00837 mutable double *rhs_; 00838 00840 mutable double *rowrange_; 00841 00843 mutable double *rowlower_; 00844 00846 mutable double *rowupper_; 00847 00849 mutable double *colsol_; 00850 00852 mutable double *rowsol_; 00853 00855 mutable double *redcost_; 00856 00858 mutable double *rowact_; 00859 00861 mutable CoinPackedMatrix *matrixByRow_; 00862 00864 mutable CoinPackedMatrix *matrixByCol_; 00866 00869 00870 char *coltype_; 00871 00873 int coltypesize_; 00874 00876 mutable bool probtypemip_; 00877 00879 }; 00880 00881 //############################################################################# 00887 void OsiCpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00888 00889 #endif