MVar
MVar
Gurobi matrix variable object. AnMVar
is a NumPy ndarray of Gurobi variables. Variables are always associated with a particular model. You typically create these objects usingModel.addMVar.
You generally useMVar
objects to build matrix expressions, typically using overloaded operators. You can buildlinear matrix expressionsorquadratic matrix expressions:
expr1 = A @ x expr2 = A @ x + B @ y + z expr3 = x @ A @ x + y @ B @ yThe first two expressions are linear, while the third is quadratic.
Dimensions and data types must always be compatible. In the examples above, matrixmust be either a NumPy ndarray with two dimensions or a SciPy sparse matrix (which will always have two dimensions), andmust be a 1-DMVar
. Inexpr1
, the size of the second dimension ofmust be equal to the length of. The same must be true ofandinexpr2
. In addition, the size of the first dimension ofinexpr2
must be equal to the size of the first dimension of, and also to the length of.
Forexpr3
, the size of the first dimension ofmust be equal to the length of theMVar
on the left, and the size of the second dimension must be equal to the length of theMVar
on the right. The same is true for.
An expression is typically then passed tosetObjective(to set the optimization objective) oraddConstr(to add a constraint).
Variable objects have a number of attributes. The full list can be found in theAttributessection of this document. Some variable attributes can only be queried, while others can also be set. Recall that the Gurobi optimizer employs a lazy update approach, so changes to attributes don't take effect until the next call toModel.update,Model.optimize, orModel.writeon the associated model.
We should point out a few things about variable attributes. Consider thelb
attribute. Its value can be queried usingmvar.lb
. The Gurobi library ignores letter case in attribute names, so it can also be queried asvar.LB
. Attribute values are returns as a NumPyndarray
that has the same shape asmvar
. An attribute can be set, using a standard assignment statement (e.g.,var.lb = l
), withl
being either anndarray
with the appropriate shape, or a scalar which is then applied to all of the associated variables. However, as mentioned earlier, attribute modification is done in a lazy fashion, so you won't see the effect of the change immediately. And some attributes can not be set (e.g., thex
attribute), so attempts to assign new values to them will raise an exception.
You can also useMVar.getAttr/MVar.setAttrto access attributes. The attribute name can be passed to these routines as a string, or you can use the constants defined in theGRB.Attrclass (e.g.,GRB.Attr.LB
).
Subsections