17 #include "OsiClpSolverInterface.hpp"
20 #include "OsiCpxSolverInterface.hpp"
23 #include "OsiGrbSolverInterface.hpp"
26 #include "OsiSpxSolverInterface.hpp"
29 #include "OsiXprSolverInterface.hpp"
33 #include "CglGomory.hpp"
34 #include "CglProbing.hpp"
35 #include "CglKnapsackCover.hpp"
36 #include "CglOddHole.hpp"
37 #include "CglClique.hpp"
38 #include "CglFlowCover.hpp"
39 #include "CglMixedIntegerRounding2.hpp"
40 #include "CglTwomir.hpp"
41 #include "CglPreProcess.hpp"
42 #include "CglLandP.hpp"
43 #include "CglRedSplit.hpp"
65 #include "CbcCompareActual.hpp"
93 using namespace Ipopt;
94 using namespace Couenne;
96 CouenneSetup::~CouenneSetup(){
97 if (couenneProb_ && couenneProb_is_own_)
105 bool CouenneSetup::InitializeCouenne (
char ** argv,
118 couenneProb_ = couenneProb;
119 couenneProb_is_own_ =
false;
126 options () -> SetStringValue (
"sb",
"yes",
false,
true);
136 options_ -> SetStringValue (
"nlp_failure_behavior",
"fathom",
"couenne.");
138 gatherParametersValues (options_);
144 if (!couenneProb_ && argv) {
147 ci -> readAmplNlFile (argv, roptions (), options (), journalist ());
152 "Couenne was compiled without AMPL Solver Library. Cannot initialize from AMPL NL File."
157 assert (couenneProb_ != NULL);
159 ci -> initialize (roptions_, options_, journalist_,
164 nonlinearSolver_ = ci;
174 #define addJournalist(optname,jlevel) { \
175 options () -> GetIntegerValue ((optname), i, "couenne."); \
176 journalist () -> GetJournal ("console") -> SetPrintLevel ((jlevel), (EJournalLevel) i); \
188 options_ -> SetIntegerValue (
"print_level", 0);
196 couenneProb_ =
new CouenneProblem (aslfg_ -> asl,
this, journalist ());
201 options_ -> GetStringValue (
"lp_solver", s,
"couenne.");
206 continuousSolver_ = CSI;
207 CSI -> setCutGenPtr (couenneCg);
209 }
else if (s ==
"cplex") {
213 continuousSolver_ = CSI;
214 CSI -> setCutGenPtr (couenneCg);
216 journalist()->Printf(J_ERROR, J_INITIALIZATION,
"Couenne was compiled without CPLEX interface. Please reconfigure, recompile, and try again.\n");
219 }
else if (s ==
"xpress-mp") {
223 continuousSolver_ = CSI;
224 CSI -> setCutGenPtr (couenneCg);
226 journalist()->Printf(J_ERROR, J_INITIALIZATION,
"Couenne was compiled without Xpress-MP interface. Please reconfigure, recompile, and try again.\n");
229 }
else if (s ==
"gurobi") {
233 continuousSolver_ = CSI;
234 CSI -> setCutGenPtr (couenneCg);
236 journalist()->Printf(J_ERROR, J_INITIALIZATION,
"Couenne was compiled without GUROBI interface. Please reconfigure, recompile, and try again.\n");
239 }
else if (s ==
"soplex") {
243 continuousSolver_ = CSI;
244 CSI -> setCutGenPtr (couenneCg);
246 journalist()->Printf(J_ERROR, J_INITIALIZATION,
"Couenne was compiled without Soplex. Please reconfigure, recompile, and try again.\n");
250 journalist ()-> Printf (J_ERROR, J_INITIALIZATION,
"The LP solver you specified hasn't been added to Couenne yet.\n");
254 continuousSolver_ -> passInMessageHandler(ci -> messageHandler());
256 couenneProb_ -> setBase (
this);
258 assert (couenneProb_);
260 couenneProb_ -> reformulate (couenneCg);
265 extraStuff -> setExtraCharacteristics (extraStuff -> extraCharacteristics () | 2);
267 continuousSolver_ -> setAuxiliaryInfo (extraStuff);
270 extraStuff = dynamic_cast <
Bonmin::BabInfo *> (continuousSolver_ -> getAuxiliaryInfo ());
274 options () -> GetIntegerValue (
"lp_log_level", lpLogLevel,
"couenne.");
275 continuousSolver_ -> messageHandler () -> setLogLevel (lpLogLevel);
281 nVars = couenneProb_ -> nVars ();
283 OsiObject ** objects = NULL;
285 options () -> GetStringValue (
"enable_sos", s,
"couenne.");
290 objects =
new OsiObject* [couenneProb_ -> nCons () + nVars];
292 nSOS = couenneProb_ -> findSOS (&(bb -> model()), dynamic_cast <OsiSolverInterface *> (nonlinearSolver ()), objects);
294 nonlinearSolver () -> addObjects (nSOS, objects);
319 options () -> GetStringValue (
"display_stats", s,
"couenne.");
320 displayStats_ = (s ==
"yes");
322 options () -> GetStringValue (
"branching_object", s,
"couenne.");
326 if (s ==
"vt_obj") objType = CouenneObject::VT_OBJ;
327 else if (s ==
"var_obj") objType = CouenneObject::VAR_OBJ;
328 else if (s ==
"expr_obj") objType = CouenneObject::EXPR_OBJ;
330 printf (
"CouenneSetup: Unknown branching object type\n");
338 objects =
new OsiObject* [nVars];
344 options () -> GetIntegerValue (
"cont_var_priority", contObjPriority,
"couenne.");
345 options () -> GetIntegerValue (
"int_var_priority", intObjPriority,
"couenne.");
348 if (!options_ -> GetEnumValue (
"variable_selection", varSelection,
"couenne.")) {
355 (CouenneObject::VT_OBJ == objType)){
357 printf (
"Warning: Violation Transfer and strong branching are mutually exclusive.\nResetting to Violation Transfer only.");
362 for (
int i = 0; i < nVars; i++) {
364 exprVar *var = couenneProb_ -> Var (i);
367 if (var -> Multiplicity () <= 0)
372 case CouenneObject::EXPR_OBJ:
376 ((var -> Type () ==
AUX) &&
377 (var -> Image () -> Linearity () >
LINEAR))) {
388 objects [nobj] =
new CouenneObject (couenneCg, couenneProb_, var,
this, journalist ());
390 objects [nobj++] -> setPriority (var ->
isInteger () ? intObjPriority : contObjPriority);
396 case CouenneObject::VAR_OBJ:
401 (couenneProb_ -> Dependence () [var -> Index ()] . size () > 0)) {
405 int ind = var -> Index ();
407 objects [nobj] =
new CouenneVarObject (couenneCg, couenneProb_, var,
this, journalist (), varSelection);
408 objects [nobj++] -> setPriority (var ->
isInteger () ? intObjPriority : contObjPriority);
415 case CouenneObject::VT_OBJ:
420 (couenneProb_ -> Dependence () [var -> Index ()] . size () > 0)) {
424 objects [nobj] =
new CouenneVTObject (couenneCg, couenneProb_, var,
this, journalist (), varSelection);
425 objects [nobj++] -> setPriority (var ->
isInteger () ? intObjPriority : contObjPriority);
444 if (couenneProb_ -> orbitalBranching ()) {
446 couenneProb_ -> ChangeBounds (couenneProb_ -> Lb (), couenneProb_ -> Ub (), couenneProb_ -> nVars ());
447 couenneProb_ -> Compute_Symmetry ();
455 continuousSolver_ -> addObjects (nobj, objects);
459 for (
int i = 0 ; i < nobj ; i++)
466 options () -> GetIntegerValue (
"fixpoint_bt", freq,
"couenne.");
473 cg.
id =
"Couenne fixed point FBBT";
474 cutGenerators (). push_back (cg);
479 options () -> GetIntegerValue (
"convexification_cuts", freq,
"couenne.");
486 cg.
id =
"Couenne convexifier cuts";
487 cutGenerators().push_back (cg);
498 if (couenneCg -> Problem () -> nIntVars () > 0)
499 addMilpCutGenerators ();
501 CouennePtr_ = couenneCg;
505 options () -> GetIntegerValue (
"two_implied_bt", freq,
"couenne.");
516 cg.
id =
"Couenne two-implied cuts";
517 cutGenerators (). push_back(cg);
524 std::string doHeuristic;
525 options () -> GetStringValue (
"local_optimization_heuristic", doHeuristic,
"couenne.");
531 couenneCg -> Problem () -> setMaxCpuTime (getDoubleParameter (BabSetupBase::MaxTime));
533 ci -> extractLinearRelaxation (*continuousSolver_, *couenneCg,
true, doHeuristic ==
"yes");
537 if (!(extraStuff -> infeasibleNode ()) &&
538 ci -> isProvenOptimal () &&
539 ci -> haveNlpSolution ()) {
543 (ci -> getObjValue (), ci -> getColSolution (), *couenneProb_);
545 h.
id =
"Couenne Rounding NLP";
547 heuristics_.push_back(h);
550 if (extraStuff -> infeasibleNode ()){
551 journalist() -> Printf (J_SUMMARY,
J_PROBLEM,
"Linear relaxation infeasible, the problem is infeasible.\n");
560 if (doHeuristic ==
"yes") {
563 options()->GetIntegerValue(
"log_num_local_optimization_per_level",numSolve,
"couenne.");
565 nlpHeuristic->
setNlp(*ci,
false);
570 h.
id =
"Couenne Rounding NLP";
572 heuristics_.push_back(h);
575 options () -> GetStringValue (
"iterative_rounding_heuristic", doHeuristic,
"couenne.");
577 if (doHeuristic ==
"yes") {
580 h.
id =
"Couenne Iterative Rounding";
582 heuristics_.push_back(h);
585 options () -> GetStringValue (
"feas_pump_heuristic", doHeuristic,
"couenne.");
587 if (doHeuristic !=
"no") {
593 options () -> GetIntegerValue (
"feas_pump_level", numSolve,
"couenne.");
595 nlpHeuristic -> setNumberSolvePerLevel (numSolve);
597 nlpHeuristic -> nCalls () =
598 (
"yes" == doHeuristic) ? -1 :
599 (
"once" == doHeuristic) ? 1 : -2;
603 h.
id =
"Couenne Feasibility Pump";
605 heuristics_. push_back (h);
610 Ipopt::Index doHeuristicDiveFractional =
false;
611 options()->GetEnumValue(
"heuristic_dive_fractional",doHeuristicDiveFractional,prefix_.c_str());
612 if(doHeuristicDiveFractional){
616 h.
id =
"DiveFractional";
617 heuristics_.push_back(h);
620 Ipopt::Index doHeuristicDiveVectorLength =
false;
621 options()->GetEnumValue(
"heuristic_dive_vectorLength",doHeuristicDiveVectorLength,prefix_.c_str());
622 if(doHeuristicDiveVectorLength){
626 h.
id =
"DiveVectorLength";
627 heuristics_.push_back(h);
630 Ipopt::Index doHeuristicDiveMIPFractional =
false;
631 if(!options()->GetEnumValue(
"heuristic_dive_MIP_fractional",doHeuristicDiveMIPFractional,prefix_.c_str())){
632 doHeuristicDiveMIPFractional =
true;
633 std::string o_name = prefix_ +
"heuristic_dive_MIP_fractional";
634 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
636 if(doHeuristicDiveMIPFractional){
640 h.
id =
"DiveMIPFractional";
641 heuristics_.push_back(h);
644 Ipopt::Index doHeuristicDiveMIPVectorLength =
false;
645 options()->GetEnumValue(
"heuristic_dive_MIP_vectorLength",doHeuristicDiveMIPVectorLength,prefix_.c_str());
646 if(doHeuristicDiveMIPVectorLength){
650 h.
id =
"DiveMIPVectorLength";
651 heuristics_.push_back(h);
653 Ipopt::Index doHeuristicFPump =
false;
654 if(!nonlinearSolver_->model()->hasGeneralInteger() && !options()->GetEnumValue(
"heuristic_feasibility_pump",doHeuristicFPump,prefix_.c_str())){
655 doHeuristicFPump =
true;
656 std::string o_name = prefix_ +
"heuristic_feasibility_pump";
657 options_->SetStringValue(o_name.c_str(),
"yes",
true,
true);
659 if(doHeuristicFPump){
664 heuristics_.push_back(h);
667 Ipopt::Index doFixAndSolve =
false;
668 options()->GetEnumValue(
"fix_and_solve_heuristic",doFixAndSolve,prefix_.c_str());
673 h.
id =
"Fix and Solve";
674 heuristics_.push_back(h);
677 Ipopt::Index doDummyPump =
false;
678 options()->GetEnumValue(
"dummy_pump_heuristic",doDummyPump,prefix_.c_str());
684 heuristics_.push_back(h);
687 Ipopt::Index doHeuristicRINS =
false;
688 options()->GetEnumValue(
"heuristic_RINS",doHeuristicRINS,prefix_.c_str());
694 heuristics_.push_back(h);
697 Ipopt::Index doHeuristicLocalBranching =
false;
698 options()->GetEnumValue(
"heuristic_local_branching",doHeuristicLocalBranching,prefix_.c_str());
699 if(doHeuristicLocalBranching){
703 h.
id =
"LocalBranching";
704 heuristics_.push_back(h);
707 Ipopt::Index doHeuristicPumpForMinlp =
false;
708 options()->GetEnumValue(
"pump_for_minlp",doHeuristicPumpForMinlp,prefix_.c_str());
709 if(doHeuristicPumpForMinlp){
713 h.
id =
"Pump for MINLP";
714 heuristics_.push_back(h);
717 Ipopt::Index doHeuristicMilpRounding =
false;
718 options()->GetEnumValue(
"MILP_rounding_heuristic",doHeuristicMilpRounding,prefix_.c_str());
719 if(doHeuristicMilpRounding){
723 h.
id =
"MILP Rounding";
724 heuristics_.push_back(h);
730 switch (varSelection) {
734 (*
this, couenneProb_, journalist ());
735 chooseVariable->setTrustStrongForSolution(
false);
736 chooseVariable->setTrustStrongForBound(
false);
738 branchingMethod_ = chooseVariable;
744 (continuousSolver_, couenneProb_, journalist ());
748 std::cerr <<
"Unknown variable_selection for Couenne\n" << std::endl;
756 if (!options_->GetEnumValue(
"node_comparison", ival,
"bonmin.")) {
758 nodeComparisonMethod_ = bestBound;
764 if (intParam_[NumCutPasses] < 2)
765 intParam_[NumCutPasses] = 2;
769 intParam_ [BabSetupBase::SpecialOption] = 16 | 4;
773 options () -> GetIntegerValue (
"sdp_cuts", freq,
"couenne.");
784 cg.
id =
"Couenne SDP cuts";
785 cutGenerators (). push_back (cg);
790 options () -> GetIntegerValue (
"minlp_disj_cuts", freq,
"couenne.");
798 varSelection == OSI_STRONG,
804 cg.
cgl = couenneDisj;
805 cg.
id =
"Couenne disjunctive cuts";
806 cutGenerators (). push_back(cg);
811 options () -> GetIntegerValue (
"crossconv_cuts", freq,
"couenne.");
822 cg.
cgl = couenneCross;
823 cg.
id =
"Couenne cross-aux cuts";
824 cutGenerators (). push_back(cg);
830 void CouenneSetup::registerOptions ()
831 {registerAllOptions (roptions ());}
838 BabSetupBase ::registerAllOptions (roptions);
855 roptions -> AddStringOption3 (
"milp_solver",
856 "Choose the subsolver to solve MILP sub-problems in OA decompositions.",
858 "Cbc_D",
"Coin Branch and Cut with its default",
859 "Cbc_Par",
"Coin Branch and Cut with passed parameters",
861 " To use Cplex, a valid license is required and you should have compiled OsiCpx in COIN-OR (see Osi documentation).");
863 roptions -> setOptionExtraInfo (
"milp_solver",64);
865 roptions -> AddStringOption2 (
"milp_strategy",
866 "Choose a strategy for MILPs.",
868 "find_good_sol",
"Stop sub milps when a solution improving the incumbent is found",
869 "solve_to_optimality",
"Solve MILPs to optimality",
872 roptions -> AddStringOption6 (
"algorithm",
873 "Choice of the algorithm.",
875 "B-BB",
"simple branch-and-bound algorithm,",
876 "B-OA",
"OA Decomposition algorithm,",
877 "B-QG",
"Quesada and Grossmann branch-and-cut algorithm,",
878 "B-Hyb",
"hybrid outer approximation based branch-and-cut,",
879 "B-Ecp",
"ecp cuts based branch-and-cut a la FilMINT.",
880 "B-iFP",
"Iterated Feasibility Pump for MINLP.",
881 "This will preset some of the options of bonmin depending on the algorithm choice."
884 CouenneProblem ::registerOptions (roptions);
885 CouenneCutGenerator ::registerOptions (roptions);
886 CouenneChooseStrong ::registerOptions (roptions);
887 CouenneChooseVariable ::registerOptions (roptions);
888 CouenneFixPoint ::registerOptions (roptions);
889 CouenneDisjCuts ::registerOptions (roptions);
890 CouenneCrossConv ::registerOptions (roptions);
891 CouenneSdpCuts ::registerOptions (roptions);
892 CouenneTwoImplied ::registerOptions (roptions);
893 NlpSolveHeuristic ::registerOptions (roptions);
894 CouenneFeasPump ::registerOptions (roptions);
895 CouenneIterativeRounding::registerOptions (roptions);
898 roptions -> AddStringOption2
899 (
"local_branching_heuristic",
900 "Apply local branching heuristic",
904 "A local-branching heuristic based is used to find feasible solutions.");
907 roptions -> AddNumberOption (
"couenne_check",
908 "known value of a global optimum (for debug purposes only)",
910 "Default value is +infinity.");
912 roptions -> AddStringOption2 (
"display_stats",
913 "display statistics at the end of the run",
918 roptions -> AddStringOption2 (
"save_soltext",
919 "save pairs (index, value) of the solution at the end of the solve",
924 roptions -> AddStringOption2 (
"test_mode",
925 "set to true if this is Couenne unit test",
930 roptions -> AddStringOption5 (
"lp_solver",
931 "Linear Programming solver for the linearization",
933 "clp",
"Use the COIN-OR Open Source solver CLP (default)",
934 "cplex",
"Use the commercial solver Cplex (license is needed)",
935 "gurobi",
"Use the commercial solver Gurobi (license is needed)",
936 "soplex",
"Use the freely available Soplex",
937 "xpress-mp",
"Use the commercial solver Xpress MP (license is needed)"
940 #define addLevOption(optname,comment,default) roptions -> AddBoundedIntegerOption (optname, comment, -2, J_LAST_LEVEL-1, default, "")
942 addLevOption (
"output_level",
"Output level", J_WARNING);
943 addLevOption (
"branching_print_level",
"Output level for braching code in Couenne", J_NONE);
944 addLevOption (
"boundtightening_print_level",
"Output level for bound tightening code in Couenne", J_NONE);
945 addLevOption (
"convexifying_print_level",
"Output level for convexifying code in Couenne", J_NONE);
946 addLevOption (
"problem_print_level",
"Output level for problem manipulation code in Couenne", J_NONE);
947 addLevOption (
"nlpheur_print_level",
"Output level for NLP heuristic in Couenne", J_NONE);
948 addLevOption (
"disjcuts_print_level",
"Output level for disjunctive cuts in Couenne", J_NONE);
949 addLevOption (
"reformulate_print_level",
"Output level for reformulating problems in Couenne", J_NONE);
951 roptions -> AddNumberOption
953 "Tolerance for constraints/auxiliary variables",
955 "Default value is 1e-5.");
957 roptions -> AddStringOption2
959 "Feasibility-based (cheap) bound tightening (FBBT)",
963 "A pre-processing technique to reduce the bounding box, before the generation of linearization cuts. "
964 "This is a quick and effective way to reduce the solution set, and it is highly recommended to keep it active."
976 {(
const char *)
"Gomory_cuts", 0},
977 {(
const char *)
"probing_cuts", 0},
978 {(
const char *)
"cover_cuts", 0},
979 {(
const char *)
"mir_cuts", 0},
980 {(
const char *)
"2mir_cuts", 0},
981 {(
const char *)
"flow_covers_cuts", 0},
982 {(
const char *)
"lift_and_project_cuts", 0},
983 {(
const char *)
"reduce_split_cuts", 0},
984 {(
const char *)
"clique_cuts", 0},
987 for (
int i=0; cutOption [i].cgname; i++) {
991 sprintf (descr,
"Frequency k (in terms of nodes) for generating %s cuts in branch-and-cut.",
992 cutOption [i].cgname);
994 roptions -> AddLowerBoundedIntegerOption
995 (cutOption [i].cgname,
997 -100, cutOption [i].defaultFreq,
998 "If k > 0, cuts are generated every k nodes, "
999 "if -99 < k < 0 cuts are generated every -k nodes but "
1000 "Cbc may decide to stop generating cuts, if not enough are generated at the root node, "
1001 "if k=-99 generate cuts only at the root node, if k=0 or 100 do not generate cuts.");
1003 roptions->setOptionExtraInfo (cutOption [i].cgname, 5);
1010 void CouenneSetup::addMilpCutGenerators () {
1012 enum extraInfo_ {CUTINFO_NONE, CUTINFO_MIG, CUTINFO_PROBING, CUTINFO_CLIQUE};
1018 const char *optname;
1019 CglCutGenerator *cglptr;
1021 enum extraInfo_ extraInfo;
1024 {(
const char*)
"Gomory_cuts",
new CglGomory, (
const char*)
"Mixed Integer Gomory",CUTINFO_MIG},
1025 {(
const char*)
"probing_cuts",
new CglProbing, (
const char*)
"Probing", CUTINFO_PROBING},
1026 {(
const char*)
"mir_cuts",
new CglMixedIntegerRounding2, (
const char*)
"Mixed Integer Rounding",
1028 {(
const char*)
"2mir_cuts",
new CglTwomir, (
const char*)
"2-MIR", CUTINFO_NONE},
1029 {(
const char*)
"cover_cuts",
new CglKnapsackCover, (
const char*)
"Cover", CUTINFO_NONE},
1030 {(
const char*)
"clique_cuts",
new CglClique, (
const char*)
"Clique", CUTINFO_CLIQUE},
1031 {(
const char*)
"lift_and_project_cuts",
new CglLandP,(
const char*)
"Lift and Project",CUTINFO_NONE},
1032 {(
const char*)
"reduce_split_cuts",
new CglRedSplit,(
const char*)
"Reduce and Split",CUTINFO_NONE},
1033 {(
const char*)
"flow_covers_cuts",
new CglFlowCover,(
const char*)
"Flow cover cuts", CUTINFO_NONE},
1034 {NULL, NULL, NULL, CUTINFO_NONE}};
1038 for (
int i=0; cutList [i]. optname; i++) {
1040 options_ -> GetIntegerValue (std::string (cutList [i]. optname), freq,
"couenne.");
1043 delete cutList [i].cglptr;
1049 cg.
cgl = cutList [i].cglptr;
1050 cg.
id = std::string (cutList [i]. cglId);
1051 cutGenerators_.push_back (cg);
1054 switch (cutList [i].extraInfo) {
1057 CglGomory *gc = dynamic_cast <CglGomory *> (cutList [i].cglptr);
1061 gc -> setLimitAtRoot(512);
1066 case CUTINFO_PROBING: {
1067 CglProbing *pc = dynamic_cast <CglProbing *> (cutList [i].cglptr);
1071 pc->setUsingObjective(1);
1073 pc->setMaxPassRoot(3);
1075 pc->setMaxProbe(10);
1076 pc->setMaxProbeRoot(50);
1079 pc->setMaxLookRoot(50);
1080 pc->setMaxLookRoot(10);
1082 pc->setMaxElements(200);
1087 case CUTINFO_CLIQUE: {
1088 CglClique *clique = dynamic_cast <CglClique *> (cutList [i].cglptr);
1092 clique -> setStarCliqueReport(
false);
1093 clique -> setRowCliqueReport(
false);
1094 clique -> setMinViolation(0.1);
1104 double givenAllowFGap2 = 0.0;
1105 options_->GetNumericValue(std::string(
"allowable_fraction_gap"),
1106 givenAllowFGap2,
"bonmin.");
1107 double upval = 1e50;
1110 printf(
"CutOff value:\n");
1111 scanf(
"%lf", &upval);
1113 options_->GetNumericValue(std::string(
"art_cutoff"), upval,
"bonmin.");
1117 double newCO = (1-givenAllowFGap2) * upval;
1118 couenneProb_->setCutOff(newCO);
1119 printf(
"CutOff set to %f\n", newCO);
1121 #ifdef FM_TRACE_OPTSOL
1122 if(couenneProb_->getRecordBestSol()->getHasSol()) {
1123 if(newCO < couenneProb_->getRecordBestSol()->getVal()) {
1124 couenneProb_->getRecordBestSol()->setVal(newCO);
Cut Generator for linear convexifications.
void setCouenneProblem(CouenneProblem *)
set the couenne problem to use.
const CouNumber feas_tolerance_default
void setOnlyPseudoWhenTrusted(bool only_pseudo_when_trusted)
Type for heuristic method with its string identification.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register all the options for class instance.
An iterative rounding heuristic, tailored for nonconvex MINLPs.
OsiObject for auxiliary variables $w=f(x)$.
OsiObject for violation transfer on variables in a MINLP.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
void setNlp(Bonmin::OsiTMINLPInterface &nlp, bool cloneNlp=true)
Set the nlp solver.
Option category for Couenne.
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.
A heuristic that stores the initial solution of the NLP.
These are cuts of the form.
const Ipopt::EJournalCategory J_DISJCUTS(Ipopt::J_USER6)
const Ipopt::EJournalCategory J_BRANCHING(Ipopt::J_USER1)
const Ipopt::EJournalCategory J_CONVEXIFYING(Ipopt::J_USER3)
ASL * readASLfg(char **argv)
const double maxNlpInf_0
A heuristic to call an NlpSolver if all CouenneObjects are close to be satisfied (for other integer o...
#define addJournalist(optname, jlevel)
#define addLevOption(optname, comment, default)
An implementation of the Feasibility pump that uses linearization and Ipopt to find the two sequences...
Type for cut generation method with its frequency and string identification.
Bonmin class for passing info between components of branch-and-cuts.
Cut Generator for FBBT fixpoint.
Cut Generator for linear convexifications.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
Solver interface class with a pointer to a Couenne cut generator.
void setNumberSolvePerLevel(int value)
set number of nlp's solved for each given level of the tree
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
const Ipopt::EJournalCategory J_BOUNDTIGHTENING(Ipopt::J_USER2)
Class for MINLP problems with symbolic information.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
void fint fint fint fint fint fint fint fint fint fint real real real real real real real real * s
const Ipopt::EJournalCategory J_REFORMULATE(Ipopt::J_USER7)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options for this heuristic.
U * GetRawPtr(const OSSmartPtr< U > &smart_ptr)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
Cut Generator for implied bounds derived from pairs of linear (in)equalities.
Choose a variable for branching.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
NodeComparison
Strategies for comparing the nodes on the heap.
const Ipopt::EJournalCategory J_NLPHEURISTIC(Ipopt::J_USER5)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
Cut Generator that uses relationships between auxiliaries.
branch_obj
type of object (for branching variable selection)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
void setMaxNlpInf(double value)
set maxNlpInf.
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
const Ipopt::EJournalCategory J_COUENNE(Ipopt::J_USER8)
static void registerOptions(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions)
Register the options common to all local search based heuristics.
const Ipopt::EJournalCategory J_PROBLEM(Ipopt::J_USER4)
Bonmin class for passing info between components of branch-and-cuts.
OsiObject for variables in a MINLP.
bool isInteger(CouNumber x)
is this number integer?