OsiCpxSolverInterface.hpp
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // name: OSI Interface for CPLEX
3 // author: Tobias Pfender
4 // Konrad-Zuse-Zentrum Berlin (Germany)
5 // email: pfender@zib.de
6 // date: 09/25/2000
7 // license: this file may be freely distributed under the terms of CPL
8 // comments: please scan this file for '???' and read the comments
9 //-----------------------------------------------------------------------------
10 // Copyright (C) 2000, Tobias Pfender, International Business Machines
11 // Corporation and others. All Rights Reserved.
12 
13 #ifndef OsiCpxSolverInterface_H
14 #define OsiCpxSolverInterface_H
15 
16 #include "OsiSolverInterface.hpp"
17 
18 typedef struct cpxlp* CPXLPptr;
19 typedef struct cpxenv* CPXENVptr;
20 
26 class OsiCpxSolverInterface : virtual public OsiSolverInterface {
27  friend void OsiCpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
28 
29 public:
30 
31  //---------------------------------------------------------------------------
34  virtual void initialSolve();
36 
38  virtual void resolve();
39 
41  virtual void branchAndBound();
43 
44  //---------------------------------------------------------------------------
60  // Set an integer parameter
61  bool setIntParam(OsiIntParam key, int value);
62  // Set an double parameter
63  bool setDblParam(OsiDblParam key, double value);
64  // Set a string parameter
65  bool setStrParam(OsiStrParam key, const std::string & value);
66  // Get an integer parameter
67  bool getIntParam(OsiIntParam key, int& value) const;
68  // Get an double parameter
69  bool getDblParam(OsiDblParam key, double& value) const;
70  // Get a string parameter
71  bool getStrParam(OsiStrParam key, std::string& value) const;
73 
74  //---------------------------------------------------------------------------
76 
77  virtual bool isAbandoned() const;
80  virtual bool isProvenOptimal() const;
82  virtual bool isProvenPrimalInfeasible() const;
84  virtual bool isProvenDualInfeasible() const;
86  virtual bool isPrimalObjectiveLimitReached() const;
88  virtual bool isDualObjectiveLimitReached() const;
90  virtual bool isIterationLimitReached() const;
92 
93  //---------------------------------------------------------------------------
96 
103  CoinWarmStart *getEmptyWarmStart () const;
104 
106  virtual CoinWarmStart* getWarmStart() const;
109  virtual bool setWarmStart(const CoinWarmStart* warmstart);
111 
112  //---------------------------------------------------------------------------
119  virtual void markHotStart();
122  virtual void solveFromHotStart();
124  virtual void unmarkHotStart();
126 
127  //---------------------------------------------------------------------------
142  virtual int getNumCols() const;
144 
146  virtual int getNumRows() const;
147 
149  virtual int getNumElements() const;
150 
152  virtual const double * getColLower() const;
153 
155  virtual const double * getColUpper() const;
156 
166  virtual const char * getRowSense() const;
167 
176  virtual const double * getRightHandSide() const;
177 
186  virtual const double * getRowRange() const;
187 
189  virtual const double * getRowLower() const;
190 
192  virtual const double * getRowUpper() const;
193 
195  virtual const double * getObjCoefficients() const;
196 
198  virtual double getObjSense() const;
199 
201  virtual bool isContinuous(int colNumber) const;
202 
203 #if 0
204  virtual bool isBinary(int columnNumber) const;
206 
211  virtual bool isInteger(int columnNumber) const;
212 
214  virtual bool isIntegerNonBinary(int columnNumber) const;
215 
217  virtual bool isFreeBinary(int columnNumber) const;
218 #endif
219 
221  virtual const CoinPackedMatrix * getMatrixByRow() const;
222 
224  virtual const CoinPackedMatrix * getMatrixByCol() const;
225 
227  virtual double getInfinity() const;
229 
232  virtual const double * getColSolution() const;
234 
236  virtual const double * getRowPrice() const;
237 
239  virtual const double * getReducedCost() const;
240 
243  virtual const double * getRowActivity() const;
244 
246  virtual double getObjValue() const;
247 
250  virtual int getIterationCount() const;
251 
263  virtual std::vector<double*> getDualRays(int maxNumRays) const;
275  virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
276 
277 #if 0
278 
280  virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
281  const;
282 #endif
283 
284 
285 
286  //---------------------------------------------------------------------------
287 
290  //-------------------------------------------------------------------------
294  virtual void setObjCoeff( int elementIndex, double elementValue );
295 
297  virtual void setObjCoeffSet(const int* indexFirst,
298  const int* indexLast,
299  const double* coeffList);
300 
304  virtual void setColLower( int elementIndex, double elementValue );
305 
309  virtual void setColUpper( int elementIndex, double elementValue );
310 
314  virtual void setColBounds( int elementIndex,
315  double lower, double upper );
316 
324  virtual void setColSetBounds(const int* indexFirst,
325  const int* indexLast,
326  const double* boundList);
327 
330  virtual void setRowLower( int elementIndex, double elementValue );
331 
334  virtual void setRowUpper( int elementIndex, double elementValue );
335 
339  virtual void setRowBounds( int elementIndex,
340  double lower, double upper );
341 
343  virtual void setRowType(int index, char sense, double rightHandSide,
344  double range);
345 
353  virtual void setRowSetBounds(const int* indexFirst,
354  const int* indexLast,
355  const double* boundList);
356 
366  virtual void setRowSetTypes(const int* indexFirst,
367  const int* indexLast,
368  const char* senseList,
369  const double* rhsList,
370  const double* rangeList);
372 
373  //-------------------------------------------------------------------------
377  virtual void setContinuous(int index);
379  virtual void setInteger(int index);
382  virtual void setContinuous(const int* indices, int len);
385  virtual void setInteger(const int* indices, int len);
387 
388  //-------------------------------------------------------------------------
390  virtual void setObjSense(double s);
391 
402  virtual void setColSolution(const double * colsol);
403 
414  virtual void setRowPrice(const double * rowprice);
415 
416  //-------------------------------------------------------------------------
423  virtual void addCol(const CoinPackedVectorBase& vec,
424  const double collb, const double colub,
425  const double obj);
426 
429  virtual void addCols(const int numcols,
430  const CoinPackedVectorBase * const * cols,
431  const double* collb, const double* colub,
432  const double* obj);
434  virtual void deleteCols(const int num, const int * colIndices);
435 
438  virtual void addRow(const CoinPackedVectorBase& vec,
439  const double rowlb, const double rowub);
441  virtual void addRow(const CoinPackedVectorBase& vec,
442  const char rowsen, const double rowrhs,
443  const double rowrng);
444 
447  virtual void addRows(const int numrows,
448  const CoinPackedVectorBase * const * rows,
449  const double* rowlb, const double* rowub);
451  virtual void addRows(const int numrows,
452  const CoinPackedVectorBase * const * rows,
453  const char* rowsen, const double* rowrhs,
454  const double* rowrng);
456  virtual void deleteRows(const int num, const int * rowIndices);
457 
458 #if 0
459  // ??? implemented in OsiSolverInterface
460  //-----------------------------------------------------------------------
482  virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
483  double effectivenessLb = 0.0);
484 #endif
485 
486 
487 
488  //---------------------------------------------------------------------------
489 
503  virtual void loadProblem(const CoinPackedMatrix& matrix,
504  const double* collb, const double* colub,
505  const double* obj,
506  const double* rowlb, const double* rowub);
507 
515  virtual void assignProblem(CoinPackedMatrix*& matrix,
516  double*& collb, double*& colub, double*& obj,
517  double*& rowlb, double*& rowub);
518 
531  virtual void loadProblem(const CoinPackedMatrix& matrix,
532  const double* collb, const double* colub,
533  const double* obj,
534  const char* rowsen, const double* rowrhs,
535  const double* rowrng);
536 
544  virtual void assignProblem(CoinPackedMatrix*& matrix,
545  double*& collb, double*& colub, double*& obj,
546  char*& rowsen, double*& rowrhs,
547  double*& rowrng);
548 
551  virtual void loadProblem(const int numcols, const int numrows,
552  const int* start, const int* index,
553  const double* value,
554  const double* collb, const double* colub,
555  const double* obj,
556  const double* rowlb, const double* rowub);
557 
560  virtual void loadProblem(const int numcols, const int numrows,
561  const int* start, const int* index,
562  const double* value,
563  const double* collb, const double* colub,
564  const double* obj,
565  const char* rowsen, const double* rowrhs,
566  const double* rowrng);
567 
570  virtual int readMps(const char *filename,
571  const char *extension = "mps");
572 
577  virtual void writeMps(const char *filename,
578  const char *extension = "mps",
579  double objSense=0.0) const;
580 
582 
590  void passInMessageHandler(CoinMessageHandler * handler);
592 
593  //---------------------------------------------------------------------------
594 
601  {
624  };
625  CPXLPptr getLpPtr( int keepCached = KEEPCACHED_NONE );
626 
631 
633  const char* getCtype() const;
634 
639 
641  virtual OsiSolverInterface * clone(bool copyData = true) const;
642 
645 
648 
650  virtual ~OsiCpxSolverInterface();
651 
653  virtual void reset();
655 
656 /***************************************************************************/
676 
680  virtual int canDoSimplexInterface() const;
681 
686  virtual void enableSimplexInterface(int doingPrimal) {};
687 
691  virtual void disableSimplexInterface() {};
692 
696  virtual void enableFactorization() const {};
697 
701  virtual void disableFactorization() const {};
702 
704  virtual bool basisIsAvailable() const;
705 
709  virtual void getBasisStatus(int* cstat, int* rstat) const;
710 
712  virtual void getBInvARow(int row, double* z, double * slack=NULL) const;
713 
715  virtual void getBInvRow(int row, double* z) const;
716 
718  virtual void getBInvACol(int col, double* vec) const;
719 
721  virtual void getBInvCol(int col, double* vec) const;
722 
728  virtual void getBasics(int* index) const;
730  void switchToLP();
731 
733  void switchToMIP();
734 
736 /***************************************************************************/
737 
738 protected:
739 
742  virtual void applyRowCut( const OsiRowCut & rc );
744 
748  virtual void applyColCut( const OsiColCut & cc );
750 
751 private:
754  void resizeColType( int minsize );
756 
758  void freeColType();
760 
761 
764 
766  CPXLPptr getMutableLpPtr() const;
767 
769  void gutsOfCopy( const OsiCpxSolverInterface & source );
770 
772  void gutsOfConstructor();
773 
775  void gutsOfDestructor();
776 
778  void freeCachedColRim();
779 
781  void freeCachedRowRim();
782 
784  void freeCachedResults();
785 
787  void freeCachedMatrix();
788 
790  void freeCachedData( int keepCached = KEEPCACHED_NONE );
791 
793  void freeAllMemory();
794 
795 
797  void printBounds();
799 
800 
803  mutable CPXENVptr env_;
806  mutable CPXLPptr lp_;
807 
814 
817  mutable double *obj_;
819 
821  mutable double *collower_;
822 
824  mutable double *colupper_;
825 
827  mutable char *rowsense_;
828 
830  mutable double *rhs_;
831 
833  mutable double *rowrange_;
834 
836  mutable double *rowlower_;
837 
839  mutable double *rowupper_;
840 
842  mutable double *colsol_;
843 
845  mutable double *rowsol_;
846 
848  mutable double *redcost_;
849 
851  mutable double *rowact_;
852 
854  mutable CoinPackedMatrix *matrixByRow_;
855 
857  mutable CoinPackedMatrix *matrixByCol_;
859 
862  char *coltype_;
864 
867 
869  mutable bool probtypemip_;
870 
872 };
873 
874 //#############################################################################
880 void OsiCpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
881 
882 #endif