DyLP  1.10.4
OsiSpxSolverInterface.hpp
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // name: OSI Interface for SoPlex >= 1.4.2c
3 // authors: Tobias Pfender
4 // Ambros Gleixner
5 // Wei Huang
6 // Konrad-Zuse-Zentrum Berlin (Germany)
7 // email: pfender@zib.de
8 // date: 01/16/2002
9 // license: this file may be freely distributed under the terms of the EPL
10 //-----------------------------------------------------------------------------
11 // Copyright (C) 2002, Tobias Pfender, International Business Machines
12 // Corporation and others. All Rights Reserved.
13 // Last edit: $Id: OsiSpxSolverInterface.hpp 2200 2019-01-06 23:02:02Z unxusr $
14 
15 #ifndef OsiSpxSolverInterface_H
16 #define OsiSpxSolverInterface_H
17 
18 #include <string>
19 #include "OsiSolverInterface.hpp"
20 #include "CoinWarmStartBasis.hpp"
21 
22 #ifndef _SOPLEX_H_
23 /* forward declarations so the header can be compiled without having to include soplex.h
24  * however, these declaration work only for SoPlex < 2.0, so we do them only if soplex.h hasn't been included already
25  */
26 namespace soplex {
27 class DIdxSet;
28 class DVector;
29 class SPxOut;
30 class SoPlex;
31 }
32 #endif
33 
37 class OsiSpxSolverInterface : virtual public OsiSolverInterface {
38  friend void OsiSpxSolverInterfaceUnitTest(const std::string &mpsDir, const std::string &netlibDir);
39 
40 public:
41  //---------------------------------------------------------------------------
44  virtual void initialSolve();
46 
48  virtual void resolve();
49 
51  virtual void branchAndBound();
53 
54  //---------------------------------------------------------------------------
70  // Set an integer parameter
71  bool setIntParam(OsiIntParam key, int value);
72  // Set an double parameter
73  bool setDblParam(OsiDblParam key, double value);
74  // Get an integer parameter
75  bool getIntParam(OsiIntParam key, int &value) const;
76  // Get an double parameter
77  bool getDblParam(OsiDblParam key, double &value) const;
78  // Get a string parameter
79  bool getStrParam(OsiStrParam key, std::string &value) const;
80  // Set timelimit
81  void setTimeLimit(double value);
82  // Get timelimit
83  double getTimeLimit() const;
85 
86  //---------------------------------------------------------------------------
88 
89  virtual bool isAbandoned() const;
92  virtual bool isProvenOptimal() const;
94  virtual bool isProvenPrimalInfeasible() const;
96  virtual bool isProvenDualInfeasible() const;
97  // Is the given primal objective limit reached? - use implementation from OsiSolverInterface
99  virtual bool isDualObjectiveLimitReached() const;
101  virtual bool isIterationLimitReached() const;
103  virtual bool isTimeLimitReached() const;
105 
106  //---------------------------------------------------------------------------
109  inline CoinWarmStart *getEmptyWarmStart() const
111  {
112  return (dynamic_cast< CoinWarmStart * >(new CoinWarmStartBasis()));
113  }
115  virtual CoinWarmStart *getWarmStart() const;
118  virtual bool setWarmStart(const CoinWarmStart *warmstart);
120 
121  //---------------------------------------------------------------------------
128  virtual void markHotStart();
131  virtual void solveFromHotStart();
133  virtual void unmarkHotStart();
135 
136  //---------------------------------------------------------------------------
151  virtual int getNumCols() const;
153 
155  virtual int getNumRows() const;
156 
158  virtual int getNumElements() const;
159 
161  virtual const double *getColLower() const;
162 
164  virtual const double *getColUpper() const;
165 
175  virtual const char *getRowSense() const;
176 
185  virtual const double *getRightHandSide() const;
186 
195  virtual const double *getRowRange() const;
196 
198  virtual const double *getRowLower() const;
199 
201  virtual const double *getRowUpper() const;
202 
204  virtual const double *getObjCoefficients() const;
205 
207  virtual double getObjSense() const;
208 
210  virtual bool isContinuous(int colNumber) const;
211 
212 #if 0
213  virtual bool isBinary(int columnNumber) const;
215 
220  virtual bool isInteger(int columnNumber) const;
221 
223  virtual bool isIntegerNonBinary(int columnNumber) const;
224 
226  virtual bool isFreeBinary(int columnNumber) const;
227 #endif
228 
230  virtual const CoinPackedMatrix *getMatrixByRow() const;
231 
233  virtual const CoinPackedMatrix *getMatrixByCol() const;
234 
236  virtual double getInfinity() const;
238 
241  virtual const double *getColSolution() const;
243 
245  virtual const double *getRowPrice() const;
246 
248  virtual const double *getReducedCost() const;
249 
252  virtual const double *getRowActivity() const;
253 
255  virtual double getObjValue() const;
256 
259  virtual int getIterationCount() const;
260 
278  virtual std::vector< double * > getDualRays(int maxNumRays,
279  bool fullRay = false) const;
291  virtual std::vector< double * > getPrimalRays(int maxNumRays) const;
292 
293 #if 0
294 
296  virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
297  const;
298 #endif
299 
300 
301 
302  //---------------------------------------------------------------------------
303 
306  //-------------------------------------------------------------------------
310  virtual void setObjCoeff(int elementIndex, double elementValue);
311 
314  virtual void setColLower(int elementIndex, double elementValue);
315 
318  virtual void setColUpper(int elementIndex, double elementValue);
319 
323  virtual void setColBounds(int elementIndex,
324  double lower, double upper);
325 
326 #if 0 // we are using the default implementation of OsiSolverInterface
327 
335  virtual void setColSetBounds(const int* indexFirst,
336  const int* indexLast,
337  const double* boundList);
338 #endif
339 
342  virtual void setRowLower(int elementIndex, double elementValue);
343 
346  virtual void setRowUpper(int elementIndex, double elementValue);
347 
351  virtual void setRowBounds(int elementIndex,
352  double lower, double upper);
353 
355  virtual void setRowType(int index, char sense, double rightHandSide,
356  double range);
357 
358 #if 0 // we are using the default implementation of OsiSolverInterface
359 
366  virtual void setRowSetBounds(const int* indexFirst,
367  const int* indexLast,
368  const double* boundList);
369 
379  virtual void setRowSetTypes(const int* indexFirst,
380  const int* indexLast,
381  const char* senseList,
382  const double* rhsList,
383  const double* rangeList);
384 #endif
385 
386 
387  //-------------------------------------------------------------------------
391  virtual void setContinuous(int index);
393  virtual void setInteger(int index);
394 #if 0 // we are using the default implementation of OsiSolverInterface
395 
397  virtual void setContinuous(const int* indices, int len);
400  virtual void setInteger(const int* indices, int len);
401 #endif
402 
403 
404  //-------------------------------------------------------------------------
406  virtual void setObjSense(double s);
407 
418  virtual void setColSolution(const double *colsol);
419 
430  virtual void setRowPrice(const double *rowprice);
431 
432  //-------------------------------------------------------------------------
438  virtual void addCol(const CoinPackedVectorBase &vec,
439  const double collb, const double colub,
440  const double obj);
441 
442 #if 0 // we are using the default implementation of OsiSolverInterface
443 
444  virtual void addCols(const int numcols,
445  const CoinPackedVectorBase * const * cols,
446  const double* collb, const double* colub,
447  const double* obj);
448 #endif
449 
451  virtual void deleteCols(const int num, const int *colIndices);
452 
454  virtual void addRow(const CoinPackedVectorBase &vec,
455  const double rowlb, const double rowub);
457  virtual void addRow(const CoinPackedVectorBase &vec,
458  const char rowsen, const double rowrhs,
459  const double rowrng);
460 
461 #if 0 // we are using the default implementation of OsiSolverInterface
462 
463  virtual void addRows(const int numrows,
464  const CoinPackedVectorBase * const * rows,
465  const double* rowlb, const double* rowub);
467  virtual void addRows(const int numrows,
468  const CoinPackedVectorBase * const * rows,
469  const char* rowsen, const double* rowrhs,
470  const double* rowrng);
471 #endif
472 
474  virtual void deleteRows(const int num, const int *rowIndices);
475 
476 #if 0 // we are using the default implementation of OsiSolverInterface \
477  //-----------------------------------------------------------------------
478 
499  virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
500  double effectivenessLb = 0.0);
501 #endif
502 
503 
504 
505  //---------------------------------------------------------------------------
506 
520  virtual void loadProblem(const CoinPackedMatrix &matrix,
521  const double *collb, const double *colub,
522  const double *obj,
523  const double *rowlb, const double *rowub);
524 
532  virtual void assignProblem(CoinPackedMatrix *&matrix,
533  double *&collb, double *&colub, double *&obj,
534  double *&rowlb, double *&rowub);
535 
548  virtual void loadProblem(const CoinPackedMatrix &matrix,
549  const double *collb, const double *colub,
550  const double *obj,
551  const char *rowsen, const double *rowrhs,
552  const double *rowrng);
553 
561  virtual void assignProblem(CoinPackedMatrix *&matrix,
562  double *&collb, double *&colub, double *&obj,
563  char *&rowsen, double *&rowrhs,
564  double *&rowrng);
565 
568  virtual void loadProblem(const int numcols, const int numrows,
569  const int *start, const int *index,
570  const double *value,
571  const double *collb, const double *colub,
572  const double *obj,
573  const double *rowlb, const double *rowub);
574 
577  virtual void loadProblem(const int numcols, const int numrows,
578  const int *start, const int *index,
579  const double *value,
580  const double *collb, const double *colub,
581  const double *obj,
582  const char *rowsen, const double *rowrhs,
583  const double *rowrng);
584 
586  virtual int readMps(const char *filename,
587  const char *extension = "mps");
588 
593  virtual void writeMps(const char *filename,
594  const char *extension = "mps",
595  double objSense = 0.0) const;
597 
598  //---------------------------------------------------------------------------
599 
604 
606  virtual OsiSolverInterface *clone(bool copyData = true) const;
607 
610 
612  OsiSpxSolverInterface &operator=(const OsiSpxSolverInterface &rhs);
613 
615  virtual ~OsiSpxSolverInterface();
617 
620  KEEPCACHED_NONE = 0,
622  KEEPCACHED_COLUMN = 1,
624  KEEPCACHED_ROW = 2,
626  KEEPCACHED_MATRIX = 4,
628  KEEPCACHED_RESULTS = 8,
630  KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
632  KEEPCACHED_ALL = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
634  FREECACHED_COLUMN = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
636  FREECACHED_ROW = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
638  FREECACHED_MATRIX = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
640  FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
641  };
642  soplex::SoPlex *getLpPtr(int keepCached = KEEPCACHED_NONE);
643 
644  soplex::SPxOut *getSPxOut() { return spxout_; }
645 
646 protected:
649  virtual void applyRowCut(const OsiRowCut &rc);
651 
655  virtual void applyColCut(const OsiColCut &cc);
657 
660  soplex::SPxOut *spxout_;
663  soplex::SoPlex *soplex_;
665 
666 private:
669 
671  void freeCachedColRim();
672 
674  void freeCachedRowRim();
675 
677  void freeCachedResults();
678 
680  void freeCachedMatrix();
681 
683  void freeCachedData(int keepCached = KEEPCACHED_NONE);
684 
686  void freeAllMemory();
688 
691  soplex::DIdxSet *spxintvars_;
693 
700 
703  mutable soplex::DVector *obj_;
705 
707  mutable char *rowsense_;
708 
710  mutable double *rhs_;
711 
713  mutable double *rowrange_;
714 
716  mutable soplex::DVector *colsol_;
717 
719  mutable soplex::DVector *rowsol_;
720 
722  mutable soplex::DVector *redcost_;
723 
725  mutable soplex::DVector *rowact_;
726 
729 
733 
734 };
735 
736 //#############################################################################
738 void OsiSpxSolverInterfaceUnitTest(const std::string &mpsDir, const std::string &netlibDir);
739 
740 #endif
741 
742 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
743 */
SoPlex Solver Interface Instantiation of OsiSpxSolverInterface for SoPlex.
char * rowsense_
Pointer to dense vector of row sense indicators.
CoinPackedMatrix * matrixByRow_
Pointer to row-wise copy of problem matrix coefficients.
soplex::DVector * rowsol_
Pointer to dual solution vector.
double * rowrange_
Pointer to dense vector of slack upper bounds for range constraints (undefined for non-range rows) ...
Collections of row cuts and column cuts.
Definition: OsiCuts.hpp:19
Column Cut Class.
Definition: OsiColCut.hpp:23
The default COIN simplex (basis-oriented) warm start class.
CoinPackedMatrix * matrixByCol_
Pointer to row-wise copy of problem matrix coefficients.
Abstract Base Class for describing an interface to a solver.
void * hotStartCStat_
Hotstart information.
Abstract base class for various sparse vectors.
soplex::DVector * colsol_
Pointer to primal solution vector.
Row Cut Class.
Definition: OsiRowCut.hpp:29
Sparse Matrix Base Class.
double * rhs_
Pointer to dense vector of row right-hand side values.
soplex::DVector * rowact_
Pointer to row activity (slack) vector.
soplex::DVector * redcost_
Pointer to reduced cost vector.
soplex::SoPlex * soplex_
SoPlex solver object.
void OsiSpxSolverInterfaceUnitTest(const std::string &mpsDir, const std::string &netlibDir)
A function that tests the methods in the OsiSpxSolverInterface class.
std::vector< int > OsiVectorInt
Vector of int.
Internal class for obtaining status from the applyCuts method.
Abstract base class for warm start information.