idol
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 ::idol::Bilevel::Description m_bilevel_description_separation;
21
22 Model m_master;
23 std::optional<::idol::Bilevel::Description> m_bilevel_description_master;
24 std::vector<Var> m_second_stage_variables;
25 std::vector<Ctr> m_second_stage_constraints;
26 std::vector<Ctr> m_linking_constraints;
27 std::vector<Ctr> m_coupling_constraints;
28
29 unsigned int m_n_added_scenario = 0;
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);
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_separation() const { return m_bilevel_description_separation; }
54 const Bilevel::Description& bilevel_description_master() const { return *m_bilevel_description_master; }
55 bool is_adjustable_robust_problem() const;
56 bool is_wait_and_see_follower() const { return !is_adjustable_robust_problem(); }
57 bool should_have_epigraph_and_epigraph_is_not_in_master() const;
58 const Var& second_stage_epigraph() const { return *m_second_stage_epigraph; }
59 void add_epigraph_to_master();
60};
61
62#endif //IDOL_CCG_FORMULATION_H