Crate grb[−][src]
Expand description
This crate provides Rust bindings for Gurobi Optimizer. It currently requires Gurobi 9.0 or higher.
Installing
-
Before using this crate, you should install Gurobi and obtain a license.
-
Make sure that the environment variable
GUROBI_HOME
is set to the installation path of Gurobi (likeC:\gurobi911\win64
or/opt/gurobi911/linux64
). If you are using the Conda package from the Gurobi channel, the build script will fall back toGUROBI_HOME=${CONDA_PREFIX}
, so you should not setGUROBI_HOME
.
Quick Start
The example below sets up and solves a Mixed Integer Program (MIP). Additional examples covering the more specific aspects of this crate’s API can be found here.
The documention for Model
contains most of the details for defining, solving and querying models.
use grb::prelude::*;
let mut model = Model::new("model1")?;
// add decision variables with no bounds
let x1 = add_ctsvar!(model, name: "x1", bounds: ..)?;
let x2 = add_intvar!(model, name: "x2", bounds: ..)?;
// add linear constraints
let c0 = model.add_constr("c0", c!(x1 + 2*x2 >= -14))?;
let c1 = model.add_constr("c1", c!(-4 * x1 - x2 <= -33))?;
let c2 = model.add_constr("c2", c!(2* x1 <= 20 - x2))?;
// model is lazily updated by default
assert_eq!(model.get_obj_attr(attr::VarName, &x1).unwrap_err(), grb::Error::ModelObjectPending);
assert_eq!(model.get_attr(attr::IsMIP)?, 0);
// set the objective function, which updates the model objects (variables and constraints).
// One could also call `model.update()`
model.set_objective(8*x1 + x2, Minimize)?;
assert_eq!(model.get_obj_attr(attr::VarName, &x1)?, "x1");
assert_eq!(model.get_attr(attr::IsMIP)?, 1);
// write model to the file.
model.write("model.lp")?;
// optimize the model
model.optimize()?;
assert_eq!(model.status()?, Status::Optimal);
// Querying a model attribute
assert_eq!(model.get_attr(attr::ObjVal)? , 59.0);
// Querying a model object attributes
assert_eq!(model.get_obj_attr(attr::Slack, &c0)?, -34.5);
let x1_name = model.get_obj_attr(attr::VarName, &x1)?;
// Querying an attribute for multiple model objects
let val = model.get_obj_attr_batch(attr::X, vec![x1, x2])?;
assert_eq!(val, [6.5, 7.0]);
// Querying variables by name
assert_eq!(model.get_var_by_name(&x1_name)?, Some(x1));
Errors
Due to the nature of C APIs, almost every Gurobi routine can return an error. Unless otherwise stated,
if a method or function returns a Result
, the error will be Error::FromAPI
.
Re-exports
Modules
Gurobi Attributes for models, constraints and variables.
Interface to Gurobi’s callback API
This module contains the structs passed to the Model::add_constr(s)
and Model::add_range(s)
methods.
Algebraic expressions involving variables used to construct constraints and a helper trait for pretty-printing.
Most commonly used items from this crate bundled for convenient import.
Macros
Equivalent to calling add_var!
(model, Binary, ...)
Equivalent to calling add_var!
(model, Continuous, ...)
Equivalent to calling add_var!
(model, Integer, ...)
Convienence wrapper around Model::add_var
; adds a new variable to a Model
object. The macro keyword arguments are
optional.
A proc-macro for creating constraint objects.
Structs
A handle to an AsyncModel
which is currently solving.
A wrapper around Model
that supports async optimisation in the background.
A Gurobi Environment object.
Gurobi Model object.
A Gurobi variable.
Enums
Sense for new linear/quadratic constraint
The error type for operations in Gurobi Rust API
Sense of objective function, aka direction of optimisation.
Type of cost function at feasibility relaxation
Type of SOS constraint
Status of a model
Constants
A large constant used by Gurobi to represent numeric infinity.
Traits
This trait encompasses all Gurobi model objects: Var
, Constr
, QConstr
and SOS
.
Each ModelObject
is associated with a particular model, and can only be used with that model.
Each ModelObject
also has a unique, fixed 32-bit ID. Gurobi itself uses an i32
to index objects
(only positive indices are used), so the 32-bit limitation is already there. Note that IDs are only
guaranteed to be unique if the concrete types of the ModelObject
are the same and the objects
belong to the same model. For example, if v
is a Var
and c
is a Constr
, then v
and c
may
have the same ID. Additionally, if s
is also a Var
, but doesn’t belong to the same Model
as v
,
s
and v
may have the same ID.
Functions
Returns the version number of Gurobi
Type Definitions
A specialized std::result::Result
for library errors