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 const int where,
void*
const usrdata) {
52 CHECK(usrdata !=
nullptr);
53 CHECK(model !=
nullptr);
54 auto user_cb_data =
static_cast<UserCallbackData*
>(usrdata);
55 CHECK_EQ(model, user_cb_data->gurobi->model());
57 if (!user_cb_data->status.ok()) {
61 user_cb_data->status = user_cb_data->user_cb(context);
62 if (!user_cb_data->status.ok()) {
63 user_cb_data->gurobi->Terminate();
86 ScopedCallback(
const ScopedCallback&) =
delete;
87 ScopedCallback& operator=(
const ScopedCallback&) =
delete;
88 ScopedCallback(ScopedCallback&&) =
delete;
89 ScopedCallback& operator=(ScopedCallback&&) =
delete;
92 static absl::StatusOr<std::unique_ptr<ScopedCallback>> New(
94 CHECK(gurobi !=
nullptr);
95 auto scope = absl::WrapUnique(
new ScopedCallback(gurobi));
97 scope->user_cb_data_.user_cb = std::move(cb);
98 scope->user_cb_data_.gurobi = gurobi;
100 gurobi->model(), GurobiCallback, &scope->user_cb_data_)));
101 scope->needs_cleanup_ =
true;
107 absl::Status Flush() {
108 const absl::Status status = std::move(user_cb_data_.status);
109 user_cb_data_.status = absl::OkStatus();
114 absl::Status Release() {
115 if (needs_cleanup_) {
116 needs_cleanup_ =
false;
117 return gurobi_->ToStatus(
120 return absl::OkStatus();
124 if (
const absl::Status s = Flush(); !s.ok()) {
125 LOG(ERROR) <<
"Error returned from callback: " << s;
127 if (
const absl::Status s = Release(); !s.ok()) {
128 LOG(ERROR) <<
"Error cleaning up callback: " << s;
133 explicit ScopedCallback(Gurobi*
const gurobi) : gurobi_(gurobi) {}
135 bool needs_cleanup_ =
false;
137 UserCallbackData user_cb_data_;
143 return key.name == proto_key.name() &&
144 key.application_name == proto_key.application_name() &&
145 key.expiration == proto_key.expiration() && key.key == proto_key.key();
151 if (env !=
nullptr) {
157 const std::optional<GurobiIsvKey>& isv_key) {
158 if (isv_key.has_value()) {
163 GRBenv* naked_primary_env =
nullptr;
164 const int err =
GRBloadenv(&naked_primary_env,
nullptr);
172 <<
"failed to create Gurobi primary environment, GRBloadenv() "
173 "returned the error ("
178 GRBenv*
const primary_env) {
179 CHECK(primary_env !=
nullptr);
180 return New(
nullptr, primary_env);
185 if (primary_env ==
nullptr) {
188 GRBenv*
const raw_primary_env = primary_env.get();
189 return New(std::move(primary_env), raw_primary_env);
194 : owned_primary_env_(
std::move(optional_owned_primary_env)),
195 gurobi_model_(ABSL_DIE_IF_NULL(model)),
196 model_env_(ABSL_DIE_IF_NULL(model_env)) {}
198absl::StatusOr<std::unique_ptr<Gurobi>>
Gurobi::New(
200 CHECK(primary_env !=
nullptr);
210 <<
"Error creating gurobi model on GRBnewmodel(), error code: "
213 CHECK(
model !=
nullptr);
217 int gurobi_major, gurobi_minor, gurobi_technical;
218 GRBversion(&gurobi_major, &gurobi_minor, &gurobi_technical);
219 VLOG(3) << absl::StrFormat(
220 "Successfully created model for Gurobi v%d.%d.%d (%s)", gurobi_major,
223 return absl::WrapUnique(
224 new Gurobi(std::move(optional_owned_primary_env),
model, model_env));
230 LOG(ERROR) <<
"Error freeing gurobi model, code: " << err
237 if (grb_err == kGrbOk) {
238 return absl::OkStatus();
242 <<
"Gurobi error code: " << grb_err
247 const char vtype,
const std::string& name) {
248 return AddVar({}, {}, obj, lb, ub, vtype, name);
252 const absl::Span<const double> vval,
253 const double obj,
const double lb,
const double ub,
254 const char vtype,
const std::string& name) {
255 CHECK_EQ(vind.size(), vval.size());
256 const int numnz =
static_cast<int>(vind.size());
258 const_cast<int*
>(vind.data()),
259 const_cast<double*
>(vval.data()),
264 name.empty() ?
nullptr : name.data()));
267absl::Status Gurobi::AddVars(
const absl::Span<const double> obj,
268 const absl::Span<const double> lb,
269 const absl::Span<const double> ub,
270 const absl::Span<const char> vtype,
271 const absl::Span<const std::string> names) {
272 return AddVars({}, {}, {}, obj, lb, ub, vtype, names);
275absl::Status Gurobi::AddVars(
const absl::Span<const int> vbegin,
276 const absl::Span<const int> vind,
277 const absl::Span<const double> vval,
278 const absl::Span<const double> obj,
279 const absl::Span<const double> lb,
280 const absl::Span<const double> ub,
281 const absl::Span<const char> vtype,
282 const absl::Span<const std::string> names) {
283 CHECK_EQ(vind.size(), vval.size());
284 const int num_vars =
static_cast<int>(lb.size());
285 CHECK_EQ(ub.size(), num_vars);
286 CHECK_EQ(vtype.size(), num_vars);
287 double* c_obj =
nullptr;
289 CHECK_EQ(obj.size(), num_vars);
290 c_obj =
const_cast<double*
>(obj.data());
292 if (!vbegin.empty()) {
293 CHECK_EQ(vbegin.size(), num_vars);
295 char** c_names =
nullptr;
296 std::vector<char*> c_names_data;
297 if (!names.empty()) {
298 CHECK_EQ(num_vars, names.size());
299 for (
const std::string& name : names) {
300 c_names_data.push_back(
const_cast<char*
>(name.c_str()));
302 c_names = c_names_data.data();
306 const_cast<int*
>(vbegin.data()),
307 const_cast<int*
>(vind.data()),
308 const_cast<double*
>(vval.data()),
310 const_cast<double*
>(lb.data()),
311 const_cast<double*
>(ub.data()),
312 const_cast<char*
>(vtype.data()),
318 GRBdelvars(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
322 const std::string& name) {
323 return AddConstr({}, {}, sense, rhs, name);
327 const absl::Span<const double> cval,
328 const char sense,
const double rhs,
329 const std::string& name) {
330 CHECK_EQ(cind.size(), cval.size());
331 const int numnz =
static_cast<int>(cind.size());
334 const_cast<int*
>(cind.data()),
335 const_cast<double*
>(cval.data()),
338 name.empty() ?
nullptr : name.data()));
341absl::Status Gurobi::AddConstrs(
const absl::Span<const char> sense,
342 const absl::Span<const double> rhs,
343 const absl::Span<const std::string> names) {
344 const int num_cons =
static_cast<int>(sense.size());
345 CHECK_EQ(rhs.size(), num_cons);
346 char** c_names =
nullptr;
347 std::vector<char*> c_names_data;
348 if (!names.empty()) {
349 CHECK_EQ(num_cons, names.size());
350 for (
const std::string& name : names) {
351 c_names_data.push_back(
const_cast<char*
>(name.c_str()));
353 c_names = c_names_data.data();
359 nullptr,
const_cast<char*
>(sense.data()),
360 const_cast<double*
>(rhs.data()), c_names));
365 GRBdelconstrs(gurobi_model_, ind.size(),
const_cast<int*
>(ind.data())));
369 const absl::Span<const int> qcol,
370 const absl::Span<const double> qval) {
371 const int numqnz =
static_cast<int>(qrow.size());
372 CHECK_EQ(qcol.size(), numqnz);
373 CHECK_EQ(qval.size(), numqnz);
375 gurobi_model_, numqnz,
const_cast<int*
>(qcol.data()),
376 const_cast<int*
>(qrow.data()),
const_cast<double*
>(qval.data())));
382 const double weight,
const double abs_tol,
383 const double rel_tol,
384 const std::string& name,
385 const double constant,
386 const absl::Span<const int> lind,
387 const absl::Span<const double> lval) {
388 const int numlnz =
static_cast<int>(lind.size());
389 CHECK_EQ(lval.size(), numlnz);
397 const_cast<char*
>(name.c_str()),
400 const_cast<int*
>(lind.data()),
401 const_cast<double*
>(lval.data())));
405 const absl::Span<const double> lval,
406 const absl::Span<const int> qrow,
407 const absl::Span<const int> qcol,
408 const absl::Span<const double> qval,
409 const char sense,
const double rhs,
410 const std::string& name) {
411 const int numlnz =
static_cast<int>(lind.size());
412 CHECK_EQ(lval.size(), numlnz);
414 const int numqlnz =
static_cast<int>(qrow.size());
415 CHECK_EQ(qcol.size(), numqlnz);
416 CHECK_EQ(qval.size(), numqlnz);
421 const_cast<int*
>(lind.data()),
422 const_cast<double*
>(lval.data()),
424 const_cast<int*
>(qrow.data()),
425 const_cast<int*
>(qcol.data()),
426 const_cast<double*
>(qval.data()),
429 const_cast<char*
>(name.c_str())));
434 const_cast<int*
>(ind.data())));
438 const absl::Span<const int> beg,
439 const absl::Span<const int> ind,
440 const absl::Span<const double> weight) {
441 const int num_sos =
static_cast<int>(types.size());
442 CHECK_EQ(beg.size(), num_sos);
444 const int num_members =
static_cast<int>(ind.size());
445 CHECK_EQ(weight.size(), num_members);
449 const_cast<int*
>(types.data()),
450 const_cast<int*
>(beg.data()),
451 const_cast<int*
>(ind.data()),
452 const_cast<double*
>(weight.data())));
457 const_cast<int*
>(ind.data())));
462 const absl::Span<const int> ind,
463 const absl::Span<const double> val,
464 const char sense,
const double rhs) {
465 const int nvars =
static_cast<int>(ind.size());
466 CHECK_EQ(val.size(), nvars);
468 gurobi_model_,
const_cast<char*
>(name.c_str()),
469 binvar, binval, nvars,
470 const_cast<int*
>(ind.data()),
471 const_cast<double*
>(val.data()), sense, rhs));
476 const_cast<int*
>(ind.data())));
480 const absl::Span<const int> vind,
481 const absl::Span<const double> val) {
482 const int num_changes =
static_cast<int>(cind.size());
483 CHECK_EQ(vind.size(), num_changes);
484 CHECK_EQ(val.size(), num_changes);
486 gurobi_model_, num_changes,
const_cast<int*
>(cind.data()),
487 const_cast<int*
>(vind.data()),
const_cast<double*
>(val.data())));
493 nullptr, first_var, num_vars)));
498 const absl::Span<int> vind,
499 const absl::Span<double> vval,
const int first_var,
500 const int num_vars) {
501 CHECK_EQ(vbegin.size(), num_vars);
502 CHECK_EQ(vind.size(), vval.size());
506 vval.data(), first_var, num_vars)));
507 CHECK_EQ(nnz, vind.size());
508 return absl::OkStatus();
512 const int num_vars) {
515 result.
begins.resize(num_vars);
516 result.
inds.resize(nnz);
517 result.
vals.resize(nnz);
521 result.
inds.data(), result.
vals.data(), first_var, num_vars)));
522 CHECK_EQ(read_nnz, nnz);
531 ASSIGN_OR_RETURN(
const auto scope, ScopedCallback::New(
this, std::move(cb)));
535 return scope->Release();
539 ASSIGN_OR_RETURN(
const auto scope, ScopedCallback::New(
this, std::move(cb)));
545 }
else if (error == kGrbOk) {
557 return scope->Release();
567 <<
"Error getting Gurobi int attribute: " << name;
574 <<
"Error getting Gurobi double attribute: " << name;
579 const char*
const name)
const {
582 char* result =
nullptr;
584 <<
"Error getting Gurobi string attribute: " << name;
585 if (result ==
nullptr) {
586 return std::string();
588 return std::string(result);
592 const std::string& value) {
601 const double value) {
606 const absl::Span<const int> new_values) {
608 const_cast<int*
>(new_values.data())));
612 const char*
const name,
const absl::Span<const double> new_values) {
614 const_cast<double*
>(new_values.data())));
618 const absl::Span<const char> new_values) {
620 const_cast<char*
>(new_values.data())));
624 const absl::Span<int> attr_out)
const {
626 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
627 <<
"Error getting Gurobi int array attribute: " << name;
628 return absl::OkStatus();
632 const int len)
const {
633 std::vector<int> result(len);
639 const char*
const name,
const absl::Span<double> attr_out)
const {
641 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
642 <<
"Error getting Gurobi double array attribute: " << name;
643 return absl::OkStatus();
647 const char*
const name,
const int len)
const {
648 std::vector<double> result(len);
654 const absl::Span<char> attr_out)
const {
656 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
657 <<
"Error getting Gurobi char array attribute: " << name;
658 return absl::OkStatus();
662 const char*
const name,
const int len)
const {
663 std::vector<char> result(len);
669 const absl::Span<const int> ind,
670 const absl::Span<const int> new_values) {
671 const int len =
static_cast<int>(ind.size());
672 CHECK_EQ(new_values.size(), len);
674 const_cast<int*
>(ind.data()),
675 const_cast<int*
>(new_values.data())));
679 const char*
const name,
const absl::Span<const int> ind,
680 const absl::Span<const double> new_values) {
681 const int len =
static_cast<int>(ind.size());
682 CHECK_EQ(new_values.size(), len);
684 const_cast<int*
>(ind.data()),
685 const_cast<double*
>(new_values.data())));
689 const absl::Span<const int> ind,
690 const absl::Span<const char> new_values) {
691 const int len =
static_cast<int>(ind.size());
692 CHECK_EQ(new_values.size(), len);
694 const_cast<int*
>(ind.data()),
695 const_cast<char*
>(new_values.data())));
699 const int element)
const {
707 const int element,
const int new_value) {
713 const int element)
const {
727 const int element)
const {
736 const char new_value) {
742 const std::string& value) {
751 const double value) {
756 const std::string& value) {
775 return std::string(result.data());
784 const double value) {
787 <<
" for objective index: " << obj_index;
791 const char*
const name,
const int obj_index) {
795 <<
" for objective index: " << obj_index;
802 void*
const cb_data,
const int where)
803 : gurobi_(ABSL_DIE_IF_NULL(
gurobi)), cb_data_(cb_data), where_(
where) {}
808 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
813 const int what)
const {
816 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(&result))));
821 const int what,
const absl::Span<double> result)
const {
822 return gurobi_->ToStatus(
823 GRBcbget(cb_data_, where_, what,
static_cast<void*
>(result.data())));
827 char* result =
nullptr;
830 if (result ==
nullptr) {
831 return std::string();
833 return std::string(result);
837 const absl::Span<const int> cutind,
const absl::Span<const double> cutval,
838 const char cutsense,
const double cutrhs)
const {
839 const int cut_len =
static_cast<int>(cutind.size());
840 CHECK_EQ(cutval.size(), cut_len);
841 return gurobi_->ToStatus(
842 GRBcbcut(cb_data_, cut_len,
const_cast<int*
>(cutind.data()),
843 const_cast<double*
>(cutval.data()), cutsense, cutrhs));
847 const absl::Span<const int> lazyind,
const absl::Span<const double> lazyval,
848 const char lazysense,
const double lazyrhs)
const {
849 const int lazy_len =
static_cast<int>(lazyind.size());
850 CHECK_EQ(lazyval.size(), lazy_len);
851 return gurobi_->ToStatus(
852 GRBcblazy(cb_data_, lazy_len,
const_cast<int*
>(lazyind.data()),
853 const_cast<double*
>(lazyval.data()), lazysense, lazyrhs));
857 const absl::Span<const double>
solution)
const {
864absl::StatusOr<GRBenv*> Gurobi::GetMultiObjectiveEnv(
865 const int obj_index)
const {
867 if (obj_env ==
nullptr) {
869 <<
"Failed to get objective environment for objective index: "
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
GurobiInitializerProto_ISVKey ISVKey
nested types -------------------------------------------------—
absl::StatusOr< std::string > CbGetMessage() const
Calls GRBcbget() where what=MSG_STRING (call only at where=MESSAGE).
absl::Status CbLazy(absl::Span< const int > lazyind, absl::Span< const double > lazyval, char lazysense, double lazyrhs) const
Calls GRBcblazy().
int where() const
The current event of the callback, see Callback Codes in Gurobi docs.
CallbackContext(Gurobi *gurobi, void *cb_data, int where)
For internal use only.
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
Calls GRBcbcut().
absl::StatusOr< double > CbSolution(absl::Span< const double > solution) const
Calls GRBcbsolution().
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)
Calls GRBaddvar() to add a variable to the model.
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)
Calls GRBsetstrparam().
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)
void Terminate()
Calls GRBterminate().
static absl::StatusOr< std::unique_ptr< Gurobi > > New(GRBenvUniquePtr primary_env=nullptr)
GRBmodel * model() const
Typically not needed.
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)
Calls GRBsetintparam().
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)
Calls GRBgetintparam().
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)
Calls GRBsetdblparam().
absl::StatusOr< double > GetDoubleParam(const char *name)
Calls GRBgetdblparam().
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()
Calls GRBresetparams().
absl::Status UpdateModel()
Calls GRBupdatemodel().
absl::Status SetDoubleAttr(const char *attr_name, double value)
absl::StatusOr< std::string > GetStringParam(const char *name)
Calls GRBgetstrparam().
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)
Calls GRBdelconstrs().
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)
Calls GRBdelvars().
#define GRB_ERROR_CALLBACK
#define GRB_CB_MSG_STRING
struct _GRBmodel GRBmodel
#define GRB_ERROR_IIS_NOT_INFEASIBLE
#define GRB_INT_ATTR_IIS_MINIMAL
An object oriented wrapper for quadratic constraints in ModelStorage.
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
This is the 'define' section.
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