00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef OsiSpxSolverInterface_H
00014 #define OsiSpxSolverInterface_H
00015
00016 #include <string>
00017 #include "spxsolver.h"
00018 #include "OsiSolverInterface.hpp"
00019 #include "CoinWarmStartBasis.hpp"
00020
00026 class OsiSpxSolverInterface : virtual public OsiSolverInterface {
00027 friend void OsiSpxSolverInterfaceUnitTest(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
00061 bool setIntParam(OsiIntParam key, int value);
00062
00063 bool setDblParam(OsiDblParam key, double value);
00064
00065 bool getIntParam(OsiIntParam key, int& value) const;
00066
00067 bool getDblParam(OsiDblParam key, double& value) const;
00068
00069 bool getStrParam(OsiStrParam key, std::string& value) const;
00071
00072
00074
00075
00076 virtual bool isAbandoned() const;
00078 virtual bool isProvenOptimal() const;
00080 virtual bool isProvenPrimalInfeasible() const;
00082 virtual bool isProvenDualInfeasible() const;
00084 virtual bool isPrimalObjectiveLimitReached() const;
00086 virtual bool isDualObjectiveLimitReached() const;
00088 virtual bool isIterationLimitReached() const;
00090
00091
00094
00095 inline CoinWarmStart *getEmptyWarmStart () const
00096 { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
00098 virtual CoinWarmStart* getWarmStart() const;
00101 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00103
00104
00111
00112 virtual void markHotStart();
00114 virtual void solveFromHotStart();
00116 virtual void unmarkHotStart();
00118
00119
00134
00135 virtual int getNumCols() const;
00136
00138 virtual int getNumRows() const;
00139
00141 virtual int getNumElements() const;
00142
00144 virtual const double * getColLower() const;
00145
00147 virtual const double * getColUpper() const;
00148
00158 virtual const char * getRowSense() const;
00159
00168 virtual const double * getRightHandSide() const;
00169
00178 virtual const double * getRowRange() const;
00179
00181 virtual const double * getRowLower() const;
00182
00184 virtual const double * getRowUpper() const;
00185
00187 virtual const double * getObjCoefficients() const;
00188
00190 virtual double getObjSense() const;
00191
00193 virtual bool isContinuous(int colNumber) const;
00194
00195 #if 0
00197 virtual bool isBinary(int columnNumber) const;
00198
00203 virtual bool isInteger(int columnNumber) const;
00204
00206 virtual bool isIntegerNonBinary(int columnNumber) const;
00207
00209 virtual bool isFreeBinary(int columnNumber) const;
00210 #endif
00211
00213 virtual const CoinPackedMatrix * getMatrixByRow() const;
00214
00216 virtual const CoinPackedMatrix * getMatrixByCol() const;
00217
00219 virtual double getInfinity() const;
00221
00224
00225 virtual const double * getColSolution() const;
00226
00228 virtual const double * getRowPrice() const;
00229
00231 virtual const double * getReducedCost() const;
00232
00235 virtual const double * getRowActivity() const;
00236
00238 virtual double getObjValue() const;
00239
00242 virtual int getIterationCount() const;
00243
00255 virtual std::vector<double*> getDualRays(int maxNumRays) const;
00267 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00268
00269 #if 0
00270
00272 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00273 const;
00274 #endif
00275
00276
00277
00278
00279
00282
00286 virtual void setObjCoeff( int elementIndex, double elementValue );
00287
00290 virtual void setColLower( int elementIndex, double elementValue );
00291
00294 virtual void setColUpper( int elementIndex, double elementValue );
00295
00299 virtual void setColBounds( int elementIndex,
00300 double lower, double upper );
00301
00302 #if 0 // we are using the default implementation of OsiSolverInterface
00303
00311 virtual void setColSetBounds(const int* indexFirst,
00312 const int* indexLast,
00313 const double* boundList);
00314 #endif
00315
00318 virtual void setRowLower( int elementIndex, double elementValue );
00319
00322 virtual void setRowUpper( int elementIndex, double elementValue );
00323
00327 virtual void setRowBounds( int elementIndex,
00328 double lower, double upper );
00329
00331 virtual void setRowType(int index, char sense, double rightHandSide,
00332 double range);
00333
00334 #if 0 // we are using the default implementation of OsiSolverInterface
00335
00342 virtual void setRowSetBounds(const int* indexFirst,
00343 const int* indexLast,
00344 const double* boundList);
00345
00355 virtual void setRowSetTypes(const int* indexFirst,
00356 const int* indexLast,
00357 const char* senseList,
00358 const double* rhsList,
00359 const double* rangeList);
00360 #endif
00361
00362
00363
00367 virtual void setContinuous(int index);
00369 virtual void setInteger(int index);
00370 #if 0 // we are using the default implementation of OsiSolverInterface
00371
00373 virtual void setContinuous(const int* indices, int len);
00376 virtual void setInteger(const int* indices, int len);
00377 #endif
00378
00379
00380
00382 virtual void setObjSense(double s);
00383
00394 virtual void setColSolution(const double * colsol);
00395
00406 virtual void setRowPrice(const double * rowprice);
00407
00408
00414 virtual void addCol(const CoinPackedVectorBase& vec,
00415 const double collb, const double colub,
00416 const double obj);
00417
00418 #if 0 // we are using the default implementation of OsiSolverInterface
00419
00420 virtual void addCols(const int numcols,
00421 const CoinPackedVectorBase * const * cols,
00422 const double* collb, const double* colub,
00423 const double* obj);
00424 #endif
00425
00427 virtual void deleteCols(const int num, const int * colIndices);
00428
00430 virtual void addRow(const CoinPackedVectorBase& vec,
00431 const double rowlb, const double rowub);
00433 virtual void addRow(const CoinPackedVectorBase& vec,
00434 const char rowsen, const double rowrhs,
00435 const double rowrng);
00436
00437 #if 0 // we are using the default implementation of OsiSolverInterface
00438
00439 virtual void addRows(const int numrows,
00440 const CoinPackedVectorBase * const * rows,
00441 const double* rowlb, const double* rowub);
00443 virtual void addRows(const int numrows,
00444 const CoinPackedVectorBase * const * rows,
00445 const char* rowsen, const double* rowrhs,
00446 const double* rowrng);
00447 #endif
00448
00450 virtual void deleteRows(const int num, const int * rowIndices);
00451
00452 #if 0 // we are using the default implementation of OsiSolverInterface
00453
00475 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00476 double effectivenessLb = 0.0);
00477 #endif
00478
00479
00480
00481
00482
00496 virtual void loadProblem(const CoinPackedMatrix& matrix,
00497 const double* collb, const double* colub,
00498 const double* obj,
00499 const double* rowlb, const double* rowub);
00500
00508 virtual void assignProblem(CoinPackedMatrix*& matrix,
00509 double*& collb, double*& colub, double*& obj,
00510 double*& rowlb, double*& rowub);
00511
00524 virtual void loadProblem(const CoinPackedMatrix& matrix,
00525 const double* collb, const double* colub,
00526 const double* obj,
00527 const char* rowsen, const double* rowrhs,
00528 const double* rowrng);
00529
00537 virtual void assignProblem(CoinPackedMatrix*& matrix,
00538 double*& collb, double*& colub, double*& obj,
00539 char*& rowsen, double*& rowrhs,
00540 double*& rowrng);
00541
00544 virtual void loadProblem(const int numcols, const int numrows,
00545 const int* start, const int* index,
00546 const double* value,
00547 const double* collb, const double* colub,
00548 const double* obj,
00549 const double* rowlb, const double* rowub);
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 char* rowsen, const double* rowrhs,
00559 const double* rowrng);
00560
00562 virtual int readMps(const char *filename,
00563 const char *extension = "mps");
00564
00569 virtual void writeMps(const char *filename,
00570 const char *extension = "mps",
00571 double objSense=0.0) const;
00573
00574
00575
00578
00579 OsiSpxSolverInterface();
00580
00582 virtual OsiSolverInterface * clone(bool copyData = true) const;
00583
00585 OsiSpxSolverInterface( const OsiSpxSolverInterface& );
00586
00588 OsiSpxSolverInterface& operator=( const OsiSpxSolverInterface& rhs );
00589
00591 virtual ~OsiSpxSolverInterface();
00593
00594 protected:
00595
00598
00599 virtual void applyRowCut( const OsiRowCut & rc );
00600
00604 virtual void applyColCut( const OsiColCut & cc );
00606
00609
00610 soplex::SPxSolver spxsolver_;
00612
00613
00614 private:
00617
00619 void freeCachedColRim();
00620
00622 void freeCachedRowRim();
00623
00625 void freeCachedResults();
00626
00628 void freeCachedMatrix();
00629
00630 enum keepCachedFlag
00631 {
00633 KEEPCACHED_NONE = 0,
00635 KEEPCACHED_COLUMN = 1,
00637 KEEPCACHED_ROW = 2,
00639 KEEPCACHED_MATRIX = 4,
00641 KEEPCACHED_RESULTS = 8,
00643 KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00645 KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00647 FREECACHED_COLUMN = KEEPCACHED_PROBLEM & !KEEPCACHED_COLUMN,
00649 FREECACHED_ROW = KEEPCACHED_PROBLEM & !KEEPCACHED_ROW,
00651 FREECACHED_MATRIX = KEEPCACHED_PROBLEM & !KEEPCACHED_MATRIX,
00653 FREECACHED_RESULTS = KEEPCACHED_ALL & !KEEPCACHED_RESULTS
00654 };
00655
00657 void freeCachedData( int keepCached = KEEPCACHED_NONE );
00658
00660 void freeAllMemory();
00661
00663 void printBounds();
00665
00666
00669
00670 soplex::DIdxSet spxintvars_;
00671
00673 soplex::SoPlex::VarStatus *hotStartCStat_;
00674 int hotStartCStatSize_;
00675 soplex::SoPlex::VarStatus *hotStartRStat_;
00676 int hotStartRStatSize_;
00677 int hotStartMaxIteration_;
00678
00681
00682 mutable soplex::DVector *obj_;
00683
00685 mutable char *rowsense_;
00686
00688 mutable double *rhs_;
00689
00691 mutable double *rowrange_;
00692
00694 mutable soplex::DVector *colsol_;
00695
00697 mutable soplex::DVector *rowsol_;
00698
00700 mutable soplex::DVector *redcost_;
00701
00703 mutable soplex::DVector *rowact_;
00704
00706 mutable CoinPackedMatrix *matrixByRow_;
00707
00709 mutable CoinPackedMatrix *matrixByCol_;
00711
00712 };
00713
00714
00720 void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00721
00722 #endif