5#ifndef IDOL_STRONGBRANCHING_H
6#define IDOL_STRONGBRANCHING_H
8#include "VariableBranching.h"
9#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/NodeScoreFunction.h"
10#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/strong-branching/StrongBranchingPhase.h"
11#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/StrongBranching.h"
19 StrongBranching() =
default;
21 template<
class IteratorT>
24 template<
class NodeInfoT>
26 std::optional<unsigned int> m_max_n_variables;
27 std::unique_ptr<NodeScoreFunction> m_node_scoring_function;
28 std::list<StrongBranchingPhase> m_phases;
33 Strategy(
const Strategy<NodeInfoT>& t_src);
35 explicit Strategy(
const StrongBranching& t_parent);
41 idol::VariableBranching::Strategy<NodeInfoT>::create_branching_candidates(t_parent.parent()),
42 m_max_n_variables.has_value() ? m_max_n_variables.value() : 100,
49 return new Strategy(*
this);
53 StrongBranching& with_max_n_variables(
unsigned int t_n_variables);
55 StrongBranching& with_node_scoring_function(
const NodeScoreFunction& t_score_function);
57 StrongBranching& add_phase(
const StrongBranchingPhaseType &t_phase,
unsigned int t_max_n_variables,
unsigned int t_max_depth);
59 std::optional<unsigned int> m_max_n_variables;
60 std::unique_ptr<NodeScoreFunction> m_node_scoring_function;
61 std::list<StrongBranchingPhase> m_phases;
64template<
class NodeInfoT>
67 m_max_n_variables(t_parent.m_max_n_variables),
68 m_node_scoring_function(t_parent.m_node_scoring_function ? t_parent.m_node_scoring_function->clone() : nullptr),
69 m_phases(t_parent.m_phases) {
73template<
class NodeInfoT>
74idol::StrongBranching::Strategy<NodeInfoT>::Strategy(
const Strategy<NodeInfoT>& t_src)
75 : VariableBranching::Strategy<NodeInfoT>(t_src),
76 m_max_n_variables(t_src.m_max_n_variables),
77 m_node_scoring_function(t_src.m_node_scoring_function ? t_src.m_node_scoring_function->clone() : nullptr),
78 m_phases(t_src.m_phases)