5#ifndef IDOL_OPTIMIZER_H
6#define IDOL_OPTIMIZER_H
12#include "idol/general/numericals.h"
13#include "idol/general/utils/types.h"
29class idol::impl::Optimizer {
30 const ::idol::Model& m_parent;
32 bool m_is_terminated =
false;
34 unsigned int m_param_threads = 1;
35 unsigned int m_param_iteration_limit = std::numeric_limits<unsigned int>::max();
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;
52 virtual void build() = 0;
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.");
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.");
68 virtual void update() = 0;
70 virtual void write(
const std::string& t_name) = 0;
74 virtual void hook_before_optimize() {}
76 virtual void hook_optimize() = 0;
78 virtual void hook_after_optimize() {}
80 virtual void set_solution_index(
unsigned int t_index) = 0;
82 virtual void update_obj_sense() = 0;
84 virtual void update_obj() = 0;
86 virtual void update_rhs() = 0;
88 virtual void update_obj_constant() = 0;
90 virtual void update_mat_coeff(
const Ctr& t_ctr,
const Var& t_var) = 0;
92 virtual void update_ctr_type(
const Ctr& t_ctr) = 0;
94 virtual void update_ctr_rhs(
const Ctr& t_ctr) = 0;
96 virtual void update_var_type(
const Var& t_var) = 0;
98 virtual void update_var_lb(
const Var& t_var) = 0;
100 virtual void update_var_ub(
const Var& t_var) = 0;
102 virtual void update_var_obj(
const Var& t_var) = 0;
104 explicit Optimizer(const ::idol::Model& t_parent);
106 virtual ~Optimizer() =
default;
108 [[nodiscard]]
virtual std::string name()
const = 0;
110 [[nodiscard]]
virtual const ::idol::Model& parent()
const {
return m_parent; }
112 [[nodiscard]]
virtual SolutionStatus get_status()
const = 0;
114 [[nodiscard]]
virtual SolutionReason get_reason()
const = 0;
116 [[nodiscard]]
virtual double get_best_obj()
const = 0;
118 [[nodiscard]]
virtual double get_best_bound()
const = 0;
120 [[nodiscard]]
virtual double get_var_primal(
const Var& t_var)
const = 0;
122 [[nodiscard]]
virtual double get_var_reduced_cost(
const Var& t_var)
const = 0;
124 [[nodiscard]]
virtual double get_var_ray(
const Var& t_var)
const = 0;
126 [[nodiscard]]
virtual double get_ctr_dual(
const Ctr& t_ctr)
const = 0;
128 [[nodiscard]]
virtual double get_ctr_farkas(
const Ctr& t_ctr)
const = 0;
130 [[nodiscard]]
virtual double get_relative_gap()
const = 0;
132 [[nodiscard]]
virtual double get_absolute_gap()
const = 0;
134 [[nodiscard]]
virtual unsigned int get_n_solutions()
const = 0;
136 [[nodiscard]]
virtual unsigned int get_solution_index()
const = 0;
138 [[nodiscard]]
bool get_param_logs()
const {
return m_param_logs; }
140 virtual void set_param_logs(
bool t_value) { m_param_logs = t_value; }
142 [[nodiscard]]
double get_param_time_limit()
const {
return m_param_time_limit; }
144 virtual void set_param_time_limit(
double t_time_limit) { m_param_time_limit = t_time_limit; }
146 [[nodiscard]]
unsigned int get_param_thread_limit()
const {
return m_param_threads; }
148 virtual void set_param_threads(
unsigned int t_threads) { m_param_threads = t_threads; }
150 [[nodiscard]]
double get_param_best_obj_stop()
const;
152 virtual void set_param_best_obj_stop(
double t_best_obj_stop) { m_param_best_obj_stop = t_best_obj_stop; }
154 [[nodiscard]]
double get_param_best_bound_stop()
const;
156 virtual void set_param_best_bound_stop(
double t_best_bound_stop) { m_param_best_bound_stop = t_best_bound_stop; }
158 [[nodiscard]]
double get_tol_mip_relative_gap()
const {
return m_tol_mip_relative_gap; }
160 virtual void set_tol_mip_relative_gap(
double t_tol_mip_relative_gap) { m_tol_mip_relative_gap = t_tol_mip_relative_gap; }
162 [[nodiscard]]
double get_tol_mip_absolute_gap()
const {
return m_tol_mip_absolute_gap; }
164 virtual void set_tol_mip_absolute_gap(
double t_mip_tol_absolute_gap) { m_tol_mip_absolute_gap = t_mip_tol_absolute_gap; }
166 [[nodiscard]]
double get_tol_feasibility()
const {
return m_tol_feasibility; }
168 virtual void set_tol_feasibility(
double t_tol_feasibility) { m_tol_feasibility = t_tol_feasibility; }
170 [[nodiscard]]
double get_tol_optimality()
const {
return m_tol_optimality; }
172 virtual void set_tol_optimality(
double t_tol_optimality) { m_tol_optimality = t_tol_optimality; }
174 [[nodiscard]]
double get_tol_integer()
const {
return m_tol_integer; }
176 virtual void set_tol_integer(
double t_tol_integer) { m_tol_integer = t_tol_integer; }
178 [[nodiscard]]
unsigned int get_param_iteration_limit()
const {
return m_param_iteration_limit; }
180 void set_param_iteration_limit(
unsigned int t_iteration_limit) { m_param_iteration_limit = t_iteration_limit; }
182 [[nodiscard]]
bool get_param_presolve()
const {
return m_param_presolve; }
184 virtual void set_param_presolve(
bool t_value) { m_param_presolve = t_value; }
186 [[nodiscard]]
bool get_param_infeasible_or_unbounded_info()
const {
return m_param_infeasible_or_unbounded_info; }
188 virtual void set_param_infeasible_or_unbounded_info(
bool t_value) { m_param_infeasible_or_unbounded_info = t_value; }
190 [[nodiscard]]
const Timer& time()
const {
return m_timer; }
192 [[nodiscard]]
double get_remaining_time()
const;
194 [[nodiscard]]
bool is_terminated()
const {
return m_is_terminated; }
196 virtual void terminate();
198 template<
class T> T& as() {
199 auto* result =
dynamic_cast<T*
>(
this);
201 throw Exception(
"Optimizer could not be cast to desired type.");
206 template<
class T>
const T& as()
const {
207 auto* result =
dynamic_cast<const T*
>(
this);
209 throw Exception(
"Optimizer could not be cast to desired type.");
214 template<
class T> [[nodiscard]]
bool is()
const {
215 return dynamic_cast<const T*
>(
this);
222 explicit Optimizer(const ::idol::Model& t_parent);
static double Feasibility
static double MIPAbsoluteGap
static double MIPRelativeGap