00001
00002
00003
00004
00005
00006
00007
00008
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 #include "IpSmartPtr.hpp"
00020 #include "BonTMINLP2OsiLP.hpp"
00021
00022 namespace Bonmin
00023 {
00025 class BabSetupBase
00026 {
00027 public:
00029 struct CuttingMethod
00030 {
00031 int frequency;
00032 std::string id;
00033 CglCutGenerator * cgl;
00034 bool atSolution;
00035 bool normal;
00036 bool always;
00037 CuttingMethod():
00038 atSolution(false),
00039 normal(true),
00040 always(false)
00041 {}
00042
00043 CuttingMethod(const CuttingMethod & other):
00044 frequency(other.frequency),
00045 id(other.id),
00046 cgl(other.cgl),
00047 atSolution(other.atSolution),
00048 normal(other.normal),
00049 always(other.always)
00050 {}
00051 };
00053 struct HeuristicMethod
00054 {
00055 std::string id;
00056 CbcHeuristic* heuristic;
00057 HeuristicMethod()
00058 {}
00059
00060 HeuristicMethod(const HeuristicMethod & other):
00061 id(other.id),
00062 heuristic(other.heuristic)
00063 {}
00064 };
00065 typedef std::list<CuttingMethod> CuttingMethods;
00066 typedef std::list<HeuristicMethod > HeuristicMethods;
00067
00069 enum NodeComparison {
00070 bestBound = 0 ,
00071 DFS ,
00072 BFS ,
00073 dynamic ,
00075 bestGuess
00076 };
00077
00079 enum TreeTraversal {
00080 HeapOnly=0 ,
00081 DiveFromBest ,
00082 ProbedDive ,
00083 DfsDiveFromBest ,
00084 DfsDiveDynamic
00085 };
00086
00087
00089 enum VarSelectStra_Enum {
00090 MOST_FRACTIONAL=0,
00091 STRONG_BRANCHING,
00092 RELIABILITY_BRANCHING,
00093 #ifdef BONMIN_CURVATURE_BRANCHING
00094 CURVATURE_ESTIMATOR,
00095 #endif
00096 QP_STRONG_BRANCHING,
00097 LP_STRONG_BRANCHING,
00098 NLP_STRONG_BRANCHING,
00099 OSI_SIMPLE,
00100 OSI_STRONG,
00101 RANDOM
00102 };
00103
00105 enum IntParameter{
00106 BabLogLevel = 0 ,
00107 BabLogInterval,
00108 MaxFailures ,
00109 FailureBehavior ,
00110 MaxInfeasible ,
00112 NumberStrong ,
00113 MinReliability ,
00114 MaxNodes ,
00115 MaxSolutions ,
00116 MaxIterations ,
00117 SpecialOption ,
00118 DisableSos ,
00119 NumCutPasses,
00120 NumCutPassesAtRoot,
00121 RootLogLevel,
00122 NumberIntParam
00123 };
00124
00125
00127 enum DoubleParameter{
00128 CutoffDecr = 0 ,
00129 Cutoff ,
00130 AllowableGap ,
00131 AllowableFractionGap ,
00132 IntTol ,
00133 MaxTime ,
00134 NumberDoubleParam
00135 };
00136
00138 BabSetupBase(const CoinMessageHandler * handler = NULL);
00139
00141 BabSetupBase(Ipopt::SmartPtr<TMINLP> tminlp, const CoinMessageHandler * handler = NULL);
00143 BabSetupBase(Ipopt::SmartPtr<TNLPSolver> app);
00145 BabSetupBase(const OsiTMINLPInterface& nlp);
00147 BabSetupBase(const BabSetupBase &setup,
00148 OsiTMINLPInterface &nlp);
00149
00151 BabSetupBase(const BabSetupBase &setup,
00152 OsiTMINLPInterface &nlp,
00153 const std::string &prefix);
00154
00156 BabSetupBase(const BabSetupBase & other);
00157
00159 virtual BabSetupBase * clone() const = 0;
00160
00162 virtual BabSetupBase *clone(OsiTMINLPInterface&nlp)const;
00164 virtual ~BabSetupBase();
00165
00169 void use(const OsiTMINLPInterface& nlp);
00171 void use(Ipopt::SmartPtr<TMINLP> tminlp );
00173 void use(Ipopt::SmartPtr<TMINLP2TNLP> prob);
00175 void setNonlinearSolver(OsiTMINLPInterface * s)
00176 {
00177 nonlinearSolver_ = s;
00178 }
00184 virtual void registerOptions();
00186 virtual void setBabDefaultOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions)
00187 {}
00189 static void registerAllOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
00190
00192 virtual void readOptionsFile()
00193 {
00194 if (readOptions_) return;
00195 readOptionsFile("bonmin.opt");
00196 }
00197
00199 void readOptionsFile(std::string fileName);
00200
00202 void readOptionsString(std::string opt_string);
00203
00205 void readOptionsStream(std::istream& is);
00206
00208 void mayPrintDoc();
00209
00210
00212 const char * prefix() const {
00213 return prefix_.c_str();
00214 }
00215
00217 void setOptionsAndJournalist(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00218 Ipopt::SmartPtr<Ipopt::OptionsList> options,
00219 Ipopt::SmartPtr<Ipopt::Journalist> journalist)
00220 {
00221 options_ = options;
00222 roptions_ = roptions;
00223 journalist_ = journalist;
00224 }
00225
00227 void initializeOptionsAndJournalist();
00233 OsiTMINLPInterface * nonlinearSolver()
00234 {
00235 return nonlinearSolver_;
00236 }
00238 OsiSolverInterface * continuousSolver()
00239 {
00240 return continuousSolver_;
00241 }
00243 CuttingMethods& cutGenerators()
00244 {
00245 return cutGenerators_;
00246 }
00248 HeuristicMethods& heuristics()
00249 {
00250 return heuristics_;
00251 }
00253 OsiChooseVariable * branchingMethod()
00254 {
00255 return branchingMethod_;
00256 }
00258 NodeComparison& nodeComparisonMethod()
00259 {
00260 return nodeComparisonMethod_;
00261 }
00263 TreeTraversal treeTraversalMethod()
00264 {
00265 return treeTraversalMethod_;
00266 }
00268 int getIntParameter(const IntParameter &p) const
00269 {
00270 return intParam_[p];
00271 }
00273 double getDoubleParameter(const DoubleParameter &p) const
00274 {
00275 return doubleParam_[p];
00276 }
00278 void setIntParameter(const IntParameter &p, const int v)
00279 {
00280 intParam_[p] = v;
00281 }
00283 void setDoubleParameter(const DoubleParameter &p, const double v)
00284 {
00285 doubleParam_[p] = v;
00286 }
00290 void gatherParametersValues()
00291 {
00292 gatherParametersValues(options_);
00293 }
00295 void gatherParametersValues(Ipopt::SmartPtr<Ipopt::OptionsList> options);
00297 Ipopt::SmartPtr<Ipopt::Journalist> journalist()
00298 {
00299 return journalist_;
00300 }
00301
00303 Ipopt::SmartPtr<Ipopt::OptionsList> options()
00304 {
00305 return options_;
00306 }
00307
00309 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions()
00310 {
00311 return roptions_;
00312 }
00313
00315 const vector<OsiObject *>& objects() const
00316 {
00317 return objects_;
00318 }
00319
00321 vector<OsiObject *>& objects()
00322 {
00323 return objects_;
00324 }
00325
00326 void addCutGenerator(CuttingMethod & cg){
00327 cutGenerators_.push_back(cg);
00328 }
00329
00330 void set_linearizer(TMINLP2OsiLP * linearizer){
00331 linearizer_ = linearizer;
00332 }
00333
00334 protected:
00336 void setPriorities();
00338 void addSos();
00339
00341 int intParam_[NumberIntParam];
00343 static int defaultIntParam_[NumberIntParam];
00345 double doubleParam_[NumberDoubleParam];
00347 static double defaultDoubleParam_[NumberDoubleParam];
00349 OsiTMINLPInterface * nonlinearSolver_;
00351 OsiSolverInterface * continuousSolver_;
00353 Ipopt::SmartPtr<TMINLP2OsiLP> linearizer_;
00355 CuttingMethods cutGenerators_;
00357 HeuristicMethods heuristics_;
00359 OsiChooseVariable * branchingMethod_;
00361 NodeComparison nodeComparisonMethod_;
00363 TreeTraversal treeTraversalMethod_;
00365 vector<OsiObject *> objects_;
00366
00367
00369 Ipopt::SmartPtr<Ipopt::Journalist> journalist_;
00370
00372 Ipopt::SmartPtr<Ipopt::OptionsList> options_;
00373
00375 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions_;
00376
00378 bool readOptions_;
00380 CoinMessageHandler * messageHandler_;
00382 std::string prefix_;
00383 };
00384 }
00385 #endif
00386