Loading...
Searching...
No Matches
Optimizers_CriticalValueColumnAndConstraintGeneration.h
1//
2// Created by Henri on 17/04/2026.
3//
4
5#ifndef IDOL_OPTIMIZERS_CRITICALVALUECOLUMNANDCONSTRAINTGENERATION_H
6#define IDOL_OPTIMIZERS_CRITICALVALUECOLUMNANDCONSTRAINTGENERATION_H
7
8#include "Formulation.h"
9#include "idol/general/optimizers/Algorithm.h"
10#include "idol/general/optimizers/OptimizerFactory.h"
11#include "idol/robust/modeling/Description.h"
12
13namespace idol::Optimizers::Robust {
15}
16
18 const idol::Robust::Description& m_description;
19 std::unique_ptr<OptimizerFactory> m_master_optimizer_factory;
20 std::unique_ptr<OptimizerFactory> m_deterministic_optimizer_factory;
21 const bool m_use_indicator;
22
23 std::unique_ptr<CVCCG::Formulation> m_formulation;
24 std::list<Var> m_branching_candidates;
25 unsigned int m_n_iterations = 0;
26 bool m_is_diving = false;
27public:
28 CriticalValueColumnAndConstraintGeneration(const Model& t_model,
29 const idol::Robust::Description& t_description,
30 const OptimizerFactory& t_master_optimizer,
31 const OptimizerFactory& t_deterministic_optimizer,
32 bool t_use_indicator
33 );
34
35 [[nodiscard]] std::string name() const override { return "CVCCG"; }
36 [[nodiscard]] double get_var_primal(const Var& t_var) const override;
37 [[nodiscard]] double get_var_reduced_cost(const Var& t_var) const override;
38 [[nodiscard]] double get_var_ray(const Var& t_var) const override;
39 [[nodiscard]] double get_ctr_dual(const Ctr& t_ctr) const override;
40 [[nodiscard]] double get_ctr_farkas(const Ctr& t_ctr) const override;
41 [[nodiscard]] unsigned get_n_solutions() const override;
42 [[nodiscard]] unsigned get_solution_index() const override;
43
44 [[nodiscard]] const idol::Robust::Description& description() const { return m_description; }
45 [[nodiscard]] const OptimizerFactory& get_master_optimizer_factory() const { return *m_master_optimizer_factory; }
46 [[nodiscard]] const OptimizerFactory& get_deterministic_optimizer_factory() const { return *m_deterministic_optimizer_factory; }
47 [[nodiscard]] bool use_indicator() const { return m_use_indicator; }
48
49 [[nodiscard]] const CVCCG::Formulation& get_formulation() const { return *m_formulation; }
50
51 void declare_branching_on_unc_vars(std::list<Var> t_branching_candidates) { m_branching_candidates = std::move(t_branching_candidates); }
52 [[nodiscard]] auto branching_candidates() const { return ConstIteratorForward(m_branching_candidates); }
53 void set_unc_var_lb(const Var& t_var, double t_lb);
54 void set_unc_var_ub(const Var& t_var, double t_ub);
55protected:
56 void add(const Var& t_var) override { m_formulation.reset(); }
57 void add(const Ctr& t_ctr) override { m_formulation.reset(); }
58 void add(const QCtr& t_ctr) override { m_formulation.reset(); }
59 void add(const SOSCtr& t_ctr) override { m_formulation.reset(); }
60 void remove(const Var& t_var) override { m_formulation.reset(); }
61 void remove(const Ctr& t_ctr) override { m_formulation.reset(); }
62 void remove(const QCtr& t_ctr) override { m_formulation.reset(); }
63 void remove(const SOSCtr& t_ctr) override { m_formulation.reset(); }
64 void update() override { }
65 void write(const std::string& t_name) override;
66 void hook_before_optimize() override;
67 void hook_optimize() override;
68 void set_solution_index(unsigned t_index) override;
69 void update_obj_sense() override { m_formulation.reset(); }
70 void update_obj() override { m_formulation.reset(); }
71 void update_rhs() override { m_formulation.reset(); }
72 void update_obj_constant() override { m_formulation.reset(); }
73 void update_mat_coeff(const Ctr& t_ctr, const Var& t_var) override { m_formulation.reset(); }
74 void update_ctr_type(const Ctr& t_ctr) override { m_formulation.reset(); }
75 void update_ctr_rhs(const Ctr& t_ctr) override { m_formulation.reset(); }
76 void update_var_type(const Var& t_var) override { m_formulation.reset(); }
77 void update_var_lb(const Var& t_var) override { m_formulation.reset(); }
78 void update_var_ub(const Var& t_var) override { m_formulation.reset(); }
79 void update_var_obj(const Var& t_var) override { m_formulation.reset(); }
80
81 void solve_master_problem();
82 void analyze_master_problem();
83 void check_termination_criterion();
84 void solve_sub_problems();
85 void log_banner();
86 void log_iteration_separator();
87 void log_iteration();
88
89};
90
91#endif //IDOL_OPTIMIZERS_CRITICALVALUECOLUMNANDCONSTRAINTGENERATION_H