OsiOslSolverInterface.hpp
Go to the documentation of this file.
1 // Copyright (C) 2000, International Business Machines
2 // Corporation and others. All Rights Reserved.
3 
4 #ifndef _OsiOslSolverInterface_hpp_
5 #define _OsiOslSolverInterface_hpp_
6 
7 #if (defined(__MINGW32__) || defined(__CYGWIN32__)) && !defined(OSLMSDLL)
8 # define OSLMSDLL
9 #endif
10 
11 #include <string>
12 #include "ekk_c_api.h"
13 
14 #include "OsiSolverInterface.hpp"
15 #include "CoinPackedMatrix.hpp"
16 #include "CoinWarmStartBasis.hpp"
17 
18 //#############################################################################
19 
25 class OsiOslSolverInterface : virtual public OsiSolverInterface {
26  friend void OsiOslSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
27 
28 public:
29  //---------------------------------------------------------------------------
32 
33  virtual void initialSolve();
34 
36  virtual void resolve();
37 
39  virtual void branchAndBound();
41 
42  //---------------------------------------------------------------------------
58  // Set an integer parameter
59  bool setIntParam(OsiIntParam key, int value);
60  // Set an double parameter
61  bool setDblParam(OsiDblParam key, double value);
62  // Set a string parameter
63  bool setStrParam(OsiStrParam key, const std::string & value);
64  // Get an integer parameter
65  bool getIntParam(OsiIntParam key, int& value) const;
66  // Get an double parameter
67  bool getDblParam(OsiDblParam key, double& value) const;
68  // Get a string parameter
69  bool getStrParam(OsiStrParam key, std::string& value) const;
71 
72  //---------------------------------------------------------------------------
74 
75 
76  virtual bool isAbandoned() const;
78  virtual bool isProvenOptimal() const;
80  virtual bool isProvenPrimalInfeasible() const;
82  virtual bool isProvenDualInfeasible() const;
84  virtual bool isPrimalObjectiveLimitReached() const;
86  virtual bool isDualObjectiveLimitReached() const;
88  virtual bool isIterationLimitReached() const;
89  //Returns true if a basis is available and optimal
90  virtual bool basisIsAvailable() const ;
92 
93  //---------------------------------------------------------------------------
96 
97  inline CoinWarmStart *getEmptyWarmStart () const
98  { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
100  virtual CoinWarmStart* getWarmStart() const;
103  virtual bool setWarmStart(const CoinWarmStart* warmstart);
105 
106  //---------------------------------------------------------------------------
113 
114  virtual void markHotStart();
116  virtual void solveFromHotStart();
118  virtual void unmarkHotStart();
120 
121  //---------------------------------------------------------------------------
136 
137  virtual int getNumCols() const;
138 
140  virtual int getNumRows() const;
141 
143  virtual int getNumElements() const;
144 
146  virtual const double * getColLower() const;
147 
149  virtual const double * getColUpper() const;
150 
160  virtual const char * getRowSense() const;
161 
170  virtual const double * getRightHandSide() const;
171 
180  virtual const double * getRowRange() const;
181 
183  virtual const double * getRowLower() const;
184 
186  virtual const double * getRowUpper() const;
187 
189  virtual const double * getObjCoefficients() const;
190 
192  virtual double getObjSense() const;
193 
195  virtual bool isContinuous(int colNumber) const;
196 
197 #if 0
198 
199  virtual bool isBinary(int columnNumber) const;
200 
205  virtual bool isInteger(int columnNumber) const;
206 
208  virtual bool isIntegerNonBinary(int columnNumber) const;
209 
211  virtual bool isFreeBinary(int columnNumber) const;
212 #endif
213 
215  virtual const CoinPackedMatrix * getMatrixByRow() const;
216 
218  virtual const CoinPackedMatrix * getMatrixByCol() const;
219 
221  virtual double getInfinity() const;
223 
226 
227  virtual const double * getColSolution() const;
228 
230  virtual const double * getRowPrice() const;
231 
233  virtual const double * getReducedCost() const;
234 
237  virtual const double * getRowActivity() const;
238 
240  virtual double getObjValue() const;
241 
244  virtual int getIterationCount() const;
245 
257  virtual std::vector<double*> getDualRays(int maxNumRays) const;
269  virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
270 
271 #if 0
272 
274  virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
275  const;
276 #endif
277 
278 
279 
280  //---------------------------------------------------------------------------
281 
284  //-------------------------------------------------------------------------
288  virtual void setObjCoeff( int elementIndex, double elementValue );
289 
292  virtual void setColLower( int elementIndex, double elementValue );
293 
296  virtual void setColUpper( int elementIndex, double elementValue );
297 
298 #if 0
299  // The default implementation is OK.
303  virtual void setColBounds( int elementIndex,
304  double lower, double upper ) {
305  setColLower(elementIndex, lower);
306  setColUpper(elementIndex, upper);
307  }
308 #endif
309 
317  virtual void setColSetBounds(const int* indexFirst,
318  const int* indexLast,
319  const double* boundList);
320 
323  virtual void setRowLower( int elementIndex, double elementValue );
324 
327  virtual void setRowUpper( int elementIndex, double elementValue );
328 
332  virtual void setRowBounds( int elementIndex,
333  double lower, double upper );
334 
336  virtual void setRowType(int index, char sense, double rightHandSide,
337  double range);
338 
347  virtual void setRowSetBounds(const int* indexFirst,
348  const int* indexLast,
349  const double* boundList);
350 
361  virtual void setRowSetTypes(const int* indexFirst,
362  const int* indexLast,
363  const char* senseList,
364  const double* rhsList,
365  const double* rangeList);
367 
368  //-------------------------------------------------------------------------
372  virtual void setContinuous(int index);
374  virtual void setInteger(int index);
377  virtual void setContinuous(const int* indices, int len);
380  virtual void setInteger(const int* indices, int len);
382 
383  //-------------------------------------------------------------------------
385  virtual void setObjSense(double s );
386 
397  virtual void setColSolution(const double * colsol);
398 
409  virtual void setRowPrice(const double * rowprice);
410 
411  //-------------------------------------------------------------------------
417  virtual void addCol(const CoinPackedVectorBase& vec,
418  const double collb, const double colub,
419  const double obj);
421  virtual void addCols(const int numcols,
422  const CoinPackedVectorBase * const * cols,
423  const double* collb, const double* colub,
424  const double* obj);
425 #if 0
426 
427  virtual void addCols(const CoinPackedMatrix& matrix,
428  const double* collb, const double* colub,
429  const double* obj);
430 #endif
431 
432  virtual void deleteCols(const int num, const int * colIndices);
433 
435  virtual void addRow(const CoinPackedVectorBase& vec,
436  const double rowlb, const double rowub);
438  virtual void addRow(const CoinPackedVectorBase& vec,
439  const char rowsen, const double rowrhs,
440  const double rowrng);
442  virtual void addRows(const int numrows,
443  const CoinPackedVectorBase * const * rows,
444  const double* rowlb, const double* rowub);
446  virtual void addRows(const int numrows,
447  const CoinPackedVectorBase * const * rows,
448  const char* rowsen, const double* rowrhs,
449  const double* rowrng);
450 #if 0
451 
452  virtual void addRows(const CoinPackedMatrix& matrix,
453  const double* rowlb, const double* rowub);
455  virtual void addRows(const CoinPackedMatrix& matrix,
456  const char* rowsen, const double* rowrhs,
457  const double* rowrng);
458 #endif
459 
460  virtual void deleteRows(const int num, const int * rowIndices);
461 
462  //-----------------------------------------------------------------------
463 #if 0
464 
485  virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
486  double effectivenessLb = 0.0);
487 #endif
488 
489 
490 
491  //---------------------------------------------------------------------------
492 
506  virtual void loadProblem(const CoinPackedMatrix& matrix,
507  const double* collb, const double* colub,
508  const double* obj,
509  const double* rowlb, const double* rowub);
510 
518  virtual void assignProblem(CoinPackedMatrix*& matrix,
519  double*& collb, double*& colub, double*& obj,
520  double*& rowlb, double*& rowub);
521 
534  virtual void loadProblem(const CoinPackedMatrix& matrix,
535  const double* collb, const double* colub,
536  const double* obj,
537  const char* rowsen, const double* rowrhs,
538  const double* rowrng);
539 
547  virtual void assignProblem(CoinPackedMatrix*& matrix,
548  double*& collb, double*& colub, double*& obj,
549  char*& rowsen, double*& rowrhs,
550  double*& rowrng);
551 
554  virtual void loadProblem(const int numcols, const int numrows,
555  const CoinBigIndex * start, const int* index,
556  const double* value,
557  const double* collb, const double* colub,
558  const double* obj,
559  const double* rowlb, const double* rowub);
560 
563  virtual void loadProblem(const int numcols, const int numrows,
564  const CoinBigIndex * start, const int* index,
565  const double* value,
566  const double* collb, const double* colub,
567  const double* obj,
568  const char* rowsen, const double* rowrhs,
569  const double* rowrng);
570 
573  virtual int readMps(const char *filename,
574  const char *extension = "mps");
575 
580  virtual void writeMps(const char *filename,
581  const char *extension = "mps",
582  double objSense=0.0) const;
584 
585  //---------------------------------------------------------------------------
586 
589 
590  EKKModel * getModelPtr();
591 
602  static void incrementInstanceCounter();
603 
612  static void decrementInstanceCounter();
613 
616  static unsigned int getNumInstances();
618 
619 
622 
624 
626  virtual OsiSolverInterface * clone(bool copyData = true) const;
627 
630 
633  operator=(const OsiOslSolverInterface& rhs);
634 
636  virtual ~OsiOslSolverInterface ();
637 
639  virtual void reset();
641 
642 protected:
643 
647  virtual void applyRowCut( const OsiRowCut & rc );
648 
650  virtual void applyColCut( const OsiColCut & cc );
652 
653 private:
654 
657 
658  static EKKContext * getContextPtr();
660 
663 
664  static EKKContext * contextPtr_;
666  static unsigned int numInstances_;
668 
669 
675  EKKModel * getMutableModelPtr() const;
676 
678  void gutsOfDestructor();
679 
681  void freeCachedResults();
682 
684  void extractSenseRhsRange() const;
686 
689 
690  mutable EKKModel * modelPtr_;
691 
694 
695  mutable char *rowsense_;
696 
698  mutable double *rhs_;
699 
703  mutable double *rowrange_;
704 
707  CoinWarmStartBasis* ws_;
710 
712  mutable CoinPackedMatrix *matrixByRow_;
714  mutable CoinPackedMatrix *matrixByColumn_;
716 
717 
718 };
719 
720 //#############################################################################
728 void
729 OsiOslSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
730 
731 #endif