/home/coin/SVN-release/CoinAll-1.1.0/Osi/src/OsiSpx/OsiSpxSolverInterface.hpp

Go to the documentation of this file.
00001 //  LAST EDIT: Fri Aug 31 13:54:15 2001 by Tobias Pfender (opt14!bzfpfend) 
00002 //-----------------------------------------------------------------------------
00003 // name:     OSI Interface for SOPLEX
00004 // author:   Tobias Pfender
00005 //           Konrad-Zuse-Zentrum Berlin (Germany)
00006 //           email: pfender@zib.de
00007 // date:     01/16/2002
00008 // license:  this file may be freely distributed under the terms of the CPL
00009 //-----------------------------------------------------------------------------
00010 // Copyright (C) 2002, Tobias Pfender, International Business Machines
00011 // Corporation and others.  All Rights Reserved.
00012 
00013 #ifndef OsiSpxSolverInterface_H
00014 #define OsiSpxSolverInterface_H
00015 
00016 #include <string>
00017 #include "spxsolver.h"
00018 #include "OsiSolverInterface.hpp"
00019 #include "CoinWarmStartBasis.hpp"
00020 
00026 class OsiSpxSolverInterface : virtual public OsiSolverInterface {
00027   friend void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00028   
00029 public:
00030   
00031   //---------------------------------------------------------------------------
00034 
00035   virtual void initialSolve();
00036   
00038   virtual void resolve();
00039   
00041   virtual void branchAndBound();
00043   
00044   //---------------------------------------------------------------------------
00060     // Set an integer parameter
00061     bool setIntParam(OsiIntParam key, int value);
00062     // Set an double parameter
00063     bool setDblParam(OsiDblParam key, double value);
00064     // Get an integer parameter
00065     bool getIntParam(OsiIntParam key, int& value) const;
00066     // Get an double parameter
00067     bool getDblParam(OsiDblParam key, double& value) const;
00068     // Get a string parameter
00069     bool getStrParam(OsiStrParam key, std::string& value) const;
00071 
00072   //---------------------------------------------------------------------------
00074 
00075 
00076     virtual bool isAbandoned() const;
00078     virtual bool isProvenOptimal() const;
00080     virtual bool isProvenPrimalInfeasible() const;
00082     virtual bool isProvenDualInfeasible() const;
00084     virtual bool isPrimalObjectiveLimitReached() const;
00086     virtual bool isDualObjectiveLimitReached() const;
00088     virtual bool isIterationLimitReached() const;
00090 
00091   //---------------------------------------------------------------------------
00094 
00095     inline CoinWarmStart *getEmptyWarmStart () const
00096     { return (dynamic_cast<CoinWarmStart *>(new CoinWarmStartBasis())) ; }
00098     virtual CoinWarmStart* getWarmStart() const;
00101     virtual bool setWarmStart(const CoinWarmStart* warmstart);
00103 
00104   //---------------------------------------------------------------------------
00111 
00112     virtual void markHotStart();
00114     virtual void solveFromHotStart();
00116     virtual void unmarkHotStart();
00118 
00119   //---------------------------------------------------------------------------
00134 
00135       virtual int getNumCols() const;
00136   
00138       virtual int getNumRows() const;
00139   
00141       virtual int getNumElements() const;
00142   
00144       virtual const double * getColLower() const;
00145   
00147       virtual const double * getColUpper() const;
00148   
00158       virtual const char * getRowSense() const;
00159   
00168       virtual const double * getRightHandSide() const;
00169   
00178       virtual const double * getRowRange() const;
00179   
00181       virtual const double * getRowLower() const;
00182   
00184       virtual const double * getRowUpper() const;
00185   
00187       virtual const double * getObjCoefficients() const;
00188   
00190       virtual double getObjSense() const;
00191 
00193       virtual bool isContinuous(int colNumber) const;
00194 
00195 #if 0
00197       virtual bool isBinary(int columnNumber) const;
00198   
00203       virtual bool isInteger(int columnNumber) const;
00204   
00206       virtual bool isIntegerNonBinary(int columnNumber) const;
00207   
00209       virtual bool isFreeBinary(int columnNumber) const;
00210 #endif
00211   
00213       virtual const CoinPackedMatrix * getMatrixByRow() const;
00214   
00216       virtual const CoinPackedMatrix * getMatrixByCol() const;
00217   
00219       virtual double getInfinity() const;
00221     
00224 
00225       virtual const double * getColSolution() const;
00226   
00228       virtual const double * getRowPrice() const;
00229   
00231       virtual const double * getReducedCost() const;
00232   
00235       virtual const double * getRowActivity() const;
00236   
00238       virtual double getObjValue() const;
00239   
00242       virtual int getIterationCount() const;
00243   
00255       virtual std::vector<double*> getDualRays(int maxNumRays) const;
00267       virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
00268   
00269 #if 0
00270 
00272       virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
00273         const;
00274 #endif
00275 
00276 
00277   
00278   //---------------------------------------------------------------------------
00279 
00282     //-------------------------------------------------------------------------
00286       virtual void setObjCoeff( int elementIndex, double elementValue );
00287 
00290       virtual void setColLower( int elementIndex, double elementValue );
00291       
00294       virtual void setColUpper( int elementIndex, double elementValue );
00295       
00299       virtual void setColBounds( int elementIndex,
00300                                  double lower, double upper );
00301     
00302 #if 0 // we are using the default implementation of OsiSolverInterface
00303 
00311       virtual void setColSetBounds(const int* indexFirst,
00312                                    const int* indexLast,
00313                                    const double* boundList);
00314 #endif
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     
00334 #if 0 // we are using the default implementation of OsiSolverInterface
00335 
00342       virtual void setRowSetBounds(const int* indexFirst,
00343                                    const int* indexLast,
00344                                    const double* boundList);
00345 
00355       virtual void setRowSetTypes(const int* indexFirst,
00356                                   const int* indexLast,
00357                                   const char* senseList,
00358                                   const double* rhsList,
00359                                   const double* rangeList);
00360 #endif
00361 
00362     
00363     //-------------------------------------------------------------------------
00367       virtual void setContinuous(int index);
00369       virtual void setInteger(int index);
00370 #if 0 // we are using the default implementation of OsiSolverInterface
00371 
00373       virtual void setContinuous(const int* indices, int len);
00376       virtual void setInteger(const int* indices, int len);
00377 #endif
00378 
00379     
00380     //-------------------------------------------------------------------------
00382     virtual void setObjSense(double s);
00383     
00394     virtual void setColSolution(const double * colsol);
00395     
00406     virtual void setRowPrice(const double * rowprice);
00407     
00408     //-------------------------------------------------------------------------
00414       virtual void addCol(const CoinPackedVectorBase& vec,
00415                           const double collb, const double colub,   
00416                           const double obj);
00417 
00418 #if 0 // we are using the default implementation of OsiSolverInterface
00419 
00420       virtual void addCols(const int numcols,
00421                            const CoinPackedVectorBase * const * cols,
00422                            const double* collb, const double* colub,   
00423                            const double* obj);
00424 #endif
00425 
00427       virtual void deleteCols(const int num, const int * colIndices);
00428     
00430       virtual void addRow(const CoinPackedVectorBase& vec,
00431                           const double rowlb, const double rowub);
00433       virtual void addRow(const CoinPackedVectorBase& vec,
00434                           const char rowsen, const double rowrhs,   
00435                           const double rowrng);
00436 
00437 #if 0 // we are using the default implementation of OsiSolverInterface
00438 
00439       virtual void addRows(const int numrows,
00440                            const CoinPackedVectorBase * const * rows,
00441                            const double* rowlb, const double* rowub);
00443       virtual void addRows(const int numrows,
00444                            const CoinPackedVectorBase * const * rows,
00445                            const char* rowsen, const double* rowrhs,   
00446                            const double* rowrng);
00447 #endif
00448 
00450       virtual void deleteRows(const int num, const int * rowIndices);
00451     
00452 #if 0 // we are using the default implementation of OsiSolverInterface
00453       //-----------------------------------------------------------------------
00475       virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
00476                                             double effectivenessLb = 0.0);
00477 #endif
00478 
00479 
00480 
00481   //---------------------------------------------------------------------------
00482 
00496     virtual void loadProblem(const CoinPackedMatrix& matrix,
00497                              const double* collb, const double* colub,   
00498                              const double* obj,
00499                              const double* rowlb, const double* rowub);
00500                             
00508     virtual void assignProblem(CoinPackedMatrix*& matrix,
00509                                double*& collb, double*& colub, double*& obj,
00510                                double*& rowlb, double*& rowub);
00511 
00524     virtual void loadProblem(const CoinPackedMatrix& matrix,
00525                              const double* collb, const double* colub,
00526                              const double* obj,
00527                              const char* rowsen, const double* rowrhs,   
00528                              const double* rowrng);
00529 
00537     virtual void assignProblem(CoinPackedMatrix*& matrix,
00538                                double*& collb, double*& colub, double*& obj,
00539                                char*& rowsen, double*& rowrhs,
00540                                double*& rowrng);
00541 
00544     virtual void loadProblem(const int numcols, const int numrows,
00545                              const int* start, const int* index,
00546                              const double* value,
00547                              const double* collb, const double* colub,   
00548                              const double* obj,
00549                              const double* rowlb, const double* rowub);
00550 
00553     virtual void loadProblem(const int numcols, const int numrows,
00554                              const int* start, const int* index,
00555                              const double* value,
00556                              const double* collb, const double* colub,   
00557                              const double* obj,
00558                              const char* rowsen, const double* rowrhs,   
00559                              const double* rowrng);
00560 
00562     virtual int readMps(const char *filename,
00563                          const char *extension = "mps");
00564 
00569     virtual void writeMps(const char *filename,
00570                           const char *extension = "mps",
00571                           double objSense=0.0) const;
00573 
00574   //---------------------------------------------------------------------------
00575 
00578 
00579   OsiSpxSolverInterface(); 
00580   
00582   virtual OsiSolverInterface * clone(bool copyData = true) const;
00583   
00585   OsiSpxSolverInterface( const OsiSpxSolverInterface& );
00586   
00588   OsiSpxSolverInterface& operator=( const OsiSpxSolverInterface& rhs );
00589   
00591   virtual ~OsiSpxSolverInterface();
00593   
00594 protected:
00595   
00598 
00599   virtual void applyRowCut( const OsiRowCut & rc );
00600   
00604   virtual void applyColCut( const OsiColCut & cc );
00606 
00609 
00610   soplex::SPxSolver spxsolver_;
00612 
00613   
00614 private:
00617   
00619   void freeCachedColRim();
00620 
00622   void freeCachedRowRim();
00623 
00625   void freeCachedResults();
00626   
00628   void freeCachedMatrix();
00629 
00630   enum keepCachedFlag
00631   {
00633     KEEPCACHED_NONE    = 0,
00635     KEEPCACHED_COLUMN  = 1,
00637     KEEPCACHED_ROW     = 2,
00639     KEEPCACHED_MATRIX  = 4,
00641     KEEPCACHED_RESULTS = 8,
00643     KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
00645     KEEPCACHED_ALL     = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
00647     FREECACHED_COLUMN  = KEEPCACHED_PROBLEM & !KEEPCACHED_COLUMN,
00649     FREECACHED_ROW     = KEEPCACHED_PROBLEM & !KEEPCACHED_ROW,
00651     FREECACHED_MATRIX  = KEEPCACHED_PROBLEM & !KEEPCACHED_MATRIX,
00653     FREECACHED_RESULTS = KEEPCACHED_ALL & !KEEPCACHED_RESULTS
00654   };
00655 
00657   void freeCachedData( int keepCached = KEEPCACHED_NONE );
00658 
00660   void freeAllMemory();
00661 
00663   void printBounds(); 
00665   
00666   
00669 
00670   soplex::DIdxSet   spxintvars_;
00671 
00673   soplex::SoPlex::VarStatus *hotStartCStat_;
00674   int                       hotStartCStatSize_;
00675   soplex::SoPlex::VarStatus *hotStartRStat_;
00676   int                       hotStartRStatSize_;
00677   int                       hotStartMaxIteration_;
00678 
00681 
00682   mutable soplex::DVector *obj_;
00683 
00685   mutable char    *rowsense_;
00686   
00688   mutable double  *rhs_;
00689   
00691   mutable double  *rowrange_;
00692   
00694   mutable soplex::DVector *colsol_;
00695   
00697   mutable soplex::DVector *rowsol_;
00698 
00700   mutable soplex::DVector *redcost_;
00701 
00703   mutable soplex::DVector *rowact_;
00704 
00706   mutable CoinPackedMatrix *matrixByRow_;  
00707   
00709   mutable CoinPackedMatrix *matrixByCol_;  
00711 
00712 };
00713 
00714 //#############################################################################
00720 void OsiSpxSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
00721 
00722 #endif

Generated on Sun Nov 14 14:06:40 2010 for Coin-All by  doxygen 1.4.7