22#include "absl/log/check.h"
23#include "absl/log/die_if_null.h"
24#include "absl/log/log.h"
25#include "absl/log/vlog_is_on.h"
26#include "absl/memory/memory.h"
27#include "absl/status/status.h"
28#include "absl/status/statusor.h"
29#include "absl/strings/str_format.h"
30#include "absl/types/span.h"
42constexpr int kGrbOk = 0;
44struct UserCallbackData {
46 absl::Status status = absl::OkStatus();
47 Gurobi* gurobi =
nullptr;
51#define GUROBI_STDCALL __stdcall
57 const int where,
void*
const usrdata) {
58 CHECK(usrdata !=
nullptr);
59 CHECK(model !=
nullptr);
60 auto user_cb_data =
static_cast<UserCallbackData*
>(usrdata);
61 CHECK_EQ(model, user_cb_data->gurobi->model());
63 if (!user_cb_data->status.ok()) {
66 const Gurobi::CallbackContext context(user_cb_data->gurobi, cbdata, where);
67 user_cb_data->status = user_cb_data->user_cb(context);
68 if (!user_cb_data->status.ok()) {
69 user_cb_data->gurobi->Terminate();
92 ScopedCallback(
const ScopedCallback&) =
delete;
93 ScopedCallback& operator=(
const ScopedCallback&) =
delete;
94 ScopedCallback(ScopedCallback&&) =
delete;
95 ScopedCallback& operator=(ScopedCallback&&) =
delete;
98 static absl::StatusOr<std::unique_ptr<ScopedCallback>> New(
100 CHECK(gurobi !=
nullptr);
101 auto scope = absl::WrapUnique(
new ScopedCallback(gurobi));
103 scope->user_cb_data_.user_cb = std::move(cb);
104 scope->user_cb_data_.gurobi = gurobi;
106 gurobi->model(), GurobiCallback, &scope->user_cb_data_)));
107 scope->needs_cleanup_ =
true;
113 absl::Status Flush() {
114 const absl::Status status = std::move(user_cb_data_.status);
115 user_cb_data_.status = absl::OkStatus();
120 absl::Status Release() {
121 if (needs_cleanup_) {
122 needs_cleanup_ =
false;
123 return gurobi_->ToStatus(
126 return absl::OkStatus();
130 if (
const absl::Status s = Flush(); !s.ok()) {
131 LOG(ERROR) <<
"Error returned from callback: " << s;
133 if (
const absl::Status s = Release(); !s.ok()) {
134 LOG(ERROR) <<
"Error cleaning up callback: " << s;
139 explicit ScopedCallback(Gurobi*
const gurobi) : gurobi_(gurobi) {}
141 bool needs_cleanup_ =
false;
143 UserCallbackData user_cb_data_;
149 return key.name == proto_key.name() &&
150 key.application_name == proto_key.application_name() &&
151 key.expiration == proto_key.expiration() && key.key == proto_key.key();
157 if (env !=
nullptr) {
163 const std::optional<GurobiIsvKey>& isv_key) {
164 if (isv_key.has_value()) {
169 GRBenv* naked_primary_env =
nullptr;
170 const int err =
GRBloadenv(&naked_primary_env,
nullptr);
178 <<
"failed to create Gurobi primary environment, GRBloadenv() "
179 "returned the error ("
184 GRBenv*
const primary_env) {
185 CHECK(primary_env !=
nullptr);
186 return New(
nullptr, primary_env);
191 if (primary_env ==
nullptr) {
194 GRBenv*
const raw_primary_env = primary_env.get();
195 return New(std::move(primary_env), raw_primary_env);
200 : owned_primary_env_(
std::move(optional_owned_primary_env)),
201 gurobi_model_(ABSL_DIE_IF_NULL(model)),
202 model_env_(ABSL_DIE_IF_NULL(model_env)) {}
204absl::StatusOr<std::unique_ptr<Gurobi>>
Gurobi::New(
206 CHECK(primary_env !=
nullptr);
216 <<
"Error creating gurobi model on GRBnewmodel(), error code: "
219 CHECK(
model !=
nullptr);
223 int gurobi_major, gurobi_minor, gurobi_technical;
224 GRBversion(&gurobi_major, &gurobi_minor, &gurobi_technical);
225 VLOG(3) << absl::StrFormat(
226 "Successfully created model for Gurobi v%d.%d.%d (%s)", gurobi_major,
229 return absl::WrapUnique(
230 new Gurobi(std::move(optional_owned_primary_env),
model, model_env));
236 LOG(ERROR) <<
"Error freeing gurobi model, code: " << err
243 if (grb_err == kGrbOk) {
244 return absl::OkStatus();
248 <<
"Gurobi error code: " << grb_err
253 const char vtype,
const std::string& name) {
254 return AddVar({}, {}, obj, lb, ub, vtype, name);
258 const absl::Span<const double> vval,
259 const double obj,
const double lb,
const double ub,
260 const char vtype,
const std::string& name) {
261 CHECK_EQ(vind.size(), vval.size());
262 const int numnz =
static_cast<int>(vind.size());
264 const_cast<int*
>(vind.data()),
265 const_cast<double*
>(vval.data()),
270 name.empty() ?
nullptr : name.data()));
273absl::Status Gurobi::AddVars(
const absl::Span<const double> obj,
274 const absl::Span<const double> lb,
275 const absl::Span<const double> ub,
276 const absl::Span<const char> vtype,
277 const absl::Span<const std::string> names) {
278 return AddVars({}, {}, {}, obj, lb, ub, vtype, names);
281absl::Status Gurobi::AddVars(
const absl::Span<const int> vbegin,
282 const absl::Span<const int> vind,
283 const absl::Span<const double> vval,
284 const absl::Span<const double> obj,
285 const absl::Span<const double> lb,
286 const absl::Span<const double> ub,
287 const absl::Span<const char> vtype,
288 const absl::Span<const std::string> names) {
289 CHECK_EQ(vind.size(), vval.size());
290 const int num_vars =
static_cast<int>(lb.size());
291 CHECK_EQ(ub.size(), num_vars);
292 CHECK_EQ(vtype.size(), num_vars);
293 double* c_obj =
nullptr;
295 CHECK_EQ(obj.size(), num_vars);
296 c_obj =
const_cast<double*
>(obj.data());
298 if (!vbegin.empty()) {
299 CHECK_EQ(vbegin.size(), num_vars);
301 char** c_names =
nullptr;
302 std::vector<char*> c_names_data;
303 if (!names.empty()) {
304 CHECK_EQ(num_vars, names.size());
305 for (
const std::string& name : names) {
306 c_names_data.push_back(
const_cast<char*
>(name.c_str()));
308 c_names = c_names_data.data();
312 const_cast<int*
>(vbegin.data()),
313 const_cast<int*
>(vind.data()),
314 const_cast<double*
>(vval.data()),
316 const_cast<double*
>(lb.data()),
317 const_cast<double*
>(ub.data()),
318 const_cast<char*
>(vtype.data()),
324 GRBdelvars(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
328 const std::string& name) {
329 return AddConstr({}, {}, sense, rhs, name);
333 const absl::Span<const double> cval,
334 const char sense,
const double rhs,
335 const std::string& name) {
336 CHECK_EQ(cind.size(), cval.size());
337 const int numnz =
static_cast<int>(cind.size());
340 const_cast<int*
>(cind.data()),
341 const_cast<double*
>(cval.data()),
344 name.empty() ?
nullptr : name.data()));
347absl::Status Gurobi::AddConstrs(
const absl::Span<const char> sense,
348 const absl::Span<const double> rhs,
349 const absl::Span<const std::string> names) {
350 const int num_cons =
static_cast<int>(sense.size());
351 CHECK_EQ(rhs.size(), num_cons);
352 char** c_names =
nullptr;
353 std::vector<char*> c_names_data;
354 if (!names.empty()) {
355 CHECK_EQ(num_cons, names.size());
356 for (
const std::string& name : names) {
357 c_names_data.push_back(
const_cast<char*
>(name.c_str()));
359 c_names = c_names_data.data();
365 nullptr,
const_cast<char*
>(sense.data()),
366 const_cast<double*
>(rhs.data()), c_names));
371 GRBdelconstrs(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
375 const absl::Span<const int> qcol,
376 const absl::Span<const double> qval) {
377 const int numqnz =
static_cast<int>(qrow.size());
378 CHECK_EQ(qcol.size(), numqnz);
379 CHECK_EQ(qval.size(), numqnz);
381 gurobi_model_, numqnz,
const_cast<int*
>(qcol.data()),
382 const_cast<int*
>(qrow.data()),
const_cast<double*
>(qval.data())));
388 const double weight,
const double abs_tol,
389 const double rel_tol,
390 const std::string& name,
391 const double constant,
392 const absl::Span<const int> lind,
393 const absl::Span<const double> lval) {
394 const int numlnz =
static_cast<int>(lind.size());
395 CHECK_EQ(lval.size(), numlnz);
403 const_cast<char*
>(name.c_str()),
406 const_cast<int*
>(lind.data()),
407 const_cast<double*
>(lval.data())));
411 const absl::Span<const double> lval,
412 const absl::Span<const int> qrow,
413 const absl::Span<const int> qcol,
414 const absl::Span<const double> qval,
415 const char sense,
const double rhs,
416 const std::string& name) {
417 const int numlnz =
static_cast<int>(lind.size());
418 CHECK_EQ(lval.size(), numlnz);
420 const int numqlnz =
static_cast<int>(qrow.size());
421 CHECK_EQ(qcol.size(), numqlnz);
422 CHECK_EQ(qval.size(), numqlnz);
427 const_cast<int*
>(lind.data()),
428 const_cast<double*
>(lval.data()),
430 const_cast<int*
>(qrow.data()),
431 const_cast<int*
>(qcol.data()),
432 const_cast<double*
>(qval.data()),
435 const_cast<char*
>(name.c_str())));
440 const_cast<int*
>(ind.data())));
444 const absl::Span<const int> beg,
445 const absl::Span<const int> ind,
446 const absl::Span<const double> weight) {
447 const int num_sos =
static_cast<int>(types.size());
448 CHECK_EQ(beg.size(), num_sos);
450 const int num_members =
static_cast<int>(ind.size());
451 CHECK_EQ(weight.size(), num_members);
455 const_cast<int*
>(types.data()),
456 const_cast<int*
>(beg.data()),
457 const_cast<int*
>(ind.data()),
458 const_cast<double*
>(weight.data())));
463 const_cast<int*
>(ind.data())));
468 const absl::Span<const int> ind,
469 const absl::Span<const double> val,
470 const char sense,
const double rhs) {
471 const int nvars =
static_cast<int>(ind.size());
472 CHECK_EQ(val.size(), nvars);
474 gurobi_model_,
const_cast<char*
>(name.c_str()),
475 binvar, binval, nvars,
476 const_cast<int*
>(ind.data()),
477 const_cast<double*
>(val.data()), sense, rhs));
482 const_cast<int*
>(ind.data())));
486 const absl::Span<const int> vind,
487 const absl::Span<const double> val) {
488 const int num_changes =
static_cast<int>(cind.size());
489 CHECK_EQ(vind.size(), num_changes);
490 CHECK_EQ(val.size(), num_changes);
492 gurobi_model_, num_changes,
const_cast<int*
>(cind.data()),
493 const_cast<int*
>(vind.data()),
const_cast<double*
>(val.data())));
499 nullptr, first_var, num_vars)));
504 const absl::Span<int> vind,
505 const absl::Span<double> vval,
const int first_var,
506 const int num_vars) {
507 CHECK_EQ(vbegin.size(), num_vars);
508 CHECK_EQ(vind.size(), vval.size());
512 vval.data(), first_var, num_vars)));
513 CHECK_EQ(nnz, vind.size());
514 return absl::OkStatus();
518 const int num_vars) {
521 result.
begins.resize(num_vars);
522 result.
inds.resize(nnz);
523 result.
vals.resize(nnz);
527 result.
inds.data(), result.
vals.data(), first_var, num_vars)));
528 CHECK_EQ(read_nnz, nnz);
537 ASSIGN_OR_RETURN(
const auto scope, ScopedCallback::New(
this, std::move(cb)));
541 return scope->Release();
545 ASSIGN_OR_RETURN(
const auto scope, ScopedCallback::New(
this, std::move(cb)));
551 }
else if (error == kGrbOk) {
563 return scope->Release();
573 <<
"Error getting Gurobi int attribute: " << name;
580 <<
"Error getting Gurobi double attribute: " << name;
585 const char*
const name)
const {
588 char* result =
nullptr;
590 <<
"Error getting Gurobi string attribute: " << name;
591 if (result ==
nullptr) {
592 return std::string();
594 return std::string(result);
598 const std::string& value) {
607 const double value) {
612 const absl::Span<const int> new_values) {
614 const_cast<int*
>(new_values.data())));
618 const char*
const name,
const absl::Span<const double> new_values) {
620 const_cast<double*
>(new_values.data())));
624 const absl::Span<const char> new_values) {
626 const_cast<char*
>(new_values.data())));
630 const absl::Span<int> attr_out)
const {
632 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
633 <<
"Error getting Gurobi int array attribute: " << name;
634 return absl::OkStatus();
638 const int len)
const {
639 std::vector<int> result(len);
645 const char*
const name,
const absl::Span<double> attr_out)
const {
647 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
648 <<
"Error getting Gurobi double array attribute: " << name;
649 return absl::OkStatus();
653 const char*
const name,
const int len)
const {
654 std::vector<double> result(len);
660 const absl::Span<char> attr_out)
const {
662 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
663 <<
"Error getting Gurobi char array attribute: " << name;
664 return absl::OkStatus();
668 const char*
const name,
const int len)
const {
669 std::vector<char> result(len);
675 const absl::Span<const int> ind,
676 const absl::Span<const int> new_values) {
677 const int len =
static_cast<int>(ind.size());
678 CHECK_EQ(new_values.size(), len);
680 const_cast<int*
>(ind.data()),
681 const_cast<int*
>(new_values.data())));
685 const char*
const name,
const absl::Span<const int> ind,
686 const absl::Span<const double> new_values) {
687 const int len =
static_cast<int>(ind.size());
688 CHECK_EQ(new_values.size(), len);
690 const_cast<int*
>(ind.data()),
691 const_cast<double*
>(new_values.data())));
695 const absl::Span<const int> ind,
696 const absl::Span<const char> new_values) {
697 const int len =
static_cast<int>(ind.size());
698 CHECK_EQ(new_values.size(), len);
700 const_cast<int*
>(ind.data()),
701 const_cast<char*
>(new_values.data())));
705 const int element)
const {
713 const int element,
const int new_value) {
719 const int element)
const {
733 const int element)
const {
742 const char new_value) {
748 const std::string& value) {
757 const double value) {
762 const std::string& value) {
781 return std::string(result.data());
790 const double value) {
793 <<
" for objective index: " << obj_index;
797 const char*
const name,
const int obj_index) {
801 <<
" for objective index: " << obj_index;
808 void*
const cb_data,
const int where)
809 : gurobi_(ABSL_DIE_IF_NULL(
gurobi)), cb_data_(cb_data), where_(
where) {}
814 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
819 const int what)
const {
822 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
827 const int what,
const absl::Span<double> result)
const {
828 return gurobi_->ToStatus(
829 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(result.data())));
833 char* result =
nullptr;
836 if (result ==
nullptr) {
837 return std::string();
839 return std::string(result);
843 const absl::Span<const int> cutind,
const absl::Span<const double> cutval,
844 const char cutsense,
const double cutrhs)
const {
845 const int cut_len =
static_cast<int>(cutind.size());
846 CHECK_EQ(cutval.size(), cut_len);
847 return gurobi_->ToStatus(
848 GRBcbcut(cb_data_, cut_len,
const_cast<int*
>(cutind.data()),
849 const_cast<double*
>(cutval.data()), cutsense, cutrhs));
853 const absl::Span<const int> lazyind,
const absl::Span<const double> lazyval,
854 const char lazysense,
const double lazyrhs)
const {
855 const int lazy_len =
static_cast<int>(lazyind.size());
856 CHECK_EQ(lazyval.size(), lazy_len);
857 return gurobi_->ToStatus(
858 GRBcblazy(cb_data_, lazy_len,
const_cast<int*
>(lazyind.data()),
859 const_cast<double*
>(lazyval.data()), lazysense, lazyrhs));
863 const absl::Span<const double>
solution)
const {
870absl::StatusOr<GRBenv*> Gurobi::GetMultiObjectiveEnv(
871 const int obj_index)
const {
873 if (obj_env ==
nullptr) {
875 <<
"Failed to get objective environment for objective index: "
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
GurobiInitializerProto_ISVKey ISVKey
absl::StatusOr< std::string > CbGetMessage() const
absl::Status CbLazy(absl::Span< const int > lazyind, absl::Span< const double > lazyval, char lazysense, double lazyrhs) const
CallbackContext(Gurobi *gurobi, void *cb_data, int where)
absl::StatusOr< double > CbGetDouble(int what) const
absl::Status CbCut(absl::Span< const int > cutind, absl::Span< const double > cutval, char cutsense, double cutrhs) const
absl::StatusOr< double > CbSolution(absl::Span< const double > solution) const
absl::Status CbGetDoubleArray(int what, absl::Span< double > result) const
absl::StatusOr< int > CbGetInt(int what) const
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 GetIntAttrArray(const char *name, absl::Span< int > attr_out) const
absl::Status SetMultiObjectiveDoubleParam(const char *name, int obj_index, double value)
absl::Status ToStatus(int grb_err, absl::StatusCode code=absl::StatusCode::kInvalidArgument, absl::SourceLocation loc=absl::SourceLocation::current()) const
absl::Status DelGenConstrs(absl::Span< const int > ind)
absl::Status SetDoubleAttrElement(const char *name, int element, double new_value)
static absl::StatusOr< std::unique_ptr< Gurobi > > NewWithSharedPrimaryEnv(GRBenv *primary_env)
absl::StatusOr< bool > ComputeIIS(Callback cb=nullptr)
absl::Status AddVar(double obj, double lb, double ub, char vtype, const std::string &name)
bool IsAttrAvailable(const char *name) const
absl::StatusOr< char > GetCharAttrElement(const char *name, int element) const
absl::Status SetIntAttrElement(const char *name, int element, int new_value)
absl::Status SetCharAttrArray(const char *name, absl::Span< const char > new_values)
absl::Status SetDoubleAttrArray(const char *name, absl::Span< const double > new_values)
absl::StatusOr< int > GetIntAttr(const char *name) const
absl::Status SetStringParam(const char *name, const std::string &value)
absl::Status DelSos(absl::Span< const int > ind)
absl::StatusOr< int > GetNnz(int first_var, int num_vars)
absl::Status SetDoubleAttrList(const char *name, absl::Span< const int > ind, absl::Span< const double > new_values)
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 SetIntAttr(const char *attr_name, int value)
absl::Status AddConstr(char sense, double rhs, const std::string &name)
absl::Status SetParam(const char *name, const std::string &value)
absl::Status SetStringAttr(const char *attr_name, const std::string &value)
std::function< absl::Status(const CallbackContext &)> Callback
absl::Status GetVars(absl::Span< int > vbegin, absl::Span< int > vind, absl::Span< double > vval, int first_var, int num_vars)
absl::Status ChgCoeffs(absl::Span< const int > cind, absl::Span< const int > vind, absl::Span< const double > val)
static absl::StatusOr< std::unique_ptr< Gurobi > > New(GRBenvUniquePtr primary_env=nullptr)
absl::Status Optimize(Callback cb=nullptr)
absl::Status GetCharAttrArray(const char *name, absl::Span< char > attr_out) const
absl::StatusOr< double > GetDoubleAttrElement(const char *name, int element) const
absl::StatusOr< double > GetDoubleAttr(const char *name) const
absl::Status SetCharAttrElement(const char *name, int element, char new_value)
absl::Status SetIntParam(const char *name, int value)
absl::StatusOr< std::string > GetStringAttr(const char *name) const
absl::Status SetIntAttrArray(const char *name, absl::Span< const int > new_values)
absl::StatusOr< int > GetIntParam(const char *name)
absl::StatusOr< int > GetIntAttrElement(const char *name, int element) const
absl::Status AddQpTerms(absl::Span< const int > qrow, absl::Span< const int > qcol, absl::Span< const double > qval)
absl::Status SetDoubleParam(const char *name, double value)
absl::StatusOr< double > GetDoubleParam(const char *name)
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 GetDoubleAttrArray(const char *name, absl::Span< double > attr_out) const
absl::Status ResetParameters()
absl::Status UpdateModel()
absl::Status SetDoubleAttr(const char *attr_name, double value)
absl::StatusOr< std::string > GetStringParam(const char *name)
absl::Status DelQConstrs(absl::Span< const int > ind)
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)
have size equal to the number of new be empty(all new constraints have name ""). absl absl::Status DelConstrs(absl::Span< const int > ind)
absl::Status SetIntAttrList(const char *name, absl::Span< const int > ind, absl::Span< const int > new_values)
absl::StatusOr< double > GetMultiObjectiveDoubleParam(const char *name, int obj_index)
absl::Status SetCharAttrList(const char *name, absl::Span< const int > ind, absl::Span< const char > new_values)
have size equal to the number of new be be empty(all new variables have name ""). absl have size equal to the number of new be be empty(all new variables have name ""). absl absl::Status DelVars(absl::Span< const int > ind)
#define GRB_ERROR_CALLBACK
#define GRB_CB_MSG_STRING
struct _GRBmodel GRBmodel
#define GRB_ERROR_IIS_NOT_INFEASIBLE
#define GRB_INT_ATTR_IIS_MINIMAL
absl::StatusOr< GRBenvUniquePtr > GurobiNewPrimaryEnv(const std::optional< GurobiIsvKey > &isv_key)
std::unique_ptr< GRBenv, GurobiFreeEnv > GRBenvUniquePtr
absl::StatusOr< GRBenv * > NewPrimaryEnvFromISVKey(const GurobiIsvKey &isv_key)
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(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
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
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
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetstrparam
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *newvalues)> GRBsetdblattrarray
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
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(GRBmodel *model, int len, int *ind)> GRBdelconstrs
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
std::function< int(GRBenv *env, const char *paramname, int *valueP)> GRBgetintparam
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< char *(void)> GRBplatform
std::function< int(GRBmodel *model, int numsos, int nummembers, int *types, int *beg, int *ind, double *weight)> GRBaddsos
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
StatusBuilder InvalidArgumentErrorBuilder()
void operator()(GRBenv *env) const
std::vector< double > vals
std::vector< int > begins