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 void add_separation_problem_constraints(idol::Model &t_model, const idol::Point<idol::Var> &t_first_stage_decision);
38 QuadExpr<Var> compute_second_stage_objective(const Point<Var>& t_first_stage_decision) const;
39public:
40 Formulation(const Model& t_parent,
41 const ::idol::Robust::Description &t_robust_description,
42 const ::idol::Bilevel::Description &t_bilevel_description
43 );
44
45 Model& master() { return m_master; }
46 const Model& master() const { return m_master; }
47 void add_scenario_to_master(const Point<Var>& t_scenario, bool t_add_annotation, bool t_check_for_repeated_scenarios);
48 //Model build_optimality_separation_problem(const idol::Point<idol::Var> &t_first_stage_decision);
49 //std::pair<Model, std::vector<Var>> build_feasibility_separation_problem(const Point<Var>& t_first_stage_decision);
50 //std::pair<Model, std::vector<Var>> build_joint_separation_problem(const Point<Var>& t_first_stage_decision);
51 unsigned int n_coupling_constraints() const { return m_coupling_constraints.size(); }
52 unsigned int n_added_scenarios() const { return m_n_added_scenario; }
53 const Bilevel::Description& bilevel_description_master() const { return *m_bilevel_description_master; }
54 bool is_adjustable_robust_problem() const;
55 bool is_wait_and_see_follower() const { return !is_adjustable_robust_problem(); }
56 bool should_have_epigraph_and_epigraph_is_not_in_master() const;
57 const Var& second_stage_epigraph() const { return *m_second_stage_epigraph; }
58 void add_epigraph_to_master();
59 auto second_stage_variables() const { return ConstIteratorForward(m_second_stage_variables); }
60 auto second_stage_constraints() const { return ConstIteratorForward(m_second_stage_constraints); }
61 const Model& original_model() const { return m_parent; }
62 bool has_second_stage_epigraph() const { return m_second_stage_epigraph.has_value(); }
63 bool has_second_stage_objective() const { return m_has_second_stage_objective; }
64
65};
66
67#endif //IDOL_CCG_FORMULATION_H