Bonmin 1.4trunk
|
00001 // (C) Copyright International Business Machines Corporation 2007 00002 // All Rights Reserved. 00003 // This code is published under the Common Public License. 00004 // 00005 // Authors : 00006 // Pierre Bonami, International Business Machines Corporation 00007 // 00008 // Date : 04/12/2007 00009 00010 #ifndef BabSetupBase_H 00011 #define BabSetupBase_H 00012 00013 #include <string> 00014 #include <list> 00015 #include "CglCutGenerator.hpp" 00016 #include "CbcHeuristic.hpp" 00017 #include "OsiChooseVariable.hpp" 00018 #include "BonOsiTMINLPInterface.hpp" 00019 namespace Bonmin 00020 { 00022 class BabSetupBase 00023 { 00024 public: 00026 struct CuttingMethod 00027 { 00028 int frequency; 00029 std::string id; 00030 CglCutGenerator * cgl; 00031 bool atSolution; 00032 bool normal; 00033 bool always; 00034 CuttingMethod(): 00035 atSolution(false), 00036 normal(true), 00037 always(false) 00038 {} 00039 00040 CuttingMethod(const CuttingMethod & other): 00041 frequency(other.frequency), 00042 id(other.id), 00043 cgl(other.cgl), 00044 atSolution(other.atSolution), 00045 normal(other.normal), 00046 always(other.always) 00047 {} 00048 }; 00050 struct HeuristicMethod 00051 { 00052 std::string id; 00053 CbcHeuristic* heuristic; 00054 HeuristicMethod() 00055 {} 00056 00057 HeuristicMethod(const HeuristicMethod & other): 00058 id(other.id), 00059 heuristic(other.heuristic) 00060 {} 00061 }; 00062 typedef std::list<CuttingMethod> CuttingMethods; 00063 typedef std::list<HeuristicMethod > HeuristicMethods; 00064 00066 enum NodeComparison { 00067 bestBound = 0 , 00068 DFS , 00069 BFS , 00070 dynamic , 00072 bestGuess 00073 }; 00074 00076 enum TreeTraversal { 00077 HeapOnly=0 , 00078 DiveFromBest , 00079 ProbedDive , 00080 DfsDiveFromBest , 00081 DfsDiveDynamic 00082 }; 00083 00084 00086 enum VarSelectStra_Enum { 00087 MOST_FRACTIONAL=0, 00088 STRONG_BRANCHING, 00089 RELIABILITY_BRANCHING, 00090 #ifdef BONMIN_CURVATURE_BRANCHING 00091 CURVATURE_ESTIMATOR, 00092 #endif 00093 QP_STRONG_BRANCHING, 00094 LP_STRONG_BRANCHING, 00095 NLP_STRONG_BRANCHING, 00096 OSI_SIMPLE, 00097 OSI_STRONG, 00098 RANDOM 00099 }; 00100 00102 enum IntParameter{ 00103 BabLogLevel = 0 , 00104 BabLogInterval, 00105 MaxFailures , 00106 FailureBehavior , 00107 MaxInfeasible , 00109 NumberStrong , 00110 MinReliability , 00111 MaxNodes , 00112 MaxSolutions , 00113 MaxIterations , 00114 SpecialOption , 00115 DisableSos , 00116 NumCutPasses, 00117 NumCutPassesAtRoot, 00118 RootLogLevel, 00119 NumberIntParam 00120 }; 00121 00122 00124 enum DoubleParameter{ 00125 CutoffDecr = 0 , 00126 Cutoff , 00127 AllowableGap , 00128 AllowableFractionGap , 00129 IntTol , 00130 MaxTime , 00131 NumberDoubleParam 00132 }; 00133 00135 BabSetupBase(const CoinMessageHandler * handler = NULL); 00136 00138 BabSetupBase(Ipopt::SmartPtr<TMINLP> tminlp, const CoinMessageHandler * handler = NULL); 00140 BabSetupBase(Ipopt::SmartPtr<TNLPSolver> app); 00142 BabSetupBase(const OsiTMINLPInterface& nlp); 00144 BabSetupBase(const BabSetupBase &setup, 00145 OsiTMINLPInterface &nlp); 00146 00148 BabSetupBase(const BabSetupBase &setup, 00149 OsiTMINLPInterface &nlp, 00150 const std::string &prefix); 00151 00153 BabSetupBase(const BabSetupBase & other); 00154 00156 virtual BabSetupBase * clone() const = 0; 00157 00159 virtual BabSetupBase *clone(OsiTMINLPInterface&nlp)const; 00161 virtual ~BabSetupBase(); 00162 00166 void use(const OsiTMINLPInterface& nlp); 00168 void use(Ipopt::SmartPtr<TMINLP> tminlp ); 00170 void use(Ipopt::SmartPtr<TMINLP2TNLP> prob); 00172 void setNonlinearSolver(OsiTMINLPInterface * s) 00173 { 00174 nonlinearSolver_ = s; 00175 } 00181 virtual void registerOptions(); 00183 virtual void setBabDefaultOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions) 00184 {} 00186 static void registerAllOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions); 00187 00189 virtual void readOptionsFile() 00190 { 00191 if (readOptions_) return; 00192 readOptionsFile("bonmin.opt"); 00193 } 00194 00196 void readOptionsFile(std::string fileName); 00197 00199 void readOptionsString(std::string opt_string); 00200 00202 void readOptionsStream(std::istream& is); 00203 00205 void mayPrintDoc(); 00206 00207 00209 const char * prefix() const { 00210 return prefix_.c_str(); 00211 } 00212 00214 void setOptionsAndJournalist(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions, 00215 Ipopt::SmartPtr<Ipopt::OptionsList> options, 00216 Ipopt::SmartPtr<Ipopt::Journalist> journalist) 00217 { 00218 options_ = options; 00219 roptions_ = roptions; 00220 journalist_ = journalist; 00221 } 00222 00224 void initializeOptionsAndJournalist(); 00230 OsiTMINLPInterface * nonlinearSolver() 00231 { 00232 return nonlinearSolver_; 00233 } 00235 OsiSolverInterface * continuousSolver() 00236 { 00237 return continuousSolver_; 00238 } 00240 CuttingMethods& cutGenerators() 00241 { 00242 return cutGenerators_; 00243 } 00245 HeuristicMethods& heuristics() 00246 { 00247 return heuristics_; 00248 } 00250 OsiChooseVariable * branchingMethod() 00251 { 00252 return branchingMethod_; 00253 } 00255 NodeComparison& nodeComparisonMethod() 00256 { 00257 return nodeComparisonMethod_; 00258 } 00260 TreeTraversal treeTraversalMethod() 00261 { 00262 return treeTraversalMethod_; 00263 } 00265 int getIntParameter(const IntParameter &p) const 00266 { 00267 return intParam_[p]; 00268 } 00270 double getDoubleParameter(const DoubleParameter &p) const 00271 { 00272 return doubleParam_[p]; 00273 } 00275 void setIntParameter(const IntParameter &p, const int v) 00276 { 00277 intParam_[p] = v; 00278 } 00280 void setDoubleParameter(const DoubleParameter &p, const double v) 00281 { 00282 doubleParam_[p] = v; 00283 } 00287 void gatherParametersValues() 00288 { 00289 gatherParametersValues(options_); 00290 } 00292 void gatherParametersValues(Ipopt::SmartPtr<OptionsList> options); 00294 Ipopt::SmartPtr<Ipopt::Journalist> journalist() 00295 { 00296 return journalist_; 00297 } 00298 00300 Ipopt::SmartPtr<Ipopt::OptionsList> options() 00301 { 00302 return options_; 00303 } 00304 00306 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions() 00307 { 00308 return roptions_; 00309 } 00310 00312 const vector<OsiObject *>& objects() const 00313 { 00314 return objects_; 00315 } 00316 00318 vector<OsiObject *>& objects() 00319 { 00320 return objects_; 00321 } 00322 00323 void addCutGenerator(CuttingMethod & cg){ 00324 cutGenerators_.push_back(cg); 00325 } 00326 protected: 00328 void setPriorities(); 00330 void addSos(); 00331 00333 int intParam_[NumberIntParam]; 00335 static int defaultIntParam_[NumberIntParam]; 00337 double doubleParam_[NumberDoubleParam]; 00339 static double defaultDoubleParam_[NumberDoubleParam]; 00341 OsiTMINLPInterface * nonlinearSolver_; 00343 OsiSolverInterface * continuousSolver_; 00345 CuttingMethods cutGenerators_; 00347 HeuristicMethods heuristics_; 00349 OsiChooseVariable * branchingMethod_; 00351 NodeComparison nodeComparisonMethod_; 00353 TreeTraversal treeTraversalMethod_; 00355 vector<OsiObject *> objects_; 00356 00357 00359 Ipopt::SmartPtr<Ipopt::Journalist> journalist_; 00360 00362 Ipopt::SmartPtr<Ipopt::OptionsList> options_; 00363 00365 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions_; 00366 00368 bool readOptions_; 00370 CoinMessageHandler * messageHandler_; 00372 std::string prefix_; 00373 }; 00374 }/* End namespace Bonmin. */ 00375 #endif 00376