idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
KKT.h
1//
2// Created by henri on 29.11.24.
3//
4
5#ifndef IDOL_BILEVEL_KKT_H
6#define IDOL_BILEVEL_KKT_H
7
8#include "idol/general/optimizers/OptimizerFactory.h"
9#include "idol/bilevel/modeling/Description.h"
10#include "idol/bilevel/optimizers/BilevelOptimizerInterface.h"
11#include "idol/mixed-integer/modeling/models/KKT.h"
12
13namespace idol::Bilevel {
14 class KKT;
15}
16
18 const Bilevel::Description* m_description = nullptr;
19 std::unique_ptr<OptimizerFactory> m_single_level_optimizer;
20 std::unique_ptr<Reformulators::KKT::BoundProvider> m_bound_provider;
21 std::optional<bool> m_use_sos1;
22public:
23 KKT() = default;
24
25 explicit KKT(const Bilevel::Description& t_description);
26
27 KKT(const Bilevel::Description& t_description, const Reformulators::KKT::BoundProvider& t_bound_provider);
28
29 KKT(const KKT& t_src);
30
31 void set_bilevel_description(const Description &t_bilevel_description) override;
32
33 Optimizer *operator()(const Model &t_model) const override;
34
35 [[nodiscard]] OptimizerFactory *clone() const override;
36
37 KKT& with_single_level_optimizer(const OptimizerFactory& t_deterministic_optimizer);
38
39 KKT& with_bound_provider(const Reformulators::KKT::BoundProvider& t_bound_provider);
40
41 KKT& with_sos1_constraints(bool t_value);
42
43 KKT& operator+=(const OptimizerFactory& t_optimizer) { return with_single_level_optimizer(t_optimizer); }
44
45 static Model make_model(const Model& t_model, const Bilevel::Description& t_description, bool t_use_sos1 = false);
46
47 static Model make_model(const Model& t_model, const Bilevel::Description& t_description, Reformulators::KKT::BoundProvider& t_bound_provider);
48};
49
50namespace idol {
51 static Bilevel::KKT operator+(const Bilevel::KKT& t_strong_duality, const OptimizerFactory& t_optimizer) {
52 Bilevel::KKT result(t_strong_duality);
53 result += t_optimizer;
54 return result;
55 }
56}
57
58#endif //IDOL_BILEVEL_KKT_H
Optimizer * operator()(const Model &t_model) const override
OptimizerFactory * clone() const override