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();