/home/coin/SVN-release/CoinAll-1.1.0/Cgl/src/CglLandP/CglLandP.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2005, Pierre Bonami and others.  All Rights Reserved.
00002 // Author:   Pierre Bonami                                                  
00003 //           Tepper School of Business
00004 //           Carnegie Mellon University, Pittsburgh, PA 15213
00005 // Date:     07/21/05
00006 //---------------------------------------------------------------------------
00007 #ifndef CglLandP_H
00008 #define CglLandP_H
00009 
00010 //Several level of Debug
00011 // 1 - A few simple sanity check
00012 // 2 - do extra computations on cut quality
00013 // 3 - Output cut in initial non-basic space (only if logLevel >= 3 )
00014 // 4 - Double check (compute in two different ways) reduced cost and f+ f-
00015 //#define LandP_DEBUG 1
00016 
00017 
00018 #include "CglLandPValidator.hpp"
00019 #include "CglCutGenerator.hpp"
00020 #include "CglParam.hpp"
00021 
00022 #ifdef DO_STAT
00023 #include "CglLandPStats.hpp"
00024 #endif
00025 #include <iostream>
00026 #include <fstream>
00027 class CoinWarmStartBasis;
00032 namespace LAP {
00033 enum LapMessagesTypes
00034 {
00035   BEGIN_ROUND,
00036   END_ROUND,
00037   DURING_SEP,
00038   CUT_REJECTED,
00039   CUT_FAILED,
00040   LAP_CUT_FAILED_DO_MIG,
00041   LAP_MESSAGES_DUMMY_END
00042 };
00044 class LapMessages : public CoinMessages
00045 {
00046 public:
00048   LapMessages( );
00049 };
00050 class CglLandPSimplex;
00051 }
00052 
00053 class CglLandP : public CglCutGenerator
00054 {
00055   friend void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir);
00056 
00057   friend class LAP::CglLandPSimplex;
00058 
00059 public:
00060 
00061   enum SelectionRules {
00062     mostNegativeRc ,
00063     bestPivot 
00064   };
00067   class Parameters : public CglParam {
00068   public:
00070     Parameters();
00072     Parameters(const Parameters &other);
00074     Parameters & operator=(const Parameters &other);
00077     
00080     int pivotLimit;
00083     int pivotLimitInTree;
00085     int maxCutPerRound;
00087     int failedPivotLimit;
00090     int degeneratePivotLimit;
00094 
00095     double pivotTol;
00097     double away;
00099     mutable double timeLimit;
00101     double singleCutTimeLimit;
00103 
00106 
00107     bool useTableauRow;
00109     bool modularize;
00111     bool strengthen;
00113     int reducedSpace;
00115     bool perturb;
00117     bool scaleCuts;
00119     SelectionRules pivotSelection;
00121   };
00122 
00123 
00125    CglLandP(const CglLandP::Parameters &params = CglLandP::Parameters(), 
00126             const CglValidator &validator = CglValidator());
00128   ~CglLandP();
00130    CglLandP(const CglLandP &source);
00132   CglLandP& operator=(const CglLandP &rhs);
00134   CglCutGenerator * clone() const;
00135 
00136 #ifdef DO_STAT
00137 
00138   void displayStats(){roundsStats_.displaySumUp(*logStream);}
00139 
00140   void setIdString(const std::string &id){roundsStats_.setIdString(id);}
00141 #endif
00142 
00145 
00146   virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs,
00147                             const CglTreeInfo info = CglTreeInfo()) const;
00148 
00150 
00151 virtual bool needsOptimalBasis() const
00152 {
00153   return true;
00154 }
00155 
00156         CglValidator & validator(){return validator_;}
00164   void setLogLevel(int level)
00165   { handler_->setLogLevel(level);
00166   }
00167 #ifdef DO_STAT
00168   void setLogStream(std::ostream & os)
00169   {
00170     releaseLogStream();
00171     logStream = &os;
00172   }
00173 
00174 void openLogStream(std::string name){
00175   releaseLogStream();
00176   logStream = new std::ofstream(name.c_str(),std::ios::app);
00177   logAssignCount = new int;
00178   (*logAssignCount) = 1;
00179 }
00180 
00181 inline void releaseLogStream(){
00182   if(logAssignCount && *logAssignCount){
00183     (*logAssignCount)--;
00184     if(*logAssignCount == 0){
00185       delete logStream;
00186       delete logAssignCount;
00187       logAssignCount=NULL;
00188     }
00189     else logAssignCount = NULL;
00190 }
00191 }
00192 
00193 void lookupProblem(const std::string &s);
00194 
00195 #endif
00196   class NoBasisError : public CoinError
00197   {
00198   public:
00199     NoBasisError(): CoinError("No basis available","LandP",""){}
00200   };
00201 
00202   class SimplexInterfaceError : public CoinError
00203   {
00204   public:
00205     SimplexInterfaceError(): CoinError("Invalid conversion to simplex interface", "CglLandP","CglLandP"){}
00206   };
00207   Parameters & parameter() {return params_;}
00208 private:
00209   Parameters params_;
00210 
00212   struct CachedData
00213   {
00214     CachedData(int nBasics = 0 , int nNonBasics = 0);
00215     CachedData(const CachedData & source);
00216 
00217     CachedData& operator=(const CachedData &source);
00219     void getData(const OsiSolverInterface &si);
00220     ~CachedData();
00222     int * basics_;
00224     int *nonBasics_;
00226     int nBasics_;
00228     int nNonBasics_;
00230     CoinWarmStartBasis * basis_;
00232     double * colsol_;
00234     double * slacks_;
00236     bool * integers_;
00237   };
00238   mutable CachedData cached_;
00240   CoinMessageHandler * handler_;
00242   CoinMessages messages_;
00244   CglValidator validator_;
00245 #ifdef DO_STAT
00246 
00247   mutable roundsStatistics roundsStats_;
00249   mutable std::ostream * logStream;
00251   mutable int * logAssignCount;
00253   mutable bool used;
00254 #endif
00255 };
00256 void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir);
00257 
00258 #endif
00259 

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