Loading...
Searching...
No Matches
Formulation.h
1//
2// Created by henri on 31.10.23.
3//
4
5#ifndef IDOL_FORMULATION_H
6#define IDOL_FORMULATION_H
7
8#include "idol/mixed-integer/modeling/models/Model.h"
9#include "idol/general/utils/GeneratorPool.h"
10#include "idol/general/utils/GenerationPattern.h"
11#include "idol/general/utils/Map.h"
12
13namespace idol::DantzigWolfe {
14 class Formulation;
15}
16
18 using PresentGeneratorsList = std::list<std::pair<Var, const PrimalPoint&>>;
19
20 Annotation<unsigned int> m_decomposition;
21
22 const Model& m_original_formulation;
23 Model m_master;
24 std::vector<Model> m_sub_problems;
25 std::vector<GenerationPattern<Var>> m_generation_patterns;
26 std::vector<GeneratorPool<Var>> m_pools;
27 std::vector<PresentGeneratorsList> m_present_generators;
28
29 Map<Var, Ctr> m_soft_branching_lower_bound_constraints;
30 Map<Var, Ctr> m_soft_branching_upper_bound_constraints;
31
32 unsigned int compute_n_sub_problems(const Model& t_original_formulation);
33 void set_decomposition_by_var(const Model& t_original_formulation);
34 void initialize_sub_problems(unsigned int t_n_sub_problems);
35 void initialize_generation_patterns(unsigned int t_n_sub_problems);
36 void initialize_pools(unsigned int t_n_sub_problems);
37 void initialize_present_generators(unsigned int t_n_sub_problems);
38 void dispatch_variables(const Model& t_original_formulation);
39 void dispatch_constraints(const Model& t_original_formulation);
40 void dispatch_linking_constraint(const Ctr& t_original_ctr, const LinExpr<Var>& t_row, CtrType t_type, double t_rhs);
41 std::pair<LinExpr<Var>, std::vector<LinExpr<Var>>> decompose_expression(const LinExpr<Var> &t_linear);
42 void dispatch_objective_function(const Model& t_original_formulation);
43 bool is_feasible(const PrimalPoint& t_primal, unsigned int t_sub_problem_id);
44
45 void apply_sub_problem_bound_on_master(bool t_is_lb, const idol::Var &t_var, unsigned int t_sub_problem_id, double t_value);
46 LinExpr<Var> reformulate_sub_problem_variable(const Var &t_var, unsigned int t_sub_problem_id);
47public:
48 Formulation(const Model& t_original_formulation, const Annotation<unsigned int>& t_decomposition);
49
50 Model& master() { return m_master; }
51 const Model& master() const { return m_master; }
52
53 auto sub_problems() { return IteratorForward(m_sub_problems); }
54 auto sub_problems() const { return ConstIteratorForward(m_sub_problems); }
55
56 auto present_generators(unsigned int t_id) const { return ConstIteratorForward(m_present_generators[t_id]); }
57
58 Model& sub_problem(unsigned int t_id) { return m_sub_problems[t_id]; }
59 const Model& sub_problem(unsigned int t_id) const { return m_sub_problems[t_id]; }
60
61 Model& get_model(const Var& t_var);
62 const Model& get_model(const Var& t_var) const;
63
64 Model& get_model(const Ctr& t_ctr);
65 const Model& get_model(const Ctr& t_ctr) const;
66
67 const Annotation<unsigned int>& decomposition() const { return m_decomposition; }
68
69 const GeneratorPool<Var>& column_pool(unsigned int t_sub_problem_id) const { return m_pools[t_sub_problem_id]; }
70
71 unsigned int n_sub_problems() const { return m_sub_problems.size(); }
72
73 void add_aggregation_constraint(unsigned int t_sub_problem_id, double t_lower_multiplicity, double t_upper_multiplicity);
74
75 AffExpr<Var> compute_sub_problem_objective(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, bool t_use_farkas = false) const;
76
77 void update_sub_problem_objective(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, bool t_use_farkas = false);
78
79 void generate_column(unsigned int t_sub_problem_id, PrimalPoint t_generator);
80
81 double compute_reduced_cost(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, const PrimalPoint& t_generator);
82
83 const GenerationPattern<Var>& generation_pattern(const Var& t_var) const;
84
85 double get_original_space_var_primal(const Var& t_var, const PrimalPoint& t_master_primal) const;
86
87 void update_var_lb(const Var& t_var, double t_lb, bool t_hard, bool t_remove_infeasible_columns);
88
89 void update_var_ub(const Var& t_var, double t_ub, bool t_hard, bool t_remove_infeasible_columns);
90
91 void remove_column_if(unsigned int t_sub_problem_id, const std::function<bool(const Var &, const PrimalPoint &)> &t_indicator_for_removal);
92
93 void update_obj(const QuadExpr<Var>& t_expr);
94
95 void update_var_obj(const Var& t_var, double t_obj);
96
97 void clean_up(unsigned int t_sub_problem_id, double t_ratio);
98
99 void add(const Var& t_var, double t_lb, double t_ub, VarType t_type, const LinExpr<Ctr>& t_column);
100
101 void add(const Ctr& t_ctr, CtrType t_type, const LinExpr<Var>& t_row, double t_rhs);
102
103 void remove(const Var& t_var);
104
105 void remove(const Ctr& t_ctr);
106
107 unsigned int get_n_present_generators() const;
108
109 void load_columns_from_pool();
110
111 void add_sub_problem();
112};
113
114#endif //IDOL_FORMULATION_H