00001
00002
00003
00004 #ifndef OsiXprSolverInterface_H
00005 #define OsiXprSolverInterface_H
00006
00007 #include <string>
00008 #include <cstdio>
00009
00010 #include "OsiSolverInterface.hpp"
00011
00012 typedef struct xo_prob_struct* XPRSprob;
00013
00014
00015
00020 class OsiXprSolverInterface : virtual public OsiSolverInterface {
00021 friend void OsiXprSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00022 public:
00025
00026 virtual void initialSolve();
00027
00029 virtual void resolve();
00030
00032 virtual void branchAndBound();
00034
00050
00051 bool setIntParam(OsiIntParam key, int value);
00052
00053 bool setDblParam(OsiDblParam key, double value);
00054
00055 bool setStrParam(OsiStrParam key, const std::string & value);
00056
00057 bool getIntParam(OsiIntParam key, int& value) const;
00058
00059 bool getDblParam(OsiDblParam key, double& value) const;
00060
00061 bool getStrParam(OsiStrParam key, std::string& value) const;
00063
00064
00066
00067
00068 virtual bool isAbandoned() const;
00070 virtual bool isProvenOptimal() const;
00072 virtual bool isProvenPrimalInfeasible() const;
00074 virtual bool isProvenDualInfeasible() const;
00076 virtual bool isPrimalObjectiveLimitReached() const;
00078 virtual bool isDualObjectiveLimitReached() const;
00080 virtual bool isIterationLimitReached() const;
00082
00083
00086
00087 CoinWarmStart *getEmptyWarmStart () const;
00089 virtual CoinWarmStart* getWarmStart() const;
00092 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00094
00095
00102
00103 virtual void markHotStart();
00105 virtual void solveFromHotStart();
00107 virtual void unmarkHotStart();
00109
00110
00125
00126 virtual int getNumCols() const;
00127
00129 virtual int getNumRows() const;
00130
00132 virtual int getNumElements() const;
00133
00135 virtual const double * getColLower() const;
00136
00138 virtual const double * getColUpper() const;
00139
00149 virtual const char * getRowSense() const;
00150
00159 virtual const double * getRightHandSide() const;
00160
00169 virtual const double * getRowRange() const;
00170
00172 virtual const double * getRowLower() const;
00173
00175 virtual const double * getRowUpper() const;
00176
00178 virtual const double * getObjCoefficients() const;
00179
00181 virtual double getObjSense() const;
00182
00184 virtual bool isContinuous(int colIndex) const;
00185
00186 #if 0
00188 virtual bool isBinary(int colIndex) const;
00189
00194 virtual bool isInteger(int colIndex) const;
00195
00197 virtual bool isIntegerNonBinary(int colIndex) const;
00198
00200 virtual bool isFreeBinary(int colIndex) const;
00201 #endif
00203 virtual const CoinPackedMatrix * getMatrixByRow() const;
00204
00206 virtual const CoinPackedMatrix * getMatrixByCol() const;
00207
00209 virtual double getInfinity() const;
00211
00214
00215 virtual const double * getColSolution() const;
00216
00218 virtual const double * getRowPrice() const;
00219
00221 virtual const double * getReducedCost() const;
00222
00225 virtual const double * getRowActivity() const;
00226
00228 virtual double getObjValue() const;
00229
00232 virtual int getIterationCount() const;
00233
00251 virtual std::vector<double*> getDualRays(int maxNumRays,
00252 bool fullRay=false) const;
00264 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00265
00266 #if 0
00267
00269 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00270 const;
00271 #endif
00272
00273
00274
00275
00276
00279
00283 virtual void setObjCoeff( int elementIndex, double elementValue );
00284
00287 virtual void setColLower( int elementIndex, double elementValue );
00288
00291 virtual void setColUpper( int elementIndex, double elementValue );
00292
00296 virtual void setColBounds( int elementIndex,
00297 double lower, double upper );
00298
00307 virtual void setColSetBounds(const int* indexFirst,
00308 const int* indexLast,
00309 const double* boundList);
00310
00313 virtual void setRowLower( int elementIndex, double elementValue );
00314
00317 virtual void setRowUpper( int elementIndex, double elementValue );
00318
00322 virtual void setRowBounds( int elementIndex,
00323 double lower, double upper );
00324
00326 virtual void setRowType(int index, char sense, double rightHandSide,
00327 double range);
00328
00337 virtual void setRowSetBounds(const int* indexFirst,
00338 const int* indexLast,
00339 const double* boundList);
00340
00351 virtual void setRowSetTypes(const int* indexFirst,
00352 const int* indexLast,
00353 const char* senseList,
00354 const double* rhsList,
00355 const double* rangeList);
00357
00358
00362 virtual void setContinuous(int index);
00364 virtual void setInteger(int index);
00367 virtual void setContinuous(const int* indices, int len);
00370 virtual void setInteger(const int* indices, int len);
00372
00373
00375 virtual void setObjSense(double s);
00376
00387 virtual void setColSolution(const double * colsol);
00388
00399 virtual void setRowPrice(const double * rowprice);
00400
00401
00407 virtual void addCol(const CoinPackedVectorBase& vec,
00408 const double collb, const double colub,
00409 const double obj);
00411 virtual void addCols(const int numcols,
00412 const CoinPackedVectorBase * const * cols,
00413 const double* collb, const double* colub,
00414 const double* obj);
00416 virtual void deleteCols(const int num, const int * colIndices);
00417
00419 virtual void addRow(const CoinPackedVectorBase& vec,
00420 const double rowlb, const double rowub);
00422 virtual void addRow(const CoinPackedVectorBase& vec,
00423 const char rowsen, const double rowrhs,
00424 const double rowrng);
00426 virtual void addRows(const int numrows,
00427 const CoinPackedVectorBase * const * rows,
00428 const double* rowlb, const double* rowub);
00430 virtual void addRows(const int numrows,
00431 const CoinPackedVectorBase * const * rows,
00432 const char* rowsen, const double* rowrhs,
00433 const double* rowrng);
00435 virtual void deleteRows(const int num, const int * rowIndices);
00436 #if 0
00437
00459 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00460 double effectivenessLb = 0.0);
00462
00463 #endif
00464
00465
00479 virtual void loadProblem(const CoinPackedMatrix& matrix,
00480 const double* collb, const double* colub,
00481 const double* obj,
00482 const double* rowlb, const double* rowub);
00483
00491 virtual void assignProblem(CoinPackedMatrix*& matrix,
00492 double*& collb, double*& colub, double*& obj,
00493 double*& rowlb, double*& rowub);
00494
00507 virtual void loadProblem(const CoinPackedMatrix& matrix,
00508 const double* collb, const double* colub,
00509 const double* obj,
00510 const char* rowsen, const double* rowrhs,
00511 const double* rowrng);
00512
00520 virtual void assignProblem(CoinPackedMatrix*& matrix,
00521 double*& collb, double*& colub, double*& obj,
00522 char*& rowsen, double*& rowrhs,
00523 double*& rowrng);
00524
00527 virtual void loadProblem(const int numcols, const int numrows,
00528 const int* start, const int* index,
00529 const double* value,
00530 const double* collb, const double* colub,
00531 const double* obj,
00532 const double* rowlb, const double* rowub);
00533
00536 virtual void loadProblem(const int numcols, const int numrows,
00537 const int* start, const int* index,
00538 const double* value,
00539 const double* collb, const double* colub,
00540 const double* obj,
00541 const char* rowsen, const double* rowrhs,
00542 const double* rowrng);
00543
00544
00546 virtual int readMps(const char *filename,
00547 const char *extension = "mps");
00548
00549
00554 virtual void writeMps(const char *filename,
00555 const char *extension = "mps",
00556 double objSense=0.0) const;
00558
00566 void passInMessageHandler(CoinMessageHandler * handler);
00568
00569
00570
00584 static void incrementInstanceCounter();
00585
00594 static void decrementInstanceCounter();
00595
00598 static unsigned int getNumInstances();
00599
00601 XPRSprob getLpPtr() { return prob_; }
00603
00605 static int version();
00606
00609 static int iXprCallCount_;
00610
00611
00613 static FILE * getLogFilePtr();
00616 static void setLogFileName( const char * filename );
00618
00619
00622
00623 OsiXprSolverInterface (int newrows = 50, int newnz = 100);
00624
00626 virtual OsiSolverInterface * clone(bool copyData = true) const;
00627
00629 OsiXprSolverInterface (const OsiXprSolverInterface &);
00630
00632 OsiXprSolverInterface & operator=(const OsiXprSolverInterface& rhs);
00633
00635 virtual ~OsiXprSolverInterface ();
00637
00638 protected:
00639
00642
00643 virtual void applyRowCut( const OsiRowCut & rc );
00644
00648 virtual void applyColCut( const OsiColCut & cc );
00650
00651 private:
00652
00655
00656 static const char * logFileName_;
00657
00659 static FILE * logFilePtr_;
00660
00662 static unsigned int numInstances_;
00663
00665 static unsigned int osiSerial_;
00666
00668
00671
00672 void gutsOfCopy( const OsiXprSolverInterface & source );
00673
00675 void gutsOfConstructor();
00676
00678 void gutsOfDestructor();
00679
00681 void freeSolution();
00682
00685 void freeCachedResults();
00686
00688 int getNumIntVars() const;
00689
00692
00693 void getVarTypes() const;
00694
00698 void activateMe() const;
00699
00704 bool isDataLoaded() const;
00706
00707
00710
00713
00714 mutable XPRSprob prob_;
00715
00717 mutable std::string xprProbname_;
00719
00727 mutable CoinPackedMatrix *matrixByRow_;
00728 mutable CoinPackedMatrix *matrixByCol_;
00729
00731 mutable double *colupper_;
00732
00734 mutable double *collower_;
00735
00737 mutable double *rowupper_;
00738
00740 mutable double *rowlower_;
00741
00743 mutable char *rowsense_;
00744
00746 mutable double *rhs_;
00747
00751 mutable double *rowrange_;
00752
00754 mutable double *objcoeffs_;
00755
00757 mutable double objsense_;
00758
00760 mutable double *colsol_;
00761
00763 mutable double *rowsol_;
00764
00766 mutable double *rowact_;
00767
00769 mutable double *rowprice_;
00770
00772 mutable double *colprice_;
00773
00775 mutable int *ivarind_;
00776
00785 mutable char *ivartype_;
00786
00790 mutable char *vartype_;
00791
00793 mutable bool lastsolvewasmip;
00795
00796 };
00797
00798
00804 void
00805 OsiXprSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00806
00807 #endif