00001
00002
00003
00004
00005 #ifndef OsiXprSolverInterface_H
00006 #define OsiXprSolverInterface_H
00007
00008 #include <string>
00009 #include <cstdio>
00010
00011 #include "OsiSolverInterface.hpp"
00012
00013 typedef struct xo_prob_struct* XPRSprob;
00014
00015
00016
00021 class OsiXprSolverInterface : virtual public OsiSolverInterface {
00022 friend void OsiXprSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00023 public:
00026
00027 virtual void initialSolve();
00028
00030 virtual void resolve();
00031
00033 virtual void branchAndBound();
00035
00051
00052 bool setIntParam(OsiIntParam key, int value);
00053
00054 bool setDblParam(OsiDblParam key, double value);
00055
00056 bool setStrParam(OsiStrParam key, const std::string & value);
00057
00058 bool getIntParam(OsiIntParam key, int& value) const;
00059
00060 bool getDblParam(OsiDblParam key, double& value) const;
00061
00062 bool getStrParam(OsiStrParam key, std::string& value) const;
00063
00064 void setMipStart(bool value) { domipstart = value; }
00065
00066 bool getMipStart() const { return domipstart; }
00068
00069
00071
00072
00073 virtual bool isAbandoned() const;
00075 virtual bool isProvenOptimal() const;
00077 virtual bool isProvenPrimalInfeasible() const;
00079 virtual bool isProvenDualInfeasible() const;
00081 virtual bool isPrimalObjectiveLimitReached() const;
00083 virtual bool isDualObjectiveLimitReached() const;
00085 virtual bool isIterationLimitReached() const;
00087
00088
00091
00092 CoinWarmStart *getEmptyWarmStart () const;
00094 virtual CoinWarmStart* getWarmStart() const;
00097 virtual bool setWarmStart(const CoinWarmStart* warmstart);
00099
00100
00107
00108 virtual void markHotStart();
00110 virtual void solveFromHotStart();
00112 virtual void unmarkHotStart();
00114
00115
00130
00131 virtual int getNumCols() const;
00132
00134 virtual int getNumRows() const;
00135
00137 virtual int getNumElements() const;
00138
00140 virtual const double * getColLower() const;
00141
00143 virtual const double * getColUpper() const;
00144
00154 virtual const char * getRowSense() const;
00155
00164 virtual const double * getRightHandSide() const;
00165
00174 virtual const double * getRowRange() const;
00175
00177 virtual const double * getRowLower() const;
00178
00180 virtual const double * getRowUpper() const;
00181
00183 virtual const double * getObjCoefficients() const;
00184
00186 virtual double getObjSense() const;
00187
00189 virtual bool isContinuous(int colIndex) const;
00190
00191 #if 0
00193 virtual bool isBinary(int colIndex) const;
00194
00199 virtual bool isInteger(int colIndex) const;
00200
00202 virtual bool isIntegerNonBinary(int colIndex) const;
00203
00205 virtual bool isFreeBinary(int colIndex) const;
00206 #endif
00208 virtual const CoinPackedMatrix * getMatrixByRow() const;
00209
00211 virtual const CoinPackedMatrix * getMatrixByCol() const;
00212
00214 virtual double getInfinity() const;
00216
00219
00220 virtual const double * getColSolution() const;
00221
00223 virtual const double * getRowPrice() const;
00224
00226 virtual const double * getReducedCost() const;
00227
00230 virtual const double * getRowActivity() const;
00231
00233 virtual double getObjValue() const;
00234
00237 virtual int getIterationCount() const;
00238
00256 virtual std::vector<double*> getDualRays(int maxNumRays,
00257 bool fullRay=false) const;
00269 virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00270
00271 #if 0
00272
00274 virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00275 const;
00276 #endif
00277
00278
00279
00280
00281
00284
00288 virtual void setObjCoeff( int elementIndex, double elementValue );
00289
00292 virtual void setColLower( int elementIndex, double elementValue );
00293
00296 virtual void setColUpper( int elementIndex, double elementValue );
00297
00301 virtual void setColBounds( int elementIndex,
00302 double lower, double upper );
00303
00312 virtual void setColSetBounds(const int* indexFirst,
00313 const int* indexLast,
00314 const double* boundList);
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
00342 virtual void setRowSetBounds(const int* indexFirst,
00343 const int* indexLast,
00344 const double* boundList);
00345
00356 virtual void setRowSetTypes(const int* indexFirst,
00357 const int* indexLast,
00358 const char* senseList,
00359 const double* rhsList,
00360 const double* rangeList);
00362
00363
00367 virtual void setContinuous(int index);
00369 virtual void setInteger(int index);
00372 virtual void setContinuous(const int* indices, int len);
00375 virtual void setInteger(const int* indices, int len);
00377
00378
00380 virtual void setObjSense(double s);
00381
00392 virtual void setColSolution(const double * colsol);
00393
00404 virtual void setRowPrice(const double * rowprice);
00405
00406
00412 virtual void addCol(const CoinPackedVectorBase& vec,
00413 const double collb, const double colub,
00414 const double obj);
00416 virtual void addCols(const int numcols,
00417 const CoinPackedVectorBase * const * cols,
00418 const double* collb, const double* colub,
00419 const double* obj);
00421 virtual void deleteCols(const int num, const int * colIndices);
00422
00424 virtual void addRow(const CoinPackedVectorBase& vec,
00425 const double rowlb, const double rowub);
00427 virtual void addRow(const CoinPackedVectorBase& vec,
00428 const char rowsen, const double rowrhs,
00429 const double rowrng);
00431 virtual void addRows(const int numrows,
00432 const CoinPackedVectorBase * const * rows,
00433 const double* rowlb, const double* rowub);
00435 virtual void addRows(const int numrows,
00436 const CoinPackedVectorBase * const * rows,
00437 const char* rowsen, const double* rowrhs,
00438 const double* rowrng);
00440 virtual void deleteRows(const int num, const int * rowIndices);
00441 #if 0
00442
00464 virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00465 double effectivenessLb = 0.0);
00467
00468 #endif
00469
00470
00484 virtual void loadProblem(const CoinPackedMatrix& matrix,
00485 const double* collb, const double* colub,
00486 const double* obj,
00487 const double* rowlb, const double* rowub);
00488
00496 virtual void assignProblem(CoinPackedMatrix*& matrix,
00497 double*& collb, double*& colub, double*& obj,
00498 double*& rowlb, double*& rowub);
00499
00512 virtual void loadProblem(const CoinPackedMatrix& matrix,
00513 const double* collb, const double* colub,
00514 const double* obj,
00515 const char* rowsen, const double* rowrhs,
00516 const double* rowrng);
00517
00525 virtual void assignProblem(CoinPackedMatrix*& matrix,
00526 double*& collb, double*& colub, double*& obj,
00527 char*& rowsen, double*& rowrhs,
00528 double*& rowrng);
00529
00532 virtual void loadProblem(const int numcols, const int numrows,
00533 const int* start, const int* index,
00534 const double* value,
00535 const double* collb, const double* colub,
00536 const double* obj,
00537 const double* rowlb, const double* rowub);
00538
00541 virtual void loadProblem(const int numcols, const int numrows,
00542 const int* start, const int* index,
00543 const double* value,
00544 const double* collb, const double* colub,
00545 const double* obj,
00546 const char* rowsen, const double* rowrhs,
00547 const double* rowrng);
00548
00549
00551 virtual int readMps(const char *filename,
00552 const char *extension = "mps");
00553
00554
00559 virtual void writeMps(const char *filename,
00560 const char *extension = "mps",
00561 double objSense=0.0) const;
00563
00571 void passInMessageHandler(CoinMessageHandler * handler);
00573
00574
00575
00589 static void incrementInstanceCounter();
00590
00599 static void decrementInstanceCounter();
00600
00603 static unsigned int getNumInstances();
00604
00606 XPRSprob getLpPtr() { return prob_; }
00608
00610 static int version();
00611
00614 static int iXprCallCount_;
00615
00616
00618 static FILE * getLogFilePtr();
00621 static void setLogFileName( const char * filename );
00623
00624
00627
00628 OsiXprSolverInterface (int newrows = 50, int newnz = 100);
00629
00631 virtual OsiSolverInterface * clone(bool copyData = true) const;
00632
00634 OsiXprSolverInterface (const OsiXprSolverInterface &);
00635
00637 OsiXprSolverInterface & operator=(const OsiXprSolverInterface& rhs);
00638
00640 virtual ~OsiXprSolverInterface ();
00642
00643 protected:
00644
00647
00648 virtual void applyRowCut( const OsiRowCut & rc );
00649
00653 virtual void applyColCut( const OsiColCut & cc );
00655
00656 private:
00657
00660
00661 static const char * logFileName_;
00662
00664 static FILE * logFilePtr_;
00665
00667 static unsigned int numInstances_;
00668
00670 static unsigned int osiSerial_;
00671
00673
00676
00677 void gutsOfCopy( const OsiXprSolverInterface & source );
00678
00680 void gutsOfConstructor();
00681
00683 void gutsOfDestructor();
00684
00686 void freeSolution();
00687
00690 void freeCachedResults();
00691
00693 int getNumIntVars() const;
00694
00697
00698 void getVarTypes() const;
00699
00703 void activateMe() const;
00704
00709 bool isDataLoaded() const;
00711
00712
00715
00718
00719 mutable XPRSprob prob_;
00720
00722 mutable std::string xprProbname_;
00724
00732 mutable CoinPackedMatrix *matrixByRow_;
00733 mutable CoinPackedMatrix *matrixByCol_;
00734
00736 mutable double *colupper_;
00737
00739 mutable double *collower_;
00740
00742 mutable double *rowupper_;
00743
00745 mutable double *rowlower_;
00746
00748 mutable char *rowsense_;
00749
00751 mutable double *rhs_;
00752
00756 mutable double *rowrange_;
00757
00759 mutable double *objcoeffs_;
00760
00762 mutable double objsense_;
00763
00765 mutable double *colsol_;
00766
00768 mutable double *rowsol_;
00769
00771 mutable double *rowact_;
00772
00774 mutable double *rowprice_;
00775
00777 mutable double *colprice_;
00778
00780 mutable int *ivarind_;
00781
00790 mutable char *ivartype_;
00791
00795 mutable char *vartype_;
00796
00798 mutable bool lastsolvewasmip;
00800
00801
00803 bool domipstart;
00804 };
00805
00806
00808 void OsiXprSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00809
00810 #endif