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;
46 [[nodiscard]]
bool is_constraint()
const {
return m_constraint_in_original_model.has_value(); }
47 [[nodiscard]]
const Ctr& ctr()
const {
return m_constraint_in_original_model.value(); }
48 [[nodiscard]]
auto currently_present_cuts()
const {
return ConstIteratorForward(m_currently_present_cuts); }
49 auto currently_present_cuts() {
return IteratorForward(m_currently_present_cuts); }
50 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 Uncertainty() =
default;
53 Uncertainty(
const Ctr& t_ctr) : m_constraint_in_original_model(t_ctr) {}
59 std::list<Var> m_linking_variables;
60 bool m_all_linking_variables_are_binary =
true;
61 bool m_all_data_in_linking_constraints_is_integer =
true;
62 const bool m_use_cover_constraints =
true;
68 std::list<GeneratedScenario> m_scenario_pool;
69 std::list<LinkingConstraint> m_linking_constraints;
70 std::list<Uncertainty> m_uncertainties;
71 unsigned int m_n_critical_values = 0;
73 void check_assumptions();
74 void initialize_master();
75 void initialize_sub_problem();
77 void add_scenario_to_master(
const std::list<GeneratedScenario>::iterator& t_iterator_in_pool, Uncertainty& t_uncertainty);
78 void create_critical_value_variable_if_needed(
const PrimalPoint& t_scenario);
79 void create_critical_value_variable(
const PrimalPoint& t_scenario, LinkingConstraint& t_linking);
80 double compute_critical_value(
const Ctr& t_ctr,
const PrimalPoint& t_scenario)
const;
84 Model& master() {
return m_master; }
85 Model& sub_problem() {
return m_sub_problem; }
90 void update_sub_problem_constraints(
const PrimalPoint& t_master_solution);
91 unsigned int n_uncertainties()
const {
return m_uncertainties.size(); }
92 void update_sub_problem_objective(
const PrimalPoint& t_master_solution,
const Uncertainty& t_uncertainty);
93 std::list<GeneratedScenario>::iterator add_scenario_to_pool(PrimalPoint&& t_scenario, PrimalPoint&& t_master_scenario);
94 void add_scenario_to_master(
const std::list<GeneratedScenario>::iterator& t_iterator_in_pool);
96 unsigned int n_critical_values()
const {
return m_n_critical_values; }
97 unsigned int n_scenarios_in_pool()
const {
return m_scenario_pool.size(); }
98 double get_scenario_var_primal(
const Var& t_var)
const;