OR-Tools  9.3
g_gurobi.cc
Go to the documentation of this file.
1// Copyright 2010-2021 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 <string>
17#include <string_view>
18#include <utility>
19
20#include "absl/status/status.h"
21#include "absl/status/statusor.h"
22#include "absl/strings/str_format.h"
27
29
30namespace {
31constexpr int kGrbOk = 0;
32
33struct UserCallbackData {
35 absl::Status status = absl::OkStatus();
36 Gurobi* gurobi = nullptr;
37};
38
39int GurobiCallback(GRBmodel* const model, void* const cbdata, const int where,
40 void* const usrdata) {
41 CHECK(usrdata != nullptr);
42 CHECK(model != nullptr);
43 auto user_cb_data = static_cast<UserCallbackData*>(usrdata);
44 CHECK_EQ(model, user_cb_data->gurobi->model());
45 // NOTE: if a previous callback failed, we never run the callback again.
46 if (!user_cb_data->status.ok()) {
47 return GRB_ERROR_CALLBACK;
48 }
49 const Gurobi::CallbackContext context(user_cb_data->gurobi, cbdata, where);
50 user_cb_data->status = user_cb_data->user_cb(context);
51 if (!user_cb_data->status.ok()) {
52 user_cb_data->gurobi->Terminate();
53 return GRB_ERROR_CALLBACK;
54 }
55 return kGrbOk;
56}
57
58} // namespace
59
60void GurobiFreeEnv::operator()(GRBenv* const env) const {
61 if (env != nullptr) {
62 GRBfreeenv(env);
63 }
64}
65
66absl::StatusOr<GRBenvUniquePtr> GurobiNewMasterEnv(
67 const std::optional<GurobiIsvKey>& isv_key) {
68 GRBenv* naked_master_env = nullptr;
69 int err;
70 std::string_view init_env_method;
71 if (isv_key.has_value()) {
72 err = GRBisqp(&naked_master_env, /*logfilename=*/
73 nullptr, isv_key->name.c_str(),
74 isv_key->application_name.c_str(), isv_key->expiration,
75 isv_key->key.c_str());
76 init_env_method = "GRBisqp()";
77 } else {
78 err = GRBloadenv(&naked_master_env, /*logfilename=*/nullptr);
79 init_env_method = "GRBloadenv()";
80 }
81 if (err != kGrbOk) {
82 // Surprisingly, even when Gurobi fails to load the environment, it still
83 // creates one. Here we make sure to free it properly.
84 //
85 // We can also use it with GRBgeterrormsg() to get the associated error
86 // message that goes with the error and the contains additional data like
87 // the user, the host and the hostid.
88 const GRBenvUniquePtr master_env(naked_master_env);
90 << "failed to create Gurobi master environment, " << init_env_method
91 << " returned the error (" << err
92 << "): " << GRBgeterrormsg(master_env.get());
93 }
94 return GRBenvUniquePtr(naked_master_env);
95}
96
97absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::NewWithSharedMasterEnv(
98 GRBenv* const master_env) {
99 CHECK(master_env != nullptr);
100 return New(nullptr, master_env);
101}
102
103absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::New(
104 GRBenvUniquePtr master_env) {
105 if (master_env == nullptr) {
107 }
108 GRBenv* const raw_master_env = master_env.get();
109 return New(std::move(master_env), raw_master_env);
110}
111
112Gurobi::Gurobi(GRBenvUniquePtr optional_owned_master_env, GRBmodel* const model,
113 GRBenv* const model_env)
114 : owned_master_env_(std::move(optional_owned_master_env)),
115 gurobi_model_(ABSL_DIE_IF_NULL(model)),
116 model_env_(ABSL_DIE_IF_NULL(model_env)) {}
117
118absl::StatusOr<std::unique_ptr<Gurobi>> Gurobi::New(
119 GRBenvUniquePtr optional_owned_master_env, GRBenv* const master_env) {
120 CHECK(master_env != nullptr);
121 GRBmodel* model = nullptr;
122 const int err = GRBnewmodel(master_env, &model,
123 /*Pname=*/nullptr,
124 /*numvars=*/0,
125 /*obj=*/nullptr, /*lb=*/nullptr,
126 /*ub=*/nullptr, /*vtype=*/nullptr,
127 /*varnames=*/nullptr);
128 if (err != kGrbOk) {
130 << "Error creating gurobi model on GRBnewmodel(), error code: "
131 << err << " message: " << GRBgeterrormsg(master_env);
132 }
133 CHECK(model != nullptr);
134 GRBenv* const model_env = GRBgetenv(model);
135
136 if (VLOG_IS_ON(3)) {
137 int gurobi_major, gurobi_minor, gurobi_technical;
138 GRBversion(&gurobi_major, &gurobi_minor, &gurobi_technical);
139 VLOG(3) << absl::StrFormat(
140 "Successfully created model for Gurobi v%d.%d.%d (%s)", gurobi_major,
141 gurobi_minor, gurobi_technical, GRBplatform());
142 }
143 return absl::WrapUnique(
144 new Gurobi(std::move(optional_owned_master_env), model, model_env));
145}
146
148 const int err = GRBfreemodel(gurobi_model_);
149 if (err != kGrbOk) {
150 LOG(ERROR) << "Error freeing gurobi model, code: " << err
151 << ", message: " << GRBgeterrormsg(model_env_);
152 }
153}
154
155absl::Status Gurobi::ToStatus(const int grb_err, const absl::StatusCode code,
156 const absl::SourceLocation loc) const {
157 if (grb_err == kGrbOk) {
158 return absl::OkStatus();
159 }
160
161 return util::StatusBuilder(code)
162 << "Gurobi error code: " << grb_err
163 << ", message: " << GRBgeterrormsg(model_env_);
164}
165
166absl::Status Gurobi::AddVars(const absl::Span<const double> obj,
167 const absl::Span<const double> lb,
168 const absl::Span<const double> ub,
169 const absl::Span<const char> vtype,
170 const absl::Span<const std::string> names) {
171 return AddVars({}, {}, {}, obj, lb, ub, vtype, names);
172}
173
174absl::Status Gurobi::AddVars(const absl::Span<const int> vbegin,
175 const absl::Span<const int> vind,
176 const absl::Span<const double> vval,
177 const absl::Span<const double> obj,
178 const absl::Span<const double> lb,
179 const absl::Span<const double> ub,
180 const absl::Span<const char> vtype,
181 const absl::Span<const std::string> names) {
182 CHECK_EQ(vind.size(), vval.size());
183 const int num_vars = lb.size();
184 CHECK_EQ(ub.size(), num_vars);
185 CHECK_EQ(vtype.size(), num_vars);
186 double* c_obj = nullptr;
187 if (!obj.empty()) {
188 CHECK_EQ(obj.size(), num_vars);
189 c_obj = const_cast<double*>(obj.data());
190 }
191 if (!vbegin.empty()) {
192 CHECK_EQ(vbegin.size(), num_vars);
193 }
194 char** c_names = nullptr;
195 std::vector<char*> c_names_data;
196 if (!names.empty()) {
197 CHECK_EQ(num_vars, names.size());
198 for (const std::string& name : names) {
199 c_names_data.push_back(const_cast<char*>(name.c_str()));
200 }
201 c_names = c_names_data.data();
202 }
203 return ToStatus(GRBaddvars(/*model=*/gurobi_model_, /*numvars=*/num_vars,
204 /*numnz=*/vind.size(),
205 /*vbeg=*/const_cast<int*>(vbegin.data()),
206 /*vind=*/const_cast<int*>(vind.data()),
207 /*vval=*/const_cast<double*>(vval.data()),
208 /*obj=*/c_obj,
209 /*lb=*/const_cast<double*>(lb.data()),
210 /*ub=*/const_cast<double*>(ub.data()),
211 /*vtype=*/const_cast<char*>(vtype.data()),
212 /*varnames=*/c_names));
213}
214
215absl::Status Gurobi::DelVars(const absl::Span<const int> ind) {
216 return ToStatus(
217 GRBdelvars(gurobi_model_, ind.size(), const_cast<int*>(ind.data())));
218}
219
220absl::Status Gurobi::AddConstrs(const absl::Span<const char> sense,
221 const absl::Span<const double> rhs,
222 const absl::Span<const std::string> names) {
223 const int num_cons = sense.size();
224 CHECK_EQ(rhs.size(), num_cons);
225 char** c_names = nullptr;
226 std::vector<char*> c_names_data;
227 if (!names.empty()) {
228 CHECK_EQ(num_cons, names.size());
229 for (const std::string& name : names) {
230 c_names_data.push_back(const_cast<char*>(name.c_str()));
231 }
232 c_names = c_names_data.data();
233 }
234 return ToStatus(GRBaddconstrs(
235 /*model=*/gurobi_model_,
236 /*numconstrs=*/num_cons,
237 /*numnz=*/0, /*cbeg=*/nullptr, /*cind=*/nullptr,
238 /*cval=*/nullptr, /*sense=*/const_cast<char*>(sense.data()),
239 /*rhs=*/const_cast<double*>(rhs.data()), /*constrnames=*/c_names));
240}
241
242absl::Status Gurobi::DelConstrs(const absl::Span<const int> ind) {
243 return ToStatus(
244 GRBdelconstrs(gurobi_model_, ind.size(), const_cast<int*>(ind.data())));
245}
246
247absl::Status Gurobi::AddQpTerms(const absl::Span<const int> qrow,
248 const absl::Span<const int> qcol,
249 const absl::Span<const double> qval) {
250 const int numqnz = qrow.size();
251 CHECK_EQ(qcol.size(), numqnz);
252 CHECK_EQ(qval.size(), numqnz);
253 return ToStatus(GRBaddqpterms(
254 gurobi_model_, numqnz, const_cast<int*>(qcol.data()),
255 const_cast<int*>(qrow.data()), const_cast<double*>(qval.data())));
256}
257
258absl::Status Gurobi::DelQ() { return ToStatus(GRBdelq(gurobi_model_)); }
259
260absl::Status Gurobi::ChgCoeffs(const absl::Span<const int> cind,
261 const absl::Span<const int> vind,
262 const absl::Span<const double> val) {
263 const int num_changes = cind.size();
264 CHECK_EQ(vind.size(), num_changes);
265 CHECK_EQ(val.size(), num_changes);
266 return ToStatus(GRBchgcoeffs(
267 gurobi_model_, num_changes, const_cast<int*>(cind.data()),
268 const_cast<int*>(vind.data()), const_cast<double*>(val.data())));
269}
270
271absl::StatusOr<int> Gurobi::GetNnz(const int first_var, const int num_vars) {
272 int nnz = 0;
273 RETURN_IF_ERROR(ToStatus(GRBgetvars(gurobi_model_, &nnz, nullptr, nullptr,
274 nullptr, first_var, num_vars)));
275 return nnz;
276}
277
278absl::Status Gurobi::GetVars(const absl::Span<int> vbegin,
279 const absl::Span<int> vind,
280 const absl::Span<double> vval, const int first_var,
281 const int num_vars) {
282 CHECK_EQ(vbegin.size(), num_vars);
283 CHECK_EQ(vind.size(), vval.size());
284 int nnz = 0;
286 ToStatus(GRBgetvars(gurobi_model_, &nnz, vbegin.data(), vind.data(),
287 vval.data(), first_var, num_vars)));
288 CHECK_EQ(nnz, vind.size());
289 return absl::OkStatus();
290}
291
292absl::StatusOr<Gurobi::SparseMat> Gurobi::GetVars(const int first_var,
293 const int num_vars) {
294 SparseMat result;
295 ASSIGN_OR_RETURN(const int nnz, GetNnz(first_var, num_vars));
296 result.begins.resize(num_vars);
297 result.inds.resize(nnz);
298 result.vals.resize(nnz);
299 int read_nnz = 0;
300 RETURN_IF_ERROR(ToStatus(
301 GRBgetvars(gurobi_model_, &read_nnz, result.begins.data(),
302 result.inds.data(), result.vals.data(), first_var, num_vars)));
303 CHECK_EQ(read_nnz, nnz);
304 return result;
305}
306
307absl::Status Gurobi::UpdateModel() {
308 return ToStatus(GRBupdatemodel(gurobi_model_));
309}
310
311absl::Status Gurobi::Optimize(Callback cb) {
312 bool needs_cb_cleanup = false;
313 UserCallbackData user_cb_data;
314 if (cb != nullptr) {
315 user_cb_data.user_cb = std::move(cb);
316 user_cb_data.gurobi = this;
317 RETURN_IF_ERROR(ToStatus(
318 GRBsetcallbackfunc(gurobi_model_, GurobiCallback, &user_cb_data)));
319 needs_cb_cleanup = true;
320 }
321
322 // Failsafe to try and clear the callback if there is another error. We cannot
323 // raise an error in a destructor, we can only log it.
324 auto callback_cleanup = absl::MakeCleanup([&]() {
325 if (needs_cb_cleanup) {
326 int error = GRBsetcallbackfunc(gurobi_model_, nullptr, nullptr);
327 if (error != kGrbOk) {
328 LOG(ERROR) << "Error cleaning up callback";
329 }
330 }
331 });
332 absl::Status solve_status = ToStatus(GRBoptimize(gurobi_model_));
333 RETURN_IF_ERROR(user_cb_data.status) << "Error in Optimize callback.";
334 RETURN_IF_ERROR(solve_status);
335 if (needs_cb_cleanup) {
336 needs_cb_cleanup = false;
338 ToStatus(GRBsetcallbackfunc(gurobi_model_, nullptr, nullptr)));
339 }
340 return absl::OkStatus();
341}
342
343bool Gurobi::IsAttrAvailable(const char* name) const {
344 return GRBisattravailable(gurobi_model_, name) > 0;
345}
346
347absl::StatusOr<int> Gurobi::GetIntAttr(const char* const name) const {
348 int result;
349 RETURN_IF_ERROR(ToStatus(GRBgetintattr(gurobi_model_, name, &result)))
350 << "Error getting Gurobi int attribute: " << name;
351 return result;
352}
353
354absl::StatusOr<double> Gurobi::GetDoubleAttr(const char* const name) const {
355 double result;
356 RETURN_IF_ERROR(ToStatus(GRBgetdblattr(gurobi_model_, name, &result)))
357 << "Error getting Gurobi double attribute: " << name;
358 return result;
359}
360
361absl::StatusOr<std::string> Gurobi::GetStringAttr(
362 const char* const name) const {
363 // WARNING: if a string attribute is the empty string, we need to be careful,
364 // std::string(char*) cannot take a nullptr.
365 char* result = nullptr;
366 RETURN_IF_ERROR(ToStatus(GRBgetstrattr(gurobi_model_, name, &result)))
367 << "Error getting Gurobi string attribute: " << name;
368 if (result == nullptr) {
369 return std::string();
370 }
371 return std::string(result);
372}
373
374absl::Status Gurobi::SetStringAttr(const char* const attr_name,
375 const std::string& value) {
376 return ToStatus(GRBsetstrattr(gurobi_model_, attr_name, value.c_str()));
377}
378
379absl::Status Gurobi::SetIntAttr(const char* const attr_name, const int value) {
380 return ToStatus(GRBsetintattr(gurobi_model_, attr_name, value));
381}
382
383absl::Status Gurobi::SetDoubleAttr(const char* const attr_name,
384 const double value) {
385 return ToStatus(GRBsetdblattr(gurobi_model_, attr_name, value));
386}
387
388absl::Status Gurobi::SetIntAttrArray(const char* const name,
389 const absl::Span<const int> new_values) {
390 return ToStatus(GRBsetintattrarray(gurobi_model_, name, 0, new_values.size(),
391 const_cast<int*>(new_values.data())));
392}
393
395 const char* const name, const absl::Span<const double> new_values) {
396 return ToStatus(GRBsetdblattrarray(gurobi_model_, name, 0, new_values.size(),
397 const_cast<double*>(new_values.data())));
398}
399
400absl::Status Gurobi::SetCharAttrArray(const char* const name,
401 const absl::Span<const char> new_values) {
402 return ToStatus(GRBsetcharattrarray(gurobi_model_, name, 0, new_values.size(),
403 const_cast<char*>(new_values.data())));
404}
405
406absl::Status Gurobi::GetIntAttrArray(const char* const name,
407 const absl::Span<int> attr_out) const {
409 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
410 << "Error getting Gurobi int array attribute: " << name;
411 return absl::OkStatus();
412}
413
414absl::StatusOr<std::vector<int>> Gurobi::GetIntAttrArray(const char* const name,
415 const int len) const {
416 std::vector<int> result(len);
417 RETURN_IF_ERROR(GetIntAttrArray(name, absl::MakeSpan(result)));
418 return result;
419}
420
422 const char* const name, const absl::Span<double> attr_out) const {
424 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
425 << "Error getting Gurobi double array attribute: " << name;
426 return absl::OkStatus();
427}
428
429absl::StatusOr<std::vector<double>> Gurobi::GetDoubleAttrArray(
430 const char* const name, const int len) const {
431 std::vector<double> result(len);
432 RETURN_IF_ERROR(GetDoubleAttrArray(name, absl::MakeSpan(result)));
433 return result;
434}
435
436absl::Status Gurobi::GetCharAttrArray(const char* const name,
437 const absl::Span<char> attr_out) const {
439 gurobi_model_, name, 0, attr_out.size(), attr_out.data())))
440 << "Error getting Gurobi char array attribute: " << name;
441 return absl::OkStatus();
442}
443
444absl::StatusOr<std::vector<char>> Gurobi::GetCharAttrArray(
445 const char* const name, const int len) const {
446 std::vector<char> result(len);
447 RETURN_IF_ERROR(GetCharAttrArray(name, absl::MakeSpan(result)));
448 return result;
449}
450
451absl::Status Gurobi::SetIntAttrList(const char* const name,
452 const absl::Span<const int> ind,
453 const absl::Span<const int> new_values) {
454 const int len = ind.size();
455 CHECK_EQ(new_values.size(), len);
456 return ToStatus(GRBsetintattrlist(gurobi_model_, name, len,
457 const_cast<int*>(ind.data()),
458 const_cast<int*>(new_values.data())));
459}
460
462 const char* const name, const absl::Span<const int> ind,
463 const absl::Span<const double> new_values) {
464 const int len = ind.size();
465 CHECK_EQ(new_values.size(), len);
466 return ToStatus(GRBsetdblattrlist(gurobi_model_, name, len,
467 const_cast<int*>(ind.data()),
468 const_cast<double*>(new_values.data())));
469}
470
471absl::Status Gurobi::SetCharAttrList(const char* const name,
472 const absl::Span<const int> ind,
473 const absl::Span<const char> new_values) {
474 const int len = ind.size();
475 CHECK_EQ(new_values.size(), len);
476 return ToStatus(GRBsetcharattrlist(gurobi_model_, name, len,
477 const_cast<int*>(ind.data()),
478 const_cast<char*>(new_values.data())));
479}
480
481absl::Status Gurobi::SetParam(const char* const name,
482 const std::string& value) {
483 return ToStatus(GRBsetparam(model_env_, name, value.c_str()));
484}
485
486absl::Status Gurobi::SetIntParam(const char* const name, const int value) {
487 return ToStatus(GRBsetintparam(model_env_, name, value));
488}
489
490absl::Status Gurobi::SetDoubleParam(const char* const name,
491 const double value) {
492 return ToStatus(GRBsetdblparam(model_env_, name, value));
493}
494
495absl::Status Gurobi::SetStringParam(const char* const name,
496 const std::string& value) {
497 return ToStatus(GRBsetstrparam(model_env_, name, value.c_str()));
498}
499
500absl::StatusOr<int> Gurobi::GetIntParam(const char* const name) {
501 int result;
502 RETURN_IF_ERROR(ToStatus(GRBgetintparam(model_env_, name, &result)));
503 return result;
504}
505
506absl::StatusOr<double> Gurobi::GetDoubleParam(const char* const name) {
507 double result;
508 RETURN_IF_ERROR(ToStatus(GRBgetdblparam(model_env_, name, &result)));
509 return result;
510}
511
512absl::StatusOr<std::string> Gurobi::GetStringParam(const char* const name) {
513 std::vector<char> result(GRB_MAX_STRLEN);
514 RETURN_IF_ERROR(ToStatus(GRBgetstrparam(model_env_, name, result.data())));
515 return std::string(result.data());
516}
517
519 return ToStatus(GRBresetparams(model_env_));
520}
521
522void Gurobi::Terminate() { GRBterminate(gurobi_model_); }
523
525 void* const cb_data, const int where)
526 : gurobi_(ABSL_DIE_IF_NULL(gurobi)), cb_data_(cb_data), where_(where) {}
527
528absl::StatusOr<int> Gurobi::CallbackContext::CbGetInt(const int what) const {
529 int result;
530 RETURN_IF_ERROR(gurobi_->ToStatus(
531 GRBcbget(cb_data_, where_, what, static_cast<void*>(&result))));
532 return result;
533}
534
536 const int what) const {
537 double result;
538 RETURN_IF_ERROR(gurobi_->ToStatus(
539 GRBcbget(cb_data_, where_, what, static_cast<void*>(&result))));
540 return result;
541}
542
544 const int what, const absl::Span<double> result) const {
545 return gurobi_->ToStatus(
546 GRBcbget(cb_data_, where_, what, static_cast<void*>(result.data())));
547}
548
549absl::StatusOr<std::string> Gurobi::CallbackContext::CbGetMessage() const {
550 char* result = nullptr;
551 RETURN_IF_ERROR(gurobi_->ToStatus(GRBcbget(
552 cb_data_, where_, GRB_CB_MSG_STRING, static_cast<void*>(&result))));
553 if (result == nullptr) {
554 return std::string();
555 }
556 return std::string(result);
557}
558
560 const absl::Span<const int> cutind, const absl::Span<const double> cutval,
561 const char cutsense, const double cutrhs) const {
562 const int cut_len = cutind.size();
563 CHECK_EQ(cutval.size(), cut_len);
564 return gurobi_->ToStatus(
565 GRBcbcut(cb_data_, cut_len, const_cast<int*>(cutind.data()),
566 const_cast<double*>(cutval.data()), cutsense, cutrhs));
567}
568
570 const absl::Span<const int> lazyind, const absl::Span<const double> lazyval,
571 const char lazysense, const double lazyrhs) const {
572 const int lazy_len = lazyind.size();
573 CHECK_EQ(lazyval.size(), lazy_len);
574 return gurobi_->ToStatus(
575 GRBcblazy(cb_data_, lazy_len, const_cast<int*>(lazyind.data()),
576 const_cast<double*>(lazyval.data()), lazysense, lazyrhs));
577}
578
580 const absl::Span<const double> solution) const {
581 double result;
582 RETURN_IF_ERROR(gurobi_->ToStatus(
583 GRBcbsolution(cb_data_, const_cast<double*>(solution.data()), &result)));
584 return result;
585}
586
587} // namespace operations_research::math_opt
#define CHECK(condition)
Definition: base/logging.h:495
#define CHECK_EQ(val1, val2)
Definition: base/logging.h:703
#define LOG(severity)
Definition: base/logging.h:420
#define ABSL_DIE_IF_NULL
Definition: base/logging.h:43
#define VLOG(verboselevel)
Definition: base/logging.h:984
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
absl::StatusOr< double > CbGetDouble(int what) const
Definition: g_gurobi.cc:535
absl::StatusOr< double > CbSolution(absl::Span< const double > solution) const
Definition: g_gurobi.cc:579
CallbackContext(Gurobi *gurobi, void *cb_data, int where)
Definition: g_gurobi.cc:524
absl::Status CbGetDoubleArray(int what, absl::Span< double > result) const
Definition: g_gurobi.cc:543
absl::Status CbCut(absl::Span< const int > cutind, absl::Span< const double > cutval, char cutsense, double cutrhs) const
Definition: g_gurobi.cc:559
absl::StatusOr< std::string > CbGetMessage() const
Definition: g_gurobi.cc:549
absl::StatusOr< int > CbGetInt(int what) const
Definition: g_gurobi.cc:528
absl::Status CbLazy(absl::Span< const int > lazyind, absl::Span< const double > lazyval, char lazysense, double lazyrhs) const
Definition: g_gurobi.cc:569
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:278
absl::Status GetIntAttrArray(const char *name, absl::Span< int > attr_out) const
Definition: g_gurobi.cc:406
static absl::StatusOr< std::unique_ptr< Gurobi > > New(GRBenvUniquePtr master_env=nullptr)
Definition: g_gurobi.cc:103
absl::Status AddConstrs(absl::Span< const char > sense, absl::Span< const double > rhs, absl::Span< const std::string > names)
Definition: g_gurobi.cc:220
absl::StatusOr< double > GetDoubleParam(const char *name)
Definition: g_gurobi.cc:506
absl::Status Optimize(Callback cb=nullptr)
Definition: g_gurobi.cc:311
absl::Status ChgCoeffs(absl::Span< const int > cind, absl::Span< const int > vind, absl::Span< const double > val)
Definition: g_gurobi.cc:260
absl::StatusOr< int > GetIntParam(const char *name)
Definition: g_gurobi.cc:500
absl::Status SetDoubleAttr(const char *attr_name, double value)
Definition: g_gurobi.cc:383
absl::Status AddQpTerms(absl::Span< const int > qrow, absl::Span< const int > qcol, absl::Span< const double > qval)
Definition: g_gurobi.cc:247
absl::StatusOr< int > GetNnz(int first_var, int num_vars)
Definition: g_gurobi.cc:271
absl::Status SetDoubleParam(const char *name, double value)
Definition: g_gurobi.cc:490
std::function< absl::Status(const CallbackContext &)> Callback
Definition: g_gurobi.h:225
static absl::StatusOr< std::unique_ptr< Gurobi > > NewWithSharedMasterEnv(GRBenv *master_env)
Definition: g_gurobi.cc:97
absl::Status SetIntAttr(const char *attr_name, int value)
Definition: g_gurobi.cc:379
absl::StatusOr< std::string > GetStringParam(const char *name)
Definition: g_gurobi.cc:512
absl::Status GetCharAttrArray(const char *name, absl::Span< char > attr_out) const
Definition: g_gurobi.cc:436
absl::Status SetCharAttrArray(const char *name, absl::Span< const char > new_values)
Definition: g_gurobi.cc:400
absl::StatusOr< int > GetIntAttr(const char *name) const
Definition: g_gurobi.cc:347
absl::Status DelVars(absl::Span< const int > ind)
Definition: g_gurobi.cc:215
absl::StatusOr< std::string > GetStringAttr(const char *name) const
Definition: g_gurobi.cc:361
absl::Status SetIntAttrList(const char *name, absl::Span< const int > ind, absl::Span< const int > new_values)
Definition: g_gurobi.cc:451
absl::Status GetDoubleAttrArray(const char *name, absl::Span< double > attr_out) const
Definition: g_gurobi.cc:421
absl::Status SetDoubleAttrArray(const char *name, absl::Span< const double > new_values)
Definition: g_gurobi.cc:394
absl::Status SetParam(const char *name, const std::string &value)
Definition: g_gurobi.cc:481
bool IsAttrAvailable(const char *name) const
Definition: g_gurobi.cc:343
absl::Status SetDoubleAttrList(const char *name, absl::Span< const int > ind, absl::Span< const double > new_values)
Definition: g_gurobi.cc:461
absl::StatusOr< double > GetDoubleAttr(const char *name) const
Definition: g_gurobi.cc:354
absl::Status SetIntParam(const char *name, int value)
Definition: g_gurobi.cc:486
absl::Status SetIntAttrArray(const char *name, absl::Span< const int > new_values)
Definition: g_gurobi.cc:388
absl::Status SetStringParam(const char *name, const std::string &value)
Definition: g_gurobi.cc:495
absl::Status DelConstrs(absl::Span< const int > ind)
Definition: g_gurobi.cc:242
absl::Status SetStringAttr(const char *attr_name, const std::string &value)
Definition: g_gurobi.cc:374
absl::Status AddVars(absl::Span< const double > obj, absl::Span< const double > lb, absl::Span< const double > ub, absl::Span< const char > vtype, absl::Span< const std::string > names)
Definition: g_gurobi.cc:166
absl::Status SetCharAttrList(const char *name, absl::Span< const int > ind, absl::Span< const char > new_values)
Definition: g_gurobi.cc:471
const std::string name
int64_t value
#define GRB_ERROR_CALLBACK
Definition: environment.h:77
struct _GRBenv GRBenv
Definition: environment.h:25
#define GRB_CB_MSG_STRING
Definition: environment.h:361
#define GRB_MAX_STRLEN
Definition: environment.h:112
struct _GRBmodel GRBmodel
Definition: environment.h:24
absl::Status status
Definition: g_gurobi.cc:35
Gurobi::Callback user_cb
Definition: g_gurobi.cc:34
Gurobi * gurobi
Definition: g_gurobi.cc:36
GRBmodel * model
GurobiMPCallbackContext * context
int where
const int ERROR
Definition: log_severity.h:32
absl::Cleanup< absl::decay_t< Callback > > MakeCleanup(Callback &&callback)
Definition: cleanup.h:125
absl::StatusOr< GRBenvUniquePtr > GurobiNewMasterEnv(const std::optional< GurobiIsvKey > &isv_key)
Definition: g_gurobi.cc:66
std::unique_ptr< GRBenv, GurobiFreeEnv > GRBenvUniquePtr
Definition: g_gurobi.h:67
std::function< int(GRBenv *env, const char *paramname, int *valueP)> GRBgetintparam
Definition: environment.cc:361
std::function< int(GRBmodel *model, const char *attrname, double *valueP)> GRBgetdblattr
Definition: environment.cc:95
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, double *newvalues)> GRBsetdblattrlist
Definition: environment.cc:115
std::function< char *(void)> GRBplatform
Definition: environment.cc:428
std::function< void(int *majorP, int *minorP, int *technicalP)> GRBversion
Definition: environment.cc:426
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetparam
Definition: environment.cc:375
std::function< int(GRBmodel *model, const char *attrname, int newvalue)> GRBsetintattr
Definition: environment.cc:57
std::function< int(GRBenv *env, const char *paramname, char *valueP)> GRBgetstrparam
Definition: environment.cc:365
std::function< int(void *cbdata, int lazylen, const int *lazyind, const double *lazyval, char lazysense, double lazyrhs)> GRBcblazy
Definition: environment.cc:158
std::function< int(GRBmodel *model, const char *attrname, int first, int len, int *values)> GRBgetintattrarray
Definition: environment.cc:66
std::function< int(GRBmodel *model, int numconstrs, int numnz, int *cbeg, int *cind, double *cval, char *sense, double *rhs, char **constrnames)> GRBaddconstrs
Definition: environment.cc:273
std::function< int(GRBenv *env, const char *paramname, int value)> GRBsetintparam
Definition: environment.cc:377
std::function< int(void *cbdata, int where, int what, void *resultP)> GRBcbget
Definition: environment.cc:147
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *values)> GRBgetcharattrarray
Definition: environment.cc:84
std::function< int(GRBenv **envP, const char *logfilename)> GRBloadenv
Definition: environment.cc:394
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *newvalues)> GRBsetdblattrarray
Definition: environment.cc:109
std::function< int(GRBmodel *model)> GRBfreemodel
Definition: environment.cc:335
std::function< void(GRBmodel *model)> GRBterminate
Definition: environment.cc:349
std::function< int(GRBmodel *model, int numqnz, int *qrow, int *qcol, double *qval)> GRBaddqpterms
Definition: environment.cc:318
std::function< int(GRBenv *env, const char *paramname, double *valueP)> GRBgetdblparam
Definition: environment.cc:363
std::function< const char *(GRBenv *env)> GRBgeterrormsg
Definition: environment.cc:424
std::function< int(GRBmodel *model, int cnt, int *cind, int *vind, double *val)> GRBchgcoeffs
Definition: environment.cc:327
std::function< GRBenv *(GRBmodel *model)> GRBgetenv
Definition: environment.cc:417
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelconstrs
Definition: environment.cc:320
std::function< int(GRBenv *env, const char *paramname, const char *value)> GRBsetstrparam
Definition: environment.cc:381
std::function< int(GRBenv *env)> GRBresetparams
Definition: environment.cc:384
std::function< int(GRBmodel *model, const char *attrname, int first, int len, double *values)> GRBgetdblattrarray
Definition: environment.cc:106
std::function< int(GRBmodel *model)> GRBupdatemodel
Definition: environment.cc:333
std::function< int(GRBmodel *model)> GRBdelq
Definition: environment.cc:325
std::function< int(GRBmodel *model, const char *attrname, const char *newvalue)> GRBsetstrattr
Definition: environment.cc:119
std::function< int(void *cbdata, const double *solution, double *objvalP)> GRBcbsolution
Definition: environment.cc:152
std::function< int(GRBmodel *model, const char *attrname)> GRBisattravailable
Definition: environment.cc:52
std::function< int(GRBmodel *model)> GRBoptimize
Definition: environment.cc:207
std::function< int(GRBenv **, const char *, const char *, const char *, int, const char *)> GRBisqp
Definition: environment.cc:48
std::function< int(GRBmodel *model, int len, int *ind)> GRBdelvars
Definition: environment.cc:319
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, char *newvalues)> GRBsetcharattrlist
Definition: environment.cc:93
std::function< int(GRBmodel *model, const char *attrname, char **valueP)> GRBgetstrattr
Definition: environment.cc:117
std::function< int(GRBenv *env, GRBmodel **modelP, const char *Pname, int numvars, double *obj, double *lb, double *ub, char *vtype, char **varnames)> GRBnewmodel
Definition: environment.cc:242
std::function< void(GRBenv *env)> GRBfreeenv
Definition: environment.cc:423
std::function< int(GRBmodel *model, const char *attrname, int len, int *ind, int *newvalues)> GRBsetintattrlist
Definition: environment.cc:75
std::function< int(void *cbdata, int cutlen, const int *cutind, const double *cutval, char cutsense, double cutrhs)> GRBcbcut
Definition: environment.cc:155
std::function< int(GRBmodel *model, const char *attrname, double newvalue)> GRBsetdblattr
Definition: environment.cc:97
std::function< int(GRBmodel *model, const char *attrname, int first, int len, int *newvalues)> GRBsetintattrarray
Definition: environment.cc:69
std::function< int(GRBmodel *model, int(GUROBI_STDCALL *cb)(CB_ARGS), void *usrdata)> GRBsetcallbackfunc
Definition: environment.cc:140
std::function< int(GRBmodel *model, int *numnzP, int *vbeg, int *vind, double *vval, int start, int len)> GRBgetvars
Definition: environment.cc:169
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
Definition: environment.cc:262
std::function< int(GRBmodel *model, const char *attrname, int first, int len, char *newvalues)> GRBsetcharattrarray
Definition: environment.cc:87
std::function< int(GRBmodel *model, const char *attrname, int *valueP)> GRBgetintattr
Definition: environment.cc:55
std::function< int(GRBenv *env, const char *paramname, double value)> GRBsetdblparam
Definition: environment.cc:379
STL namespace.
StatusBuilder InvalidArgumentErrorBuilder()
void operator()(GRBenv *const env) const
Definition: g_gurobi.cc:60
#define VLOG_IS_ON(verboselevel)
Definition: vlog_is_on.h:44