Osi trunk
|
00001 //----------------------------------------------------------------------------- 00002 // name: OSI Interface for SoPlex >= 1.4.2c 00003 // authors: Tobias Pfender 00004 // Ambros Gleixner 00005 // Wei Huang 00006 // Konrad-Zuse-Zentrum Berlin (Germany) 00007 // email: pfender@zib.de 00008 // date: 01/16/2002 00009 // license: this file may be freely distributed under the terms of the EPL 00010 //----------------------------------------------------------------------------- 00011 // Copyright (C) 2002, Tobias Pfender, International Business Machines 00012 // Corporation and others. All Rights Reserved. 00013 // Last edit: $Id$ 00014 00015 #ifndef OsiSpxSolverInterface_H 00016 #define OsiSpxSolverInterface_H 00017 00018 #include <string> 00019 #include "soplex.h" 00020 #include "OsiSolverInterface.hpp" 00021 #include "CoinWarmStartBasis.hpp" 00022 00028 class OsiSpxSolverInterface : virtual public OsiSolverInterface, public soplex::SoPlex { 00029 friend void OsiSpxSolverInterfaceUnitTest(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 // Set an integer parameter 00063 bool setIntParam(OsiIntParam key, int value); 00064 // Set an double parameter 00065 bool setDblParam(OsiDblParam key, double 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 00097 inline CoinWarmStart *getEmptyWarmStart () const 00098 { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; } 00100 virtual CoinWarmStart* getWarmStart() const; 00103 virtual bool setWarmStart(const CoinWarmStart* warmstart); 00105 00106 //--------------------------------------------------------------------------- 00113 00114 virtual void markHotStart(); 00116 virtual void solveFromHotStart(); 00118 virtual void unmarkHotStart(); 00120 00121 //--------------------------------------------------------------------------- 00136 00137 virtual int getNumCols() const; 00138 00140 virtual int getNumRows() const; 00141 00143 virtual int getNumElements() const; 00144 00146 virtual const double * getColLower() const; 00147 00149 virtual const double * getColUpper() const; 00150 00160 virtual const char * getRowSense() const; 00161 00170 virtual const double * getRightHandSide() const; 00171 00180 virtual const double * getRowRange() const; 00181 00183 virtual const double * getRowLower() const; 00184 00186 virtual const double * getRowUpper() const; 00187 00189 virtual const double * getObjCoefficients() const; 00190 00192 virtual double getObjSense() const; 00193 00195 virtual bool isContinuous(int colNumber) const; 00196 00197 #if 0 00198 00199 virtual bool isBinary(int columnNumber) const; 00200 00205 virtual bool isInteger(int columnNumber) const; 00206 00208 virtual bool isIntegerNonBinary(int columnNumber) const; 00209 00211 virtual bool isFreeBinary(int columnNumber) const; 00212 #endif 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; 00277 00278 #if 0 00279 00281 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05) 00282 const; 00283 #endif 00284 00285 00286 00287 //--------------------------------------------------------------------------- 00288 00291 //------------------------------------------------------------------------- 00295 virtual void setObjCoeff( int elementIndex, double elementValue ); 00296 00299 virtual void setColLower( int elementIndex, double elementValue ); 00300 00303 virtual void setColUpper( int elementIndex, double elementValue ); 00304 00308 virtual void setColBounds( int elementIndex, 00309 double lower, double upper ); 00310 00311 #if 0 // we are using the default implementation of OsiSolverInterface 00312 00320 virtual void setColSetBounds(const int* indexFirst, 00321 const int* indexLast, 00322 const double* boundList); 00323 #endif 00324 00327 virtual void setRowLower( int elementIndex, double elementValue ); 00328 00331 virtual void setRowUpper( int elementIndex, double elementValue ); 00332 00336 virtual void setRowBounds( int elementIndex, 00337 double lower, double upper ); 00338 00340 virtual void setRowType(int index, char sense, double rightHandSide, 00341 double range); 00342 00343 #if 0 // we are using the default implementation of OsiSolverInterface 00344 00351 virtual void setRowSetBounds(const int* indexFirst, 00352 const int* indexLast, 00353 const double* boundList); 00354 00364 virtual void setRowSetTypes(const int* indexFirst, 00365 const int* indexLast, 00366 const char* senseList, 00367 const double* rhsList, 00368 const double* rangeList); 00369 #endif 00370 00371 00372 //------------------------------------------------------------------------- 00376 virtual void setContinuous(int index); 00378 virtual void setInteger(int index); 00379 #if 0 // we are using the default implementation of OsiSolverInterface 00380 00382 virtual void setContinuous(const int* indices, int len); 00385 virtual void setInteger(const int* indices, int len); 00386 #endif 00387 00388 00389 //------------------------------------------------------------------------- 00391 virtual void setObjSense(double s); 00392 00403 virtual void setColSolution(const double * colsol); 00404 00415 virtual void setRowPrice(const double * rowprice); 00416 00417 //------------------------------------------------------------------------- 00423 virtual void addCol(const CoinPackedVectorBase& vec, 00424 const double collb, const double colub, 00425 const double obj); 00426 00427 #if 0 // we are using the default implementation of OsiSolverInterface 00428 00429 virtual void addCols(const int numcols, 00430 const CoinPackedVectorBase * const * cols, 00431 const double* collb, const double* colub, 00432 const double* obj); 00433 #endif 00434 00436 virtual void deleteCols(const int num, const int * colIndices); 00437 00439 virtual void addRow(const CoinPackedVectorBase& vec, 00440 const double rowlb, const double rowub); 00442 virtual void addRow(const CoinPackedVectorBase& vec, 00443 const char rowsen, const double rowrhs, 00444 const double rowrng); 00445 00446 #if 0 // we are using the default implementation of OsiSolverInterface 00447 00448 virtual void addRows(const int numrows, 00449 const CoinPackedVectorBase * const * rows, 00450 const double* rowlb, const double* rowub); 00452 virtual void addRows(const int numrows, 00453 const CoinPackedVectorBase * const * rows, 00454 const char* rowsen, const double* rowrhs, 00455 const double* rowrng); 00456 #endif 00457 00459 virtual void deleteRows(const int num, const int * rowIndices); 00460 00461 #if 0 // we are using the default implementation of OsiSolverInterface 00462 //----------------------------------------------------------------------- 00484 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs, 00485 double effectivenessLb = 0.0); 00486 #endif 00487 00488 00489 00490 //--------------------------------------------------------------------------- 00491 00505 virtual void loadProblem(const CoinPackedMatrix& matrix, 00506 const double* collb, const double* colub, 00507 const double* obj, 00508 const double* rowlb, const double* rowub); 00509 00517 virtual void assignProblem(CoinPackedMatrix*& matrix, 00518 double*& collb, double*& colub, double*& obj, 00519 double*& rowlb, double*& rowub); 00520 00533 virtual void loadProblem(const CoinPackedMatrix& matrix, 00534 const double* collb, const double* colub, 00535 const double* obj, 00536 const char* rowsen, const double* rowrhs, 00537 const double* rowrng); 00538 00546 virtual void assignProblem(CoinPackedMatrix*& matrix, 00547 double*& collb, double*& colub, double*& obj, 00548 char*& rowsen, double*& rowrhs, 00549 double*& rowrng); 00550 00553 virtual void loadProblem(const int numcols, const int numrows, 00554 const int* start, const int* index, 00555 const double* value, 00556 const double* collb, const double* colub, 00557 const double* obj, 00558 const double* rowlb, const double* rowub); 00559 00562 virtual void loadProblem(const int numcols, const int numrows, 00563 const int* start, const int* index, 00564 const double* value, 00565 const double* collb, const double* colub, 00566 const double* obj, 00567 const char* rowsen, const double* rowrhs, 00568 const double* rowrng); 00569 00571 virtual int readMps(const char *filename, 00572 const char *extension = "mps"); 00573 00578 virtual void writeMps(const char *filename, 00579 const char *extension = "mps", 00580 double objSense=0.0) const; 00582 00583 //--------------------------------------------------------------------------- 00584 00587 00588 OsiSpxSolverInterface(); 00589 00591 virtual OsiSolverInterface * clone(bool copyData = true) const; 00592 00594 OsiSpxSolverInterface( const OsiSpxSolverInterface& ); 00595 00597 OsiSpxSolverInterface& operator=( const OsiSpxSolverInterface& rhs ); 00598 00600 virtual ~OsiSpxSolverInterface(); 00602 00603 protected: 00604 00607 00608 virtual void applyRowCut( const OsiRowCut & rc ); 00609 00613 virtual void applyColCut( const OsiColCut & cc ); 00615 00618 00619 soplex::SoPlex soplex_; 00621 00622 00623 private: 00626 00628 void freeCachedColRim(); 00629 00631 void freeCachedRowRim(); 00632 00634 void freeCachedResults(); 00635 00637 void freeCachedMatrix(); 00638 00639 enum keepCachedFlag 00640 { 00642 KEEPCACHED_NONE = 0, 00644 KEEPCACHED_COLUMN = 1, 00646 KEEPCACHED_ROW = 2, 00648 KEEPCACHED_MATRIX = 4, 00650 KEEPCACHED_RESULTS = 8, 00652 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX, 00654 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS, 00656 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & !KEEPCACHED_COLUMN, 00658 FREECACHED_ROW = KEEPCACHED_PROBLEM & !KEEPCACHED_ROW, 00660 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & !KEEPCACHED_MATRIX, 00662 FREECACHED_RESULTS = KEEPCACHED_ALL & !KEEPCACHED_RESULTS 00663 }; 00664 00666 void freeCachedData( int keepCached = KEEPCACHED_NONE ); 00667 00669 void freeAllMemory(); 00670 00672 void printBounds(); 00674 00675 00678 00679 soplex::DIdxSet spxintvars_; 00680 00682 soplex::SPxSolver::VarStatus *hotStartCStat_; 00683 int hotStartCStatSize_; 00684 soplex::SPxSolver::VarStatus *hotStartRStat_; 00685 int hotStartRStatSize_; 00686 int hotStartMaxIteration_; 00687 00690 00691 mutable soplex::DVector *obj_; 00692 00694 mutable char *rowsense_; 00695 00697 mutable double *rhs_; 00698 00700 mutable double *rowrange_; 00701 00703 mutable soplex::DVector *colsol_; 00704 00706 mutable soplex::DVector *rowsol_; 00707 00709 mutable soplex::DVector *redcost_; 00710 00712 mutable soplex::DVector *rowact_; 00713 00715 mutable CoinPackedMatrix *matrixByRow_; 00716 00718 mutable CoinPackedMatrix *matrixByCol_; 00720 00721 }; 00722 00723 //############################################################################# 00729 void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); 00730 00731 #endif