19#include "absl/flags/flag.h"
20#include "absl/status/status.h"
21#include "absl/status/statusor.h"
22#include "absl/strings/match.h"
23#include "absl/strings/str_cat.h"
24#include "absl/strings/str_format.h"
25#include "absl/strings/str_join.h"
26#include "absl/synchronization/mutex.h"
35 if (!status.ok() || status.value() ==
nullptr) {
36 LOG(WARNING) << status.status();
51std::function<int(
GRBmodel* model,
const char* attrname,
int* valueP)>
53std::function<int(
GRBmodel* model,
const char* attrname,
int newvalue)>
55std::function<int(
GRBmodel* model,
const char* attrname,
int element,
58std::function<int(
GRBmodel* model,
const char* attrname,
int element,
61std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
64std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
67std::function<int(
GRBmodel* model,
const char* attrname,
int len,
int* ind,
70std::function<int(
GRBmodel* model,
const char* attrname,
int element,
73std::function<int(
GRBmodel* model,
const char* attrname,
int element,
76std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
79std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
82std::function<int(
GRBmodel* model,
const char* attrname,
int len,
int* ind,
85std::function<int(
GRBmodel* model,
const char* attrname,
double* valueP)>
87std::function<int(
GRBmodel* model,
const char* attrname,
double newvalue)>
89std::function<int(
GRBmodel* model,
const char* attrname,
int element,
92std::function<int(
GRBmodel* model,
const char* attrname,
int element,
95std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
98std::function<int(
GRBmodel* model,
const char* attrname,
int first,
int len,
101std::function<int(
GRBmodel* model,
const char* attrname,
int len,
int* ind,
104std::function<int(
GRBmodel* model,
const char* attrname,
char** valueP)>
106std::function<int(
GRBmodel* model,
const char* attrname,
const char* newvalue)>
111std::function<int(
void* cbdata,
int where,
int what,
void* resultP)>
GRBcbget =
113std::function<int(
void* cbdata,
const double*
solution,
double* objvalP)>
115std::function<int(
void* cbdata,
int cutlen,
const int* cutind,
116 const double* cutval,
char cutsense,
double cutrhs)>
118std::function<int(
void* cbdata,
int lazylen,
const int* lazyind,
119 const double* lazyval,
char lazysense,
double lazyrhs)>
121std::function<int(
GRBmodel* model,
int* numnzP,
int* vbeg,
int* vind,
122 double* vval,
int start,
int len)>
127std::function<int(
GRBenv* env,
GRBmodel** modelP,
const char* Pname,
128 int numvars,
double* obj,
double* lb,
double* ub,
char* vtype,
131std::function<int(
GRBmodel* model,
int numnz,
int* vind,
double* vval,
132 double obj,
double lb,
double ub,
char vtype,
133 const char* varname)>
135std::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)>
139std::function<int(
GRBmodel* model,
int numnz,
int* cind,
double* cval,
140 char sense,
double rhs,
const char* constrname)>
142std::function<int(
GRBmodel* model,
int numconstrs,
int numnz,
int* cbeg,
143 int* cind,
double* cval,
char* sense,
double* rhs,
146std::function<int(
GRBmodel* model,
int numnz,
int* cind,
double* cval,
147 double lower,
double upper,
const char* constrname)>
149std::function<int(
GRBmodel* model,
int numsos,
int nummembers,
int* types,
150 int* beg,
int* ind,
double* weight)>
152std::function<int(
GRBmodel* model,
const char* name,
int resvar,
int nvars,
153 const int* vars,
double constant)>
155std::function<int(
GRBmodel* model,
const char* name,
int resvar,
int nvars,
156 const int* vars,
double constant)>
158std::function<int(
GRBmodel* model,
const char* name,
int resvar,
int argvar)>
160std::function<int(
GRBmodel* model,
const char* name,
int resvar,
int nvars,
163std::function<int(
GRBmodel* model,
const char* name,
int resvar,
int nvars,
166std::function<int(
GRBmodel* model,
const char* name,
int binvar,
int binval,
167 int nvars,
const int* vars,
const double* vals,
char sense,
170std::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)>
174std::function<int(
GRBmodel* model,
int numqnz,
int* qrow,
int* qcol,
184std::function<int(
GRBmodel* model,
int cnt,
int* cind,
int* vind,
double* val)>
189std::function<int(
GRBmodel* model,
int index,
int priority,
double weight,
190 double abstol,
double reltol,
const char* name,
191 double constant,
int lnz,
int* lind,
double* lval)>
193std::function<int(
GRBenv* env,
const char* paramname,
int* valueP)>
195std::function<int(
GRBenv* env,
const char* paramname,
double* valueP)>
197std::function<int(
GRBenv* env,
const char* paramname,
char* valueP)>
199std::function<int(
GRBenv* env,
const char* paramname,
int* valueP,
int* minP,
200 int* maxP,
int* defP)>
202std::function<int(
GRBenv* env,
const char* paramname,
double* valueP,
203 double* minP,
double* maxP,
double* defP)>
205std::function<int(
GRBenv* env,
const char* paramname,
char* valueP,
char* defP)>
211std::function<int(
GRBenv* env,
const char* paramname,
const char* value)>
213std::function<int(
GRBenv* env,
const char* paramname,
int value)>
215std::function<int(
GRBenv* env,
const char* paramname,
double value)>
217std::function<int(
GRBenv* env,
const char* paramname,
const char* value)>
230std::function<void(
int* majorP,
int* minorP,
int* technicalP)>
GRBversion =
240 "GRBisattravailable");
244 "GRBgetintattrelement");
246 "GRBsetintattrelement");
248 "GRBgetintattrarray");
250 "GRBsetintattrarray");
253 "GRBgetcharattrelement");
255 "GRBsetcharattrelement");
257 "GRBgetcharattrarray");
259 "GRBsetcharattrarray");
261 "GRBsetcharattrlist");
265 "GRBgetdblattrelement");
267 "GRBsetdblattrelement");
269 "GRBgetdblattrarray");
271 "GRBsetdblattrarray");
276 "GRBsetcallbackfunc");
293 "GRBaddgenconstrMax");
295 "GRBaddgenconstrMin");
297 "GRBaddgenconstrAbs");
299 "GRBaddgenconstrAnd");
302 "GRBaddgenconstrIndicator");
332 "GRBgetintparaminfo");
334 "GRBgetdblparaminfo");
336 "GRBgetstrparaminfo");
340 "GRBdiscardmultiobjenvs");
348 std::vector<std::string> potential_paths;
349 const std::vector<absl::string_view> kGurobiVersions = {
350 "1202",
"1201",
"1200",
"1103",
"1102",
"1101",
"1100",
351 "1003",
"1002",
"1001",
"1000",
"952",
"951",
"950",
352 "911",
"910",
"903",
"902",
"811",
"801",
"752"};
353 potential_paths.reserve(kGurobiVersions.size() * 3);
356 const char* gurobi_home_from_env = getenv(
"GUROBI_HOME");
357 if (gurobi_home_from_env !=
nullptr) {
358 for (
const absl::string_view version : kGurobiVersions) {
359 const absl::string_view lib = version.substr(0, version.size() - 1);
361 potential_paths.push_back(
362 absl::StrCat(gurobi_home_from_env,
"\\bin\\gurobi", lib,
".dll"));
363#elif defined(__APPLE__)
364 potential_paths.push_back(
365 absl::StrCat(gurobi_home_from_env,
"/lib/libgurobi", lib,
".dylib"));
366#elif defined(__GNUC__)
367 potential_paths.push_back(
368 absl::StrCat(gurobi_home_from_env,
"/lib/libgurobi", lib,
".so"));
369 potential_paths.push_back(
370 absl::StrCat(gurobi_home_from_env,
"/lib64/libgurobi", lib,
".so"));
372 LOG(ERROR) <<
"OS Not recognized by gurobi/environment.cc."
373 <<
" You won't be able to use Gurobi.";
379 for (
const absl::string_view version : kGurobiVersions) {
380 const absl::string_view lib = version.substr(0, version.size() - 1);
382 potential_paths.push_back(absl::StrCat(
"C:\\Program Files\\gurobi", version,
383 "\\win64\\bin\\gurobi", lib,
385 potential_paths.push_back(absl::StrCat(
386 "C:\\gurobi", version,
"\\win64\\bin\\gurobi", lib,
".dll"));
387 potential_paths.push_back(absl::StrCat(
"gurobi", lib,
".dll"));
388#elif defined(__APPLE__)
389 potential_paths.push_back(absl::StrCat(
390 "/Library/gurobi", version,
"/mac64/lib/libgurobi", lib,
".dylib"));
391 potential_paths.push_back(absl::StrCat(
"/Library/gurobi", version,
392 "/macos_universal2/lib/libgurobi",
394#elif defined(__GNUC__)
395 potential_paths.push_back(absl::StrCat(
396 "/opt/gurobi", version,
"/linux64/lib/libgurobi", lib,
".so"));
397 potential_paths.push_back(absl::StrCat(
398 "/opt/gurobi", version,
"/linux64/lib64/libgurobi", lib,
".so"));
399 potential_paths.push_back(
400 absl::StrCat(
"/opt/gurobi/linux64/lib/libgurobi", lib,
".so"));
401 potential_paths.push_back(
402 absl::StrCat(
"/opt/gurobi/linux64/lib64/libgurobi", lib,
".so"));
404 LOG(ERROR) <<
"OS Not recognized by gurobi/environment.cc."
405 <<
" You won't be able to use Gurobi.";
410 for (
const absl::string_view version :
411 {
"12.0.2",
"12.0.1",
"12.0.0",
"11.0.3",
"11.0.2",
"11.0.1",
"11.0.0",
412 "10.0.3",
"10.0.2",
"10.0.1",
"10.0.0",
"9.5.2",
"9.5.1",
"9.5.0"}) {
413 potential_paths.push_back(
414 absl::StrCat(
"/opt/gurobi/linux64/lib/libgurobi.so.", version));
417 return potential_paths;
421 std::vector<absl::string_view> potential_paths) {
422 static std::once_flag gurobi_loading_done;
423 static absl::Status gurobi_load_status;
425 static absl::Mutex mutex;
427 absl::MutexLock lock(&mutex);
429 std::call_once(gurobi_loading_done, [&potential_paths]() {
430 const std::vector<std::string> canonical_paths =
432 potential_paths.insert(potential_paths.end(), canonical_paths.begin(),
433 canonical_paths.end());
434 for (
const absl::string_view path : potential_paths) {
436 LOG(INFO) <<
"Found the Gurobi library in '" << path <<
".";
443 gurobi_load_status = absl::OkStatus();
445 gurobi_load_status = absl::NotFoundError(absl::StrCat(
446 "Could not find the Gurobi shared library. Looked in: [",
447 absl::StrJoin(potential_paths,
"', '"),
448 "]. If you know where it"
449 " is, pass the full path to 'LoadGurobiDynamicLibrary()'."));
452 return gurobi_load_status;
460 if (
GRBloadenv(&env,
nullptr) != 0 || env ==
nullptr) {
461 return absl::FailedPreconditionError(
462 absl::StrCat(
"Found the Gurobi shared library, but could not create "
463 "Gurobi environment: is Gurobi licensed on this machine?",
#define RETURN_IF_ERROR(expr)
bool LibraryIsLoaded() const
std::function< T > GetFunction(const char *function_name)
bool TryToLoad(const absl::string_view library_name)
struct _GRBmodel GRBmodel
In SWIG mode, we don't want anything besides these top-level includes.
std::function< int(GRBmodel *model, int numnz, int *cind, double *cval, char sense, double rhs, const char *constrname)> GRBaddconstr
std::function< void(GRBenv *env)> GRBfreeenv
std::function< int(GRBmodel *model, const char *attrname, double *valueP)> GRBgetdblattr
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *values)> GRBgetdblattrarray
std::function< int(GRBmodel *model, const char *attrname, int first, int len, int *values)> GRBgetintattrarray
std::function< int(GRBmodel *model, const char *attrname, double newvalue)> GRBsetdblattr
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelsos
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, int(GUROBI_STDCALL *cb)(CB_ARGS), void *usrdata)> GRBsetcallbackfunc
std::function< int(GRBenv *dest, GRBenv *src)> GRBcopyparams
std::function< int(GRBmodel *model, int *numnzP, int *vbeg, int *vind, double *vval, int start, int len)> GRBgetvars
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, int *newvalues)> GRBsetintattrlist
std::function< int(GRBmodel *model, int cnt, int *cind, int *vind, double *val)> GRBchgcoeffs
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *values)> GRBgetcharattrarray
std::function< int(void *cbdata, int cutlen, const int *cutind, const double *cutval, char cutsense, double cutrhs)> GRBcbcut
std::function< int(GRBenv *env, const char *paramname, double *valueP)> GRBgetdblparam
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, int len, int *ind)> GRBdelvars
std::function< int(GRBmodel *model, const char *attrname, int newvalue)> GRBsetintattr
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetparam
std::function< int(GRBmodel *model, const char *attrname, int element, int *valueP)> GRBgetintattrelement
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
std::function< int(GRBenv *env, GRBmodel **modelP, const char *Pname, int numvars, double *obj, double *lb, double *ub, char *vtype, char **varnames)> GRBnewmodel
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< int(GRBmodel *model, const char *attrname, int first, int len, int *newvalues)> GRBsetintattrarray
std::function< int(GRBmodel *model)> GRBupdatemodel
std::function< void(int *majorP, int *minorP, int *technicalP)> GRBversion
std::function< GRBenv *(GRBmodel *model)> GRBgetenv
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, char *newvalues)> GRBsetcharattrlist
bool GurobiIsCorrectlyInstalled()
std::function< int(GRBenv *env, const char *paramname, char *valueP)> GRBgetstrparam
std::function< int(GRBmodel *model, const char *attrname, int element, double *valueP)> GRBgetdblattrelement
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *newvalues)> GRBsetcharattrarray
std::function< int(GRBmodel *model)> GRBfreemodel
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelqconstrs
std::function< int(void *cbdata, int lazylen, const int *lazyind, const double *lazyval, char lazysense, double lazyrhs)> GRBcblazy
std::function< int(GRBmodel *model)> GRBcomputeIIS
void LoadGurobiFunctions(DynamicLibrary *gurobi_dynamic_library)
std::function< int(void *cbdata, int where, int what, void *resultP)> GRBcbget
std::function< int(GRBenv *env, const char *paramname, int value)> GRBsetintparam
std::function< int(GRBmodel *model, const char *attrname)> GRBisattravailable
This is the 'define' section.
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetstrparam
std::function< int(GRBenv *env, const char *paramname, char *valueP, char *defP)> GRBgetstrparaminfo
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *newvalues)> GRBsetdblattrarray
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, double lower, double upper, const char *constrname)> GRBaddrangeconstr
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 element, char newvalue)> GRBsetcharattrelement
std::function< int(GRBmodel *model, const char *attrname, int element, int newvalue)> GRBsetintattrelement
std::function< int(GRBenv *env)> GRBresetparams
std::function< int(GRBmodel *model, const char *attrname, const char *newvalue)> GRBsetstrattr
absl::Status LoadGurobiDynamicLibrary(std::vector< absl::string_view > potential_paths)
std::function< GRBenv *(GRBmodel *model)> GRBdiscardmultiobjenvs
std::function< int(GRBmodel *model)> GRBoptimize
std::function< int(GRBenv **envP, const char *logfilename)> GRBloadenv
std::function< int(GRBmodel *model, int numqnz, int *qrow, int *qcol, double *qval)> GRBaddqpterms
std::function< GRBenv *(GRBmodel *model, int num)> GRBgetmultiobjenv
std::function< int(GRBenv **envP)> GRBemptyenv
std::function< int(GRBenv *env, const char *paramname)> GRBgetparamtype
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelconstrs
std::function< int(GRBmodel *model, const char *name, int resvar, int argvar)> GRBaddgenconstrAbs
std::vector< std::string > GurobiDynamicLibraryPotentialPaths()
std::function< int(GRBenv *env, int i, char **paramnameP)> GRBgetparamname
std::function< int(GRBmodel *model, const char *attrname, int *valueP)> GRBgetintattr
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelgenconstrs
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< const char *(GRBenv *env)> GRBgeterrormsg
absl::StatusOr< GRBenv * > GetGurobiEnv()
std::function< int(GRBmodel *model, const char *filename)> GRBwrite
std::function< int(GRBenv *env, const char *paramname, double *valueP, double *minP, double *maxP, double *defP)> GRBgetdblparaminfo
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)> GRBaddgenconstrAnd
std::function< int(GRBenv *env)> GRBstartenv
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars)> GRBaddgenconstrOr
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(GRBmodel *model, const char *attrname, int len, int *ind, double *newvalues)> GRBsetdblattrlist
std::function< int(GRBmodel *model, const char *name, int resvar, int nvars, const int *vars, double constant)> GRBaddgenconstrMax
std::function< char *(void)> GRBplatform
std::function< int(GRBenv *env, const char *paramname, int *valueP, int *minP, int *maxP, int *defP)> GRBgetintparaminfo
std::function< int(GRBmodel *model, int numsos, int nummembers, int *types, int *beg, int *ind, double *weight)> GRBaddsos
std::function< int(GRBenv *env)> GRBgetnumparams
std::function< int(GRBmodel *model, const char *attrname, int element, char *valueP)> GRBgetcharattrelement
std::function< int(GRBmodel *model, const char *attrname, char **valueP)> GRBgetstrattr
std::function< int(GRBmodel *model)> GRBdelq
std::function< int(void *cbdata, const double *solution, double *objvalP)> GRBcbsolution
std::function< void(GRBmodel *model)> GRBterminate
std::function< int(GRBenv *env, const char *paramname, double value)> GRBsetdblparam
std::function< int(GRBmodel *model, const char *attrname, int element, double newvalue)> GRBsetdblattrelement