idol
A C++ Framework for Optimization
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 Model m_master;
23 std::vector<Model> m_sub_problems;
24 std::vector<GenerationPattern<Var>> m_generation_patterns;
25 std::vector<GeneratorPool<Var>> m_pools;
26 std::vector<PresentGeneratorsList> m_present_generators;
27
28 Map<Var, Ctr> m_soft_branching_lower_bound_constraints;
29 Map<Var, Ctr> m_soft_branching_upper_bound_constraints;
30
31 unsigned int compute_n_sub_problems(const Model& t_original_formulation);
32 void set_decomposition_by_var(const Model& t_original_formulation);
33 void initialize_sub_problems(unsigned int t_n_sub_problems);
34 void initialize_generation_patterns(unsigned int t_n_sub_problems);
35 void initialize_pools(unsigned int t_n_sub_problems);
36 void initialize_present_generators(unsigned int t_n_sub_problems);
37 void dispatch_variables(const Model& t_original_formulation);
38 void dispatch_constraints(const Model& t_original_formulation);
39 void dispatch_linking_constraint(const Ctr& t_original_ctr, const LinExpr<Var>& t_row, CtrType t_type, double t_rhs);
40 std::pair<LinExpr<Var>, std::vector<LinExpr<Var>>> decompose_expression(const LinExpr<Var> &t_linear);
41 void dispatch_objective_function(const Model& t_original_formulation);
42 bool is_feasible(const PrimalPoint& t_primal, unsigned int t_sub_problem_id);
43
44 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);
45 LinExpr<Var> reformulate_sub_problem_variable(const Var &t_var, unsigned int t_sub_problem_id);
46public:
47 Formulation(const Model& t_original_formulation, const Annotation<unsigned int>& t_decomposition);
48
49 Model& master() { return m_master; }
50 const Model& master() const { return m_master; }
51
52 auto sub_problems() { return IteratorForward(m_sub_problems); }
53 auto sub_problems() const { return ConstIteratorForward(m_sub_problems); }
54
55 auto present_generators(unsigned int t_id) const { return ConstIteratorForward(m_present_generators[t_id]); }
56
57 Model& sub_problem(unsigned int t_id) { return m_sub_problems[t_id]; }
58 const Model& sub_problem(unsigned int t_id) const { return m_sub_problems[t_id]; }
59
60 Model& get_model(const Var& t_var);
61 const Model& get_model(const Var& t_var) const;
62
63 Model& get_model(const Ctr& t_ctr);
64 const Model& get_model(const Ctr& t_ctr) const;
65
66 const Annotation<unsigned int>& decomposition() const { return m_decomposition; }
67
68 const GeneratorPool<Var>& column_pool(unsigned int t_sub_problem_id) const { return m_pools[t_sub_problem_id]; }
69
70 unsigned int n_sub_problems() const { return m_sub_problems.size(); }
71
72 void add_aggregation_constraint(unsigned int t_sub_problem_id, double t_lower_multiplicity, double t_upper_multiplicity);
73
74 AffExpr<Var> compute_sub_problem_objective(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, bool t_use_farkas = false) const;
75
76 void update_sub_problem_objective(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, bool t_use_farkas = false);
77
78 void generate_column(unsigned int t_sub_problem_id, PrimalPoint t_generator);
79
80 double compute_reduced_cost(unsigned int t_sub_problem_id, const DualPoint& t_master_dual, const PrimalPoint& t_generator);
81
82 const GenerationPattern<Var>& generation_pattern(const Var& t_var) const;
83
84 double get_original_space_var_primal(const Var& t_var, const PrimalPoint& t_master_primal) const;
85
86 void update_var_lb(const Var& t_var, double t_lb, bool t_hard, bool t_remove_infeasible_columns);
87
88 void update_var_ub(const Var& t_var, double t_ub, bool t_hard, bool t_remove_infeasible_columns);
89
90 void remove_column_if(unsigned int t_sub_problem_id, const std::function<bool(const Var &, const PrimalPoint &)> &t_indicator_for_removal);
91
92 void update_obj(const QuadExpr<Var>& t_expr);
93
94 void update_var_obj(const Var& t_var, double t_obj);
95
96 void clean_up(unsigned int t_sub_problem_id, double t_ratio);
97
98 void add(const Var& t_var, double t_lb, double t_ub, VarType t_type, const LinExpr<Ctr>& t_column);
99
100 void add(const Ctr& t_ctr, CtrType t_type, const LinExpr<Var>& t_row);
101
102 void remove(const Var& t_var);
103
104 void remove(const Ctr& t_ctr);
105
106 unsigned int get_n_present_generators() const;
107
108 void load_columns_from_pool();
109
110 void add_sub_problem();
111};
112
113#endif //IDOL_FORMULATION_H