11 #include "OsiClpSolverInterface.hpp"
14 #ifdef BONMIN_CURVATURE_BRANCHING
32 #ifdef COIN_HAS_FILTERSQP
37 #include "CglGomory.hpp"
38 #include "CglProbing.hpp"
39 #include "CglKnapsackCover.hpp"
40 #include "CglOddHole.hpp"
41 #include "CglClique.hpp"
42 #include "CglFlowCover.hpp"
43 #include "CglMixedIntegerRounding2.hpp"
44 #include "CglTwomir.hpp"
45 #include "CglPreProcess.hpp"
46 #include "CglLandP.hpp"
47 #include "CglRedSplit.hpp"
87 OsiBabSolver * extraStuff =
new OsiBabSolver(3);
94 const std::string &
prefix):
138 roptions->AddStringOption6(
"algorithm",
139 "Choice of the algorithm.",
141 "B-BB",
"simple branch-and-bound algorithm,",
142 "B-OA",
"OA Decomposition algorithm,",
143 "B-QG",
"Quesada and Grossmann branch-and-cut algorithm,",
144 "B-Hyb",
"hybrid outer approximation based branch-and-cut,",
145 "B-Ecp",
"ECP cuts based branch-and-cut a la FilMINT.",
146 "B-iFP",
"Iterated Feasibility Pump for MINLP.",
147 "This will preset some of the options of bonmin depending on the algorithm choice."
149 roptions->setOptionExtraInfo(
"algorithm",127);
194 roptions->AddLowerBoundedIntegerOption(
"Gomory_cuts",
195 "Frequency (in terms of nodes) for generating Gomory cuts in branch-and-cut.",
197 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
198 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
199 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
200 roptions->setOptionExtraInfo(
"Gomory_cuts",119);
202 roptions->AddBoundedIntegerOption(
"probing_cuts",
203 "Frequency (in terms of nodes) for generating probing cuts in branch-and-cut",
205 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
206 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
207 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
208 roptions->setOptionExtraInfo(
"probing_cuts",0);
210 roptions->AddLowerBoundedIntegerOption(
"cover_cuts",
211 "Frequency (in terms of nodes) for generating cover cuts in branch-and-cut",
213 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
214 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
215 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
216 roptions->setOptionExtraInfo(
"cover_cuts",119);
218 roptions->AddLowerBoundedIntegerOption(
"mir_cuts",
219 "Frequency (in terms of nodes) for generating MIR cuts in branch-and-cut",
221 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
222 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
223 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
224 roptions->setOptionExtraInfo(
"mir_cuts",119);
225 roptions->AddLowerBoundedIntegerOption(
"2mir_cuts",
226 "Frequency (in terms of nodes) for generating 2-MIR cuts in branch-and-cut",
228 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
229 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
230 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
231 roptions->setOptionExtraInfo(
"2mir_cuts",119);
233 roptions->AddLowerBoundedIntegerOption(
"flow_cover_cuts",
234 "Frequency (in terms of nodes) for generating flow cover cuts in branch-and-cut",
236 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
237 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
238 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
239 roptions->setOptionExtraInfo(
"flow_cover_cuts",119);
240 roptions->AddLowerBoundedIntegerOption(
"lift_and_project_cuts",
241 "Frequency (in terms of nodes) for generating lift-and-project cuts in branch-and-cut",
243 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
244 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
245 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
246 roptions->setOptionExtraInfo(
"lift_and_project_cuts", 119);
247 roptions->AddLowerBoundedIntegerOption(
"reduce_and_split_cuts",
248 "Frequency (in terms of nodes) for generating reduce-and-split cuts in branch-and-cut",
250 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
251 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
252 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
253 roptions->setOptionExtraInfo(
"reduce_and_split_cuts", 119);
256 roptions->AddLowerBoundedIntegerOption(
"clique_cuts",
257 "Frequency (in terms of nodes) for generating clique cuts in branch-and-cut",
259 "If $k > 0$, cuts are generated every $k$ nodes, if $-99 < k < 0$ cuts are generated every $-k$ nodes but "
260 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
261 "if $k=-99$ generate cuts only at the root node, if $k=0$ or $100$ do not generate cuts.");
262 roptions->setOptionExtraInfo(
"clique_cuts", 119);
279 CglGomory * gom =
new CglGomory;
281 gom->setLimitAtRoot(5000);
283 gom->setLargestFactorMultiplier(1
e-08);
284 cg.
id =
"Mixed Integer Gomory";
293 CglProbing * probe =
new CglProbing;
295 probe->setUsingObjective(1);
296 probe->setMaxPass(3);
297 probe->setMaxPassRoot(3);
299 probe->setMaxProbe(10);
300 probe->setMaxProbeRoot(50);
302 probe->setMaxLook(10);
303 probe->setMaxLookRoot(50);
304 probe->setMaxLookRoot(10);
306 probe->setMaxElements(200);
307 probe->setRowCuts(3);
318 CglMixedIntegerRounding2 * mir =
new CglMixedIntegerRounding2;
321 cg.
id =
"Mixed Integer Rounding";
330 CglTwomir * mir2 =
new CglTwomir;
341 CglKnapsackCover * cover =
new CglKnapsackCover;
352 CglClique * clique =
new CglClique;
353 clique->setStarCliqueReport(
false);
354 clique->setRowCliqueReport(
false);
355 clique->setMinViolation(0.1);
367 CglFlowCover * flow =
new CglFlowCover;
369 cg.
id =
"Flow Covers";
373 options_->GetIntegerValue(
"lift_and_project_cuts",freq,
prefix_.c_str());
378 CglLandP * landp =
new CglLandP;
380 cg.
id =
"Lift-and-Project";
384 options_->GetIntegerValue(
"reduce_and_split_cuts",freq,
prefix_.c_str());
389 CglRedSplit * rands =
new CglRedSplit;
391 cg.
id =
"Reduce-and-Split";
402 OsiBabSolver extraStuff(2);
408 std::string o_name =
prefix_ +
"number_before_trust";
413 std::string o_name =
prefix_ +
"number_strong_branch";
417 bool val =
options_->GetEnumValue(
"variable_selection",varSelection,
prefix_.c_str());
419 std::string o_name =
prefix_ +
"variable_selection";
420 options_->SetStringValue(o_name.c_str(),
"nlp-strong-branching",
true,
true);
424 switch (varSelection) {
425 #ifdef BONMIN_CURVATURE_BRANCHING
426 case CURVATURE_ESTIMATOR:
437 switch (varSelection) {
438 #ifdef BONMIN_CURVATURE_BRANCHING
439 case CURVATURE_ESTIMATOR:
441 chooseVariable->setTrustStrongForSolution(
false);
442 chooseVariable->setTrustStrongForBound(
false);
448 chooseVariable->setTrustStrongForSolution(
false);
452 chooseVariable->setTrustStrongForBound(
false);
457 chooseVariable->setTrustStrongForSolution(
false);
463 chooseVariable->setTrustStrongForSolution(
false);
464 chooseVariable->setTrustStrongForBound(
true);
499 Ipopt::Index doHeuristicDiveFractional =
false;
500 options()->GetEnumValue(
"heuristic_dive_fractional",doHeuristicDiveFractional,
prefix_.c_str());
501 if(doHeuristicDiveFractional){
505 h.
id =
"DiveFractional";
509 Ipopt::Index doHeuristicDiveVectorLength =
false;
510 options()->GetEnumValue(
"heuristic_dive_vectorLength",doHeuristicDiveVectorLength,
prefix_.c_str());
511 if(doHeuristicDiveVectorLength){
515 h.
id =
"DiveVectorLength";
519 Ipopt::Index doHeuristicDiveMIPFractional =
false;
520 if(!
options()->GetEnumValue(
"heuristic_dive_MIP_fractional",doHeuristicDiveMIPFractional,
prefix_.c_str())){
521 doHeuristicDiveMIPFractional =
true;
522 std::string o_name =
prefix_ +
"heuristic_dive_MIP_fractional";
523 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
525 if(doHeuristicDiveMIPFractional){
529 h.
id =
"DiveMIPFractional";
533 Ipopt::Index doHeuristicDiveMIPVectorLength =
false;
534 options()->GetEnumValue(
"heuristic_dive_MIP_vectorLength",doHeuristicDiveMIPVectorLength,
prefix_.c_str());
535 if(doHeuristicDiveMIPVectorLength){
539 h.
id =
"DiveMIPVectorLength";
542 Ipopt::Index doHeuristicFPump =
false;
544 doHeuristicFPump =
true;
545 std::string o_name =
prefix_ +
"heuristic_feasibility_pump";
546 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
548 if(doHeuristicFPump){
556 Ipopt::Index doFixAndSolve =
false;
557 options()->GetEnumValue(
"fix_and_solve_heuristic",doFixAndSolve,
prefix_.c_str());
562 h.
id =
"Fix and Solve";
566 Ipopt::Index doDummyPump =
false;
567 options()->GetEnumValue(
"dummy_pump_heuristic",doDummyPump,
prefix_.c_str());
576 Ipopt::Index doHeuristicRINS =
false;
577 options()->GetEnumValue(
"heuristic_RINS",doHeuristicRINS,
prefix_.c_str());
586 Ipopt::Index doHeuristicLocalBranching =
false;
587 options()->GetEnumValue(
"heuristic_local_branching",doHeuristicLocalBranching,
prefix_.c_str());
588 if(doHeuristicLocalBranching){
592 h.
id =
"LocalBranching";
596 Ipopt::Index doHeuristicPumpForMinlp =
false;
597 options()->GetEnumValue(
"pump_for_minlp",doHeuristicPumpForMinlp,
prefix_.c_str());
598 if(doHeuristicPumpForMinlp){
602 h.
id =
"Pump for MINLP";
606 Ipopt::Index doHeuristicMilpRounding =
false;
607 options()->GetEnumValue(
"MILP_rounding_heuristic",doHeuristicMilpRounding,
prefix_.c_str());
608 if(doHeuristicMilpRounding){
612 h.
id =
"MILP Rounding";
621 double setup_time = -CoinCpuTime();
622 if (createContinuousSolver) {
639 OsiBabSolver * extraStuff =
new OsiBabSolver(3);
646 std::string o_name =
prefix_ +
"oa_decomposition";
647 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
648 o_name =
prefix_ +
"pump_for_minlp";
649 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
650 o_name = prefix +
"pump_for_minlp.time_limit";
651 options_->SetNumericValue(o_name.c_str(),10,
true,
true);
652 o_name = prefix +
"pump_for_minlp.solution_limit";
653 options_->SetIntegerValue(o_name.c_str(),3,
true,
true);
655 else if (algo ==
B_OA) {
656 std::string o_name =
prefix_ +
"oa_decomposition";
657 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
658 o_name = prefix +
"oa_decomposition.time_limit";
659 options_->SetNumericValue(o_name.c_str(),DBL_MAX,
true,
true);
660 o_name =
prefix_ +
"pump_for_minlp";
661 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
662 o_name = prefix +
"nlp_solve_frequency";
663 options_->SetIntegerValue(o_name.c_str(), 0,
true,
true);
664 o_name = prefix +
"bb_log_level";
665 options_->SetIntegerValue(o_name.c_str(), 0,
true,
true);
667 else if (algo ==
B_IFP) {
668 std::string o_name =
prefix_ +
"oa_decomposition";
669 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
670 o_name =
prefix_ +
"pump_for_minlp";
671 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
672 o_name = prefix +
"pump_for_minlp.time_limit";
673 options_->SetNumericValue(o_name.c_str(),DBL_MAX,
true,
true);
674 o_name =
prefix_ +
"nlp_solve_frequency";
675 options_->SetIntegerValue(o_name.c_str(), 0,
true,
true);
676 o_name =
prefix_ +
"fp_pass_infeasible";
677 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
682 else if (algo==
B_QG) {
683 std::string o_name =
prefix_ +
"oa_decomposition";
684 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
685 o_name =
prefix_ +
"pump_for_minlp";
686 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
687 o_name =
prefix_ +
"nlp_solve_frequency";
688 options_->SetIntegerValue(o_name.c_str(), 0,
true,
true);
690 else if (algo==
B_Ecp) {
691 std::string o_name =
prefix_ +
"oa_decomposition";
692 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
693 o_name =
prefix_ +
"pump_for_minlp";
694 options_->SetStringValue(o_name.c_str(),
"no",
true,
true);
695 o_name =
prefix_ +
"nlp_solve_frequency";
696 options_->SetIntegerValue(o_name.c_str(), 0,
true,
true);
697 o_name =
prefix_ +
"filmint_ecp_cuts";
698 options_->SetIntegerValue(o_name.c_str(), 1,
true,
true);
701 #ifdef GREAT_STUFF_FOR_ANDREAS
702 printf(
"ToDo: Clean me up in Bab::branchAndBound\n");
710 options_->GetEnumValue(
"variable_selection",varSelection,
prefix_.c_str());
712 switch (varSelection){
728 chooser->setTrustStrongForSolution(
false);
733 std::cout<<
"Variable selection stragey not available with oa branch-and-cut."<<std::endl;
746 cg.
id=
"NLP solution based oa cuts";
772 cg.
id =
"Feasibility Pump for MINLP.";
784 cg.
id =
"Outer Approximation decomposition.";
796 cg.
id =
"Outer Approximation feasibility check.";
810 cg.
id =
"Outer Approximation strong branching solution check.";
820 h.
id =
"nonlinear programm";
823 Ipopt::Index doHeuristicRINS =
false;
824 options()->GetEnumValue(
"heuristic_RINS",doHeuristicRINS,
prefix_.c_str());
833 Ipopt::Index doHeuristicLocalBranching =
false;
834 options()->GetEnumValue(
"heuristic_local_branching",doHeuristicLocalBranching,
prefix_.c_str());
835 if(doHeuristicLocalBranching){
839 h.
id =
"LocalBranching";
843 Ipopt::Index doHeuristicFPump =
false;
844 options()->GetEnumValue(
"heuristic_feasibility_pump",doHeuristicFPump,
prefix_.c_str());
845 if(doHeuristicFPump){
853 Ipopt::Index doHeuristicDiveFractional =
false;
854 options()->GetEnumValue(
"heuristic_dive_fractional",doHeuristicDiveFractional,
prefix_.c_str());
855 if(doHeuristicDiveFractional){
859 h.
id =
"DiveFractional";
863 Ipopt::Index doHeuristicDiveVectorLength =
false;
864 options()->GetEnumValue(
"heuristic_dive_vectorLength",doHeuristicDiveVectorLength,
prefix_.c_str());
865 if(doHeuristicDiveVectorLength){
869 h.
id =
"DiveVectorLength";
873 Ipopt::Index doHeuristicDiveMIPFractional =
false;
874 options()->GetEnumValue(
"heuristic_dive_MIP_fractional",doHeuristicDiveMIPFractional,
prefix_.c_str());
875 if(doHeuristicDiveMIPFractional){
879 h.
id =
"DiveMIPFractional";
883 Ipopt::Index doHeuristicDiveMIPVectorLength =
false;
884 options()->GetEnumValue(
"heuristic_dive_MIP_vectorLength",doHeuristicDiveMIPVectorLength,
prefix_.c_str());
885 if(doHeuristicDiveMIPVectorLength){
889 h.
id =
"DiveMIPVectorLength";
895 InnerApproximation * inner =
new InnerApproximation(
this);
898 h.
id =
"InnerApproximation";
902 setup_time += CoinCpuTime();
void setOnlyPseudoWhenTrusted(bool only_pseudo_when_trusted)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register OaNlpOptim options.
int intParam_[NumberIntParam]
storage of integer parameters.
void getOuterApproximation(OsiCuts &cs, int getObj, const double *x2, bool global)
Get the outer approximation constraints at the current optimal point.
Type for heuristic method with its string identification.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register all the options for class instance.
CuttingMethods cutGenerators_
Cut generation methods.
This class chooses a variable to branch on.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register OA options.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
void passInMessageHandler(CoinMessageHandler *handler)
void use(const OsiTMINLPInterface &nlp)
use existing TMINLP interface (containing the options).
This class chooses a variable to branch on.
This is class provides an Osi interface for a Mixed Integer Linear Program expressed as a TMINLP (so ...
Spetial option in particular for Cbc.
HeuristicMethods heuristics_
Heuristic methods.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register ecp cuts options.
bool IsValid(const OSSmartPtr< U > &smart_ptr)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
Algorithm
Type of algorithms which can be used.
Number of candidates for strong branching.
void passInMessageHandler(CoinMessageHandler *handler)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register OA options.
void setPriorities()
Set the priorities into OsiTMINLPInterface when needed.
void setReassignLpSolver(bool v)
BonminSetup(const CoinMessageHandler *handler=NULL)
Default constructor.
OsiTMINLPInterface * nonlinearSolver_
Storage of the non-linear solver used.
Minimum reliability before trust pseudo-costs.
void ignoreFailures()
tell to ignore the failures (don't throw, don't fathom, don't report)
Class to perform OA in its classical form.
Type for cut generation method with its frequency and string identification.
Class to perform OA in its classical form.
OsiChooseVariable * branchingMethod_
Branching method.
void fint fint fint real fint real real real real real real real real real * e
A class to have all elements necessary to setup a branch-and-bound.
Bonmin::Algorithm getAlgorithm()
Get the algorithm used.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
static void registerAllOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register all bonmin type executable options.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
void initializeBHyb(bool createContinuousSolver=false)
Initialize a branch-and-cut with some OA.
Implementation of BonChooseVariable for curvature-based braching.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register OA options.
void initializeBBB()
Initialize a plain branch-and-bound.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options for this heuristic.
void addSos()
Add SOS constraints to OsiTMINLPInterface when needed.
Ipopt::SmartPtr< TMINLP2OsiLP > linearizer_
Method to linearize MINLPs.
void forceSolverOutput(int log_level)
Ipopt::SmartPtr< Ipopt::OptionsList > options_
List of Options.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
Log level for root relaxation.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
void setNlp(OsiTMINLPInterface *si)
Set nlp_.
bool hasGeneralInteger()
Say if problem has general integer variables.
static void registerAllOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register all the options for this algorithm instance.
double doubleParam_[NumberDoubleParam]
storage of double parameters.
std::string prefix_
Prefix to use when reading options.
Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions_
Registered Options.
const TMINLP * model() const
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
static void registerMilpCutGenerators(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register standard MILP cut generators.
void gatherParametersValues()
Get the values of base parameters from the options stored.
Ipopt::SmartPtr< Ipopt::OptionsList > options()
Acces list of Options.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
CoinMessageHandler * messageHandler_
separate message handler.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register options for that Oa based cut generation method.
void passInMessageHandler(const CoinMessageHandler *handler)
Generate cuts for the nlp corresponding to continuous relaxation at a node.
virtual void registerOptions()
Register all the options for this algorithm instance.
virtual void extractLinearRelaxation(OsiSolverInterface &si, const double *x, bool getObj=1)
Extract a linear relaxation of the MINLP.
OsiSolverInterface * continuousSolver_
Storage of continuous solver.
void setSolverOutputToDefault()
const char * prefix() const
Get prefix to use for options.
Implementation of BonChooseVariable for curvature-based braching.
void addMilpCutGenerators()
Add milp cut generators according to options.
void initialize(Ipopt::SmartPtr< TMINLP > tminlp, bool createContinuousSolver=true)
Initialize, read options and create appropriate bonmin setup.