idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
CplexCallbackI.h
1//
2// Created by henri on 10.04.25.
3//
4
5#ifndef IDOL_CPLEXCALLBACKI_H
6#define IDOL_CPLEXCALLBACKI_H
7
8#ifdef IDOL_USE_CPLEX
9#include "idol/mixed-integer/optimizers/callbacks/Callback.h"
10#include <ilcplex/ilocplex.h>
11
12namespace idol {
13 namespace Optimizers {
14 class Cplex;
15 namespace impl {
16 class CplexUserCutCallbackI;
17 class CplexLazyConstraintCallbackI;
18 class CplexHeuristicCallbackI;
19 class CplexBranchCallbackI;
20 }
21 }
22 class CplexCallbackI;
23}
24
25class idol::Optimizers::impl::CplexUserCutCallbackI : public IloCplex::UserCutCallbackI {
26 CplexCallbackI *m_callback;
27public:
28 explicit CplexUserCutCallbackI(IloEnv t_env, CplexCallbackI *t_callback) : IloCplex::UserCutCallbackI(t_env), m_callback(t_callback) {}
29
30 using IloCplex::UserCutCallbackI::add;
31protected:
32 void main() override;
33
34 [[nodiscard]] CallbackI *duplicateCallback() const override {
35 throw Exception("Duplicate CplexUserCutCallbackI!");
36 }
37};
38
39class idol::Optimizers::impl::CplexLazyConstraintCallbackI : public IloCplex::LazyConstraintCallbackI {
40 CplexCallbackI *m_callback = nullptr;
41public:
42 explicit CplexLazyConstraintCallbackI(IloEnv t_env, CplexCallbackI *t_callback) : IloCplex::LazyConstraintCallbackI(t_env), m_callback(t_callback) {}
43
44 using IloCplex::LazyConstraintCallbackI::add;
45protected:
46 void main() override;
47
48 [[nodiscard]] CallbackI *duplicateCallback() const override {
49 std::cerr << "Warning: Cplex called duplicateCallback and it is not implemented..." << std::endl;
50 throw Exception("Duplicate CplexLazyConstraintCallbackI!");
51 }
52};
53
54class idol::Optimizers::impl::CplexBranchCallbackI : public IloCplex::BranchCallbackI {
55 CplexCallbackI *m_callback = nullptr;
56public:
57 explicit CplexBranchCallbackI(IloEnv t_env, CplexCallbackI *t_callback) : IloCplex::BranchCallbackI(t_env), m_callback(t_callback) {}
58
59 using IloCplex::BranchCallbackI::makeBranch;
60protected:
61 void main() override;
62
63 [[nodiscard]] CallbackI *duplicateCallback() const override {
64 std::cerr << "Warning: Cplex called duplicateCallback and it is not implemented..." << std::endl;
65 throw Exception("Duplicate CplexBranchCallbackI!");
66 }
67};
68
69class idol::CplexCallbackI : public CallbackI {
70 Optimizers::Cplex &m_parent;
71 std::list<std::unique_ptr<Callback>> m_callbacks;
72 IloCplex::ControlCallbackI* m_caller = nullptr;
73
74 std::unique_ptr<Optimizers::impl::CplexUserCutCallbackI> m_user_cut_callback;
75 std::unique_ptr<Optimizers::impl::CplexLazyConstraintCallbackI> m_lazy_constraint_callback;
76 // std::unique_ptr<Optimizers::impl::CplexHeuristicCallbackI> m_heuristic_callback;
77 std::unique_ptr<Optimizers::impl::CplexBranchCallbackI> m_branch_callback;
78
79 Optimizers::impl::CplexUserCutCallbackI* create_user_cut_callback();
80 Optimizers::impl::CplexLazyConstraintCallbackI* create_lazy_constraint_callback();
81 Optimizers::impl::CplexHeuristicCallbackI* create_heuristic_callback();
82 Optimizers::impl::CplexBranchCallbackI* create_branch_callback();
83
84 std::optional<IloCplex::MIPCallbackI::NodeId> m_local_bounds_node_id;
85 std::vector<std::pair<Var, double>> m_local_lbs;
86 std::vector<std::pair<Var, double>> m_local_ubs;
87
88 IloRange cplex_temp_constr(const TempCtr &t_temp_ctr);
89public:
90 explicit CplexCallbackI(Optimizers::Cplex &t_parent);
91
92 void add_callback(Callback *t_callback);
93
94 void call(IloCplex::ControlCallbackI* t_caller, CallbackEvent t_event);
95
96 [[nodiscard]] const Model &original_model() const override;
97
98 void add_lazy_cut(const TempCtr &t_lazy_cut) override;
99
100 void add_user_cut(const TempCtr &t_user_cut) override;
101
102 void submit_heuristic_solution(PrimalPoint t_solution) override {}
103
104 [[nodiscard]] PrimalPoint primal_solution() const override;
105
106 [[nodiscard]] const Timer &time() const override;
107
108 [[nodiscard]] double best_obj() const override;
109
110 [[nodiscard]] double best_bound() const override;
111
112 double get_var_primal(const Var& t_var) const;
113 double get_var_local_lb(const Var& t_var) const;
114 double get_var_local_ub(const Var& t_var) const;
115 void set_var_local_lb(const Var& t_var, double t_bound);
116 void set_var_local_ub(const Var& t_var, double t_bound);
117
118 void terminate() override;
119
120 friend class idol::Optimizers::Cplex;
121 friend class idol::Optimizers::impl::CplexBranchCallbackI;
122};
123
124#endif
125#endif //IDOL_CPLEXCALLBACKI_H