19 #include "absl/status/status.h"
20 #include "absl/status/statusor.h"
21 #include "absl/strings/match.h"
22 #include "absl/strings/str_cat.h"
23 #include "absl/strings/str_format.h"
24 #include "absl/strings/str_join.h"
25 #include "absl/synchronization/mutex.h"
47 std::function<int(
GRBenv**,
const char*,
const char*,
const char*,
int,
52 std::function<int(
GRBmodel*
model,
const char* attrname,
int* valueP)>
54 std::function<int(
GRBmodel*
model,
const char* attrname,
int newvalue)>
56 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
59 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
62 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
65 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
68 std::function<int(
GRBmodel*
model,
const char* attrname,
int len,
int* ind,
71 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
74 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
77 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
80 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
83 std::function<int(
GRBmodel*
model,
const char* attrname,
int len,
int* ind,
86 std::function<int(
GRBmodel*
model,
const char* attrname,
double* valueP)>
88 std::function<int(
GRBmodel*
model,
const char* attrname,
double newvalue)>
90 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
93 std::function<int(
GRBmodel*
model,
const char* attrname,
int element,
96 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
99 std::function<int(
GRBmodel*
model,
const char* attrname,
int first,
int len,
102 std::function<int(
GRBmodel*
model,
const char* attrname,
int len,
int* ind,
105 std::function<int(
GRBmodel*
model,
const char* attrname,
char** valueP)>
107 std::function<int(
GRBmodel*
model,
const char* attrname,
const char* newvalue)>
112 std::function<int(
void* cbdata,
int where,
int what,
void* resultP)>
GRBcbget =
114 std::function<int(
void* cbdata,
const double* solution,
double* objvalP)>
116 std::function<int(
void* cbdata,
int cutlen,
const int* cutind,
117 const double* cutval,
char cutsense,
double cutrhs)>
119 std::function<int(
void* cbdata,
int lazylen,
const int* lazyind,
120 const double* lazyval,
char lazysense,
double lazyrhs)>
122 std::function<int(
GRBmodel*
model,
int* numnzP,
int* vbeg,
int* vind,
123 double* vval,
int start,
int len)>
127 std::function<int(
GRBenv* env,
GRBmodel** modelP,
const char* Pname,
128 int numvars,
double* obj,
double* lb,
double* ub,
char* vtype,
131 std::function<int(
GRBmodel*
model,
int numnz,
int* vind,
double* vval,
132 double obj,
double lb,
double ub,
char vtype,
133 const char* varname)>
135 std::function<int(
GRBmodel*
model,
int numvars,
int numnz,
int* vbeg,
int* vind,
136 double* vval,
double* obj,
double* lb,
double* ub,
137 char* vtype,
char** varnames)>
139 std::function<int(
GRBmodel*
model,
int numnz,
int* cind,
double* cval,
140 char sense,
double rhs,
const char* constrname)>
142 std::function<int(
GRBmodel*
model,
int numconstrs,
int numnz,
int* cbeg,
143 int* cind,
double* cval,
char* sense,
double* rhs,
146 std::function<int(
GRBmodel*
model,
int numnz,
int* cind,
double* cval,
147 double lower,
double upper,
const char* constrname)>
149 std::function<int(
GRBmodel*
model,
int numsos,
int nummembers,
int* types,
150 int* beg,
int* ind,
double*
weight)>
153 const int* vars,
double constant)>
156 const int* vars,
double constant)>
167 int nvars,
const int* vars,
const double* vals,
char sense,
170 std::function<int(
GRBmodel*
model,
int numlnz,
int* lind,
double* lval,
171 int numqnz,
int* qrow,
int* qcol,
double* qval,
char sense,
172 double rhs,
const char* QCname)>
174 std::function<int(
GRBmodel*
model,
int numqnz,
int* qrow,
int* qcol,
184 std::function<int(
GRBmodel*
model,
int cnt,
int* cind,
int* vind,
double* val)>
190 double abstol,
double reltol,
const char*
name,
191 double constant,
int lnz,
int* lind,
double* lval)>
193 std::function<int(
GRBenv* env,
const char* paramname,
int* valueP)>
195 std::function<int(
GRBenv* env,
const char* paramname,
double* valueP)>
197 std::function<int(
GRBenv* env,
const char* paramname,
char* valueP)>
199 std::function<int(
GRBenv* env,
const char* paramname,
const char*
value)>
201 std::function<int(
GRBenv* env,
const char* paramname,
int value)>
203 std::function<int(
GRBenv* env,
const char* paramname,
double value)>
205 std::function<int(
GRBenv* env,
const char* paramname,
const char*
value)>
213 std::function<void(
int* majorP,
int* minorP,
int* technicalP)>
GRBversion =
224 "GRBisattravailable");
228 "GRBgetintattrelement");
230 "GRBsetintattrelement");
232 "GRBgetintattrarray");
234 "GRBsetintattrarray");
237 "GRBgetcharattrelement");
239 "GRBsetcharattrelement");
241 "GRBgetcharattrarray");
243 "GRBsetcharattrarray");
245 "GRBsetcharattrlist");
249 "GRBgetdblattrelement");
251 "GRBsetdblattrelement");
253 "GRBgetdblattrarray");
255 "GRBsetdblattrarray");
260 "GRBsetcallbackfunc");
276 "GRBaddgenconstrMax");
278 "GRBaddgenconstrMin");
280 "GRBaddgenconstrAbs");
282 "GRBaddgenconstrAnd");
285 "GRBaddgenconstrIndicator");
317 std::vector<std::string> potential_paths;
318 const std::vector<std::string> kGurobiVersions = {
"1000",
"952",
"951",
"950",
319 "911",
"910",
"903",
"902",
320 "811",
"801",
"752"};
321 potential_paths.reserve(kGurobiVersions.size() * 3);
324 const char* gurobi_home_from_env = getenv(
"GUROBI_HOME");
325 if (gurobi_home_from_env !=
nullptr) {
326 for (
const std::string& version : kGurobiVersions) {
327 const std::string lib = version.substr(0, version.size() - 1);
328 #if defined(_MSC_VER)
329 potential_paths.push_back(
330 absl::StrCat(gurobi_home_from_env,
"\\bin\\gurobi", lib,
".dll"));
331 #elif defined(__APPLE__)
332 potential_paths.push_back(
333 absl::StrCat(gurobi_home_from_env,
"/lib/libgurobi", lib,
".dylib"));
334 #elif defined(__GNUC__)
335 potential_paths.push_back(
336 absl::StrCat(gurobi_home_from_env,
"/lib/libgurobi", lib,
".so"));
337 potential_paths.push_back(
338 absl::StrCat(gurobi_home_from_env,
"/lib64/libgurobi", lib,
".so"));
340 LOG(ERROR) <<
"OS Not recognized by gurobi/environment.cc."
341 <<
" You won't be able to use Gurobi.";
347 for (
const std::string& version : kGurobiVersions) {
348 const std::string lib = version.substr(0, version.size() - 1);
349 #if defined(_MSC_VER)
350 potential_paths.push_back(absl::StrCat(
"C:\\Program Files\\gurobi", version,
351 "\\win64\\bin\\gurobi", lib,
353 potential_paths.push_back(absl::StrCat(
354 "C:\\gurobi", version,
"\\win64\\bin\\gurobi", lib,
".dll"));
355 #elif defined(__APPLE__)
356 potential_paths.push_back(absl::StrCat(
357 "/Library/gurobi", version,
"/mac64/lib/libgurobi", lib,
".dylib"));
358 potential_paths.push_back(absl::StrCat(
"/Library/gurobi", version,
359 "/macos_universal2/lib/libgurobi",
361 #elif defined(__GNUC__)
362 potential_paths.push_back(absl::StrCat(
363 "/opt/gurobi", version,
"/linux64/lib/libgurobi", lib,
".so"));
364 potential_paths.push_back(absl::StrCat(
365 "/opt/gurobi", version,
"/linux64/lib64/libgurobi", lib,
".so"));
366 potential_paths.push_back(
367 absl::StrCat(
"/opt/gurobi/linux64/lib/libgurobi", lib,
".so"));
368 potential_paths.push_back(
369 absl::StrCat(
"/opt/gurobi/linux64/lib64/libgurobi", lib,
".so"));
371 LOG(ERROR) <<
"OS Not recognized by gurobi/environment.cc."
372 <<
" You won't be able to use Gurobi.";
376 #if defined(__GNUC__)
377 for (
const std::string& version : {
"10.0.0",
"9.5.2",
"9.5.1",
"9.5.0"}) {
378 potential_paths.push_back(
379 absl::StrCat(
"/opt/gurobi/linux64/lib/libgurobi.so.", version));
382 return potential_paths;
386 std::vector<std::string> potential_paths) {
387 static std::once_flag gurobi_loading_done;
388 static absl::Status gurobi_load_status;
390 static absl::Mutex mutex;
392 absl::MutexLock lock(&mutex);
394 std::call_once(gurobi_loading_done, [&potential_paths]() {
395 const std::vector<std::string> canonical_paths =
397 potential_paths.insert(potential_paths.end(), canonical_paths.begin(),
398 canonical_paths.end());
399 for (
const std::string& path : potential_paths) {
401 LOG(INFO) <<
"Found the Gurobi library in '" << path <<
".";
408 gurobi_load_status = absl::OkStatus();
410 gurobi_load_status = absl::NotFoundError(absl::StrCat(
411 "Could not find the Gurobi shared library. Looked in: [",
412 absl::StrJoin(potential_paths,
"', '"),
413 "]. If you know where it"
414 " is, pass the full path to 'LoadGurobiDynamicLibrary()'."));
417 return gurobi_load_status;
425 if (
GRBloadenv(&env,
nullptr) != 0 || env ==
nullptr) {
426 return absl::FailedPreconditionError(
427 absl::StrCat(
"Found the Gurobi shared library, but could not create "
428 "Gurobi environment: is Gurobi licensed on this machine?",
#define RETURN_IF_ERROR(expr)
std::function< T > GetFunction(const char *function_name)
bool TryToLoad(const std::string &library_name)
bool LibraryIsLoaded() const
struct _GRBmodel GRBmodel
Collection of objects used to extend the Constraint Solver library.
std::function< int(GRBmodel *model, const char *attrname, int element, char *valueP)> GRBgetcharattrelement
std::function< int(GRBenv *env, const char *paramname, int *valueP)> GRBgetintparam
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars, double constant)> GRBaddgenconstrMin
std::function< int(GRBmodel *model, int numnz, int *cind, double *cval, char sense, double rhs, const char *constrname)> GRBaddconstr
std::function< int(GRBmodel *model, const char *attrname, double *valueP)> GRBgetdblattr
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
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, double *newvalues)> GRBsetdblattrlist
std::function< int(GRBmodel *model, int numnz, int *vind, double *vval, double obj, double lb, double ub, char vtype, const char *varname)> GRBaddvar
std::function< char *(void)> GRBplatform
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelgenconstrs
std::function< void(int *majorP, int *minorP, int *technicalP)> GRBversion
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetparam
std::function< int(GRBmodel *model, const char *attrname, int newvalue)> GRBsetintattr
std::function< int(GRBenv *env, const char *paramname, char *valueP)> GRBgetstrparam
std::function< int(void *cbdata, int lazylen, const int *lazyind, const double *lazyval, char lazysense, double lazyrhs)> GRBcblazy
std::function< int(GRBmodel *model, const char *attrname, int first, int len, int *values)> GRBgetintattrarray
std::function< int(GRBmodel *model, int numconstrs, int numnz, int *cbeg, int *cind, double *cval, char *sense, double *rhs, char **constrnames)> GRBaddconstrs
std::function< int(GRBenv *env, const char *paramname, int value)> GRBsetintparam
std::function< int(GRBmodel *model, const char *name, int resvar, int argvar)> GRBaddgenconstrAbs
std::function< int(void *cbdata, int where, int what, void *resultP)> GRBcbget
std::function< int(GRBmodel *model, int index, int priority, double weight, double abstol, double reltol, const char *name, double constant, int lnz, int *lind, double *lval)> GRBsetobjectiven
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *values)> GRBgetcharattrarray
std::function< int(GRBenv **envP, const char *logfilename)> GRBloadenv
std::function< int(GRBmodel *model, const char *attrname, int element, int *valueP)> GRBgetintattrelement
std::function< int(GRBenv *dest, GRBenv *src)> GRBcopyparams
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *newvalues)> GRBsetdblattrarray
std::function< int(GRBmodel *model)> GRBfreemodel
std::function< void(GRBmodel *model)> GRBterminate
std::function< int(GRBmodel *model, int numqnz, int *qrow, int *qcol, double *qval)> GRBaddqpterms
std::function< int(GRBenv *env, const char *paramname, double *valueP)> GRBgetdblparam
std::function< const char *(GRBenv *env)> GRBgeterrormsg
std::function< int(GRBmodel *model, int cnt, int *cind, int *vind, double *val)> GRBchgcoeffs
absl::StatusOr< GRBenv * > GetGurobiEnv()
std::function< GRBenv *(GRBmodel *model)> GRBgetenv
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelconstrs
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars, double constant)> GRBaddgenconstrMax
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetstrparam
std::function< int(GRBmodel *model, const char *attrname, int element, double newvalue)> GRBsetdblattrelement
void LoadGurobiFunctions(DynamicLibrary *gurobi_dynamic_library)
std::function< int(GRBenv *env)> GRBresetparams
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *values)> GRBgetdblattrarray
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelqconstrs
std::function< int(GRBmodel *model)> GRBupdatemodel
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars)> GRBaddgenconstrAnd
std::function< int(GRBmodel *model)> GRBdelq
std::function< int(GRBmodel *model, int numnz, int *cind, double *cval, double lower, double upper, const char *constrname)> GRBaddrangeconstr
std::vector< std::string > GurobiDynamicLibraryPotentialPaths()
std::function< int(GRBmodel *model, const char *attrname, int element, char newvalue)> GRBsetcharattrelement
std::function< int(GRBmodel *model, const char *attrname, int element, int newvalue)> GRBsetintattrelement
std::function< int(GRBmodel *model, const char *attrname, const char *newvalue)> GRBsetstrattr
std::function< int(GRBmodel *model, const char *attrname, int element, double *valueP)> GRBgetdblattrelement
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars)> GRBaddgenconstrOr
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelsos
std::function< int(void *cbdata, const double *solution, double *objvalP)> GRBcbsolution
std::function< int(GRBmodel *model, const char *attrname)> GRBisattravailable
std::function< int(GRBmodel *model)> GRBoptimize
std::function< int(GRBmodel *model, const char *filename)> GRBwrite
std::function< int(GRBenv **, const char *, const char *, const char *, int, const char *)> GRBisqp
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelvars
bool GurobiIsCorrectlyInstalled()
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, char *newvalues)> GRBsetcharattrlist
std::function< int(GRBmodel *model, const char *attrname, char **valueP)> GRBgetstrattr
std::function< int(GRBenv *env, GRBmodel **modelP, const char *Pname, int numvars, double *obj, double *lb, double *ub, char *vtype, char **varnames)> GRBnewmodel
absl::Status LoadGurobiDynamicLibrary(std::vector< std::string > potential_paths)
std::function< void(GRBenv *env)> GRBfreeenv
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, int *newvalues)> GRBsetintattrlist
std::function< int(GRBmodel *model, int numsos, int nummembers, int *types, int *beg, int *ind, double *weight)> GRBaddsos
std::function< int(void *cbdata, int cutlen, const int *cutind, const double *cutval, char cutsense, double cutrhs)> GRBcbcut
std::function< int(GRBmodel *model, const char *attrname, double newvalue)> GRBsetdblattr
std::function< int(GRBmodel *model, const char *attrname, int first, int len, int *newvalues)> GRBsetintattrarray
std::function< int(GRBmodel *model, int(GUROBI_STDCALL *cb)(CB_ARGS), void *usrdata)> GRBsetcallbackfunc
std::function< int(GRBmodel *model, int *numnzP, int *vbeg, int *vind, double *vval, int start, int len)> GRBgetvars
std::function< int(GRBmodel *model, int numvars, int numnz, int *vbeg, int *vind, double *vval, double *obj, double *lb, double *ub, char *vtype, char **varnames)> GRBaddvars
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *newvalues)> GRBsetcharattrarray
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
std::function< int(GRBmodel *model, const char *attrname, int *valueP)> GRBgetintattr
std::function< int(GRBenv *env, const char *paramname, double value)> GRBsetdblparam