A C++ Framework for Optimization
Loading...
Searching...
No Matches
Formulation.h
1//
2// Created by henri on 11.12.24.
3//
4
5#ifndef IDOL_CCG_FORMULATION_H
6#define IDOL_CCG_FORMULATION_H
7
8#include "idol/mixed-integer/modeling/models/Model.h"
9#include "idol/robust/modeling/Description.h"
10#include "idol/bilevel/modeling/Description.h"
11
12namespace idol::CCG {
13 class Formulation;
14}
15
17 const Model& m_parent;
18 const ::idol::Robust::Description &m_robust_description;
19 const ::idol::Bilevel::Description &m_bilevel_description;
20
21 Model m_master;
22 std::optional<::idol::Bilevel::Description> m_bilevel_description_master;
23 std::vector<Var> m_second_stage_variables;
24 std::vector<Ctr> m_second_stage_constraints;
25 std::vector<Ctr> m_linking_constraints;
26 std::vector<Ctr> m_coupling_constraints;
27
28 unsigned int m_n_added_scenario = 0;
29 std::list<PrimalPoint> m_generated_scenarios;
30 bool m_has_second_stage_objective = false;
31 std::optional<Var> m_second_stage_epigraph;
32
33 void parse_variables();
34 void parse_objective();
35 void parse_constraints();
36 void copy_bilevel_description(const ::idol::Bilevel::Description& t_src, const ::idol::Bilevel::Description& t_dest) const;
37 QuadExpr<Var> compute_second_stage_objective(const Point<Var>& t_first_stage_decision) const;
38public:
39 Formulation(const Model& t_parent,
40 const ::idol::Robust::Description &t_robust_description,
41 const ::idol::Bilevel::Description &t_bilevel_description
42 );
43
44 Model& master() { return m_master; }
45 const Model& master() const { return m_master; }
46 void add_scenario_to_master(const Point<Var>& t_scenario, bool t_add_annotation, bool t_check_for_repeated_scenarios);
47 unsigned int n_coupling_constraints() const { return m_coupling_constraints.size(); }
48 unsigned int n_added_scenarios() const { return m_n_added_scenario; }
49 const Bilevel::Description& bilevel_description_master() const { return *m_bilevel_description_master; }
50 bool is_adjustable_robust_problem() const;
51 bool is_wait_and_see_follower() const { return !is_adjustable_robust_problem(); }
52 bool should_have_epigraph_and_epigraph_is_not_in_master() const;
53 const Var& second_stage_epigraph() const { return *m_second_stage_epigraph; }
54 void add_epigraph_to_master();
55 auto second_stage_variables() const { return ConstIteratorForward(m_second_stage_variables); }
56 auto second_stage_constraints() const { return ConstIteratorForward(m_second_stage_constraints); }
57 const Model& original_model() const { return m_parent; }
58 bool has_second_stage_epigraph() const { return m_second_stage_epigraph.has_value(); }
59 bool has_second_stage_objective() const { return m_has_second_stage_objective; }
60
61};
62
63#endif //IDOL_CCG_FORMULATION_H