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);