ZonoOpt 2.4.0
Loading...
Searching...
No Matches
GurobiApi.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_GUROBI_API_HPP_
2#define ZONOOPT_GUROBI_API_HPP_
3
10#ifdef _WIN32
11 #include <windows.h>
12 typedef HMODULE ZonoOptLibHandle;
13 #define ZONOOPT_GET_SYMBOL GetProcAddress
14#else
15 #include <dlfcn.h>
16 typedef void* ZonoOptLibHandle;
17 #define ZONOOPT_GET_SYMBOL dlsym
18#endif
19
20#include <vector>
21#include <string>
22#include <memory>
23
24namespace ZonoOpt
25{
26namespace detail
27{
28
29class GurobiApi {
30public:
31
32 struct ModelDeleter {
33 void operator()(void* model) const;
34 };
35
36 using Model = std::unique_ptr<void, ModelDeleter>;
37 using Env = std::shared_ptr<void>;
38
39 using LibPtr = std::shared_ptr<void>;
40
41 // function signatures
42 typedef int (*GRBloadenv_t)(void**, const char*);
43 typedef int (*GRBnewmodel_t)(void*, void**, const char*, int, double*, double*, double*, char*, const char**);
44 typedef void (*GRBfreeenv_t)(void*);
45 typedef void (*GRBfreemodel_t)(void*);
46 typedef int (*GRBaddconstr_t)(void*, int, int*, double*, char, double, const char*);
47 typedef int (*GRBoptimize_t)(void*);
48 typedef int (*GRBaddqpterms_t)(void*, int, int*, int*, double*);
49 typedef int (*GRBupdatemodel_t)(void*);
50 typedef int (*GRBgetintattr_t)(void*, const char*, int*);
51 typedef int (*GRBgetdblattr_t)(void*, const char*, double*);
52 typedef int (*GRBgetdblattrarray_t)(void*, const char*, int, int, double*);
53 typedef int (*GRBsetintparam_t)(void*, const char*, int);
54 typedef int (*GRBsetdblparam_t)(void*, const char*, double);
55 typedef int (*GRBsetstrparam_t)(void*, const char*, const char*);
56 typedef void (*GRBversion_t)(int*, int*, int*);
57 typedef void* (*GRBgetenv_t)(void*);
58 typedef int (*GRBemptyenv_t)(void**);
59 typedef int (*GRBstartenv_t)(void*);
60
61 // function pointers
62 GRBloadenv_t GRBloadenv = nullptr;
63 GRBnewmodel_t GRBnewmodel = nullptr;
64 GRBfreeenv_t GRBfreeenv = nullptr;
65 GRBfreemodel_t GRBfreemodel = nullptr;
66 GRBaddconstr_t GRBaddconstr = nullptr;
67 GRBoptimize_t GRBoptimize = nullptr;
68 GRBaddqpterms_t GRBaddqpterms = nullptr;
69 GRBupdatemodel_t GRBupdatemodel = nullptr;
70 GRBgetintattr_t GRBgetintattr = nullptr;
71 GRBgetdblattr_t GRBgetdblattr = nullptr;
72 GRBgetdblattrarray_t GRBgetdblattrarray = nullptr;
73 GRBsetintparam_t GRBsetintparam = nullptr;
74 GRBsetdblparam_t GRBsetdblparam = nullptr;
75 GRBsetstrparam_t GRBsetstrparam = nullptr;
76 GRBversion_t GRBversion = nullptr;
77 GRBgetenv_t GRBgetenv = nullptr;
78 GRBemptyenv_t GRBemptyenv = nullptr;
79 GRBstartenv_t GRBstartenv = nullptr;
80
81 // API management
82 static GurobiApi& instance();
83
84 bool is_available() const { return _lib_ptr != nullptr; }
85
88 const std::string& unavailable_reason() const { return _unavailable_reason; }
89
90 int gurobi_major = 0;
91 int gurobi_minor = 0;
92 int gurobi_tech = 0;
93
95 static constexpr int MIN_GUROBI_MAJOR = 9;
96
97 // model and environment
98 Env create_env(const std::string& log = "");
99 Model create_model(Env& env, const std::string& name, int numvars = 0, double* obj = nullptr,
100 double* lb = nullptr, double* ub = nullptr, char* vtype = nullptr,
101 const char** varnames = nullptr);
102
103 // function wrappers (throw std::runtime_error on failure)
104 void add_constr(Model& model, int nnz, int* ind, double* val, char sense, double rhs, const char* name = nullptr);
105 void optimize(Model& model);
106 void add_qp_terms(Model& model, int nnz, int* qrow, int* qcol, double* qval);
107 void update_model(Model& model);
108 void get_int_attr(Model& model, const std::string& attr_name, int& value_out);
109 void get_dbl_attr(Model& model, const std::string& attr_name, double& value_out);
110 void get_dbl_attr_array(Model& model, const std::string& attr_name, int start, int len, double* arr_out);
111 void set_int_param(Model& model, const std::string& param_name, int value);
112 void set_dbl_param(Model& model, const std::string& param_name, double value);
113 void set_str_param(Model& model, const std::string& param_name, const std::string& value);
114
115private:
116 LibPtr _lib_ptr = nullptr;
117 std::string _unavailable_reason;
118 GurobiApi();
119 ~GurobiApi() = default;
120 GurobiApi(const GurobiApi&) = delete;
121 GurobiApi& operator=(const GurobiApi&) = delete;
122
123 ZonoOptLibHandle load_library();
124 ZonoOptLibHandle load_library_from_path(const std::string& path, const std::vector<std::string>& names);
125};
126
127} // namespace detail
128} // namespace ZonoOpt
129
130#endif
void * ZonoOptLibHandle
Definition GurobiApi.hpp:16
std::vector< char > vtype
Definition GurobiSolver.cpp:374
GurobiApi::Env env
Definition GurobiSolver.cpp:81
GurobiApi::Model model
Definition GurobiSolver.cpp:82
Definition ZonoOpt.hpp:58