00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef OsiMskSolverInterface_H
00012 #define OsiMskSolverInterface_H
00013
00014 #include "OsiSolverInterface.hpp"
00015
00016 typedef void* MSKtask_t;
00017 typedef void* MSKenv_t;
00018
00019
00020
00021
00022
00023 class OsiMskSolverInterface :
00024 virtual public OsiSolverInterface {
00025 friend void OsiMskSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00026 public:
00027
00028
00031
00032 virtual void initialSolve();
00033
00035 virtual void resolve();
00036
00038 virtual void branchAndBound();
00040
00041
00057
00058 bool setIntParam(OsiIntParam key, int value);
00059
00060 bool setDblParam(OsiDblParam key, double value);
00061
00062 bool setStrParam(OsiStrParam key, const std::string & value);
00063
00064 bool getIntParam(OsiIntParam key, int& value) const;
00065
00066 bool getDblParam(OsiDblParam key, double& value) const;
00067
00068 bool getStrParam(OsiStrParam key, std::string& value) const;
00070
00071
00073
00074
00075 virtual bool isAbandoned() const;
00077 virtual bool isProvenOptimal() const;
00079 virtual bool isProvenPrimalInfeasible() const;
00081 virtual bool isProvenDualInfeasible() const;
00083 virtual bool isPrimalObjectiveLimitReached() const;
00085 virtual bool isDualObjectiveLimitReached() const;
00087 virtual bool isIterationLimitReached() const;
00089 virtual bool isLicenseError() const;
00091 int getRescode() const { return Mskerr; }
00093
00094
00103 CoinWarmStart* getEmptyWarmStart () const;
00104
00106
00107 virtual CoinWarmStart* getWarmStart() const;
00110 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00112
00113
00120
00121 virtual void markHotStart();
00123 virtual void solveFromHotStart();
00125 virtual void unmarkHotStart();
00127
00128
00143
00144 virtual int getNumCols() const;
00145
00147 virtual int getNumRows() const;
00148
00150 virtual int getNumElements() const;
00151
00153 virtual const double * getColLower() const;
00154
00156 virtual const double * getColUpper() const;
00157
00167 virtual const char * getRowSense() const;
00168
00177 virtual const double * getRightHandSide() const;
00178
00187 virtual const double * getRowRange() const;
00188
00190 virtual const double * getRowLower() const;
00191
00193 virtual const double * getRowUpper() const;
00194
00196 virtual const double * getObjCoefficients() const;
00197
00199 virtual double getObjSense() const;
00200
00202 virtual bool isContinuous(int colNumber) const;
00203
00204 #if 0
00206 virtual bool isBinary(int columnNumber) const;
00207
00212 virtual bool isInteger(int columnNumber) const;
00213
00215 virtual bool isIntegerNonBinary(int columnNumber) const;
00216
00218 virtual bool isFreeBinary(int columnNumber) const;
00219 #endif
00220
00222 virtual const CoinPackedMatrix * getMatrixByRow() const;
00223
00225 virtual const CoinPackedMatrix * getMatrixByCol() const;
00226
00228 virtual double getInfinity() const;
00230
00233
00234 virtual const double * getColSolution() const;
00235
00237 virtual const double * getRowPrice() const;
00238
00240 virtual const double * getReducedCost() const;
00241
00244 virtual const double * getRowActivity() const;
00245
00247 virtual double getObjValue() const;
00248
00251 virtual int getIterationCount() const;
00252
00270 virtual std::vector<double*> getDualRays(int maxNumRays,
00271 bool fullRay=false) const;
00283 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00284
00285 #if 0
00286
00288 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00289 const;
00290 #endif
00291
00292
00293
00294
00295
00298
00302 virtual void setObjCoeff( int elementIndex, double elementValue );
00303
00305 virtual void setObjCoeffSet(const int* indexFirst,
00306 const int* indexLast,
00307 const double* coeffList);
00308
00311 virtual void setColLower( int elementIndex, double elementValue );
00312
00315 virtual void setColUpper( int elementIndex, double elementValue );
00316
00320 virtual void setColBounds( int elementIndex,
00321 double lower, double upper );
00322
00330 virtual void setColSetBounds(const int* indexFirst,
00331 const int* indexLast,
00332 const double* boundList);
00333
00336 virtual void setRowLower( int elementIndex, double elementValue );
00337
00340 virtual void setRowUpper( int elementIndex, double elementValue );
00341
00345 virtual void setRowBounds( int elementIndex,
00346 double lower, double upper );
00347
00349 virtual void setRowType(int index, char sense, double rightHandSide,
00350 double range);
00351
00359 virtual void setRowSetBounds(const int* indexFirst,
00360 const int* indexLast,
00361 const double* boundList);
00362
00372 virtual void setRowSetTypes(const int* indexFirst,
00373 const int* indexLast,
00374 const char* senseList,
00375 const double* rhsList,
00376 const double* rangeList);
00378
00379
00383 virtual void setContinuous(int index);
00385 virtual void setInteger(int index);
00388 virtual void setContinuous(const int* indices, int len);
00391 virtual void setInteger(const int* indices, int len);
00393
00394
00396 virtual void setObjSense(double s);
00397
00408 virtual void setColSolution(const double * colsol);
00409
00420 virtual void setRowPrice(const double * rowprice);
00421
00422
00428 virtual void addCol(const CoinPackedVectorBase& vec,
00429 const double collb, const double colub,
00430 const double obj);
00432 virtual void addCols(const int numcols,
00433 const CoinPackedVectorBase * const * cols,
00434 const double* collb, const double* colub,
00435 const double* obj);
00437 virtual void deleteCols(const int num, const int * colIndices);
00438
00440 virtual void addRow(const CoinPackedVectorBase& vec,
00441 const double rowlb, const double rowub);
00443 virtual void addRow(const CoinPackedVectorBase& vec,
00444 const char rowsen, const double rowrhs,
00445 const double rowrng);
00447 virtual void addRows(const int numrows,
00448 const CoinPackedVectorBase * const * rows,
00449 const double* rowlb, const double* rowub);
00451 virtual void addRows(const int numrows,
00452 const CoinPackedVectorBase * const * rows,
00453 const char* rowsen, const double* rowrhs,
00454 const double* rowrng);
00456 virtual void deleteRows(const int num, const int * rowIndices);
00457
00458 #if 0
00459
00460
00482 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00483 double effectivenessLb = 0.0);
00484 #endif
00485
00486
00487
00488
00489
00503 virtual void loadProblem(const CoinPackedMatrix& matrix,
00504 const double* collb, const double* colub,
00505 const double* obj,
00506 const double* rowlb, const double* rowub);
00507
00515 virtual void assignProblem(CoinPackedMatrix*& matrix,
00516 double*& collb, double*& colub, double*& obj,
00517 double*& rowlb, double*& rowub);
00518
00531 virtual void loadProblem(const CoinPackedMatrix& matrix,
00532 const double* collb, const double* colub,
00533 const double* obj,
00534 const char* rowsen, const double* rowrhs,
00535 const double* rowrng);
00536
00544 virtual void assignProblem(CoinPackedMatrix*& matrix,
00545 double*& collb, double*& colub, double*& obj,
00546 char*& rowsen, double*& rowrhs,
00547 double*& rowrng);
00548
00551 virtual void loadProblem(const int numcols, const int numrows,
00552 const int* start, const int* index,
00553 const double* value,
00554 const double* collb, const double* colub,
00555 const double* obj,
00556 const double* rowlb, const double* rowub);
00557
00560 virtual void loadProblem(const int numcols, const int numrows,
00561 const int* start, const int* index,
00562 const double* value,
00563 const double* collb, const double* colub,
00564 const double* obj,
00565 const char* rowsen, const double* rowrhs,
00566 const double* rowrng);
00567
00569 virtual int readMps(const char *filename,
00570 const char *extension = "mps");
00571
00576 virtual void writeMps(const char *filename,
00577 const char *extension = "mps",
00578 double objSense=0.0) const;
00580
00588 void passInMessageHandler(CoinMessageHandler * handler);
00590
00591
00592
00598 enum keepCachedFlag
00599 {
00601 KEEPCACHED_NONE = 0,
00603 KEEPCACHED_COLUMN = 1,
00605 KEEPCACHED_ROW = 2,
00607 KEEPCACHED_MATRIX = 4,
00609 KEEPCACHED_RESULTS = 8,
00611 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00613 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00615 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00617 FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00619 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00621 FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00622 };
00623
00624 MSKtask_t getLpPtr( int keepCached = KEEPCACHED_NONE );
00625
00627
00628 MSKenv_t getEnvironmentPtr();
00630
00632 const char* getCtype() const;
00633
00643 static void incrementInstanceCounter();
00644
00653 static void decrementInstanceCounter();
00654
00656 static unsigned int getNumInstances();
00658
00659
00662
00663
00664
00665 OsiMskSolverInterface(MSKenv_t mskenv = NULL);
00666
00668 virtual OsiSolverInterface * clone(bool copyData = true) const;
00669
00671 OsiMskSolverInterface( const OsiMskSolverInterface& );
00672
00674 OsiMskSolverInterface& operator=( const OsiMskSolverInterface& rhs );
00675
00677 virtual ~OsiMskSolverInterface();
00679
00680 protected:
00681
00684
00685 virtual void applyRowCut( const OsiRowCut & rc );
00686
00690 virtual void applyColCut( const OsiColCut & cc );
00692
00693 private:
00696
00697 void switchToLP();
00698
00700 void switchToMIP();
00701
00703 void resizeColType( int minsize );
00704
00706 void freeColType();
00707
00708 bool definedSolution(int solution) const;
00709
00710 int solverUsed() const;
00711
00713
00716
00717 static MSKenv_t env_ ;
00718
00720
00722 static unsigned int numInstances_;
00723
00726
00727 int Mskerr;
00728 int MSKsolverused_;
00729 double ObjOffset_;
00730
00731 int InitialSolver;
00732
00734 public: MSKtask_t getMutableLpPtr() const;
00735
00737 void gutsOfCopy( const OsiMskSolverInterface & source );
00738
00740 void gutsOfConstructor();
00741
00743 void gutsOfDestructor();
00744
00746 void freeCachedColRim();
00747
00749 void freeCachedRowRim();
00750
00752 void freeCachedResults();
00753
00755 void freeCachedMatrix();
00756
00758 void freeCachedData( int keepCached = KEEPCACHED_NONE );
00759
00761 void freeAllMemory();
00762
00765
00766 mutable MSKtask_t task_;
00767
00769 int *hotStartCStat_;
00770 int hotStartCStatSize_;
00771 int *hotStartRStat_;
00772 int hotStartRStatSize_;
00773 int hotStartMaxIteration_;
00774
00777
00778 mutable double *obj_;
00779
00781 mutable double *collower_;
00782
00784 mutable double *colupper_;
00785
00787 mutable char *rowsense_;
00788
00790 mutable double *rhs_;
00791
00793 mutable double *rowrange_;
00794
00796 mutable double *rowlower_;
00797
00799 mutable double *rowupper_;
00800
00802 mutable double *colsol_;
00803
00805 mutable double *rowsol_;
00806
00808 mutable double *redcost_;
00809
00811 mutable double *rowact_;
00812
00814 mutable CoinPackedMatrix *matrixByRow_;
00815
00817 mutable CoinPackedMatrix *matrixByCol_;
00819
00822
00823 char *coltype_;
00824
00826 int coltypesize_;
00827
00829 mutable bool probtypemip_;
00830
00832 };
00833
00834
00836 void OsiMskSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00837
00838 #endif