23 struct LinkingConstraint {
24 Ctr ctr_in_uncertainty_set;
25 Map<long int, std::pair<Var, Ctr>> critical_values;
28 LinkingConstraint(
Ctr t_ctr) : ctr_in_uncertainty_set(std::move(t_ctr)) {}
31 struct GeneratedScenario {
33 PrimalPoint master_solution;
36 struct CurrentlyPresentCut {
38 std::list<GeneratedScenario>::iterator scenario;
43 std::optional<Ctr> m_constraint_in_original_model;
44 std::list<CurrentlyPresentCut> m_currently_present_cuts;
45 std::list<CurrentlyPresentCut> m_not_currently_present_cuts;
47 [[nodiscard]]
bool is_constraint()
const {
return m_constraint_in_original_model.has_value(); }
48 [[nodiscard]]
const Ctr& ctr()
const {
return m_constraint_in_original_model.value(); }
49 [[nodiscard]]
auto currently_present_cuts()
const {
return ConstIteratorForward(m_currently_present_cuts); }
50 auto currently_present_cuts() {
return IteratorForward(m_currently_present_cuts); }
51 void add_currently_present_cut(
const Ctr& t_ctr, std::list<GeneratedScenario>::iterator t_scenario,
double t_penalty) { m_currently_present_cuts.emplace_back(t_ctr, t_scenario, t_penalty); }
52 auto remove_from_currently_present_cuts(
const std::list<CurrentlyPresentCut>::const_iterator& t_it) {
return m_currently_present_cuts.erase(t_it); }
54 Uncertainty() =
default;
55 Uncertainty(
const Ctr& t_ctr) : m_constraint_in_original_model(t_ctr) {}
61 std::list<Var> m_linking_variables;
62 bool m_master_is_continuous =
true;
63 bool m_all_linking_variables_are_binary =
true;
64 bool m_all_data_in_linking_constraints_is_integer =
true;
65 const bool m_use_cover_constraints =
true;
69 std::optional<Var> m_epigraph_variable;
72 std::list<GeneratedScenario> m_scenario_pool;
73 std::list<LinkingConstraint> m_linking_constraints;
74 std::list<Uncertainty> m_uncertainties;
75 unsigned int m_n_critical_values = 0;
77 void check_assumptions();
78 void initialize_master();
79 void initialize_sub_problem();
81 void add_scenario_to_master(
const std::list<GeneratedScenario>::iterator& t_iterator_in_pool, Uncertainty& t_uncertainty);
82 void create_critical_value_variable_if_needed(
const PrimalPoint& t_scenario);
83 void create_critical_value_variable(
const PrimalPoint& t_scenario, LinkingConstraint& t_linking);
84 double compute_critical_value(
const Ctr& t_ctr,
const PrimalPoint& t_scenario)
const;
88 Model& master() {
return m_master; }
89 Model& sub_problem() {
return m_sub_problem; }
94 void update_sub_problem_rhs(
const PrimalPoint& t_master_solution);
95 unsigned int n_uncertainties()
const {
return m_uncertainties.size(); }
96 void update_sub_problem_objective(
const PrimalPoint& t_master_solution,
const Uncertainty& t_uncertainty);
97 std::list<GeneratedScenario>::iterator add_scenario_to_pool(PrimalPoint&& t_scenario, PrimalPoint&& t_master_scenario);
98 void add_scenario_to_master(
const std::list<GeneratedScenario>::iterator& t_iterator_in_pool);
100 unsigned int n_critical_values()
const {
return m_n_critical_values; }
101 unsigned int n_scenarios_in_pool()
const {
return m_scenario_pool.size(); }
102 double get_scenario_var_primal(
const Var& t_var)
const;
104 bool master_provides_a_valid_bound()
const;
105 const Var& epigraph_variable()
const {
return *m_epigraph_variable; }
107 void remove_cut_if(Uncertainty& t_uncertainty,
const std::function<
bool(
const Ctr&,
const PrimalPoint&)>& t_indicator);
108 void set_unc_var_lb(
const Var& t_var,
double t_lb);
109 void set_unc_var_ub(
const Var& t_var,
double t_ub);
110 void load_cut_from_pool();
112 bool uses_indicator()
const;