00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef OsiSpxSolverInterface_H
00016 #define OsiSpxSolverInterface_H
00017
00018 #include <string>
00019 #include "OsiSolverInterface.hpp"
00020 #include "CoinWarmStartBasis.hpp"
00021
00022 #ifndef _SOPLEX_H_
00023
00024
00025
00026 namespace soplex {
00027 class DIdxSet;
00028 class DVector;
00029 class SoPlex;
00030 }
00031 #endif
00032
00036 class OsiSpxSolverInterface : virtual public OsiSolverInterface {
00037 friend void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00038
00039 public:
00040
00041
00044
00045 virtual void initialSolve();
00046
00048 virtual void resolve();
00049
00051 virtual void branchAndBound();
00053
00054
00070
00071 bool setIntParam(OsiIntParam key, int value);
00072
00073 bool setDblParam(OsiDblParam key, double value);
00074
00075 bool getIntParam(OsiIntParam key, int& value) const;
00076
00077 bool getDblParam(OsiDblParam key, double& value) const;
00078
00079 bool getStrParam(OsiStrParam key, std::string& value) const;
00080
00081 void setTimeLimit(double value);
00082
00083 double getTimeLimit() const;
00085
00086
00088
00089
00090 virtual bool isAbandoned() const;
00092 virtual bool isProvenOptimal() const;
00094 virtual bool isProvenPrimalInfeasible() const;
00096 virtual bool isProvenDualInfeasible() const;
00097
00099 virtual bool isDualObjectiveLimitReached() const;
00101 virtual bool isIterationLimitReached() const;
00103 virtual bool isTimeLimitReached() const;
00105
00106
00109
00110 inline CoinWarmStart *getEmptyWarmStart () const
00111 { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
00113 virtual CoinWarmStart* getWarmStart() const;
00116 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00118
00119
00126
00127 virtual void markHotStart();
00129 virtual void solveFromHotStart();
00131 virtual void unmarkHotStart();
00133
00134
00149
00150 virtual int getNumCols() const;
00151
00153 virtual int getNumRows() const;
00154
00156 virtual int getNumElements() const;
00157
00159 virtual const double * getColLower() const;
00160
00162 virtual const double * getColUpper() const;
00163
00173 virtual const char * getRowSense() const;
00174
00183 virtual const double * getRightHandSide() const;
00184
00193 virtual const double * getRowRange() const;
00194
00196 virtual const double * getRowLower() const;
00197
00199 virtual const double * getRowUpper() const;
00200
00202 virtual const double * getObjCoefficients() const;
00203
00205 virtual double getObjSense() const;
00206
00208 virtual bool isContinuous(int colNumber) const;
00209
00210 #if 0
00212 virtual bool isBinary(int columnNumber) const;
00213
00218 virtual bool isInteger(int columnNumber) const;
00219
00221 virtual bool isIntegerNonBinary(int columnNumber) const;
00222
00224 virtual bool isFreeBinary(int columnNumber) const;
00225 #endif
00226
00228 virtual const CoinPackedMatrix * getMatrixByRow() const;
00229
00231 virtual const CoinPackedMatrix * getMatrixByCol() const;
00232
00234 virtual double getInfinity() const;
00236
00239
00240 virtual const double * getColSolution() const;
00241
00243 virtual const double * getRowPrice() const;
00244
00246 virtual const double * getReducedCost() const;
00247
00250 virtual const double * getRowActivity() const;
00251
00253 virtual double getObjValue() const;
00254
00257 virtual int getIterationCount() const;
00258
00276 virtual std::vector<double*> getDualRays(int maxNumRays,
00277 bool fullRay=false) const;
00289 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00290
00291 #if 0
00292
00294 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00295 const;
00296 #endif
00297
00298
00299
00300
00301
00304
00308 virtual void setObjCoeff( int elementIndex, double elementValue );
00309
00312 virtual void setColLower( int elementIndex, double elementValue );
00313
00316 virtual void setColUpper( int elementIndex, double elementValue );
00317
00321 virtual void setColBounds( int elementIndex,
00322 double lower, double upper );
00323
00324 #if 0 // we are using the default implementation of OsiSolverInterface
00325
00333 virtual void setColSetBounds(const int* indexFirst,
00334 const int* indexLast,
00335 const double* boundList);
00336 #endif
00337
00340 virtual void setRowLower( int elementIndex, double elementValue );
00341
00344 virtual void setRowUpper( int elementIndex, double elementValue );
00345
00349 virtual void setRowBounds( int elementIndex,
00350 double lower, double upper );
00351
00353 virtual void setRowType(int index, char sense, double rightHandSide,
00354 double range);
00355
00356 #if 0 // we are using the default implementation of OsiSolverInterface
00357
00364 virtual void setRowSetBounds(const int* indexFirst,
00365 const int* indexLast,
00366 const double* boundList);
00367
00377 virtual void setRowSetTypes(const int* indexFirst,
00378 const int* indexLast,
00379 const char* senseList,
00380 const double* rhsList,
00381 const double* rangeList);
00382 #endif
00383
00384
00385
00389 virtual void setContinuous(int index);
00391 virtual void setInteger(int index);
00392 #if 0 // we are using the default implementation of OsiSolverInterface
00393
00395 virtual void setContinuous(const int* indices, int len);
00398 virtual void setInteger(const int* indices, int len);
00399 #endif
00400
00401
00402
00404 virtual void setObjSense(double s);
00405
00416 virtual void setColSolution(const double * colsol);
00417
00428 virtual void setRowPrice(const double * rowprice);
00429
00430
00436 virtual void addCol(const CoinPackedVectorBase& vec,
00437 const double collb, const double colub,
00438 const double obj);
00439
00440 #if 0 // we are using the default implementation of OsiSolverInterface
00441
00442 virtual void addCols(const int numcols,
00443 const CoinPackedVectorBase * const * cols,
00444 const double* collb, const double* colub,
00445 const double* obj);
00446 #endif
00447
00449 virtual void deleteCols(const int num, const int * colIndices);
00450
00452 virtual void addRow(const CoinPackedVectorBase& vec,
00453 const double rowlb, const double rowub);
00455 virtual void addRow(const CoinPackedVectorBase& vec,
00456 const char rowsen, const double rowrhs,
00457 const double rowrng);
00458
00459 #if 0 // we are using the default implementation of OsiSolverInterface
00460
00461 virtual void addRows(const int numrows,
00462 const CoinPackedVectorBase * const * rows,
00463 const double* rowlb, const double* rowub);
00465 virtual void addRows(const int numrows,
00466 const CoinPackedVectorBase * const * rows,
00467 const char* rowsen, const double* rowrhs,
00468 const double* rowrng);
00469 #endif
00470
00472 virtual void deleteRows(const int num, const int * rowIndices);
00473
00474 #if 0 // we are using the default implementation of OsiSolverInterface
00475
00497 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00498 double effectivenessLb = 0.0);
00499 #endif
00500
00501
00502
00503
00504
00518 virtual void loadProblem(const CoinPackedMatrix& matrix,
00519 const double* collb, const double* colub,
00520 const double* obj,
00521 const double* rowlb, const double* rowub);
00522
00530 virtual void assignProblem(CoinPackedMatrix*& matrix,
00531 double*& collb, double*& colub, double*& obj,
00532 double*& rowlb, double*& rowub);
00533
00546 virtual void loadProblem(const CoinPackedMatrix& matrix,
00547 const double* collb, const double* colub,
00548 const double* obj,
00549 const char* rowsen, const double* rowrhs,
00550 const double* rowrng);
00551
00559 virtual void assignProblem(CoinPackedMatrix*& matrix,
00560 double*& collb, double*& colub, double*& obj,
00561 char*& rowsen, double*& rowrhs,
00562 double*& rowrng);
00563
00566 virtual void loadProblem(const int numcols, const int numrows,
00567 const int* start, const int* index,
00568 const double* value,
00569 const double* collb, const double* colub,
00570 const double* obj,
00571 const double* rowlb, const double* rowub);
00572
00575 virtual void loadProblem(const int numcols, const int numrows,
00576 const int* start, const int* index,
00577 const double* value,
00578 const double* collb, const double* colub,
00579 const double* obj,
00580 const char* rowsen, const double* rowrhs,
00581 const double* rowrng);
00582
00584 virtual int readMps(const char *filename,
00585 const char *extension = "mps");
00586
00591 virtual void writeMps(const char *filename,
00592 const char *extension = "mps",
00593 double objSense=0.0) const;
00595
00596
00597
00600
00601 OsiSpxSolverInterface();
00602
00604 virtual OsiSolverInterface * clone(bool copyData = true) const;
00605
00607 OsiSpxSolverInterface( const OsiSpxSolverInterface& );
00608
00610 OsiSpxSolverInterface& operator=( const OsiSpxSolverInterface& rhs );
00611
00613 virtual ~OsiSpxSolverInterface();
00615
00616 protected:
00617
00620
00621 virtual void applyRowCut( const OsiRowCut & rc );
00622
00626 virtual void applyColCut( const OsiColCut & cc );
00628
00631
00632 soplex::SoPlex *soplex_;
00634
00635
00636 private:
00639
00641 void freeCachedColRim();
00642
00644 void freeCachedRowRim();
00645
00647 void freeCachedResults();
00648
00650 void freeCachedMatrix();
00651
00652 enum keepCachedFlag
00653 {
00655 KEEPCACHED_NONE = 0,
00657 KEEPCACHED_COLUMN = 1,
00659 KEEPCACHED_ROW = 2,
00661 KEEPCACHED_MATRIX = 4,
00663 KEEPCACHED_RESULTS = 8,
00665 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00667 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00669 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00671 FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00673 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00675 FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00676 };
00677
00679 void freeCachedData( int keepCached = KEEPCACHED_NONE );
00680
00682 void freeAllMemory();
00684
00685
00688
00689 soplex::DIdxSet *spxintvars_;
00690
00692 void* hotStartCStat_;
00693 int hotStartCStatSize_;
00694 void* hotStartRStat_;
00695 int hotStartRStatSize_;
00696 int hotStartMaxIteration_;
00697
00700
00701 mutable soplex::DVector *obj_;
00702
00704 mutable char *rowsense_;
00705
00707 mutable double *rhs_;
00708
00710 mutable double *rowrange_;
00711
00713 mutable soplex::DVector *colsol_;
00714
00716 mutable soplex::DVector *rowsol_;
00717
00719 mutable soplex::DVector *redcost_;
00720
00722 mutable soplex::DVector *rowact_;
00723
00725 mutable CoinPackedMatrix *matrixByRow_;
00726
00728 mutable CoinPackedMatrix *matrixByCol_;
00730
00731 };
00732
00733
00735 void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00736
00737 #endif