Google OR-Tools v9.14
a fast and portable software suite for combinatorial optimization
Loading...
Searching...
No Matches
g_gurobi.cc
Go to the documentation of this file.
1// Copyright 2010-2025 Google LLC
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
15
16#include <memory>
17#include <optional>
18#include <string>
19#include <utility>
20#include <vector>
21
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"
38
40
41namespace {
42constexpr int kGrbOk = 0;
43
44struct UserCallbackData {
45 Gurobi::Callback user_cb;
46 absl::Status status = absl::OkStatus();
47 Gurobi* gurobi = nullptr;
48};
49
50int GUROBI_STDCALL GurobiCallback(GRBmodel* const model, void* const cbdata,
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());
56 // NOTE: if a previous callback failed, we never run the callback again.
57 if (!user_cb_data->status.ok()) {
58 return GRB_ERROR_CALLBACK;
59 }
60 const Gurobi::CallbackContext context(user_cb_data->gurobi, cbdata, where);
61 user_cb_data->status = user_cb_data->user_cb(context);
62 if (!user_cb_data->status.ok()) {
63 user_cb_data->gurobi->Terminate();
64 return GRB_ERROR_CALLBACK;
65 }
66 return kGrbOk;
67}
68
69// A class for handling callback management (setting/unsetting) and their
70// associated errors. Users create this handler to register their callback, do
71// something, then call `Flush()` to flush errors returned from the callback,
72// and then finally call `Release()` to clear the registered callback. This
73// class uses RAII to attempt to automatically clear the callback if your code
74// returns prior to calling `Release()` manually, but note that this does not
75// propagate any errors if it fails.
76
77// A typical use case would be:
78//
79// ASSIGN_OR_RETURN(const auto scope, ScopedCallback::New(this, std::move(cb)));
80// const int error = GRBxxx(gurobi_model_);
81// RETURN_IF_ERROR(scope->Flush());
82// RETURN_IF_ERROR(ToStatus(error));
83// return scope->Release();
84class ScopedCallback {
85 public:
86 ScopedCallback(const ScopedCallback&) = delete;
87 ScopedCallback& operator=(const ScopedCallback&) = delete;
88 ScopedCallback(ScopedCallback&&) = delete;
89 ScopedCallback& operator=(ScopedCallback&&) = delete;
90
91 // Returned object retains a pointer to `gurobi`, which must not be null.
92 static absl::StatusOr<std::unique_ptr<ScopedCallback>> New(
93 Gurobi* const gurobi, Gurobi::Callback cb) {
94 CHECK(gurobi != nullptr);
95 auto scope = absl::WrapUnique(new ScopedCallback(gurobi));
96 if (cb != nullptr) {
97 scope->user_cb_data_.user_cb = std::move(cb);
98 scope->user_cb_data_.gurobi = gurobi;
99 RETURN_IF_ERROR(gurobi->ToStatus(GRBsetcallbackfunc(
100 gurobi->model(), GurobiCallback, &scope->user_cb_data_)));
101 scope->needs_cleanup_ = true;
102 }
103 return scope;
104 }
105
106 // Propagates any errors returned from the callback.
107 absl::Status Flush() {
108 const absl::Status status = std::move(user_cb_data_.status);
109 user_cb_data_.status = absl::OkStatus();
110 return status;
111 }
112
113 // Clears the registered callback.
114 absl::Status Release() {
115 if (needs_cleanup_) {
116 needs_cleanup_ = false;
117 return gurobi_->ToStatus(
118 GRBsetcallbackfunc(gurobi_->model(), nullptr, nullptr));
119 }
120 return absl::OkStatus();
121 }
122
123 ~ScopedCallback() {
124 if (const absl::Status s = Flush(); !s.ok()) {
125 LOG(ERROR) << "Error returned from callback: " << s;
126 }
127 if (const absl::Status s = Release(); !s.ok()) {
128 LOG(ERROR) << "Error cleaning up callback: " << s;
129 }
130 }
131
132 private:
133 explicit ScopedCallback(Gurobi* const gurobi) : gurobi_(gurobi) {}
134
135 bool needs_cleanup_ = false;
136 Gurobi* gurobi_;
137 UserCallbackData user_cb_data_;
138};
139
140// Returns true if both keys are equal.
141bool AreISVKeyEqual(const GurobiIsvKey& key,
142 const GurobiInitializerProto::ISVKey& proto_key) {
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();
146}
147
148} // namespace
149
150void GurobiFreeEnv::operator()(GRBenv* const env) const {
151 if (env != nullptr) {
152 GRBfreeenv(env);
153 }
154}
155
156absl::StatusOr<GRBenvUniquePtr> GurobiNewPrimaryEnv(
157 const std::optional<GurobiIsvKey>& isv_key) {
158 if (isv_key.has_value()) {
159 ASSIGN_OR_RETURN(GRBenv* const naked_primary_env,
160 NewPrimaryEnvFromISVKey(*isv_key));
161 return GRBenvUniquePtr(naked_primary_env);
162 }
163 GRBenv* naked_primary_env = nullptr;
164 const int err = GRBloadenv(&naked_primary_env, /*logfilename=*/nullptr);
165 // Surprisingly, Gurobi will still create an environment if initialization
166 // fails, so we want this wrapper even in the error case to free it properly.
167 GRBenvUniquePtr primary_env(naked_primary_env);
168 if (err == kGrbOk) {
169 return primary_env;
170 }
172 << "failed to create Gurobi primary environment, GRBloadenv() "
173 "returned the error ("
174 << err << "): " << GRBgeterrormsg(primary_env.get());
175}
176
177absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::NewWithSharedPrimaryEnv(
178 GRBenv* const primary_env) {
179 CHECK(primary_env != nullptr);
180 return New(nullptr, primary_env);
181}
182
183absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::New(
184 GRBenvUniquePtr primary_env) {
185 if (primary_env == nullptr) {
187 }
188 GRBenv* const raw_primary_env = primary_env.get();
189 return New(std::move(primary_env), raw_primary_env);
190}
191
192Gurobi::Gurobi(GRBenvUniquePtr optional_owned_primary_env,
193 GRBmodel* const model, GRBenv* const model_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)) {}
197
198absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::New(
199 GRBenvUniquePtr optional_owned_primary_env, GRBenv* const primary_env) {
200 CHECK(primary_env != nullptr);
201 GRBmodel* model = nullptr;
202 const int err = GRBnewmodel(primary_env, &model,
203 /*Pname=*/nullptr,
204 /*numvars=*/0,
205 /*obj=*/nullptr, /*lb=*/nullptr,
206 /*ub=*/nullptr, /*vtype=*/nullptr,
207 /*varnames=*/nullptr);
208 if (err != kGrbOk) {
210 << "Error creating gurobi model on GRBnewmodel(), error code: "
211 << err << " message: " << GRBgeterrormsg(primary_env);
212 }
213 CHECK(model != nullptr);
214 GRBenv* const model_env = GRBgetenv(model);
215
216 if (VLOG_IS_ON(3)) {
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,
221 gurobi_minor, gurobi_technical, GRBplatform());
222 }
223 return absl::WrapUnique(
224 new Gurobi(std::move(optional_owned_primary_env), model, model_env));
225}
226
228 const int err = GRBfreemodel(gurobi_model_);
229 if (err != kGrbOk) {
230 LOG(ERROR) << "Error freeing gurobi model, code: " << err
231 << ", message: " << GRBgeterrormsg(model_env_);
232 }
233}
234
235absl::Status Gurobi::ToStatus(const int grb_err, const absl::StatusCode code,
236 const absl::SourceLocation loc) const {
237 if (grb_err == kGrbOk) {
238 return absl::OkStatus();
239 }
240
241 return util::StatusBuilder(code)
242 << "Gurobi error code: " << grb_err
243 << ", message: " << GRBgeterrormsg(model_env_);
244}
245
246absl::Status Gurobi::AddVar(const double obj, const double lb, const double ub,
247 const char vtype, const std::string& name) {
248 return AddVar({}, {}, obj, lb, ub, vtype, name);
249}
250
251absl::Status Gurobi::AddVar(const absl::Span<const int> vind,
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());
257 return ToStatus(GRBaddvar(/*model=*/gurobi_model_, /*numnz=*/numnz,
258 /*vind=*/const_cast<int*>(vind.data()),
259 /*vval=*/const_cast<double*>(vval.data()),
260 /*obj=*/obj,
261 /*lb=*/lb,
262 /*ub=*/ub,
263 /*vtype=*/vtype,
264 /*varname=*/name.empty() ? nullptr : name.data()));
265}
266
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);
273}
274
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;
288 if (!obj.empty()) {
289 CHECK_EQ(obj.size(), num_vars);
290 c_obj = const_cast<double*>(obj.data());
291 }
292 if (!vbegin.empty()) {
293 CHECK_EQ(vbegin.size(), num_vars);
294 }
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()));
301 }
302 c_names = c_names_data.data();
303 }
304 return ToStatus(GRBaddvars(/*model=*/gurobi_model_, /*numvars=*/num_vars,
305 /*numnz=*/vind.size(),
306 /*vbeg=*/const_cast<int*>(vbegin.data()),
307 /*vind=*/const_cast<int*>(vind.data()),
308 /*vval=*/const_cast<double*>(vval.data()),
309 /*obj=*/c_obj,
310 /*lb=*/const_cast<double*>(lb.data()),
311 /*ub=*/const_cast<double*>(ub.data()),
312 /*vtype=*/const_cast<char*>(vtype.data()),
313 /*varnames=*/c_names));
314}
315
316absl::Status Gurobi::DelVars(const absl::Span<const int> ind) {
317 return ToStatus(
318 GRBdelvars(gurobi_model_, ind.size(), const_cast<int*>(ind.data())));
319}
320
321absl::Status Gurobi::AddConstr(const char sense, const double rhs,
322 const std::string& name) {
323 return AddConstr({}, {}, sense, rhs, name);
324}
325
326absl::Status Gurobi::AddConstr(const absl::Span<const int> cind,
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());
332 return ToStatus(
333 GRBaddconstr(/*model=*/gurobi_model_, /*numnz=*/numnz,
334 /*cind=*/const_cast<int*>(cind.data()),
335 /*cval=*/const_cast<double*>(cval.data()),
336 /*sense=*/sense,
337 /*rhs=*/rhs,
338 /*constrname=*/name.empty() ? nullptr : name.data()));
339}
340
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()));
352 }
353 c_names = c_names_data.data();
354 }
355 return ToStatus(GRBaddconstrs(
356 /*model=*/gurobi_model_,
357 /*numconstrs=*/num_cons,
358 /*numnz=*/0, /*cbeg=*/nullptr, /*cind=*/nullptr,
359 /*cval=*/nullptr, /*sense=*/const_cast<char*>(sense.data()),
360 /*rhs=*/const_cast<double*>(rhs.data()), /*constrnames=*/c_names));
361}
362
363absl::Status Gurobi::DelConstrs(const absl::Span<const int> ind) {
364 return ToStatus(
365 GRBdelconstrs(gurobi_model_, ind.size(), const_cast<int*>(ind.data())));
366}
367
368absl::Status Gurobi::AddQpTerms(const absl::Span<const int> qrow,
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);
374 return ToStatus(GRBaddqpterms(
375 gurobi_model_, numqnz, const_cast<int*>(qcol.data()),
376 const_cast<int*>(qrow.data()), const_cast<double*>(qval.data())));
377}
378
379absl::Status Gurobi::DelQ() { return ToStatus(GRBdelq(gurobi_model_)); }
380
381absl::Status Gurobi::SetNthObjective(const int index, const int priority,
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);
391 /*model=*/gurobi_model_,
392 /*index=*/index,
393 /*priority=*/priority,
394 /*weight=*/weight,
395 /*abstol=*/abs_tol,
396 /*reltol=*/rel_tol,
397 /*name=*/const_cast<char*>(name.c_str()),
398 /*constant=*/constant,
399 /*lnz=*/numlnz,
400 /*lind=*/const_cast<int*>(lind.data()),
401 /*lval=*/const_cast<double*>(lval.data())));
402}
403
404absl::Status Gurobi::AddQConstr(const absl::Span<const int> lind,
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);
413
414 const int numqlnz = static_cast<int>(qrow.size());
415 CHECK_EQ(qcol.size(), numqlnz);
416 CHECK_EQ(qval.size(), numqlnz);
417
418 return ToStatus(GRBaddqconstr(
419 /*model=*/gurobi_model_,
420 /*numlnz=*/numlnz,
421 /*lind=*/const_cast<int*>(lind.data()),
422 /*lval=*/const_cast<double*>(lval.data()),
423 /*numqlnz=*/numqlnz,
424 /*qrow=*/const_cast<int*>(qrow.data()),
425 /*qcol=*/const_cast<int*>(qcol.data()),
426 /*qval=*/const_cast<double*>(qval.data()),
427 /*sense=*/sense,
428 /*rhs=*/rhs,
429 /*constrname=*/const_cast<char*>(name.c_str())));
430}
431
432absl::Status Gurobi::DelQConstrs(const absl::Span<const int> ind) {
433 return ToStatus(GRBdelqconstrs(gurobi_model_, static_cast<int>(ind.size()),
434 const_cast<int*>(ind.data())));
435}
436
437absl::Status Gurobi::AddSos(const absl::Span<const int> types,
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);
443
444 const int num_members = static_cast<int>(ind.size());
445 CHECK_EQ(weight.size(), num_members);
446
447 return ToStatus(GRBaddsos(/*model=*/gurobi_model_, /*numsos=*/num_sos,
448 /*nummembers=*/num_members,
449 /*types=*/const_cast<int*>(types.data()),
450 /*beg=*/const_cast<int*>(beg.data()),
451 /*ind=*/const_cast<int*>(ind.data()),
452 /*weight=*/const_cast<double*>(weight.data())));
453}
454
455absl::Status Gurobi::DelSos(const absl::Span<const int> ind) {
456 return ToStatus(GRBdelsos(gurobi_model_, static_cast<int>(ind.size()),
457 const_cast<int*>(ind.data())));
458}
459
460absl::Status Gurobi::AddIndicator(const std::string& name, const int binvar,
461 const int binval,
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 /*model=*/gurobi_model_, /*name=*/const_cast<char*>(name.c_str()),
469 /*binvar=*/binvar, /*binval=*/binval, /*nvars=*/nvars,
470 /*ind=*/const_cast<int*>(ind.data()),
471 /*val=*/const_cast<double*>(val.data()), /*sense=*/sense, /*rhs=*/rhs));
472}
473
474absl::Status Gurobi::DelGenConstrs(const absl::Span<const int> ind) {
475 return ToStatus(GRBdelgenconstrs(gurobi_model_, static_cast<int>(ind.size()),
476 const_cast<int*>(ind.data())));
477}
478
479absl::Status Gurobi::ChgCoeffs(const absl::Span<const int> cind,
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);
485 return ToStatus(GRBchgcoeffs(
486 gurobi_model_, num_changes, const_cast<int*>(cind.data()),
487 const_cast<int*>(vind.data()), const_cast<double*>(val.data())));
488}
489
490absl::StatusOr<int> Gurobi::GetNnz(const int first_var, const int num_vars) {
491 int nnz = 0;
492 RETURN_IF_ERROR(ToStatus(GRBgetvars(gurobi_model_, &nnz, nullptr, nullptr,
493 nullptr, first_var, num_vars)));
494 return nnz;
495}
496
497absl::Status Gurobi::GetVars(const absl::Span<int> vbegin,
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());
503 int nnz = 0;
505 ToStatus(GRBgetvars(gurobi_model_, &nnz, vbegin.data(), vind.data(),
506 vval.data(), first_var, num_vars)));
507 CHECK_EQ(nnz, vind.size());
508 return absl::OkStatus();
509}
510
511absl::StatusOr<Gurobi::SparseMat> Gurobi::GetVars(const int first_var,
512 const int num_vars) {
513 SparseMat result;
514 ASSIGN_OR_RETURN(const int nnz, GetNnz(first_var, num_vars));
515 result.begins.resize(num_vars);
516 result.inds.resize(nnz);
517 result.vals.resize(nnz);
518 int read_nnz = 0;
520 GRBgetvars(gurobi_model_, &read_nnz, result.begins.data(),
521 result.inds.data(), result.vals.data(), first_var, num_vars)));
522 CHECK_EQ(read_nnz, nnz);
523 return result;
524}
525
526absl::Status Gurobi::UpdateModel() {
527 return ToStatus(GRBupdatemodel(gurobi_model_));
528}
529
530absl::Status Gurobi::Optimize(Callback cb) {
531 ASSIGN_OR_RETURN(const auto scope, ScopedCallback::New(this, std::move(cb)));
532 const int error = GRBoptimize(gurobi_model_);
533 RETURN_IF_ERROR(scope->Flush());
535 return scope->Release();
536}
537
538absl::StatusOr<bool> Gurobi::ComputeIIS(Callback cb) {
539 ASSIGN_OR_RETURN(const auto scope, ScopedCallback::New(this, std::move(cb)));
540 const int error = GRBcomputeIIS(gurobi_model_);
541 RETURN_IF_ERROR(scope->Flush());
542 if (error == GRB_ERROR_IIS_NOT_INFEASIBLE) {
543 RETURN_IF_ERROR(scope->Release());
544 return false;
545 } else if (error == kGrbOk) {
546 // If Gurobi v11 terminates at a limit before determining if the model is
547 // feasible or not, it will return an OK error code but then will fail to
548 // return anything about the IIS it does not have. To detect this case, we
549 // query the minimality attribute: we know that our env is valid at this
550 // point, and this should fail iff an IIS is present, i.e., Gurobi proved
551 // that the model was infeasible.
552 const bool has_iis = GetIntAttr(GRB_INT_ATTR_IIS_MINIMAL).ok();
553 RETURN_IF_ERROR(scope->Release());
554 return has_iis;
555 }
557 return scope->Release();
558}
559
560bool Gurobi::IsAttrAvailable(const char* name) const {
561 return GRBisattravailable(gurobi_model_, name) > 0;
562}
563
564absl::StatusOr<int> Gurobi::GetIntAttr(const char* const name) const {
565 int result;
566 RETURN_IF_ERROR(ToStatus(GRBgetintattr(gurobi_model_, name, &result)))
567 << "Error getting Gurobi int attribute: " << name;
568 return result;
569}
570
571absl::StatusOr<double> Gurobi::GetDoubleAttr(const char* const name) const {
572 double result;
573 RETURN_IF_ERROR(ToStatus(GRBgetdblattr(gurobi_model_, name, &result)))
574 << "Error getting Gurobi double attribute: " << name;
575 return result;
576}
577
578absl::StatusOr<std::string> Gurobi::GetStringAttr(
579 const char* const name) const {
580 // WARNING: if a string attribute is the empty string, we need to be careful,
581 // std::string(char*) cannot take a nullptr.
582 char* result = nullptr;
583 RETURN_IF_ERROR(ToStatus(GRBgetstrattr(gurobi_model_, name, &result)))
584 << "Error getting Gurobi string attribute: " << name;
585 if (result == nullptr) {
586 return std::string();
587 }
588 return std::string(result);
589}
590
591absl::Status Gurobi::SetStringAttr(const char* const attr_name,
592 const std::string& value) {
593 return ToStatus(GRBsetstrattr(gurobi_model_, attr_name, value.c_str()));
594}
595
596absl::Status Gurobi::SetIntAttr(const char* const attr_name, const int value) {
597 return ToStatus(GRBsetintattr(gurobi_model_, attr_name, value));
598}
599
600absl::Status Gurobi::SetDoubleAttr(const char* const attr_name,
601 const double value) {
602 return ToStatus(GRBsetdblattr(gurobi_model_, attr_name, value));
603}
604
605absl::Status Gurobi::SetIntAttrArray(const char* const name,
606 const absl::Span<const int> new_values) {
607 return ToStatus(GRBsetintattrarray(gurobi_model_, name, 0, new_values.size(),
608 const_cast<int*>(new_values.data())));
609}
610
612 const char* const name, const absl::Span<const double> new_values) {
613 return ToStatus(GRBsetdblattrarray(gurobi_model_, name, 0, new_values.size(),
614 const_cast<double*>(new_values.data())));
615}
616
617absl::Status Gurobi::SetCharAttrArray(const char* const name,
618 const absl::Span<const char> new_values) {
619 return ToStatus(GRBsetcharattrarray(gurobi_model_, name, 0, new_values.size(),
620 const_cast<char*>(new_values.data())));
621}
622
623absl::Status Gurobi::GetIntAttrArray(const char* const name,
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();
629}
630
631absl::StatusOr<std::vector<int>> Gurobi::GetIntAttrArray(const char* const name,
632 const int len) const {
633 std::vector<int> result(len);
634 RETURN_IF_ERROR(GetIntAttrArray(name, absl::MakeSpan(result)));
635 return result;
636}
637
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();
644}
645
646absl::StatusOr<std::vector<double>> Gurobi::GetDoubleAttrArray(
647 const char* const name, const int len) const {
648 std::vector<double> result(len);
649 RETURN_IF_ERROR(GetDoubleAttrArray(name, absl::MakeSpan(result)));
650 return result;
651}
652
653absl::Status Gurobi::GetCharAttrArray(const char* const name,
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();
659}
660
661absl::StatusOr<std::vector<char>> Gurobi::GetCharAttrArray(
662 const char* const name, const int len) const {
663 std::vector<char> result(len);
664 RETURN_IF_ERROR(GetCharAttrArray(name, absl::MakeSpan(result)));
665 return result;
666}
667
668absl::Status Gurobi::SetIntAttrList(const char* const name,
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);
673 return ToStatus(GRBsetintattrlist(gurobi_model_, name, len,
674 const_cast<int*>(ind.data()),
675 const_cast<int*>(new_values.data())));
676}
677
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);
683 return ToStatus(GRBsetdblattrlist(gurobi_model_, name, len,
684 const_cast<int*>(ind.data()),
685 const_cast<double*>(new_values.data())));
686}
687
688absl::Status Gurobi::SetCharAttrList(const char* const name,
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);
693 return ToStatus(GRBsetcharattrlist(gurobi_model_, name, len,
694 const_cast<int*>(ind.data()),
695 const_cast<char*>(new_values.data())));
696}
697
698absl::StatusOr<int> Gurobi::GetIntAttrElement(const char* const name,
699 const int element) const {
700 int value;
702 ToStatus(GRBgetintattrelement(gurobi_model_, name, element, &value)));
703 return value;
704}
705
706absl::Status Gurobi::SetIntAttrElement(const char* const name,
707 const int element, const int new_value) {
708 return ToStatus(
709 GRBsetintattrelement(gurobi_model_, name, element, new_value));
710}
711
712absl::StatusOr<double> Gurobi::GetDoubleAttrElement(const char* const name,
713 const int element) const {
714 double value;
716 ToStatus(GRBgetdblattrelement(gurobi_model_, name, element, &value)));
717 return value;
718}
719
720absl::Status Gurobi::SetDoubleAttrElement(const char* const name, int element,
721 double new_value) {
722 return ToStatus(
723 GRBsetdblattrelement(gurobi_model_, name, element, new_value));
724}
725
726absl::StatusOr<char> Gurobi::GetCharAttrElement(const char* const name,
727 const int element) const {
728 char value;
730 ToStatus(GRBgetcharattrelement(gurobi_model_, name, element, &value)));
731 return value;
732}
733
734absl::Status Gurobi::SetCharAttrElement(const char* const name,
735 const int element,
736 const char new_value) {
737 return ToStatus(
738 GRBsetcharattrelement(gurobi_model_, name, element, new_value));
739}
740
741absl::Status Gurobi::SetParam(const char* const name,
742 const std::string& value) {
743 return ToStatus(GRBsetparam(model_env_, name, value.c_str()));
744}
745
746absl::Status Gurobi::SetIntParam(const char* const name, const int value) {
747 return ToStatus(GRBsetintparam(model_env_, name, value));
748}
749
750absl::Status Gurobi::SetDoubleParam(const char* const name,
751 const double value) {
752 return ToStatus(GRBsetdblparam(model_env_, name, value));
753}
754
755absl::Status Gurobi::SetStringParam(const char* const name,
756 const std::string& value) {
757 return ToStatus(GRBsetstrparam(model_env_, name, value.c_str()));
758}
759
760absl::StatusOr<int> Gurobi::GetIntParam(const char* const name) {
761 int result;
762 RETURN_IF_ERROR(ToStatus(GRBgetintparam(model_env_, name, &result)));
763 return result;
764}
765
766absl::StatusOr<double> Gurobi::GetDoubleParam(const char* const name) {
767 double result;
768 RETURN_IF_ERROR(ToStatus(GRBgetdblparam(model_env_, name, &result)));
769 return result;
770}
771
772absl::StatusOr<std::string> Gurobi::GetStringParam(const char* const name) {
773 std::vector<char> result(GRB_MAX_STRLEN);
774 RETURN_IF_ERROR(ToStatus(GRBgetstrparam(model_env_, name, result.data())));
775 return std::string(result.data());
776}
777
779 return ToStatus(GRBresetparams(model_env_));
780}
781
782absl::Status Gurobi::SetMultiObjectiveDoubleParam(const char* const name,
783 const int obj_index,
784 const double value) {
785 ASSIGN_OR_RETURN(GRBenv* const obj_env, GetMultiObjectiveEnv(obj_index));
786 return util::StatusBuilder(ToStatus(GRBsetdblparam(obj_env, name, value)))
787 << " for objective index: " << obj_index;
788}
789
791 const char* const name, const int obj_index) {
792 ASSIGN_OR_RETURN(GRBenv* const obj_env, GetMultiObjectiveEnv(obj_index));
793 double result;
794 RETURN_IF_ERROR(ToStatus(GRBgetdblparam(obj_env, name, &result)))
795 << " for objective index: " << obj_index;
796 return result;
797}
798
799void Gurobi::Terminate() { GRBterminate(gurobi_model_); }
800
802 void* const cb_data, const int where)
803 : gurobi_(ABSL_DIE_IF_NULL(gurobi)), cb_data_(cb_data), where_(where) {}
804
805absl::StatusOr<int> Gurobi::CallbackContext::CbGetInt(const int what) const {
806 int result;
807 RETURN_IF_ERROR(gurobi_->ToStatus(
808 GRBcbget(cb_data_, where_, what, static_cast<void*>(&result))));
809 return result;
810}
811
813 const int what) const {
814 double result;
815 RETURN_IF_ERROR(gurobi_->ToStatus(
816 GRBcbget(cb_data_, where_, what, static_cast<void*>(&result))));
817 return result;
818}
819
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())));
824}
825
826absl::StatusOr<std::string> Gurobi::CallbackContext::CbGetMessage() const {
827 char* result = nullptr;
828 RETURN_IF_ERROR(gurobi_->ToStatus(GRBcbget(
829 cb_data_, where_, GRB_CB_MSG_STRING, static_cast<void*>(&result))));
830 if (result == nullptr) {
831 return std::string();
832 }
833 return std::string(result);
834}
835
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));
844}
845
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));
854}
855
857 const absl::Span<const double> solution) const {
858 double result;
859 RETURN_IF_ERROR(gurobi_->ToStatus(
860 GRBcbsolution(cb_data_, const_cast<double*>(solution.data()), &result)));
861 return result;
862}
863
864absl::StatusOr<GRBenv*> Gurobi::GetMultiObjectiveEnv(
865 const int obj_index) const {
866 GRBenv* const obj_env = GRBgetmultiobjenv(gurobi_model_, obj_index);
867 if (obj_env == nullptr) {
869 << "Failed to get objective environment for objective index: "
870 << obj_index;
871 }
872 return obj_env;
873}
874
875} // namespace operations_research::math_opt
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
GurobiInitializerProto_ISVKey ISVKey
nested types -------------------------------------------------—
Definition gurobi.pb.h:886
absl::StatusOr< std::string > CbGetMessage() const
Calls GRBcbget() where what=MSG_STRING (call only at where=MESSAGE).
Definition g_gurobi.cc:826
absl::Status CbLazy(absl::Span< const int > lazyind, absl::Span< const double > lazyval, char lazysense, double lazyrhs) const
Calls GRBcblazy().
Definition g_gurobi.cc:846
int where() const
The current event of the callback, see Callback Codes in Gurobi docs.
Definition g_gurobi.h:177
CallbackContext(Gurobi *gurobi, void *cb_data, int where)
For internal use only.
Definition g_gurobi.cc:801
absl::StatusOr< double > CbGetDouble(int what) const
Definition g_gurobi.cc:812
absl::Status CbCut(absl::Span< const int > cutind, absl::Span< const double > cutval, char cutsense, double cutrhs) const
Calls GRBcbcut().
Definition g_gurobi.cc:836
absl::StatusOr< double > CbSolution(absl::Span< const double > solution) const
Calls GRBcbsolution().
Definition g_gurobi.cc:856
absl::Status CbGetDoubleArray(int what, absl::Span< double > result) const
Definition g_gurobi.cc:820
absl::StatusOr< int > CbGetInt(int what) const
Definition g_gurobi.cc:805
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)
Definition g_gurobi.cc:460
absl::Status GetIntAttrArray(const char *name, absl::Span< int > attr_out) const
Definition g_gurobi.cc:623
absl::Status SetMultiObjectiveDoubleParam(const char *name, int obj_index, double value)
Definition g_gurobi.cc:782
absl::Status ToStatus(int grb_err, absl::StatusCode code=absl::StatusCode::kInvalidArgument, absl::SourceLocation loc=absl::SourceLocation::current()) const
Definition g_gurobi.cc:235
absl::Status DelGenConstrs(absl::Span< const int > ind)
Definition g_gurobi.cc:474
absl::Status SetDoubleAttrElement(const char *name, int element, double new_value)
Definition g_gurobi.cc:720
static absl::StatusOr< std::unique_ptr< Gurobi > > NewWithSharedPrimaryEnv(GRBenv *primary_env)
Definition g_gurobi.cc:177
absl::StatusOr< bool > ComputeIIS(Callback cb=nullptr)
Definition g_gurobi.cc:538
absl::Status AddVar(double obj, double lb, double ub, char vtype, const std::string &name)
Calls GRBaddvar() to add a variable to the model.
Definition g_gurobi.cc:246
bool IsAttrAvailable(const char *name) const
Definition g_gurobi.cc:560
absl::StatusOr< char > GetCharAttrElement(const char *name, int element) const
Definition g_gurobi.cc:726
absl::Status SetIntAttrElement(const char *name, int element, int new_value)
Definition g_gurobi.cc:706
absl::Status SetCharAttrArray(const char *name, absl::Span< const char > new_values)
Definition g_gurobi.cc:617
absl::Status SetDoubleAttrArray(const char *name, absl::Span< const double > new_values)
Definition g_gurobi.cc:611
absl::StatusOr< int > GetIntAttr(const char *name) const
Definition g_gurobi.cc:564
absl::Status SetStringParam(const char *name, const std::string &value)
Calls GRBsetstrparam().
Definition g_gurobi.cc:755
absl::Status DelSos(absl::Span< const int > ind)
Definition g_gurobi.cc:455
absl::StatusOr< int > GetNnz(int first_var, int num_vars)
Definition g_gurobi.cc:490
absl::Status SetDoubleAttrList(const char *name, absl::Span< const int > ind, absl::Span< const double > new_values)
Definition g_gurobi.cc:678
absl::Status AddSos(absl::Span< const int > types, absl::Span< const int > beg, absl::Span< const int > ind, absl::Span< const double > weight)
Definition g_gurobi.cc:437
absl::Status SetIntAttr(const char *attr_name, int value)
Definition g_gurobi.cc:596
absl::Status AddConstr(char sense, double rhs, const std::string &name)
Definition g_gurobi.cc:321
absl::Status SetParam(const char *name, const std::string &value)
Definition g_gurobi.cc:741
absl::Status SetStringAttr(const char *attr_name, const std::string &value)
Definition g_gurobi.cc:591
std::function< absl::Status(const CallbackContext &)> Callback
Definition g_gurobi.h:222
absl::Status GetVars(absl::Span< int > vbegin, absl::Span< int > vind, absl::Span< double > vval, int first_var, int num_vars)
Definition g_gurobi.cc:497
absl::Status ChgCoeffs(absl::Span< const int > cind, absl::Span< const int > vind, absl::Span< const double > val)
Definition g_gurobi.cc:479
void Terminate()
Calls GRBterminate().
Definition g_gurobi.cc:799
static absl::StatusOr< std::unique_ptr< Gurobi > > New(GRBenvUniquePtr primary_env=nullptr)
Definition g_gurobi.cc:183
GRBmodel * model() const
Typically not needed.
Definition g_gurobi.h:590
absl::Status Optimize(Callback cb=nullptr)
Definition g_gurobi.cc:530
absl::Status GetCharAttrArray(const char *name, absl::Span< char > attr_out) const
Definition g_gurobi.cc:653
absl::StatusOr< double > GetDoubleAttrElement(const char *name, int element) const
Definition g_gurobi.cc:712
absl::StatusOr< double > GetDoubleAttr(const char *name) const
Definition g_gurobi.cc:571
absl::Status SetCharAttrElement(const char *name, int element, char new_value)
Definition g_gurobi.cc:734
absl::Status SetIntParam(const char *name, int value)
Calls GRBsetintparam().
Definition g_gurobi.cc:746
absl::StatusOr< std::string > GetStringAttr(const char *name) const
Definition g_gurobi.cc:578
absl::Status SetIntAttrArray(const char *name, absl::Span< const int > new_values)
Definition g_gurobi.cc:605
absl::StatusOr< int > GetIntParam(const char *name)
Calls GRBgetintparam().
Definition g_gurobi.cc:760
absl::StatusOr< int > GetIntAttrElement(const char *name, int element) const
Definition g_gurobi.cc:698
absl::Status AddQpTerms(absl::Span< const int > qrow, absl::Span< const int > qcol, absl::Span< const double > qval)
Definition g_gurobi.cc:368
absl::Status SetDoubleParam(const char *name, double value)
Calls GRBsetdblparam().
Definition g_gurobi.cc:750
absl::StatusOr< double > GetDoubleParam(const char *name)
Calls GRBgetdblparam().
Definition g_gurobi.cc:766
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)
Definition g_gurobi.cc:381
absl::Status GetDoubleAttrArray(const char *name, absl::Span< double > attr_out) const
Definition g_gurobi.cc:638
absl::Status ResetParameters()
Calls GRBresetparams().
Definition g_gurobi.cc:778
absl::Status UpdateModel()
Calls GRBupdatemodel().
Definition g_gurobi.cc:526
absl::Status SetDoubleAttr(const char *attr_name, double value)
Definition g_gurobi.cc:600
absl::StatusOr< std::string > GetStringParam(const char *name)
Calls GRBgetstrparam().
Definition g_gurobi.cc:772
absl::Status DelQConstrs(absl::Span< const int > ind)
Definition g_gurobi.cc:432
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)
Definition g_gurobi.cc:404
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().
Definition g_gurobi.cc:363
absl::Status SetIntAttrList(const char *name, absl::Span< const int > ind, absl::Span< const int > new_values)
Definition g_gurobi.cc:668
absl::StatusOr< double > GetMultiObjectiveDoubleParam(const char *name, int obj_index)
Definition g_gurobi.cc:790
absl::Status SetCharAttrList(const char *name, absl::Span< const int > ind, absl::Span< const char > new_values)
Definition g_gurobi.cc:688
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().
Definition g_gurobi.cc:316
#define GRB_ERROR_CALLBACK
Definition environment.h:80
#define GUROBI_STDCALL
Definition environment.h:28
struct _GRBenv GRBenv
Definition environment.h:33
#define GRB_CB_MSG_STRING
#define GRB_MAX_STRLEN
struct _GRBmodel GRBmodel
Definition environment.h:32
#define GRB_ERROR_IIS_NOT_INFEASIBLE
Definition environment.h:84
#define GRB_INT_ATTR_IIS_MINIMAL
An object oriented wrapper for quadratic constraints in ModelStorage.
Definition gurobi_isv.cc:28
absl::StatusOr< GRBenvUniquePtr > GurobiNewPrimaryEnv(const std::optional< GurobiIsvKey > &isv_key)
Definition g_gurobi.cc:156
std::unique_ptr< GRBenv, GurobiFreeEnv > GRBenvUniquePtr
Definition g_gurobi.h:59
absl::StatusOr< GRBenv * > NewPrimaryEnvFromISVKey(const GurobiIsvKey &isv_key)
Definition gurobi_isv.cc:30
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
STL namespace.
StatusBuilder InvalidArgumentErrorBuilder()