In Sage, matrices assume that the base is a ring. Hence, we cannot
construct matrices whose entries are linear functions in Sage. Really,
they should be thought of as the tensor product of the R-module of
linear functions and the R-module of vector/matrix spaces ( is
QQ or RDF for our purposes).
You should not construct any tensor products by calling the parent directly. This is also why none of the classes are imported in the global namespace. The come into play whenever you have vector or matrix MIP linear expressions/constraints. The intended way to construct them is implicitly by acting with vectors or matrices on linear functions. For example:
sage: mip.<x> = MixedIntegerLinearProgram('ppl') # base ring is QQ
sage: 3 + x[0] + 2*x[1] # a linear function
3 + x_0 + 2*x_1
sage: x[0] * vector([3,4]) + 1 # vector linear function
(1, 1) + (3, 4)*x_0
sage: x[0] * matrix([[3,1],[4,0]]) + 1 # matrix linear function
[1 + 3*x_0 x_0]
[4*x_0 1 ]
Internally, all linear functions are stored as a dictionary whose
The entire dictionary can be accessed with the dict() method. For convenience, you can also retrieve a single coefficient with coefficient(). For example:
sage: mip.<b> = MixedIntegerLinearProgram()
sage: f_scalar = (3 + b[7] + 2*b[9]); f_scalar
3 + x_0 + 2*x_1
sage: f_scalar.dict()
{-1: 3.0, 0: 1.0, 1: 2.0}
sage: f_scalar.dict()[1]
2.0
sage: f_scalar.coefficient(b[9])
2.0
sage: f_scalar.coefficient(1)
2.0
sage: f_vector = b[7] * vector([3,4]) + 1; f_vector
(1.0, 1.0) + (3.0, 4.0)*x_0
sage: f_vector.coefficient(-1)
(1.0, 1.0)
sage: f_vector.coefficient(b[7])
(3.0, 4.0)
sage: f_vector.coefficient(0)
(3.0, 4.0)
sage: f_vector.coefficient(1)
(0.0, 0.0)
sage: f_matrix = b[7] * matrix([[0,1], [2,0]]) + b[9] - 3; f_matrix
[-3 + x_1 x_0 ]
[2*x_0 -3 + x_1]
sage: f_matrix.coefficient(-1)
[-3.0 0.0]
[ 0.0 -3.0]
sage: f_matrix.coefficient(0)
[0.0 1.0]
[2.0 0.0]
sage: f_matrix.coefficient(1)
[1.0 0.0]
[0.0 1.0]
Just like sage.numerical.linear_functions, (in)equalities become symbolic inequalities. See linear_tensor_constraints for detais.
Note
For brevity, we just use LinearTensor in class names. It is understood that this refers to the above tensor product construction.
Return the parent for the tensor product over the common base_ring.
The output is cached, so only a single parent is ever constructed for a given base ring.
INPUT:
OUTPUT:
The parent of the tensor product of a free module and linear functions over a common base ring.
EXAMPLES:
sage: from sage.numerical.linear_functions import LinearFunctionsParent
sage: from sage.numerical.linear_tensor import LinearTensorParent
sage: LinearTensorParent(QQ^3, LinearFunctionsParent(QQ))
Tensor product of Vector space of dimension 3 over Rational Field and Linear functions over Rational Field
sage: LinearTensorParent(ZZ^3, LinearFunctionsParent(QQ))
Traceback (most recent call last):
...
ValueError: base rings must match
Bases: sage.structure.parent.Parent
The parent for all linear functions over a fixed base ring.
Warning
You should use LinearTensorParent() to construct instances of this class.
INPUT/OUTPUT:
EXAMPLES:
sage: from sage.numerical.linear_tensor import LinearTensorParent_class
sage: LinearTensorParent_class
<class 'sage.numerical.linear_tensor.LinearTensorParent_class'>
alias of LinearTensor
Return the linear functions.
See also free_module().
OUTPUT:
Parent of the linear functions, one of the factors in the tensor product construction.
EXAMPLES:
sage: mip.<x> = MixedIntegerLinearProgram()
sage: lt = x[0] * vector(RDF, [1,2])
sage: lt.parent().free_module()
Vector space of dimension 2 over Real Double Field
sage: lt.parent().free_module() is vector(RDF, [1,2]).parent()
True
Return whether the free module is a matrix space.
OUTPUT:
Boolean. Whether the free_module() factor in the tensor product is a matrix space.
EXAMPLES:
sage: mip = MixedIntegerLinearProgram()
sage: LF = mip.linear_functions_parent()
sage: LF.tensor(RDF^2).is_matrix_space()
False
sage: LF.tensor(RDF^(2,2)).is_matrix_space()
True
Return whether the free module is a vector space.
OUTPUT:
Boolean. Whether the free_module() factor in the tensor product is a vector space.
EXAMPLES:
sage: mip = MixedIntegerLinearProgram()
sage: LF = mip.linear_functions_parent()
sage: LF.tensor(RDF^2).is_vector_space()
True
sage: LF.tensor(RDF^(2,2)).is_vector_space()
False
Return the linear functions.
See also free_module().
OUTPUT:
Parent of the linear functions, one of the factors in the tensor product construction.
EXAMPLES:
sage: mip.<x> = MixedIntegerLinearProgram()
sage: lt = x[0] * vector([1,2])
sage: lt.parent().linear_functions()
Linear functions over Real Double Field
sage: lt.parent().linear_functions() is mip.linear_functions_parent()
True
Test whether x is a tensor product of linear functions with a free module.
INPUT:
OUTPUT:
Boolean.
EXAMPLES:
sage: p = MixedIntegerLinearProgram()
sage: x = p.new_variable(nonnegative=False)
sage: from sage.numerical.linear_tensor import is_LinearTensor
sage: is_LinearTensor(x[0] - 2*x[2])
False
sage: is_LinearTensor('a string')
False