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