22 std::vector<idol::ADM::SubProblem>&& t_sub_problem_specs,
24 SolutionStatus t_feasible_solution_status,
27 [[nodiscard]] std::string name()
const override {
return "PADM"; }
29 [[nodiscard]]
double get_var_primal(
const Var &t_var)
const override;
31 [[nodiscard]]
double get_var_reduced_cost(
const Var &t_var)
const override;
33 [[nodiscard]]
double get_var_ray(
const Var &t_var)
const override;
35 [[nodiscard]]
double get_ctr_dual(
const Ctr &t_ctr)
const override;
37 [[nodiscard]]
double get_ctr_farkas(
const Ctr &t_ctr)
const override;
39 [[nodiscard]]
unsigned int get_n_solutions()
const override;
41 [[nodiscard]]
unsigned int get_solution_index()
const override;
43 [[nodiscard]]
unsigned int get_outer_loop_iteration_count()
const;
45 [[nodiscard]]
unsigned int get_inner_loop_iteration_count()
const;
51 void add(
const Var &t_var)
override;
53 void add(
const Ctr &t_ctr)
override;
55 void add(
const QCtr &t_ctr)
override;
57 void remove(
const Var &t_var)
override;
59 void remove(
const Ctr &t_ctr)
override;
61 void remove(
const QCtr &t_ctr)
override;
63 void update()
override;
65 void write(
const std::string &t_name)
override;
67 void hook_before_optimize()
override;
69 void hook_optimize()
override;
71 void set_solution_index(
unsigned int t_index)
override;
73 void update_obj_sense()
override;
75 void update_obj()
override;
77 void update_rhs()
override;
79 void update_obj_constant()
override;
81 void update_mat_coeff(
const Ctr &t_ctr,
const Var &t_var)
override;
83 void update_ctr_type(
const Ctr &t_ctr)
override;
85 void update_ctr_rhs(
const Ctr &t_ctr)
override;
87 void update_var_type(
const Var &t_var)
override;
89 void update_var_lb(
const Var &t_var)
override;
91 void update_var_ub(
const Var &t_var)
override;
93 void update_var_obj(
const Var &t_var)
override;
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);
99 void compute_objective_value();
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();
109 void check_feasibility();
110 void check_time_limit();
111 void check_outer_iteration_limit();
113 void write_solution(
const std::string& t_name);
114 void write_iteration_history(
const std::string& t_name);
116 double get_var_result(
const Var &t_var,
const std::function<
double(
const Var&,
unsigned int)>& t_function)
const;
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;
126 std::optional<unsigned int> m_last_iteration_with_no_feasibility_change;
127 std::optional<double> m_last_objective_value_when_rescaled;
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;
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)) {}
145 std::list<IterationLog> m_history;
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;
164 void initialize(
unsigned int t_n_sub_problems);
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);