OsiSpxSolverInterface.hpp

Go to the documentation of this file.
00001 //-----------------------------------------------------------------------------
00002 // name:     OSI Interface for SoPlex >= 1.4.2c
00003 // authors:  Tobias Pfender
00004 //           Ambros Gleixner
00005 //           Wei Huang
00006 //           Konrad-Zuse-Zentrum Berlin (Germany)
00007 //           email: pfender@zib.de
00008 // date:     01/16/2002
00009 // license:  this file may be freely distributed under the terms of the EPL
00010 //-----------------------------------------------------------------------------
00011 // Copyright (C) 2002, Tobias Pfender, International Business Machines
00012 // Corporation and others.  All Rights Reserved.
00013 // Last edit: $Id: OsiSpxSolverInterface.hpp 1967 2014-06-12 16:02:12Z stefan $
00014 
00015 #ifndef OsiSpxSolverInterface_H
00016 #define OsiSpxSolverInterface_H
00017 
00018 #include <string>
00019 #include "OsiSolverInterface.hpp"
00020 #include "CoinWarmStartBasis.hpp"
00021 
00022 #ifndef _SOPLEX_H_
00023 /* forward declarations so the header can be compiled without having to include soplex.h
00024  * however, these declaration work only for SoPlex < 2.0, so we do them only if soplex.h hasn't been included already
00025  */
00026 namespace soplex {
00027   class DIdxSet;
00028   class DVector;
00029   class SoPlex;
00030 }
00031 #endif
00032 
00036 class OsiSpxSolverInterface : virtual public OsiSolverInterface {
00037   friend void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00038   
00039 public:
00040   
00041   //---------------------------------------------------------------------------
00044 
00045   virtual void initialSolve();
00046   
00048   virtual void resolve();
00049   
00051   virtual void branchAndBound();
00053   
00054   //---------------------------------------------------------------------------
00070     // Set an integer parameter
00071     bool setIntParam(OsiIntParam key, int value);
00072     // Set an double parameter
00073     bool setDblParam(OsiDblParam key, double value);
00074     // Get an integer parameter
00075     bool getIntParam(OsiIntParam key, int& value) const;
00076     // Get an double parameter
00077     bool getDblParam(OsiDblParam key, double& value) const;
00078     // Get a string parameter
00079     bool getStrParam(OsiStrParam key, std::string& value) const;
00080     // Set timelimit
00081     void setTimeLimit(double value);
00082     // Get timelimit
00083     double getTimeLimit() const;
00085 
00086   //---------------------------------------------------------------------------
00088 
00089 
00090     virtual bool isAbandoned() const;
00092     virtual bool isProvenOptimal() const;
00094     virtual bool isProvenPrimalInfeasible() const;
00096     virtual bool isProvenDualInfeasible() const;
00097     // Is the given primal objective limit reached? - use implementation from OsiSolverInterface
00099     virtual bool isDualObjectiveLimitReached() const;
00101     virtual bool isIterationLimitReached() const;
00103     virtual bool isTimeLimitReached() const;
00105 
00106   //---------------------------------------------------------------------------
00109 
00110     inline CoinWarmStart *getEmptyWarmStart () const
00111     { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
00113     virtual CoinWarmStart* getWarmStart() const;
00116     virtual bool setWarmStart(const CoinWarmStart* warmstart);
00118 
00119   //---------------------------------------------------------------------------
00126 
00127     virtual void markHotStart();
00129     virtual void solveFromHotStart();
00131     virtual void unmarkHotStart();
00133 
00134   //---------------------------------------------------------------------------
00149 
00150       virtual int getNumCols() const;
00151   
00153       virtual int getNumRows() const;
00154   
00156       virtual int getNumElements() const;
00157   
00159       virtual const double * getColLower() const;
00160   
00162       virtual const double * getColUpper() const;
00163   
00173       virtual const char * getRowSense() const;
00174   
00183       virtual const double * getRightHandSide() const;
00184   
00193       virtual const double * getRowRange() const;
00194   
00196       virtual const double * getRowLower() const;
00197   
00199       virtual const double * getRowUpper() const;
00200   
00202       virtual const double * getObjCoefficients() const;
00203   
00205       virtual double getObjSense() const;
00206 
00208       virtual bool isContinuous(int colNumber) const;
00209 
00210 #if 0
00212       virtual bool isBinary(int columnNumber) const;
00213   
00218       virtual bool isInteger(int columnNumber) const;
00219   
00221       virtual bool isIntegerNonBinary(int columnNumber) const;
00222   
00224       virtual bool isFreeBinary(int columnNumber) const;
00225 #endif
00226   
00228       virtual const CoinPackedMatrix * getMatrixByRow() const;
00229   
00231       virtual const CoinPackedMatrix * getMatrixByCol() const;
00232   
00234       virtual double getInfinity() const;
00236     
00239 
00240       virtual const double * getColSolution() const;
00241   
00243       virtual const double * getRowPrice() const;
00244   
00246       virtual const double * getReducedCost() const;
00247   
00250       virtual const double * getRowActivity() const;
00251   
00253       virtual double getObjValue() const;
00254   
00257       virtual int getIterationCount() const;
00258   
00276       virtual std::vector<double*> getDualRays(int maxNumRays,
00277                                                bool fullRay=false) const;
00289       virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00290   
00291 #if 0
00292 
00294       virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00295         const;
00296 #endif
00297 
00298 
00299   
00300   //---------------------------------------------------------------------------
00301 
00304     //-------------------------------------------------------------------------
00308       virtual void setObjCoeff( int elementIndex, double elementValue );
00309 
00312       virtual void setColLower( int elementIndex, double elementValue );
00313       
00316       virtual void setColUpper( int elementIndex, double elementValue );
00317       
00321       virtual void setColBounds( int elementIndex,
00322                                  double lower, double upper );
00323     
00324 #if 0 // we are using the default implementation of OsiSolverInterface
00325 
00333       virtual void setColSetBounds(const int* indexFirst,
00334                                    const int* indexLast,
00335                                    const double* boundList);
00336 #endif
00337       
00340       virtual void setRowLower( int elementIndex, double elementValue );
00341       
00344       virtual void setRowUpper( int elementIndex, double elementValue );
00345     
00349       virtual void setRowBounds( int elementIndex,
00350                                  double lower, double upper );
00351     
00353       virtual void setRowType(int index, char sense, double rightHandSide,
00354                               double range);
00355     
00356 #if 0 // we are using the default implementation of OsiSolverInterface
00357 
00364       virtual void setRowSetBounds(const int* indexFirst,
00365                                    const int* indexLast,
00366                                    const double* boundList);
00367 
00377       virtual void setRowSetTypes(const int* indexFirst,
00378                                   const int* indexLast,
00379                                   const char* senseList,
00380                                   const double* rhsList,
00381                                   const double* rangeList);
00382 #endif
00383 
00384     
00385     //-------------------------------------------------------------------------
00389       virtual void setContinuous(int index);
00391       virtual void setInteger(int index);
00392 #if 0 // we are using the default implementation of OsiSolverInterface
00393 
00395       virtual void setContinuous(const int* indices, int len);
00398       virtual void setInteger(const int* indices, int len);
00399 #endif
00400 
00401     
00402     //-------------------------------------------------------------------------
00404     virtual void setObjSense(double s);
00405     
00416     virtual void setColSolution(const double * colsol);
00417     
00428     virtual void setRowPrice(const double * rowprice);
00429     
00430     //-------------------------------------------------------------------------
00436       virtual void addCol(const CoinPackedVectorBase& vec,
00437                           const double collb, const double colub,   
00438                           const double obj);
00439 
00440 #if 0 // we are using the default implementation of OsiSolverInterface
00441 
00442       virtual void addCols(const int numcols,
00443                            const CoinPackedVectorBase * const * cols,
00444                            const double* collb, const double* colub,   
00445                            const double* obj);
00446 #endif
00447 
00449       virtual void deleteCols(const int num, const int * colIndices);
00450     
00452       virtual void addRow(const CoinPackedVectorBase& vec,
00453                           const double rowlb, const double rowub);
00455       virtual void addRow(const CoinPackedVectorBase& vec,
00456                           const char rowsen, const double rowrhs,   
00457                           const double rowrng);
00458 
00459 #if 0 // we are using the default implementation of OsiSolverInterface
00460 
00461       virtual void addRows(const int numrows,
00462                            const CoinPackedVectorBase * const * rows,
00463                            const double* rowlb, const double* rowub);
00465       virtual void addRows(const int numrows,
00466                            const CoinPackedVectorBase * const * rows,
00467                            const char* rowsen, const double* rowrhs,   
00468                            const double* rowrng);
00469 #endif
00470 
00472       virtual void deleteRows(const int num, const int * rowIndices);
00473     
00474 #if 0 // we are using the default implementation of OsiSolverInterface
00475       //-----------------------------------------------------------------------
00497       virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00498                                             double effectivenessLb = 0.0);
00499 #endif
00500 
00501 
00502 
00503   //---------------------------------------------------------------------------
00504 
00518     virtual void loadProblem(const CoinPackedMatrix& matrix,
00519                              const double* collb, const double* colub,   
00520                              const double* obj,
00521                              const double* rowlb, const double* rowub);
00522                             
00530     virtual void assignProblem(CoinPackedMatrix*& matrix,
00531                                double*& collb, double*& colub, double*& obj,
00532                                double*& rowlb, double*& rowub);
00533 
00546     virtual void loadProblem(const CoinPackedMatrix& matrix,
00547                              const double* collb, const double* colub,
00548                              const double* obj,
00549                              const char* rowsen, const double* rowrhs,   
00550                              const double* rowrng);
00551 
00559     virtual void assignProblem(CoinPackedMatrix*& matrix,
00560                                double*& collb, double*& colub, double*& obj,
00561                                char*& rowsen, double*& rowrhs,
00562                                double*& rowrng);
00563 
00566     virtual void loadProblem(const int numcols, const int numrows,
00567                              const int* start, const int* index,
00568                              const double* value,
00569                              const double* collb, const double* colub,   
00570                              const double* obj,
00571                              const double* rowlb, const double* rowub);
00572 
00575     virtual void loadProblem(const int numcols, const int numrows,
00576                              const int* start, const int* index,
00577                              const double* value,
00578                              const double* collb, const double* colub,   
00579                              const double* obj,
00580                              const char* rowsen, const double* rowrhs,   
00581                              const double* rowrng);
00582 
00584     virtual int readMps(const char *filename,
00585                          const char *extension = "mps");
00586 
00591     virtual void writeMps(const char *filename,
00592                           const char *extension = "mps",
00593                           double objSense=0.0) const;
00595 
00596   //---------------------------------------------------------------------------
00597 
00600 
00601   OsiSpxSolverInterface(); 
00602   
00604   virtual OsiSolverInterface * clone(bool copyData = true) const;
00605   
00607   OsiSpxSolverInterface( const OsiSpxSolverInterface& );
00608   
00610   OsiSpxSolverInterface& operator=( const OsiSpxSolverInterface& rhs );
00611   
00613   virtual ~OsiSpxSolverInterface();
00615   
00616 protected:
00617   
00620 
00621   virtual void applyRowCut( const OsiRowCut & rc );
00622   
00626   virtual void applyColCut( const OsiColCut & cc );
00628 
00631 
00632   soplex::SoPlex *soplex_;
00634 
00635   
00636 private:
00639   
00641   void freeCachedColRim();
00642 
00644   void freeCachedRowRim();
00645 
00647   void freeCachedResults();
00648   
00650   void freeCachedMatrix();
00651 
00652   enum keepCachedFlag
00653   {
00655     KEEPCACHED_NONE    = 0,
00657     KEEPCACHED_COLUMN  = 1,
00659     KEEPCACHED_ROW     = 2,
00661     KEEPCACHED_MATRIX  = 4,
00663     KEEPCACHED_RESULTS = 8,
00665     KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00667     KEEPCACHED_ALL     = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00669     FREECACHED_COLUMN  = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
00671     FREECACHED_ROW     = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
00673     FREECACHED_MATRIX  = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
00675     FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
00676   };
00677 
00679   void freeCachedData( int keepCached = KEEPCACHED_NONE );
00680 
00682   void freeAllMemory();
00684   
00685   
00688 
00689   soplex::DIdxSet   *spxintvars_;
00690 
00692   void* hotStartCStat_;
00693   int   hotStartCStatSize_;
00694   void* hotStartRStat_;
00695   int   hotStartRStatSize_;
00696   int   hotStartMaxIteration_;
00697 
00700 
00701   mutable soplex::DVector *obj_;
00702 
00704   mutable char    *rowsense_;
00705   
00707   mutable double  *rhs_;
00708   
00710   mutable double  *rowrange_;
00711   
00713   mutable soplex::DVector *colsol_;
00714   
00716   mutable soplex::DVector *rowsol_;
00717 
00719   mutable soplex::DVector *redcost_;
00720 
00722   mutable soplex::DVector *rowact_;
00723 
00725   mutable CoinPackedMatrix *matrixByRow_;  
00726   
00728   mutable CoinPackedMatrix *matrixByCol_;  
00730 
00731 };
00732 
00733 //#############################################################################
00735 void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00736 
00737 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 7 Mar 2015 for Osi by  doxygen 1.6.1