idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
LazyCutCallback.h
1//
2// Created by henri on 11/04/23.
3//
4
5#ifndef CCG_WITH_NESTED_CG_LAZYCUTCALLBACK_H
6#define CCG_WITH_NESTED_CG_LAZYCUTCALLBACK_H
7
8#include "CutSeparation.h"
9#include "idol/mixed-integer/optimizers/callbacks/CallbackFactory.h"
10
11namespace idol {
12 class LazyCutCallback;
13}
14
16 std::unique_ptr<Model> m_model;
17 std::unique_ptr<OptimizerFactory> m_optimizer_factory;
19 CtrType m_type;
20
22 : m_model(t_src.m_model->clone()),
23 m_cut(t_src.m_cut),
24 m_type(t_src.m_type),
25 m_optimizer_factory(t_src.m_optimizer_factory ? t_src.m_optimizer_factory->clone() : nullptr) {}
26public:
27 LazyCutCallback(const Model& t_model, GenerationPattern<Ctr> t_cut, CtrType t_type = LessOrEqual) : m_model(t_model.clone()), m_cut(std::move(t_cut)), m_type(t_type) {}
28
29 class Strategy : public impl::CutSeparation {
30 protected:
31 void hook_add_cut(const TempCtr &t_cut) override {
32 add_lazy_cut(t_cut);
33 }
34
35 [[nodiscard]] std::string name() const override {
36 return "lazy-cut-callback";
37 }
38
39 public:
40 explicit Strategy(Model* t_separation_problem, GenerationPattern<Ctr> t_cut, CtrType t_type)
41 : impl::CutSeparation(IncumbentSolution, t_separation_problem, std::move(t_cut), t_type) {}
42
43 };
44
45 Callback *operator()() override {
46
47 if (!m_optimizer_factory) {
48 throw Exception("No optimizer has been given.");
49 }
50
51 auto* model = m_model->clone();
52 model->use(*m_optimizer_factory);
53
54 auto* result = new Strategy(model, m_cut, m_type);
55
56 return result;
57 }
58
59 [[nodiscard]] CallbackFactory *clone() const override {
60 return new LazyCutCallback(*this);
61 }
62
63 LazyCutCallback& with_separation_optimizer(const OptimizerFactory& t_optimizer_factory) {
64
65 if (m_optimizer_factory) {
66 throw Exception("An optimizer has already been given.");
67 }
68
69 m_optimizer_factory.reset(t_optimizer_factory.clone());
70
71 return *this;
72 }
73
74};
75
76#endif //CCG_WITH_NESTED_CG_LAZYCUTCALLBACK_H
virtual void add_lazy_cut(const TempCtr &t_cut)