00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "BonminConfig.h"
00012 #include "OsiClpSolverInterface.hpp"
00013
00014 #include "SepaSetup.hpp"
00015 #include "SepaTMINLP2OsiLP.hpp"
00016 #include "SepaHeuristicInnerApproximation.hpp"
00017 #include "BonOuterDescription.hpp"
00018
00019 namespace Sepa
00020 {
00021 SepaSetup::SepaSetup(const CoinMessageHandler * handler):BonminSetup(handler)
00022 {
00023 }
00024
00025 SepaSetup::SepaSetup(const SepaSetup &other):BonminSetup(other)
00026 {}
00027
00028 SepaSetup::SepaSetup(const SepaSetup &other,
00029 Bonmin::OsiTMINLPInterface &nlp):
00030 BonminSetup(other, nlp)
00031 {
00032 }
00033
00034 SepaSetup::SepaSetup(const SepaSetup &other,
00035 Bonmin::OsiTMINLPInterface &nlp,
00036 const std::string &prefix):
00037 BonminSetup(other, nlp, prefix)
00038 {
00039 Bonmin::Algorithm algo = getAlgorithm();
00040 if (algo == Bonmin::B_OA)
00041 initializeSepa();
00042 }
00043
00044 void SepaSetup::registerAllOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions)
00045 {
00046 Bonmin::BonminSetup::registerAllOptions(roptions);
00047
00048 Sepa::HeuristicInnerApproximation::registerOptions(roptions);
00049
00050 roptions->SetRegisteringCategory("Initial Approximations descriptions", Bonmin::RegisteredOptions::UndocumentedCategory);
00051 roptions->AddStringOption2("initial_outer_description",
00052 "Do we add all Outer Approximation constraints defining the initial Outer Approximation "
00053 "description of the MINLP. See the number_approximations_initial_outer option for fixing the "
00054 "number of approximation points",
00055 "yes", "no","Do not generate the description", "yes","Generate the description",
00056 "");
00057
00058 roptions->AddUpperBoundedIntegerOption("number_approximations_initial_outer",
00059 "Number of Outer Approximation points needed for generating the initial Outer Approximation description, maximum value = 500, default value = 50",
00060 500, 50, "");
00061 }
00062
00064 void
00065 SepaSetup::registerOptions()
00066 {
00067 registerAllOptions(roptions_);
00068 }
00069
00071 void
00072 SepaSetup::initialize(Ipopt::SmartPtr<Bonmin::TMINLP> tminlp, bool createContinuousSolver )
00073 {
00074
00075 int do_outer;
00076 int n_approx;
00077 options()->GetEnumValue("initial_outer_description", do_outer, prefix_.c_str());
00078 options()->GetIntegerValue("number_approximations_initial_outer",
00079 n_approx, prefix_.c_str());
00080 SepaTMINLP2OsiLP* linearizer = new SepaTMINLP2OsiLP;
00081 linearizer_ = linearizer;
00082 if(do_outer)
00083 linearizer->set_num_approx(n_approx);
00084
00085 Bonmin::BonminSetup::initialize(tminlp, createContinuousSolver);
00086
00087 if (getAlgorithm() == Bonmin::B_OA)
00088 initializeSepa();
00089 }
00090
00092 void
00093 SepaSetup::initialize(const Bonmin::OsiTMINLPInterface &nlpSi, bool createContinuousSolver )
00094 {
00095 int do_outer;
00096 int n_approx;
00097 options()->GetEnumValue("initial_outer_description", do_outer, prefix_.c_str());
00098 options()->GetIntegerValue("number_approximations_initial_outer",
00099 n_approx, prefix_.c_str());
00100 SepaTMINLP2OsiLP* linearizer = new SepaTMINLP2OsiLP;
00101 linearizer_ = linearizer;
00102 if(do_outer)
00103 linearizer->set_num_approx(n_approx);
00104
00105 BonminSetup::initialize(nlpSi, createContinuousSolver);
00106 if (getAlgorithm() == Bonmin::B_OA)
00107 initializeSepa();
00108 }
00109
00110 void SepaSetup::initializeSepa()
00111 {
00112
00113
00114 int doOuter;
00115 int nbAp = 10;
00116 options()->GetEnumValue("initial_outer_description", doOuter, prefix_.c_str());
00117 options()->GetIntegerValue("number_approximations_initial_outer",
00118 nbAp, prefix_.c_str());
00119
00120 #ifdef USE_OLD_FUNC
00121 if(doOuter)
00122 addOuterDescription(*nonlinearSolver(), *continuousSolver(), nonlinearSolver()->getColSolution(), nbAp, false);
00123 #endif
00124
00125 int doInner;
00126
00127 options()->GetEnumValue("heuristic_inner_approximation", doInner, prefix_.c_str());
00128 if(doInner){
00129 Sepa::HeuristicInnerApproximation * inner = new Sepa::HeuristicInnerApproximation(this);
00130 HeuristicMethod h;
00131 h.heuristic = inner;
00132 h.id = "InnerApproximation";
00133 heuristics_.push_back(h);
00134 }
00135
00136 }
00137
00138 }
00139