A C++ Framework for Optimization
Loading...
Searching...
No Matches
Optimizers_GLPK.h
1//
2// Created by henri on 14/02/23.
3//
4
5#ifndef IDOL_OPTIMIZERS_GLPK_H
6#define IDOL_OPTIMIZERS_GLPK_H
7
8#include <stack>
9
10#include "idol/general/optimizers/OptimizerWithLazyUpdates.h"
11#include "headers/header_glpk.h"
12
13namespace idol::Optimizers {
14 class GLPK;
15}
16
17class idol::Optimizers::GLPK : public OptimizerWithLazyUpdates<int, int, int, int> {
18
19 class DynamicLib;
20 static std::unique_ptr<DynamicLib> m_dynamic_lib;
21
22 bool m_continuous_relaxation;
23
24 glp_prob* m_model = nullptr;
25 glp_smcp m_simplex_parameters;
26 glp_iocp m_mip_parameters;
27 bool m_solved_as_mip = false;
28 bool m_rebuild_basis = false;
29
30 SolutionStatus m_solution_status = Loaded;
31 SolutionReason m_solution_reason = NotSpecified;
32 std::optional<PrimalPoint> m_unbounded_ray;
33 std::optional<DualPoint> m_farkas_certificate;
34
35 std::stack<int> m_deleted_variables;
36 std::stack<int> m_deleted_constraints;
37protected:
38 static DynamicLib& get_dynamic_lib();
39
40 void hook_build() override;
41 void hook_optimize() override;
42 void hook_write(const std::string &t_name) override;
43 int hook_add(const Var &t_var, bool t_add_column) override;
44 int hook_add(const Ctr &t_ctr) override;
45 int hook_add(const QCtr &t_ctr) override;
46 int hook_add(const SOSCtr &t_ctr) override;
47 void hook_update_objective_sense() override;
48 void hook_update_matrix(const Ctr &t_ctr, const Var &t_var, double t_constant) override;
49 void hook_update() override;
50 void hook_update(const Var &t_var) override;
51 void hook_update(const Ctr &t_ctr) override;
52 void hook_update_objective() override;
53 void hook_update_rhs() override;
54 void hook_remove(const Var &t_var) override;
55 void hook_remove(const Ctr &t_ctr) override;
56 void hook_remove(const QCtr &t_ctr) override;
57 void hook_remove(const SOSCtr &t_ctr) override;
58 void set_var_attr(int t_index, int t_type, double t_lb, double t_ub, double t_obj);
59 void set_ctr_attr(int t_index, int t_type, double t_rhs);
60
61 void save_simplex_solution_status();
62 void compute_farkas_certificate();
63 void compute_unbounded_ray();
64 void save_milp_solution_status();
65
66 [[nodiscard]] SolutionStatus get_status() const override;
67 [[nodiscard]] SolutionReason get_reason() const override;
68 [[nodiscard]] double get_best_obj() const override;
69 [[nodiscard]] double get_best_bound() const override;
70 [[nodiscard]] double get_var_primal(const Var &t_var) const override;
71 [[nodiscard]] double get_var_reduced_cost(const Var &t_var) const override;
72 [[nodiscard]] double get_var_ray(const Var &t_var) const override;
73 [[nodiscard]] double get_ctr_dual(const Ctr &t_ctr) const override;
74 [[nodiscard]] double get_ctr_farkas(const Ctr &t_ctr) const override;
75 [[nodiscard]] double get_relative_gap() const override;
76 [[nodiscard]] double get_absolute_gap() const override;
77 [[nodiscard]] unsigned int get_n_solutions() const override;
78 [[nodiscard]] unsigned int get_solution_index() const override;
79 void set_solution_index(unsigned int t_index) override;
80
81 static Model read_from_glpk(idol::Env& t_env, glp_prob* t_model);
82 static Model read_from_lp_file(Env& t_env, const std::string& t_filename);
83 static Model read_from_mps_file(Env& t_env, const std::string& t_filename);
84public:
85 explicit GLPK(const Model& t_model, bool t_continuous_relaxation);
86
87 [[nodiscard]] std::string name() const override { return "GLPK"; }
88 void set_param_time_limit(double t_time_limit) override;
89 void set_param_best_obj_stop(double t_best_obj_stop) override;
90 void set_param_best_bound_stop(double t_best_bound_stop) override;
91 void set_param_presolve(bool t_value) override;
92 void set_param_logs(bool t_value) override;
93
94 static Model read_from_file(Env& t_env, const std::string& t_filename);
95
96};
97
98#define GLPK_SYM_PTR(name) \
99typedef decltype(::name)* name##_t; \
100name##_t name = nullptr
101
103 void* m_handle = nullptr;
104
105 static std::string find_library();
106public:
107 GLPK_SYM_PTR(glp_init_smcp);
108 GLPK_SYM_PTR(glp_init_iocp);
109 GLPK_SYM_PTR(glp_create_prob);
110 GLPK_SYM_PTR(glp_delete_prob);
111 GLPK_SYM_PTR(glp_simplex);
112 GLPK_SYM_PTR(glp_intopt);
113 GLPK_SYM_PTR(glp_add_rows);
114 GLPK_SYM_PTR(glp_add_cols);
115 GLPK_SYM_PTR(glp_set_row_bnds);
116 GLPK_SYM_PTR(glp_set_col_bnds);
117 GLPK_SYM_PTR(glp_set_col_kind);
118 GLPK_SYM_PTR(glp_set_obj_coef);
119 GLPK_SYM_PTR(glp_get_num_rows);
120 GLPK_SYM_PTR(glp_get_num_cols);
121 GLPK_SYM_PTR(glp_get_col_prim);
122 GLPK_SYM_PTR(glp_get_col_dual);
123 GLPK_SYM_PTR(glp_get_row_dual);
124 GLPK_SYM_PTR(glp_write_lp);
125 GLPK_SYM_PTR(glp_set_col_name);
126 GLPK_SYM_PTR(glp_set_row_name);
127 GLPK_SYM_PTR(glp_set_mat_col);
128 GLPK_SYM_PTR(glp_set_mat_row);
129 GLPK_SYM_PTR(glp_set_obj_dir);
130 GLPK_SYM_PTR(glp_get_col_stat);
131 GLPK_SYM_PTR(glp_std_basis);
132 GLPK_SYM_PTR(glp_get_num_int);
133 GLPK_SYM_PTR(glp_get_status);
134 GLPK_SYM_PTR(glp_get_row_stat);
135 GLPK_SYM_PTR(glp_del_cols);
136 GLPK_SYM_PTR(glp_del_rows);
137 GLPK_SYM_PTR(glp_set_col_stat);
138 GLPK_SYM_PTR(glp_set_row_stat);
139 GLPK_SYM_PTR(glp_mip_col_val);
140 GLPK_SYM_PTR(glp_get_col_lb);
141 GLPK_SYM_PTR(glp_get_col_ub);
142 GLPK_SYM_PTR(glp_get_obj_coef);
143 GLPK_SYM_PTR(glp_get_col_kind);
144 GLPK_SYM_PTR(glp_get_col_name);
145 GLPK_SYM_PTR(glp_get_row_ub);
146 GLPK_SYM_PTR(glp_get_row_lb);
147 GLPK_SYM_PTR(glp_get_row_name);
148 GLPK_SYM_PTR(glp_get_mat_row);
149 GLPK_SYM_PTR(glp_read_lp);
150 GLPK_SYM_PTR(glp_read_mps);
151 GLPK_SYM_PTR(glp_get_obj_val);
152 GLPK_SYM_PTR(glp_mip_status);
153 GLPK_SYM_PTR(glp_mip_obj_val);
154 GLPK_SYM_PTR(glp_get_row_type);
155 GLPK_SYM_PTR(glp_get_obj_dir);
156
157 DynamicLib();
158
159 ~DynamicLib();
160};
161
162#endif //IDOL_OPTIMIZERS_GLPK_H