20 static std::unique_ptr<DynamicLib> m_dynamic_lib;
22 bool m_continuous_relaxation;
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;
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;
35 std::stack<int> m_deleted_variables;
36 std::stack<int> m_deleted_constraints;
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);
61 void save_simplex_solution_status();
62 void compute_farkas_certificate();
63 void compute_unbounded_ray();
64 void save_milp_solution_status();
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;
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);
85 explicit GLPK(
const Model& t_model,
bool t_continuous_relaxation);
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;
94 static Model read_from_file(
Env& t_env,
const std::string& t_filename);
103 void* m_handle =
nullptr;
105 static std::string find_library();
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);