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