19 #include <string_view>
23 #include "absl/status/status.h"
24 #include "absl/status/statusor.h"
25 #include "absl/strings/str_format.h"
32 #include "ortools/math_opt/solvers/gurobi.pb.h"
37 constexpr
int kGrbOk = 0;
39 struct UserCallbackData {
41 absl::Status
status = absl::OkStatus();
46 void*
const usrdata) {
47 CHECK(usrdata !=
nullptr);
48 CHECK(
model !=
nullptr);
49 auto user_cb_data =
static_cast<UserCallbackData*
>(usrdata);
50 CHECK_EQ(
model, user_cb_data->gurobi->model());
52 if (!user_cb_data->status.ok()) {
55 const Gurobi::CallbackContext
context(user_cb_data->gurobi, cbdata,
where);
56 user_cb_data->status = user_cb_data->user_cb(
context);
57 if (!user_cb_data->status.ok()) {
58 user_cb_data->gurobi->Terminate();
73 const std::optional<GurobiIsvKey>& isv_key) {
74 GRBenv* naked_primary_env =
nullptr;
76 std::string_view init_env_method;
77 if (isv_key.has_value()) {
78 err =
GRBisqp(&naked_primary_env,
79 nullptr, isv_key->name.c_str(),
80 isv_key->application_name.c_str(), isv_key->expiration,
81 isv_key->key.c_str());
82 init_env_method =
"GRBisqp()";
85 init_env_method =
"GRBloadenv()";
96 <<
"failed to create Gurobi primary environment, " << init_env_method
97 <<
" returned the error (" << err
104 GRBenv*
const primary_env) {
105 CHECK(primary_env !=
nullptr);
106 return New(
nullptr, primary_env);
111 if (primary_env ==
nullptr) {
114 GRBenv*
const raw_primary_env = primary_env.get();
115 return New(std::move(primary_env), raw_primary_env);
120 : owned_primary_env_(std::move(optional_owned_primary_env)),
121 gurobi_model_(ABSL_DIE_IF_NULL(
model)),
122 model_env_(ABSL_DIE_IF_NULL(model_env)) {}
124 absl::StatusOr<std::unique_ptr<Gurobi>>
Gurobi::New(
126 CHECK(primary_env !=
nullptr);
136 <<
"Error creating gurobi model on GRBnewmodel(), error code: "
139 CHECK(
model !=
nullptr);
143 int gurobi_major, gurobi_minor, gurobi_technical;
144 GRBversion(&gurobi_major, &gurobi_minor, &gurobi_technical);
145 VLOG(3) << absl::StrFormat(
146 "Successfully created model for Gurobi v%d.%d.%d (%s)", gurobi_major,
149 return absl::WrapUnique(
150 new Gurobi(std::move(optional_owned_primary_env),
model, model_env));
156 LOG(ERROR) <<
"Error freeing gurobi model, code: " << err
161 absl::Status Gurobi::ToStatus(
const int grb_err,
const absl::StatusCode code,
163 if (grb_err == kGrbOk) {
164 return absl::OkStatus();
168 <<
"Gurobi error code: " << grb_err
173 const char vtype,
const std::string&
name) {
174 return AddVar({}, {}, obj, lb, ub, vtype,
name);
178 const absl::Span<const double> vval,
179 const double obj,
const double lb,
const double ub,
180 const char vtype,
const std::string&
name) {
181 CHECK_EQ(vind.size(), vval.size());
182 const int numnz =
static_cast<int>(vind.size());
183 return ToStatus(
GRBaddvar(gurobi_model_, numnz,
184 const_cast<int*
>(vind.data()),
185 const_cast<double*
>(vval.data()),
190 name.empty() ?
nullptr :
name.data()));
194 const absl::Span<const double> lb,
195 const absl::Span<const double> ub,
196 const absl::Span<const char> vtype,
197 const absl::Span<const std::string> names) {
198 return AddVars({}, {}, {}, obj, lb, ub, vtype, names);
202 const absl::Span<const int> vind,
203 const absl::Span<const double> vval,
204 const absl::Span<const double> obj,
205 const absl::Span<const double> lb,
206 const absl::Span<const double> ub,
207 const absl::Span<const char> vtype,
208 const absl::Span<const std::string> names) {
209 CHECK_EQ(vind.size(), vval.size());
210 const int num_vars =
static_cast<int>(lb.size());
211 CHECK_EQ(ub.size(), num_vars);
212 CHECK_EQ(vtype.size(), num_vars);
213 double* c_obj =
nullptr;
215 CHECK_EQ(obj.size(), num_vars);
216 c_obj =
const_cast<double*
>(obj.data());
218 if (!vbegin.empty()) {
219 CHECK_EQ(vbegin.size(), num_vars);
221 char** c_names =
nullptr;
222 std::vector<char*> c_names_data;
223 if (!names.empty()) {
224 CHECK_EQ(num_vars, names.size());
225 for (
const std::string&
name : names) {
226 c_names_data.push_back(
const_cast<char*
>(
name.c_str()));
228 c_names = c_names_data.data();
230 return ToStatus(
GRBaddvars(gurobi_model_, num_vars,
232 const_cast<int*
>(vbegin.data()),
233 const_cast<int*
>(vind.data()),
234 const_cast<double*
>(vval.data()),
236 const_cast<double*
>(lb.data()),
237 const_cast<double*
>(ub.data()),
238 const_cast<char*
>(vtype.data()),
244 GRBdelvars(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
248 const std::string&
name) {
253 const absl::Span<const double> cval,
254 const char sense,
const double rhs,
255 const std::string&
name) {
256 CHECK_EQ(cind.size(), cval.size());
257 const int numnz =
static_cast<int>(cind.size());
260 const_cast<int*
>(cind.data()),
261 const_cast<double*
>(cval.data()),
264 name.empty() ?
nullptr :
name.data()));
268 const absl::Span<const double> rhs,
269 const absl::Span<const std::string> names) {
270 const int num_cons =
static_cast<int>(sense.size());
271 CHECK_EQ(rhs.size(), num_cons);
272 char** c_names =
nullptr;
273 std::vector<char*> c_names_data;
274 if (!names.empty()) {
275 CHECK_EQ(num_cons, names.size());
276 for (
const std::string&
name : names) {
277 c_names_data.push_back(
const_cast<char*
>(
name.c_str()));
279 c_names = c_names_data.data();
285 nullptr,
const_cast<char*
>(sense.data()),
286 const_cast<double*
>(rhs.data()), c_names));
291 GRBdelconstrs(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
295 const absl::Span<const int> qcol,
296 const absl::Span<const double> qval) {
297 const int numqnz =
static_cast<int>(qrow.size());
298 CHECK_EQ(qcol.size(), numqnz);
299 CHECK_EQ(qval.size(), numqnz);
301 gurobi_model_, numqnz,
const_cast<int*
>(qcol.data()),
302 const_cast<int*
>(qrow.data()),
const_cast<double*
>(qval.data())));
308 const double weight,
const double abs_tol,
309 const double rel_tol,
310 const std::string&
name,
311 const double constant,
312 const absl::Span<const int> lind,
313 const absl::Span<const double> lval) {
314 const int numlnz =
static_cast<int>(lind.size());
315 CHECK_EQ(lval.size(), numlnz);
323 const_cast<char*
>(
name.c_str()),
326 const_cast<int*
>(lind.data()),
327 const_cast<double*
>(lval.data())));
331 const absl::Span<const double> lval,
332 const absl::Span<const int> qrow,
333 const absl::Span<const int> qcol,
334 const absl::Span<const double> qval,
335 const char sense,
const double rhs,
336 const std::string&
name) {
337 const int numlnz =
static_cast<int>(lind.size());
338 CHECK_EQ(lval.size(), numlnz);
340 const int numqlnz =
static_cast<int>(qrow.size());
341 CHECK_EQ(qcol.size(), numqlnz);
342 CHECK_EQ(qval.size(), numqlnz);
347 const_cast<int*
>(lind.data()),
348 const_cast<double*
>(lval.data()),
350 const_cast<int*
>(qrow.data()),
351 const_cast<int*
>(qcol.data()),
352 const_cast<double*
>(qval.data()),
355 const_cast<char*
>(
name.c_str())));
359 return ToStatus(
GRBdelqconstrs(gurobi_model_,
static_cast<int>(ind.size()),
360 const_cast<int*
>(ind.data())));
364 const absl::Span<const int> beg,
365 const absl::Span<const int> ind,
366 const absl::Span<const double>
weight) {
367 const int num_sos =
static_cast<int>(types.size());
368 CHECK_EQ(beg.size(), num_sos);
370 const int num_members =
static_cast<int>(ind.size());
371 CHECK_EQ(
weight.size(), num_members);
373 return ToStatus(
GRBaddsos(gurobi_model_, num_sos,
375 const_cast<int*
>(types.data()),
376 const_cast<int*
>(beg.data()),
377 const_cast<int*
>(ind.data()),
378 const_cast<double*
>(
weight.data())));
382 return ToStatus(
GRBdelsos(gurobi_model_,
static_cast<int>(ind.size()),
383 const_cast<int*
>(ind.data())));
388 const absl::Span<const int> ind,
389 const absl::Span<const double> val,
390 const char sense,
const double rhs) {
391 const int nvars =
static_cast<int>(ind.size());
392 CHECK_EQ(val.size(), nvars);
394 gurobi_model_,
const_cast<char*
>(
name.c_str()),
395 binvar, binval, nvars,
396 const_cast<int*
>(ind.data()),
397 const_cast<double*
>(val.data()), sense, rhs));
401 return ToStatus(
GRBdelgenconstrs(gurobi_model_,
static_cast<int>(ind.size()),
402 const_cast<int*
>(ind.data())));
406 const absl::Span<const int> vind,
407 const absl::Span<const double> val) {
408 const int num_changes =
static_cast<int>(cind.size());
409 CHECK_EQ(vind.size(), num_changes);
410 CHECK_EQ(val.size(), num_changes);
412 gurobi_model_, num_changes,
const_cast<int*
>(cind.data()),
413 const_cast<int*
>(vind.data()),
const_cast<double*
>(val.data())));
419 nullptr, first_var, num_vars)));
424 const absl::Span<int> vind,
425 const absl::Span<double> vval,
const int first_var,
426 const int num_vars) {
427 CHECK_EQ(vbegin.size(), num_vars);
428 CHECK_EQ(vind.size(), vval.size());
431 ToStatus(
GRBgetvars(gurobi_model_, &nnz, vbegin.data(), vind.data(),
432 vval.data(), first_var, num_vars)));
433 CHECK_EQ(nnz, vind.size());
434 return absl::OkStatus();
438 const int num_vars) {
441 result.
begins.resize(num_vars);
442 result.
inds.resize(nnz);
443 result.
vals.resize(nnz);
447 result.
inds.data(), result.
vals.data(), first_var, num_vars)));
448 CHECK_EQ(read_nnz, nnz);
457 bool needs_cb_cleanup =
false;
458 UserCallbackData user_cb_data;
460 user_cb_data.user_cb = std::move(cb);
461 user_cb_data.gurobi =
this;
464 needs_cb_cleanup =
true;
470 if (needs_cb_cleanup) {
472 if (error != kGrbOk) {
473 LOG(ERROR) <<
"Error cleaning up callback";
477 absl::Status solve_status = ToStatus(
GRBoptimize(gurobi_model_));
480 if (needs_cb_cleanup) {
481 needs_cb_cleanup =
false;
485 return absl::OkStatus();
495 <<
"Error getting Gurobi int attribute: " <<
name;
502 <<
"Error getting Gurobi double attribute: " <<
name;
507 const char*
const name)
const {
510 char* result =
nullptr;
512 <<
"Error getting Gurobi string attribute: " <<
name;
513 if (result ==
nullptr) {
514 return std::string();
516 return std::string(result);
520 const std::string&
value) {
529 const double value) {
534 const absl::Span<const int> new_values) {
536 const_cast<int*
>(new_values.data())));
540 const char*
const name,
const absl::Span<const double> new_values) {
542 const_cast<double*
>(new_values.data())));
546 const absl::Span<const char> new_values) {
548 const_cast<char*
>(new_values.data())));
552 const absl::Span<int> attr_out)
const {
554 gurobi_model_,
name, 0, attr_out.size(), attr_out.data())))
555 <<
"Error getting Gurobi int array attribute: " <<
name;
556 return absl::OkStatus();
560 const int len)
const {
561 std::vector<int> result(len);
567 const char*
const name,
const absl::Span<double> attr_out)
const {
569 gurobi_model_,
name, 0, attr_out.size(), attr_out.data())))
570 <<
"Error getting Gurobi double array attribute: " <<
name;
571 return absl::OkStatus();
575 const char*
const name,
const int len)
const {
576 std::vector<double> result(len);
582 const absl::Span<char> attr_out)
const {
584 gurobi_model_,
name, 0, attr_out.size(), attr_out.data())))
585 <<
"Error getting Gurobi char array attribute: " <<
name;
586 return absl::OkStatus();
590 const char*
const name,
const int len)
const {
591 std::vector<char> result(len);
597 const absl::Span<const int> ind,
598 const absl::Span<const int> new_values) {
599 const int len =
static_cast<int>(ind.size());
600 CHECK_EQ(new_values.size(), len);
602 const_cast<int*
>(ind.data()),
603 const_cast<int*
>(new_values.data())));
607 const char*
const name,
const absl::Span<const int> ind,
608 const absl::Span<const double> new_values) {
609 const int len =
static_cast<int>(ind.size());
610 CHECK_EQ(new_values.size(), len);
612 const_cast<int*
>(ind.data()),
613 const_cast<double*
>(new_values.data())));
617 const absl::Span<const int> ind,
618 const absl::Span<const char> new_values) {
619 const int len =
static_cast<int>(ind.size());
620 CHECK_EQ(new_values.size(), len);
622 const_cast<int*
>(ind.data()),
623 const_cast<char*
>(new_values.data())));
627 const int element)
const {
641 const int element)
const {
650 const char new_value) {
656 const std::string&
value) {
665 const double value) {
670 const std::string&
value) {
689 return std::string(result.data());
699 void*
const cb_data,
const int where)
700 : gurobi_(ABSL_DIE_IF_NULL(
gurobi)), cb_data_(cb_data), where_(
where) {}
705 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
710 const int what)
const {
713 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
718 const int what,
const absl::Span<double> result)
const {
719 return gurobi_->ToStatus(
720 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(result.data())));
724 char* result =
nullptr;
727 if (result ==
nullptr) {
728 return std::string();
730 return std::string(result);
734 const absl::Span<const int> cutind,
const absl::Span<const double> cutval,
735 const char cutsense,
const double cutrhs)
const {
736 const int cut_len =
static_cast<int>(cutind.size());
737 CHECK_EQ(cutval.size(), cut_len);
738 return gurobi_->ToStatus(
739 GRBcbcut(cb_data_, cut_len,
const_cast<int*
>(cutind.data()),
740 const_cast<double*
>(cutval.data()), cutsense, cutrhs));
744 const absl::Span<const int> lazyind,
const absl::Span<const double> lazyval,
745 const char lazysense,
const double lazyrhs)
const {
746 const int lazy_len =
static_cast<int>(lazyind.size());
747 CHECK_EQ(lazyval.size(), lazy_len);
748 return gurobi_->ToStatus(
749 GRBcblazy(cb_data_, lazy_len,
const_cast<int*
>(lazyind.data()),
750 const_cast<double*
>(lazyval.data()), lazysense, lazyrhs));
754 const absl::Span<const double> solution)
const {
757 GRBcbsolution(cb_data_,
const_cast<double*
>(solution.data()), &result)));
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
absl::StatusOr< double > CbGetDouble(int what) const
absl::StatusOr< double > CbSolution(absl::Span< const double > solution) const
CallbackContext(Gurobi *gurobi, void *cb_data, int where)
absl::Status CbGetDoubleArray(int what, absl::Span< double > result) const
absl::Status CbCut(absl::Span< const int > cutind, absl::Span< const double > cutval, char cutsense, double cutrhs) const
absl::StatusOr< std::string > CbGetMessage() const
absl::StatusOr< int > CbGetInt(int what) const
absl::Status CbLazy(absl::Span< const int > lazyind, absl::Span< const double > lazyval, char lazysense, double lazyrhs) const
absl::Status AddConstr(char sense, double rhs, const std::string &name)
absl::Status GetVars(absl::Span< int > vbegin, absl::Span< int > vind, absl::Span< double > vval, int first_var, int num_vars)
absl::Status AddVar(double obj, double lb, double ub, char vtype, const std::string &name)
absl::Status GetIntAttrArray(const char *name, absl::Span< int > attr_out) const
absl::Status SetCharAttrElement(const char *name, int element, char new_value)
absl::Status DelQConstrs(const absl::Span< const int > ind)
absl::Status AddConstrs(absl::Span< const char > sense, absl::Span< const double > rhs, absl::Span< const std::string > names)
absl::StatusOr< double > GetDoubleAttrElement(const char *name, int element) const
absl::StatusOr< double > GetDoubleParam(const char *name)
absl::Status Optimize(Callback cb=nullptr)
absl::Status ChgCoeffs(absl::Span< const int > cind, absl::Span< const int > vind, absl::Span< const double > val)
absl::Status DelGenConstrs(absl::Span< const int > ind)
absl::StatusOr< int > GetIntParam(const char *name)
absl::Status SetDoubleAttr(const char *attr_name, double value)
absl::Status AddQpTerms(absl::Span< const int > qrow, absl::Span< const int > qcol, absl::Span< const double > qval)
absl::StatusOr< int > GetNnz(int first_var, int num_vars)
absl::Status SetDoubleParam(const char *name, double value)
std::function< absl::Status(const CallbackContext &)> Callback
absl::Status UpdateModel()
absl::Status AddIndicator(const std::string &name, int binvar, int binval, absl::Span< const int > ind, absl::Span< const double > val, char sense, double rhs)
absl::Status SetIntAttr(const char *attr_name, int value)
static absl::StatusOr< std::unique_ptr< Gurobi > > NewWithSharedPrimaryEnv(GRBenv *primary_env)
absl::StatusOr< std::string > GetStringParam(const char *name)
absl::Status SetDoubleAttrElement(const char *name, int element, double new_value)
absl::Status GetCharAttrArray(const char *name, absl::Span< char > attr_out) const
absl::Status SetCharAttrArray(const char *name, absl::Span< const char > new_values)
absl::StatusOr< int > GetIntAttr(const char *name) const
static absl::StatusOr< std::unique_ptr< Gurobi > > New(GRBenvUniquePtr primary_env=nullptr)
absl::Status DelVars(absl::Span< const int > ind)
absl::StatusOr< std::string > GetStringAttr(const char *name) const
absl::Status SetIntAttrList(const char *name, absl::Span< const int > ind, absl::Span< const int > new_values)
absl::Status GetDoubleAttrArray(const char *name, absl::Span< double > attr_out) const
absl::Status DelSos(absl::Span< const int > ind)
absl::Status SetDoubleAttrArray(const char *name, absl::Span< const double > new_values)
absl::Status SetParam(const char *name, const std::string &value)
bool IsAttrAvailable(const char *name) const
absl::Status SetDoubleAttrList(const char *name, absl::Span< const int > ind, absl::Span< const double > new_values)
absl::StatusOr< double > GetDoubleAttr(const char *name) const
absl::Status SetNthObjective(int index, int priority, double weight, double abs_tol, double rel_tol, const std::string &name, double constant, absl::Span< const int > lind, absl::Span< const double > lval)
absl::Status AddSos(absl::Span< const int > types, absl::Span< const int > beg, absl::Span< const int > ind, absl::Span< const double > weight)
absl::Status ResetParameters()
absl::Status SetIntParam(const char *name, int value)
absl::Status SetIntAttrArray(const char *name, absl::Span< const int > new_values)
absl::Status SetStringParam(const char *name, const std::string &value)
absl::Status DelConstrs(absl::Span< const int > ind)
absl::Status SetStringAttr(const char *attr_name, const std::string &value)
absl::Status AddVars(absl::Span< const double > obj, absl::Span< const double > lb, absl::Span< const double > ub, absl::Span< const char > vtype, absl::Span< const std::string > names)
absl::StatusOr< char > GetCharAttrElement(const char *name, int element) const
absl::Status SetCharAttrList(const char *name, absl::Span< const int > ind, absl::Span< const char > new_values)
absl::Status AddQConstr(absl::Span< const int > lind, absl::Span< const double > lval, absl::Span< const int > qrow, absl::Span< const int > qcol, absl::Span< const double > qval, char sense, double rhs, const std::string &name)
#define GRB_ERROR_CALLBACK
#define GRB_CB_MSG_STRING
struct _GRBmodel GRBmodel
GurobiMPCallbackContext * context
absl::Cleanup< absl::decay_t< Callback > > MakeCleanup(Callback &&callback)
absl::StatusOr< GRBenvUniquePtr > GurobiNewPrimaryEnv(const std::optional< GurobiIsvKey > &isv_key)
std::unique_ptr< GRBenv, GurobiFreeEnv > GRBenvUniquePtr
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, 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(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 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
std::function< GRBenv *(GRBmodel *model)> GRBgetenv
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelconstrs
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
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)> GRBdelq
std::function< int(GRBmodel *model, const char *attrname, int element, char newvalue)> GRBsetcharattrelement
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, 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(GRBenv **, const char *, const char *, const char *, int, const char *)> GRBisqp
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelvars
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
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
StatusBuilder InvalidArgumentErrorBuilder()
std::vector< double > vals
std::vector< int > begins
void operator()(GRBenv *const env) const
#define VLOG(verboselevel)
#define VLOG_IS_ON(verboselevel)