OR-Tools  8.1
gurobi_environment.cc
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 
16 #include <string>
17 
18 #include "absl/status/status.h"
19 #include "absl/strings/match.h"
20 #include "absl/strings/str_cat.h"
21 #include "absl/strings/str_format.h"
22 #include "ortools/base/logging.h"
24 
25 namespace operations_research {
26 absl::Status LoadGurobiEnvironment(GRBenv** env) {
27  constexpr int GRB_OK = 0;
28  const char kGurobiEnvErrorMsg[] =
29  "Could not load Gurobi environment. Is gurobi correctly installed and "
30  "licensed on this machine?";
31 
32  if (GRBloadenv(env, nullptr) != 0 || *env == nullptr) {
33  return absl::FailedPreconditionError(
34  absl::StrFormat("%s %s", kGurobiEnvErrorMsg, GRBgeterrormsg(*env)));
35  }
36  return absl::OkStatus();
37 }
38 
39 std::function<int(GRBmodel*, int, int*, double*, double, double, const char*)>
40  GRBaddrangeconstr = nullptr;
41 std::function<int(GRBmodel* model, int numnz, int* vind, double* vval,
42  double obj, double lb, double ub, char vtype,
43  const char* varname)>
44  GRBaddvar = nullptr;
45 std::function<int(GRBmodel*, int, int, int*, int*, double*, double*, double*,
46  double*, char*, char**)>
47  GRBaddvars = nullptr;
48 std::function<int(GRBmodel* model, int numchgs, int* cind, int* vind,
49  double* val)>
50  GRBchgcoeffs = nullptr;
51 std::function<void(GRBenv*)> GRBfreeenv = nullptr;
52 std::function<int(GRBmodel*)> GRBfreemodel = nullptr;
53 std::function<int(GRBmodel*, const char*, int, char*)> GRBgetcharattrelement =
54  nullptr;
55 std::function<int(GRBmodel*, const char*, double*)> GRBgetdblattr = nullptr;
56 std::function<int(GRBmodel*, const char*, int, int, double*)>
57  GRBgetdblattrarray = nullptr;
58 std::function<int(GRBmodel*, const char*, int, double*)> GRBgetdblattrelement =
59  nullptr;
60 std::function<int(GRBenv*, const char*, double*)> GRBgetdblparam = nullptr;
61 std::function<GRBenv*(GRBmodel*)> GRBgetenv = nullptr;
62 std::function<char*(GRBenv*)> GRBgeterrormsg = nullptr;
63 std::function<int(GRBmodel*, const char*, int*)> GRBgetintattr = nullptr;
64 std::function<int(GRBmodel*, const char*, int, int*)> GRBgetintattrelement =
65  nullptr;
66 std::function<int(GRBenv**, const char*)> GRBloadenv = nullptr;
67 std::function<int(GRBenv*, GRBmodel**, const char*, int numvars, double*,
68  double*, double*, char*, char**)>
69  GRBnewmodel = nullptr;
70 std::function<int(GRBmodel*)> GRBoptimize = nullptr;
71 std::function<int(GRBenv*, const char*)> GRBreadparams = nullptr;
72 std::function<int(GRBenv*)> GRBresetparams = nullptr;
73 std::function<int(GRBmodel*, const char*, int, char)> GRBsetcharattrelement =
74  nullptr;
75 std::function<int(GRBmodel*, const char*, double)> GRBsetdblattr = nullptr;
76 std::function<int(GRBmodel*, const char*, int, double)> GRBsetdblattrelement =
77  nullptr;
78 std::function<int(GRBenv*, const char*, double)> GRBsetdblparam = nullptr;
79 std::function<int(GRBmodel*, const char*, int)> GRBsetintattr = nullptr;
80 std::function<int(GRBenv*, const char*, int)> GRBsetintparam = nullptr;
81 std::function<void(GRBmodel*)> GRBterminate = nullptr;
82 std::function<int(GRBmodel*)> GRBupdatemodel = nullptr;
83 std::function<void(int*, int*, int*)> GRBversion = nullptr;
84 std::function<int(GRBmodel*, const char*)> GRBwrite = nullptr;
85 std::function<int(void* cbdata, int where, int what, void* resultP)> GRBcbget =
86  nullptr;
87 std::function<int(void* cbdata, int cutlen, const int* cutind,
88  const double* cutval, char cutsense, double cutrhs)>
89  GRBcbcut = nullptr;
90 std::function<int(void* cbdata, int lazylen, const int* lazyind,
91  const double* lazyval, char lazysense, double lazyrhs)>
92  GRBcblazy = nullptr;
93 std::function<int(void* cbdata, const double* solution, double* objvalP)>
94  GRBcbsolution = nullptr;
95 std::function<int(GRBmodel* model, int numnz, int* cind, double* cval,
96  char sense, double rhs, const char* constrname)>
97  GRBaddconstr = nullptr;
98 std::function<int(GRBmodel* model, const char* name, int binvar, int binval,
99  int nvars, const int* vars, const double* vals, char sense,
100  double rhs)>
102 std::function<int(GRBmodel* model, const char* attrname, int element,
103  int newvalue)>
105 std::function<int(GRBmodel* model, int(STDCALL* cb)(CB_ARGS), void* usrdata)>
107 std::function<int(GRBenv* env, const char* paramname, const char* value)>
108  GRBsetparam = nullptr;
109 std::function<int(GRBmodel* model, int numsos, int nummembers, int* types,
110  int* beg, int* ind, double* weight)>
111  GRBaddsos = nullptr;
112 std::function<int(GRBmodel* model, int numlnz, int* lind, double* lval,
113  int numqnz, int* qrow, int* qcol, double* qval, char sense,
114  double rhs, const char* QCname)>
115  GRBaddqconstr = nullptr;
116 std::function<int(GRBmodel* model, const char* name, int resvar, int nvars,
117  const int* vars, double constant)>
119 std::function<int(GRBmodel* model, const char* name, int resvar, int nvars,
120  const int* vars, double constant)>
122 std::function<int(GRBmodel* model, const char* name, int resvar, int argvar)>
124 std::function<int(GRBmodel* model, const char* name, int resvar, int nvars,
125  const int* vars)>
127 std::function<int(GRBmodel* model, const char* name, int resvar, int nvars,
128  const int* vars)>
129  GRBaddgenconstrOr = nullptr;
130 std::function<int(GRBmodel* model, int numqnz, int* qrow, int* qcol,
131  double* qval)>
132  GRBaddqpterms = nullptr;
133 
134 std::unique_ptr<DynamicLibrary> gurobi_dynamic_library;
136 
200 }
201 
202 bool LoadSpecificGurobiLibrary(const std::string& full_library_path) {
203  CHECK(gurobi_dynamic_library.get() != nullptr);
204  VLOG(1) << "Try to load from " << full_library_path;
205  return gurobi_dynamic_library->TryToLoad(full_library_path);
206 }
207 
208 namespace {
209 const std::vector<std::vector<std::string>> GurobiVersionLib = {
210  {"911", "91"}, {"910", "91"}, {"903", "90"}, {"902", "90"}};
211 }
212 
214  if (!gurobi_library_path.empty() &&
216  return true;
217  }
218 
219  const char* gurobi_home_from_env = getenv("GUROBI_HOME");
220  for (const std::vector<std::string>& version_lib : GurobiVersionLib) {
221  const std::string& dir = version_lib[0];
222  const std::string& number = version_lib[1];
223 #if defined(_MSC_VER) // Windows
224  if (gurobi_home_from_env != nullptr &&
225  LoadSpecificGurobiLibrary(absl::StrCat(
226  gurobi_home_from_env, "\\bin\\gurobi", number, ".dll"))) {
227  return true;
228  }
230  absl::StrCat("C:\\Program Files\\gurobi", dir,
231  "\\win64\\bin\\gurobi", number, ".dll"))) {
232  return true;
233  }
234 #elif defined(__APPLE__) // OS X
235  if (gurobi_home_from_env != nullptr &&
236  LoadSpecificGurobiLibrary(absl::StrCat(
237  gurobi_home_from_env, "/lib/libgurobi", number, ".dylib"))) {
238  return true;
239  }
240  if (LoadSpecificGurobiLibrary(absl::StrCat(
241  "/Library/gurobi", dir, "/mac64/lib/libgurobi", number, ".dylib"))) {
242  return true;
243  }
244 #elif defined(__GNUC__) // Linux
245  if (gurobi_home_from_env != nullptr &&
246  LoadSpecificGurobiLibrary(absl::StrCat(
247  gurobi_home_from_env, "/lib/libgurobi", number, ".so"))) {
248  return true;
249  }
250  if (gurobi_home_from_env != nullptr &&
251  LoadSpecificGurobiLibrary(absl::StrCat(
252  gurobi_home_from_env, "/lib64/libgurobi", number, ".so"))) {
253  return true;
254  }
255 #endif
256  }
257 
258  return false;
259 }
260 
262  if (gurobi_dynamic_library.get() != nullptr) {
263  return gurobi_dynamic_library->LibraryIsLoaded();
264  }
265 
267 
270  return true;
271  }
272 
273  return false;
274 }
275 
276 void MPSolver::SetGurobiLibraryPath(const std::string& full_library_path) {
277  gurobi_library_path = full_library_path;
278 }
279 
280 bool MPSolver::GurobiIsCorrectlyInstalled() {
281  if (!LoadGurobiSharedLibrary()) return false;
282  GRBenv* env;
283  if (GRBloadenv(&env, nullptr) != 0 || env == nullptr) return false;
284 
285  GRBfreeenv(env);
286 
287  return true;
288 }
289 
290 } // namespace operations_research
VLOG
#define VLOG(verboselevel)
Definition: base/logging.h:978
STDCALL
#define STDCALL
Definition: gurobi_environment.h:25
operations_research::GRBaddgenconstrIndicator
std::function< int(GRBmodel *model, const char *name, int binvar, int binval, int nvars, const int *vars, const double *vals, char sense, double rhs)> GRBaddgenconstrIndicator
Definition: gurobi_environment.cc:101
where
int where
Definition: gurobi_interface.cc:271
operations_research::GRBloadenv
std::function< int(GRBenv **, const char *)> GRBloadenv
Definition: gurobi_environment.cc:66
operations_research::GRBsetcallbackfunc
std::function< int(GRBmodel *model, int(STDCALL *cb)(CB_ARGS), void *usrdata)> GRBsetcallbackfunc
Definition: gurobi_environment.cc:106
NAMEOF
#define NAMEOF(x)
Definition: dynamic_library.h:30
operations_research::GRBsetintparam
std::function< int(GRBenv *, const char *, int)> GRBsetintparam
Definition: gurobi_environment.cc:80
logging.h
operations_research::GRBcbget
std::function< int(void *cbdata, int where, int what, void *resultP)> GRBcbget
Definition: gurobi_environment.cc:85
operations_research::GRBcblazy
std::function< int(void *cbdata, int lazylen, const int *lazyind, const double *lazyval, char lazysense, double lazyrhs)> GRBcblazy
Definition: gurobi_environment.cc:92
value
int64 value
Definition: demon_profiler.cc:43
DynamicLibrary
Definition: dynamic_library.h:32
weight
int64 weight
Definition: pack.cc:509
operations_research
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
Definition: dense_doubly_linked_list.h:21
operations_research::GRBgeterrormsg
std::function< char *(GRBenv *)> GRBgeterrormsg
Definition: gurobi_environment.cc:62
operations_research::LoadSpecificGurobiLibrary
bool LoadSpecificGurobiLibrary(const std::string &full_library_path)
Definition: gurobi_environment.cc:202
operations_research::LoadGurobiEnvironment
absl::Status LoadGurobiEnvironment(GRBenv **env)
Definition: gurobi_environment.cc:26
operations_research::GRBaddgenconstrAnd
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars)> GRBaddgenconstrAnd
Definition: gurobi_environment.cc:126
operations_research::GRBaddgenconstrAbs
std::function< int(GRBmodel *model, const char *name, int resvar, int argvar)> GRBaddgenconstrAbs
Definition: gurobi_environment.cc:123
operations_research::GRBwrite
std::function< int(GRBmodel *, const char *)> GRBwrite
Definition: gurobi_environment.cc:84
operations_research::GRBreadparams
std::function< int(GRBenv *, const char *)> GRBreadparams
Definition: gurobi_environment.cc:71
operations_research::GRBgetdblparam
std::function< int(GRBenv *, const char *, double *)> GRBgetdblparam
Definition: gurobi_environment.cc:60
operations_research::GRBsetparam
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetparam
Definition: gurobi_environment.cc:108
operations_research::GRBgetdblattr
std::function< int(GRBmodel *, const char *, double *)> GRBgetdblattr
Definition: gurobi_environment.cc:55
operations_research::GRBfreemodel
std::function< int(GRBmodel *)> GRBfreemodel
Definition: gurobi_environment.cc:52
operations_research::GRBnewmodel
std::function< int(GRBenv *, GRBmodel **, const char *, int numvars, double *, double *, double *, char *, char **)> GRBnewmodel
Definition: gurobi_environment.cc:69
operations_research::GRBsetintattr
std::function< int(GRBmodel *, const char *, int)> GRBsetintattr
Definition: gurobi_environment.cc:79
operations_research::GRBresetparams
std::function< int(GRBenv *)> GRBresetparams
Definition: gurobi_environment.cc:72
operations_research::GRBgetdblattrarray
std::function< int(GRBmodel *, const char *, int, int, double *)> GRBgetdblattrarray
Definition: gurobi_environment.cc:57
operations_research::GRBcbcut
std::function< int(void *cbdata, int cutlen, const int *cutind, const double *cutval, char cutsense, double cutrhs)> GRBcbcut
Definition: gurobi_environment.cc:89
operations_research::GRBaddgenconstrMax
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars, double constant)> GRBaddgenconstrMax
Definition: gurobi_environment.cc:118
operations_research::GRBchgcoeffs
std::function< int(GRBmodel *model, int numchgs, int *cind, int *vind, double *val)> GRBchgcoeffs
Definition: gurobi_environment.cc:50
operations_research::GRBsetintattrelement
std::function< int(GRBmodel *model, const char *attrname, int element, int newvalue)> GRBsetintattrelement
Definition: gurobi_environment.cc:104
operations_research::GRBsetcharattrelement
std::function< int(GRBmodel *, const char *, int, char)> GRBsetcharattrelement
Definition: gurobi_environment.cc:73
operations_research::SearchForGurobiDynamicLibrary
bool SearchForGurobiDynamicLibrary()
Definition: gurobi_environment.cc:213
operations_research::GRBsetdblattrelement
std::function< int(GRBmodel *, const char *, int, double)> GRBsetdblattrelement
Definition: gurobi_environment.cc:76
operations_research::GRBversion
std::function< void(int *, int *, int *)> GRBversion
Definition: gurobi_environment.cc:83
operations_research::GRBsetdblattr
std::function< int(GRBmodel *, const char *, double)> GRBsetdblattr
Definition: gurobi_environment.cc:75
operations_research::MPSolver::SetGurobiLibraryPath
static void SetGurobiLibraryPath(const std::string &full_library_path)
Definition: gurobi_environment.cc:276
operations_research::GRBaddsos
std::function< int(GRBmodel *model, int numsos, int nummembers, int *types, int *beg, int *ind, double *weight)> GRBaddsos
Definition: gurobi_environment.cc:111
operations_research::GRBaddrangeconstr
std::function< int(GRBmodel *, int, int *, double *, double, double, const char *)> GRBaddrangeconstr
Definition: gurobi_environment.cc:40
operations_research::GRBcbsolution
std::function< int(void *cbdata, const double *solution, double *objvalP)> GRBcbsolution
Definition: gurobi_environment.cc:94
operations_research::GRBgetintattr
std::function< int(GRBmodel *, const char *, int *)> GRBgetintattr
Definition: gurobi_environment.cc:63
operations_research::GRBaddgenconstrMin
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars, double constant)> GRBaddgenconstrMin
Definition: gurobi_environment.cc:121
GRBenv
struct _GRBenv GRBenv
Definition: gurobi_environment.h:30
operations_research::MPSolver::LoadGurobiSharedLibrary
static bool LoadGurobiSharedLibrary()
Definition: gurobi_environment.cc:261
model
GRBmodel * model
Definition: gurobi_interface.cc:269
operations_research::LoadGurobiFunctions
void LoadGurobiFunctions()
Definition: gurobi_environment.cc:137
operations_research::GRBoptimize
std::function< int(GRBmodel *)> GRBoptimize
Definition: gurobi_environment.cc:70
operations_research::GRBaddqconstr
std::function< int(GRBmodel *model, int numlnz, int *lind, double *lval, int numqnz, int *qrow, int *qcol, double *qval, char sense, double rhs, const char *QCname)> GRBaddqconstr
Definition: gurobi_environment.cc:115
operations_research::GRBaddvar
std::function< int(GRBmodel *model, int numnz, int *vind, double *vval, double obj, double lb, double ub, char vtype, const char *varname)> GRBaddvar
Definition: gurobi_environment.cc:44
operations_research::GRBaddgenconstrOr
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars)> GRBaddgenconstrOr
Definition: gurobi_environment.cc:129
gurobi_environment.h
operations_research::GRBaddqpterms
std::function< int(GRBmodel *model, int numqnz, int *qrow, int *qcol, double *qval)> GRBaddqpterms
Definition: gurobi_environment.cc:132
operations_research::GRBgetenv
std::function< GRBenv *(GRBmodel *)> GRBgetenv
Definition: gurobi_environment.cc:61
linear_solver.h
A C++ wrapper that provides a simple and unified interface to several linear programming and mixed in...
operations_research::GRBupdatemodel
std::function< int(GRBmodel *)> GRBupdatemodel
Definition: gurobi_environment.cc:82
operations_research::GRBgetcharattrelement
std::function< int(GRBmodel *, const char *, int, char *)> GRBgetcharattrelement
Definition: gurobi_environment.cc:53
GRBmodel
struct _GRBmodel GRBmodel
Definition: gurobi_environment.h:29
operations_research::GRBsetdblparam
std::function< int(GRBenv *, const char *, double)> GRBsetdblparam
Definition: gurobi_environment.cc:78
operations_research::GRBgetdblattrelement
std::function< int(GRBmodel *, const char *, int, double *)> GRBgetdblattrelement
Definition: gurobi_environment.cc:58
operations_research::GRBgetintattrelement
std::function< int(GRBmodel *, const char *, int, int *)> GRBgetintattrelement
Definition: gurobi_environment.cc:64
operations_research::GRBterminate
std::function< void(GRBmodel *)> GRBterminate
Definition: gurobi_environment.cc:81
operations_research::GRBfreeenv
std::function< void(GRBenv *)> GRBfreeenv
Definition: gurobi_environment.cc:51
operations_research::GRBaddconstr
std::function< int(GRBmodel *model, int numnz, int *cind, double *cval, char sense, double rhs, const char *constrname)> GRBaddconstr
Definition: gurobi_environment.cc:97
CHECK
#define CHECK(condition)
Definition: base/logging.h:495
name
const std::string name
Definition: default_search.cc:808
operations_research::gurobi_dynamic_library
std::unique_ptr< DynamicLibrary > gurobi_dynamic_library
Definition: gurobi_environment.cc:134
operations_research::GRBaddvars
std::function< int(GRBmodel *, int, int, int *, int *, double *, double *, double *, double *, char *, char **)> GRBaddvars
Definition: gurobi_environment.cc:47
operations_research::gurobi_library_path
std::string gurobi_library_path
Definition: gurobi_environment.cc:135
CB_ARGS
#define CB_ARGS
Definition: gurobi_environment.h:36