idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizers_Benders.h
1//
2// Created by henri on 08.05.25.
3//
4
5#ifndef IDOL_OPTIMIZERS_ROBUST_BENDERS_H
6#define IDOL_OPTIMIZERS_ROBUST_BENDERS_H
7
8#include "idol/general/optimizers/Algorithm.h"
9#include "idol/robust/modeling/Description.h"
10#include "idol/bilevel/modeling/Description.h"
11#include "idol/robust/optimizers/column-and-constraint-generation/Formulation.h"
12#include "idol/mixed-integer/optimizers/callbacks/CallbackFactory.h"
13#include "idol/mixed-integer/optimizers/callbacks/Callback.h"
14
15namespace idol::Optimizers::Robust {
16 class Benders;
17}
18
20 const ::idol::Robust::Description &m_robust_description;
21 const ::idol::Bilevel::Description &m_bilevel_description;
22 std::unique_ptr<idol::CCG::Formulation> m_formulation;
23
24 // Initial scenarios
25 std::vector<Point<Var>> m_initial_scenarios;
26
27 // Feasibility Separation
28 std::vector<std::unique_ptr<OptimizerFactory>> m_optimizer_feasibility_separation;
29
30 // Optimality Separation
31 std::vector<std::unique_ptr<OptimizerFactory>> m_optimizer_optimality_separation;
32
33 // Joint Separation
34 std::vector<std::unique_ptr<OptimizerFactory>> m_optimizer_joint_separation;
35public:
36 Benders(const Model& t_parent,
37 const ::idol::Robust::Description &t_robust_description,
38 const ::idol::Bilevel::Description &t_bilevel_description,
39 std::vector<Point<Var>> t_initial_scenarios,
40 const std::list<std::unique_ptr<OptimizerFactory>>& t_optimizer_feasibility_separation,
41 const std::list<std::unique_ptr<OptimizerFactory>>& t_optimizer_optimality_separation,
42 const std::list<std::unique_ptr<OptimizerFactory>>& t_optimizer_joint_separation);
43
44 [[nodiscard]] std::string name() const override;
45 [[nodiscard]] double get_var_primal(const Var &t_var) const override;
46 [[nodiscard]] double get_var_reduced_cost(const Var &t_var) const override;
47 [[nodiscard]] double get_var_ray(const Var &t_var) const override;
48 [[nodiscard]] double get_ctr_dual(const Ctr &t_ctr) const override;
49 [[nodiscard]] double get_ctr_farkas(const Ctr &t_ctr) const override;
50 [[nodiscard]] unsigned int get_n_solutions() const override;
51 [[nodiscard]] unsigned int get_solution_index() const override;
52
53protected:
54 void add(const Var &t_var) override;
55 void add(const Ctr &t_ctr) override;
56 void add(const QCtr &t_ctr) override;
57 void remove(const Var &t_var) override;
58 void remove(const Ctr &t_ctr) override;
59 void remove(const QCtr &t_ctr) override;
60 void update() override;
61 void write(const std::string &t_name) override;
62 void hook_before_optimize() override;
63 void hook_optimize() override;
64 void set_solution_index(unsigned int t_index) override;
65 void update_obj_sense() override;
66 void update_obj() override;
67 void update_rhs() override;
68 void update_obj_constant() override;
69 void update_mat_coeff(const Ctr &t_ctr, const Var &t_var) override;
70 void update_ctr_type(const Ctr &t_ctr) override;
71 void update_ctr_rhs(const Ctr &t_ctr) override;
72 void update_var_type(const Var &t_var) override;
73 void update_var_lb(const Var &t_var) override;
74 void update_var_ub(const Var &t_var) override;
75 void update_var_obj(const Var &t_var) override;
76
78 const Benders &m_parent;
79 public:
80 explicit BendersCallback(const Benders& t_parent);
81 Callback *operator()() override;
82 [[nodiscard]] CallbackFactory *clone() const override;
83
84 class Strategy : public ::idol::Callback {
85 const Benders &m_parent;
86 std::list<Point<Var>> m_scenarios;
87 public:
88 explicit Strategy(const Benders& t_parent);
89
90 protected:
91 void operator()(CallbackEvent t_event) override;
92 };
93
94 };
95};
96
97#endif //IDOL_OPTIMIZERS_ROBUST_BENDERS_H