5#ifndef IDOL_OPTIMIZERS_JUMP_H 
    6#define IDOL_OPTIMIZERS_JUMP_H 
    8#include "idol/general/optimizers/OptimizerWithLazyUpdates.h" 
    9#include "idol/general/utils/Set.h" 
   11namespace idol::Optimizers {
 
   19class idol::Optimizers::JuMP : 
public OptimizerWithLazyUpdates<bool, bool, bool, bool> {
 
   21    std::optional<uint64_t> m_model_id = 0;
 
   22    const std::string m_module;
 
   23    const std::string m_optimizer;
 
   24    bool m_is_continuous_relaxation;
 
   26    JuMP(
const Model& t_parent,
 
   28         std::string t_optimizer,
 
   29         bool t_is_continuous_relaxation);
 
   33    [[nodiscard]] std::string name() 
const override;
 
   34    [[nodiscard]] SolutionStatus get_status() 
const override;
 
   35    [[nodiscard]] SolutionReason get_reason() 
const override;
 
   36    [[nodiscard]] 
double get_best_obj() 
const override;
 
   37    [[nodiscard]] 
double get_best_bound() 
const override;
 
   38    [[nodiscard]] 
double get_var_primal(
const Var &t_var) 
const override;
 
   39    [[nodiscard]] 
double get_var_reduced_cost(
const Var &t_var) 
const override;
 
   40    [[nodiscard]] 
double get_var_ray(
const Var &t_var) 
const override;
 
   41    [[nodiscard]] 
double get_ctr_dual(
const Ctr &t_ctr) 
const override;
 
   42    [[nodiscard]] 
double get_ctr_farkas(
const Ctr &t_ctr) 
const override;
 
   43    [[nodiscard]] 
double get_relative_gap() 
const override;
 
   44    [[nodiscard]] 
double get_absolute_gap() 
const override;
 
   45    [[nodiscard]] 
unsigned int get_n_solutions() 
const override;
 
   46    [[nodiscard]] 
unsigned int get_solution_index() 
const override;
 
   47    void debug_print() 
const;
 
   49    void hook_optimize() 
override;
 
   50    virtual uint64_t hook_create_julia_model(jl_value_t* t_optimizer);
 
   51    void set_solution_index(
unsigned int t_index) 
override;
 
   52    void hook_build() 
override;
 
   53    void hook_write(
const std::string &t_name) 
override;
 
   54    bool hook_add(
const Var &t_var, 
bool t_add_column) 
override;
 
   55    bool hook_add(
const Ctr &t_ctr) 
override;
 
   56    bool hook_add(
const QCtr &t_ctr) 
override;
 
   57    bool hook_add(
const SOSCtr &t_ctr) 
override;
 
   58    void hook_update_objective_sense() 
override;
 
   59    void hook_update_matrix(
const Ctr &t_ctr, 
const Var &t_var, 
double t_constant) 
override;
 
   60    void hook_update() 
override;
 
   61    void hook_update(
const Var &t_var) 
override;
 
   62    void hook_update(
const Ctr &t_ctr) 
override;
 
   63    void hook_update_objective() 
override;
 
   64    void hook_update_rhs() 
override;
 
   65    void hook_remove(
const Var &t_var) 
override;
 
   66    void hook_remove(
const Ctr &t_ctr) 
override;
 
   67    void hook_remove(
const QCtr &t_ctr) 
override;
 
   68    void hook_remove(
const SOSCtr &t_ctr) 
override;
 
   71    jl_value_t* make_julia_vector(
const std::vector<T>& t_vector) {
 
   73        jl_value_t* julia_type;
 
   74        if constexpr (std::is_same_v<T, double>) {
 
   75            julia_type = (jl_value_t*) jl_float64_type;
 
   76        } 
else if constexpr (std::is_same_v<T, uint64_t>) {
 
   77            julia_type = (jl_value_t*) jl_uint64_type;
 
   82        jl_value_t* array_type = jl_apply_array_type(julia_type, 1);
 
   83        jl_array_t *result = jl_ptr_to_array_1d(array_type, (T*) t_vector.data(), t_vector.size(), 0);
 
   85        return (jl_value_t*) result;
 
   91    class JuliaSessionManager {
 
   92        bool m_idol_jump_module_is_loaded = 
false;
 
   93        bool m_idol_coluna_is_loaded = 
false;
 
   94        Set<std::string> m_loaded_modules;
 
   95        static JuliaSessionManager* s_julia_session_manager;
 
   97        static JuliaSessionManager& get();
 
   99        JuliaSessionManager();
 
  100        JuliaSessionManager(
const JuliaSessionManager&) = 
delete;
 
  101        JuliaSessionManager(JuliaSessionManager&&) = 
delete;
 
  102        JuliaSessionManager& operator=(
const JuliaSessionManager&) = 
delete;
 
  103        JuliaSessionManager& operator=(JuliaSessionManager&&) = 
delete;
 
  105        static void load_idol_jump_module();
 
  106        static void load_idol_coluna_module();
 
  107        static void load_module(
const std::string &t_module);
 
  109        ~JuliaSessionManager();
 
  111        static void throw_if_julia_error();