idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizers_JuMP.h
1//
2// Created by henri on 02.05.25.
3//
4
5#ifndef IDOL_OPTIMIZERS_JUMP_H
6#define IDOL_OPTIMIZERS_JUMP_H
7
8#include "idol/general/optimizers/OptimizerWithLazyUpdates.h"
9#include "idol/general/utils/Set.h"
10
11namespace idol::Optimizers {
12 class JuMP;
13}
14
15#ifdef IDOL_USE_JULIA
16
17#include <julia.h>
18
19class idol::Optimizers::JuMP : public OptimizerWithLazyUpdates<bool, bool, bool, bool> {
20protected:
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;
25public:
26 JuMP(const Model& t_parent,
27 std::string t_module,
28 std::string t_optimizer,
29 bool t_is_continuous_relaxation);
30
31 ~JuMP() override;
32
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;
48protected:
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;
69
70 template<class T>
71 jl_value_t* make_julia_vector(const std::vector<T>& t_vector) {
72
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;
78 } else {
79 throw idol::Exception("Unsupported julia_type");
80 }
81
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);
84
85 return (jl_value_t*) result;
86 }
87};
88
89namespace idol::impl {
90
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;
96
97 static JuliaSessionManager& get();
98 public:
99 JuliaSessionManager();
100 JuliaSessionManager(const JuliaSessionManager&) = delete;
101 JuliaSessionManager(JuliaSessionManager&&) = delete;
102 JuliaSessionManager& operator=(const JuliaSessionManager&) = delete;
103 JuliaSessionManager& operator=(JuliaSessionManager&&) = delete;
104
105 static void load_idol_jump_module();
106 static void load_idol_coluna_module();
107 static void load_module(const std::string &t_module);
108
109 ~JuliaSessionManager();
110
111 static void throw_if_julia_error();
112 };
113
114}
115
116#endif
117
118#endif //IDOL_OPTIMIZERS_JUMP_H