idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizers_PADM.h
1//
2// Created by henri on 18.09.24.
3//
4
5#ifndef IDOL_OPTIMIZERS_PADM_H
6#define IDOL_OPTIMIZERS_PADM_H
7
8#include "idol/general/optimizers/Algorithm.h"
9#include "SubProblem.h"
10#include "idol/mixed-integer/optimizers/callbacks/watchers/PlotManager.h"
11#include "Formulation.h"
12#include "PenaltyUpdates.h"
13
14namespace idol::Optimizers {
15 class PADM;
16}
17
19public:
20 PADM(const Model& t_model,
21 ADM::Formulation t_formulation,
22 std::vector<idol::ADM::SubProblem>&& t_sub_problem_specs,
23 PenaltyUpdate* t_penalty_update,
24 SolutionStatus t_feasible_solution_status,
25 Plots::Manager* t_plot_manager);
26
27 [[nodiscard]] std::string name() const override { return "PADM"; }
28
29 [[nodiscard]] double get_var_primal(const Var &t_var) const override;
30
31 [[nodiscard]] double get_var_reduced_cost(const Var &t_var) const override;
32
33 [[nodiscard]] double get_var_ray(const Var &t_var) const override;
34
35 [[nodiscard]] double get_ctr_dual(const Ctr &t_ctr) const override;
36
37 [[nodiscard]] double get_ctr_farkas(const Ctr &t_ctr) const override;
38
39 [[nodiscard]] unsigned int get_n_solutions() const override;
40
41 [[nodiscard]] unsigned int get_solution_index() const override;
42
43 [[nodiscard]] unsigned int get_outer_loop_iteration_count() const;
44
45 [[nodiscard]] unsigned int get_inner_loop_iteration_count() const;
46
47 ADM::SubProblem& sub_problem_spec(unsigned int t_sub_problem_id);
48
49 class IterationPlot;
50protected:
51 void add(const Var &t_var) override;
52
53 void add(const Ctr &t_ctr) override;
54
55 void add(const QCtr &t_ctr) override;
56
57 void remove(const Var &t_var) override;
58
59 void remove(const Ctr &t_ctr) override;
60
61 void remove(const QCtr &t_ctr) override;
62
63 void update() override;
64
65 void write(const std::string &t_name) override;
66
67 void hook_before_optimize() override;
68
69 void hook_optimize() override;
70
71 void set_solution_index(unsigned int t_index) override;
72
73 void update_obj_sense() override;
74
75 void update_obj() override;
76
77 void update_rhs() override;
78
79 void update_obj_constant() override;
80
81 void update_mat_coeff(const Ctr &t_ctr, const Var &t_var) override;
82
83 void update_ctr_type(const Ctr &t_ctr) override;
84
85 void update_ctr_rhs(const Ctr &t_ctr) override;
86
87 void update_var_type(const Var &t_var) override;
88
89 void update_var_lb(const Var &t_var) override;
90
91 void update_var_ub(const Var &t_var) override;
92
93 void update_var_obj(const Var &t_var) override;
94
95 void update_penalty_parameters();
96 void run_inner_loop();
97 [[nodiscard]] bool is_feasible() const;
98 std::pair<bool, bool> solve_sub_problem(unsigned int t_sub_problem_id); // returns a pair of bools: first is true if the sub-problem has changed its objective value, second is true if the sub-problem has changed its feasibility measure
99 void compute_objective_value();
100 void make_history();
101 void log_inner_loop(unsigned int t_inner_loop_iteration);
102 void log_outer_loop();
103 [[nodiscard]] double infeasibility_linf(unsigned int t_sub_problem_id, const PrimalPoint& t_solution) const;
104 [[nodiscard]] double infeasibility_l1(unsigned int t_sub_problem_id, const PrimalPoint& t_solution) const;
105 void detect_stagnation(bool t_feasibility_has_changed);
106 void detect_stagnation_due_to_rescaling();
107 void restart();
108
109 void check_feasibility();
110 void check_time_limit();
111 void check_outer_iteration_limit();
112
113 void write_solution(const std::string& t_name);
114 void write_iteration_history(const std::string& t_name);
115
116 double get_var_result(const Var &t_var, const std::function<double(const Var&, unsigned int)>& t_function) const;
117private:
118 ADM::Formulation m_formulation;
119 std::vector<idol::ADM::SubProblem> m_sub_problem_specs;
120 const std::unique_ptr<PenaltyUpdate> m_penalty_update;
121 const unsigned int m_max_inner_loop_iterations = std::numeric_limits<unsigned int>::max();
122 const SolutionStatus m_feasible_solution_status;
123 const unsigned int m_max_iterations_without_feasibility_change = 1000;
124 std::unique_ptr<IterationPlot> m_history_plotter;
125
126 std::optional<unsigned int> m_last_iteration_with_no_feasibility_change;
127 std::optional<double> m_last_objective_value_when_rescaled;
128
129 bool m_first_run = true;
130 unsigned int m_n_restart = 0;
131 unsigned int m_outer_loop_iteration = 0;
132 unsigned int m_inner_loop_iterations = 0;
133 std::vector<PrimalPoint> m_last_solutions;
134 bool m_use_inverse_initial_penalties = false;
135
136 struct IterationLog {
137 unsigned int outer_iteration;
138 unsigned int inner_iteration;
139 std::vector<double> objective_value;
140 std::vector<double> infeasibility;
141 IterationLog(unsigned int t_outer_iteration, unsigned int t_inner_iteration, std::vector<double> t_objective_value, std::vector<double> t_infeasibility)
142 : outer_iteration(t_outer_iteration), inner_iteration(t_inner_iteration), objective_value(std::move(t_objective_value)), infeasibility(std::move(t_infeasibility)) {}
143 };
144
145 std::list<IterationLog> m_history;
146};
147
148class TCanvas;
149class TPad;
150class TGraph;
151class TLine;
152
154 Plots::Manager& m_manager;
155
156 TCanvas* m_canvas = nullptr;
157 std::vector<TPad*> m_pads;
158 std::vector<TGraph*> m_objective_graphs;
159 std::vector<std::list<TLine*>> m_objective_lines;
160 std::vector<TGraph*> m_infeasibility_graphs;
161 std::vector<std::list<TLine*>> m_infeasibility_lines;
162 unsigned int m_last_outer_iteration = 0;
163
164 void initialize(unsigned int t_n_sub_problems);
165public:
166 explicit IterationPlot(Plots::Manager& t_manager);
167
168 void update(unsigned int t_outer_loop_iteration,
169 unsigned int t_inner_loop_iteration,
170 const std::vector<double>& t_objective_values,
171 const std::vector<double>& t_infeasibilities);
172};
173
174#endif //IDOL_OPTIMIZERS_PADM_H