Loading...
Searching...
No Matches
Formulation.h
1//
2// Created by Henri on 17/04/2026.
3//
4
5#ifndef IDOL_CVCCG_FORMULATION_H
6#define IDOL_CVCCG_FORMULATION_H
7#include <utility>
8#include <vector>
9
10#include "idol/general/utils/Optional.h"
11#include "idol/mixed-integer/modeling/models/Model.h"
12
13namespace idol::Optimizers::Robust {
15}
16
17namespace idol::CVCCG {
18 class Formulation;
19}
20
22
23 struct LinkingConstraint {
24 Ctr ctr_in_uncertainty_set;
25 Map<long int, std::pair<Var, Ctr>> critical_values;
26 Optional<Ctr> cover_constraint;
27
28 LinkingConstraint(Ctr t_ctr) : ctr_in_uncertainty_set(std::move(t_ctr)) {}
29 };
30
31 struct GeneratedScenario {
32 PrimalPoint scenario;
33 PrimalPoint master_solution;
34 };
35
36 struct CurrentlyPresentCut {
37 Ctr cut;
38 std::list<GeneratedScenario>::iterator scenario;
39 double penalty;
40 };
41
42 class Uncertainty {
43 std::optional<Ctr> m_constraint_in_original_model;
44 std::list<CurrentlyPresentCut> m_currently_present_cuts;
45 public:
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); }
51
52 Uncertainty() = default;
53 Uncertainty(const Ctr& t_ctr) : m_constraint_in_original_model(t_ctr) {}
54 };
55
57
58 // Analysis of the model
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;
63
64 Model m_master;
65 Model m_sub_problem;
66
67 // Scenarios
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;
72
73 void check_assumptions();
74 void initialize_master();
75 void initialize_sub_problem();
76
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;
81public:
83
84 Model& master() { return m_master; }
85 Model& sub_problem() { return m_sub_problem; }
86
87 auto uncertainties() { return IteratorForward(m_uncertainties); }
88 auto uncertainties() const { return ConstIteratorForward(m_uncertainties); }
89
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);
95
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;
99};
100
101#endif //IDOL_CVCCG_FORMULATION_H