A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizers_BilevelBasedBranchAndCut.h
1//
2// Created by Henri on 03/02/2026.
3//
4
5#ifndef IDOL_OPTIMIZERS_NESTEDBRANCHANDCUT_H
6#define IDOL_OPTIMIZERS_NESTEDBRANCHANDCUT_H
7
8#include "Formulation.h"
9#include "idol/robust/modeling/Description.h"
10#include "idol/general/optimizers/Algorithm.h"
11#include "idol/bilevel/modeling/Description.h"
12#include "idol/mixed-integer/optimizers/branch-and-bound/nodes/DefaultNodeInfo.h"
13
14namespace idol::Optimizers::Robust {
15 class BilevelBasedBranchAndBound;
16}
17
19 class Formulation;
20
21 const ::idol::Robust::Description &m_robust_description;
22 const ::idol::Bilevel::Description &m_bilevel_description;
23
24 std::unique_ptr<OptimizerFactory> m_optimality_bilevel_optimizer;
25 std::unique_ptr<OptimizerFactory> m_feasibility_bilevel_optimizer;
26 bool m_with_first_stage_relaxation;
27
28 std::unique_ptr<idol::Robust::BBBB::Formulation> m_formulation;
29public:
30 BilevelBasedBranchAndBound(const Model& t_model,
31 const idol::Robust::Description& t_robust_description,
32 const ::idol::Bilevel::Description& t_bilevel_description,
33 const OptimizerFactory& t_optimality_optimizer,
34 const OptimizerFactory& t_feasibility_optimizer,
35 bool t_with_first_stage_relaxation
36 );
37
38 [[nodiscard]] std::string name() const override;
39 [[nodiscard]] double get_var_primal(const Var& t_var) const override;
40 [[nodiscard]] double get_var_reduced_cost(const Var& t_var) const override;
41 [[nodiscard]] double get_var_ray(const Var& t_var) const override;
42 [[nodiscard]] double get_ctr_dual(const Ctr& t_ctr) const override;
43 [[nodiscard]] double get_ctr_farkas(const Ctr& t_ctr) const override;
44 [[nodiscard]] unsigned get_n_solutions() const override;
45 [[nodiscard]] unsigned get_solution_index() const override;
46
47 idol::Robust::BBBB::Formulation& get_formulation();
48 [[nodiscard]] const idol::Robust::BBBB::Formulation& get_formulation() const;
49 [[nodiscard]] const idol::Robust::Description& get_robust_description() const { return m_robust_description; }
50 [[nodiscard]] const idol::Bilevel::Description& get_bilevel_description() const { return m_bilevel_description; }
51 [[nodiscard]] const idol::OptimizerFactory& get_feasibility_bilevel_optimizer() const { return *m_feasibility_bilevel_optimizer; }
52 [[nodiscard]] const idol::OptimizerFactory& get_optimality_bilevel_optimizer() const { return *m_optimality_bilevel_optimizer; }
53 [[nodiscard]] bool relax_first_stage_decisions() const { return m_with_first_stage_relaxation; }
54
55protected:
56 void add(const Var& t_var) override;
57 void add(const Ctr& t_ctr) override;
58 void add(const QCtr& t_ctr) override;
59 void remove(const Var& t_var) override;
60 void remove(const Ctr& t_ctr) override;
61 void remove(const QCtr& t_ctr) override;
62 void update() override;
63 void write(const std::string& t_name) override;
64 void hook_before_optimize() override;
65 void hook_optimize() override;
66 void hook_after_optimize() override;
67 void set_solution_index(unsigned t_index) override;
68 void update_obj_sense() override;
69 void update_obj() override;
70 void update_rhs() override;
71 void update_obj_constant() override;
72 void update_mat_coeff(const Ctr& t_ctr, const Var& t_var) override;
73 void update_ctr_type(const Ctr& t_ctr) override;
74 void update_ctr_rhs(const Ctr& t_ctr) override;
75 void update_var_type(const Var& t_var) override;
76 void update_var_lb(const Var& t_var) override;
77 void update_var_ub(const Var& t_var) override;
78 void update_var_obj(const Var& t_var) override;
79
80 class Node : public idol::DefaultNodeInfo {
82 public:
83 Node() = delete;
84 Node(BilevelBasedBranchAndBound* t_parent) : m_parent(t_parent) {}
85 void save(const Model& t_original_formulation, const Model& t_model) override;
86 [[nodiscard]] Node* create_child() const override;
87 [[nodiscard]] Node* clone() const override;
88
89 static DefaultNodeUpdator<Node>* create_updator(const Model& t_src_model, Model& t_relaxation);
90 };
91};
92
93#endif //IDOL_OPTIMIZERS_NESTEDBRANCHANDCUT_H