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 "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
00063 bool setIntParam(OsiIntParam key, int value);
00064
00065 bool setDblParam(OsiDblParam key, double value);
00066
00067 bool getIntParam(OsiIntParam key, int& value) const;
00068
00069 bool getDblParam(OsiDblParam key, double& value) const;
00070
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
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