idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizer.h
1//
2// Created by henri on 31/01/23.
3//
4
5#ifndef IDOL_OPTIMIZER_H
6#define IDOL_OPTIMIZER_H
7
8#include <string>
9#include <optional>
10
11#include "Timer.h"
12#include "idol/general/numericals.h"
13#include "idol/general/utils/types.h"
14
15namespace idol {
16 class Model;
17 class Var;
18 class Ctr;
19 class QCtr;
20 class SOSCtr;
21
22 namespace impl {
23 class Optimizer;
24 }
25
26 class Optimizer;
27}
28
29class idol::impl::Optimizer {
30 const ::idol::Model& m_parent;
31
32 bool m_is_terminated = false;
33
34 unsigned int m_param_threads = 1;
35 unsigned int m_param_iteration_limit = std::numeric_limits<unsigned int>::max();
36
37 bool m_param_logs = false;
38 double m_param_time_limit = std::numeric_limits<double>::max();
39 std::optional<double> m_param_best_obj_stop;
40 std::optional<double> m_param_best_bound_stop;
41 bool m_param_presolve = true;
42 bool m_param_infeasible_or_unbounded_info = false;
43
44 double m_tol_mip_relative_gap = Tolerance::MIPRelativeGap;
45 double m_tol_mip_absolute_gap = Tolerance::MIPAbsoluteGap;
46 double m_tol_integer = Tolerance::Integer;
47 double m_tol_feasibility = Tolerance::Feasibility;
48 double m_tol_optimality = Tolerance::Optimality;
49
50 Timer m_timer;
51protected:
52 virtual void build() = 0;
53
54 virtual void add(const Var& t_var) = 0;
55 virtual void add(const Ctr& t_ctr) = 0;
56 virtual void add(const QCtr& t_ctr) = 0;
57 virtual void add(const SOSCtr& t_ctr) {
58 throw Exception("SOS constraints are not supported by this optimizer.");
59 }
60
61 virtual void remove(const Var& t_var) = 0;
62 virtual void remove(const Ctr& t_ctr) = 0;
63 virtual void remove(const QCtr& t_ctr) = 0;
64 virtual void remove(const SOSCtr& t_ctr) {
65 throw Exception("SOS constraints are not supported by this optimizer.");
66 }
67
68 virtual void update() = 0;
69
70 virtual void write(const std::string& t_name) = 0;
71
72 void optimize();
73
74 virtual void hook_before_optimize() {}
75
76 virtual void hook_optimize() = 0;
77
78 virtual void hook_after_optimize() {}
79
80 virtual void set_solution_index(unsigned int t_index) = 0;
81
82 virtual void update_obj_sense() = 0;
83
84 virtual void update_obj() = 0;
85
86 virtual void update_rhs() = 0;
87
88 virtual void update_obj_constant() = 0;
89
90 virtual void update_mat_coeff(const Ctr& t_ctr, const Var& t_var) = 0;
91
92 virtual void update_ctr_type(const Ctr& t_ctr) = 0;
93
94 virtual void update_ctr_rhs(const Ctr& t_ctr) = 0;
95
96 virtual void update_var_type(const Var& t_var) = 0;
97
98 virtual void update_var_lb(const Var& t_var) = 0;
99
100 virtual void update_var_ub(const Var& t_var) = 0;
101
102 virtual void update_var_obj(const Var& t_var) = 0;
103public:
104 explicit Optimizer(const ::idol::Model& t_parent);
105
106 virtual ~Optimizer() = default;
107
108 [[nodiscard]] virtual std::string name() const = 0;
109
110 [[nodiscard]] virtual const ::idol::Model& parent() const { return m_parent; }
111
112 [[nodiscard]] virtual SolutionStatus get_status() const = 0;
113
114 [[nodiscard]] virtual SolutionReason get_reason() const = 0;
115
116 [[nodiscard]] virtual double get_best_obj() const = 0;
117
118 [[nodiscard]] virtual double get_best_bound() const = 0;
119
120 [[nodiscard]] virtual double get_var_primal(const Var& t_var) const = 0;
121
122 [[nodiscard]] virtual double get_var_reduced_cost(const Var& t_var) const = 0;
123
124 [[nodiscard]] virtual double get_var_ray(const Var& t_var) const = 0;
125
126 [[nodiscard]] virtual double get_ctr_dual(const Ctr& t_ctr) const = 0;
127
128 [[nodiscard]] virtual double get_ctr_farkas(const Ctr& t_ctr) const = 0;
129
130 [[nodiscard]] virtual double get_relative_gap() const = 0;
131
132 [[nodiscard]] virtual double get_absolute_gap() const = 0;
133
134 [[nodiscard]] virtual unsigned int get_n_solutions() const = 0;
135
136 [[nodiscard]] virtual unsigned int get_solution_index() const = 0;
137
138 [[nodiscard]] bool get_param_logs() const { return m_param_logs; }
139
140 virtual void set_param_logs(bool t_value) { m_param_logs = t_value; }
141
142 [[nodiscard]] double get_param_time_limit() const { return m_param_time_limit; }
143
144 virtual void set_param_time_limit(double t_time_limit) { m_param_time_limit = t_time_limit; }
145
146 [[nodiscard]] unsigned int get_param_thread_limit() const { return m_param_threads; }
147
148 virtual void set_param_threads(unsigned int t_threads) { m_param_threads = t_threads; }
149
150 [[nodiscard]] double get_param_best_obj_stop() const;
151
152 virtual void set_param_best_obj_stop(double t_best_obj_stop) { m_param_best_obj_stop = t_best_obj_stop; }
153
154 [[nodiscard]] double get_param_best_bound_stop() const;
155
156 virtual void set_param_best_bound_stop(double t_best_bound_stop) { m_param_best_bound_stop = t_best_bound_stop; }
157
158 [[nodiscard]] double get_tol_mip_relative_gap() const { return m_tol_mip_relative_gap; }
159
160 virtual void set_tol_mip_relative_gap(double t_tol_mip_relative_gap) { m_tol_mip_relative_gap = t_tol_mip_relative_gap; }
161
162 [[nodiscard]] double get_tol_mip_absolute_gap() const { return m_tol_mip_absolute_gap; }
163
164 virtual void set_tol_mip_absolute_gap(double t_mip_tol_absolute_gap) { m_tol_mip_absolute_gap = t_mip_tol_absolute_gap; }
165
166 [[nodiscard]] double get_tol_feasibility() const { return m_tol_feasibility; }
167
168 virtual void set_tol_feasibility(double t_tol_feasibility) { m_tol_feasibility = t_tol_feasibility; }
169
170 [[nodiscard]] double get_tol_optimality() const { return m_tol_optimality; }
171
172 virtual void set_tol_optimality(double t_tol_optimality) { m_tol_optimality = t_tol_optimality; }
173
174 [[nodiscard]] double get_tol_integer() const { return m_tol_integer; }
175
176 virtual void set_tol_integer(double t_tol_integer) { m_tol_integer = t_tol_integer; }
177
178 [[nodiscard]] unsigned int get_param_iteration_limit() const { return m_param_iteration_limit; }
179
180 void set_param_iteration_limit(unsigned int t_iteration_limit) { m_param_iteration_limit = t_iteration_limit; }
181
182 [[nodiscard]] bool get_param_presolve() const { return m_param_presolve; }
183
184 virtual void set_param_presolve(bool t_value) { m_param_presolve = t_value; }
185
186 [[nodiscard]] bool get_param_infeasible_or_unbounded_info() const { return m_param_infeasible_or_unbounded_info; }
187
188 virtual void set_param_infeasible_or_unbounded_info(bool t_value) { m_param_infeasible_or_unbounded_info = t_value; }
189
190 [[nodiscard]] const Timer& time() const { return m_timer; }
191
192 [[nodiscard]] double get_remaining_time() const;
193
194 [[nodiscard]] bool is_terminated() const { return m_is_terminated; }
195
196 virtual void terminate();
197
198 template<class T> T& as() {
199 auto* result = dynamic_cast<T*>(this);
200 if (!result) {
201 throw Exception("Optimizer could not be cast to desired type.");
202 }
203 return *result;
204 }
205
206 template<class T> const T& as() const {
207 auto* result = dynamic_cast<const T*>(this);
208 if (!result) {
209 throw Exception("Optimizer could not be cast to desired type.");
210 }
211 return *result;
212 }
213
214 template<class T> [[nodiscard]] bool is() const {
215 return dynamic_cast<const T*>(this);
216 }
217};
218
219class idol::Optimizer : public impl::Optimizer {
220 friend class Model;
221public:
222 explicit Optimizer(const ::idol::Model& t_parent);
223};
224
225#endif //IDOL_OPTIMIZER_H
static double Feasibility
Definition numericals.h:83
static double MIPAbsoluteGap
Definition numericals.h:63
static double MIPRelativeGap
Definition numericals.h:51
static double Integer
Definition numericals.h:73
static double Optimality
Definition numericals.h:92