# Constraints on Linear Functions Tensored with a Free Module#

Here is an example of a vector-valued linear function:

```sage: mip.<x> = MixedIntegerLinearProgram('ppl')   # base ring is QQ
sage: x[0] * vector([3,4]) + 1     # vector linear function
(1, 1) + (3, 4)*x_0
```

Just like `linear_functions`, (in)equalities become symbolic inequalities:

```sage: 3 + x[0] + 2*x[1] <= 10
3 + x_0 + 2*x_1 <= 10
sage: x[0] * vector([3,4]) + 1 <= 10
(1, 1) + (3, 4)*x_0 <= (10, 10)
sage: x[0] * matrix([[0,0,1],[0,1,0],[1,0,0]]) + x[1] * identity_matrix(3) >= 0
[0 0 0]    [x_1 0         x_0]
[0 0 0] <= [0   x_0 + x_1 0  ]
[0 0 0]    [x_0 0         x_1]
```
class sage.numerical.linear_tensor_constraints.LinearTensorConstraint(parent, lhs, rhs, equality)#

Bases: `Element`

Formal constraint involving two module-valued linear functions.

Note

In the code, we use “linear tensor” as abbreviation for the tensor product (over the common base ring) of a ```linear function``` and a free module like a vector/matrix space.

Warning

This class has no reason to be instantiated by the user, and is meant to be used by instances of `MixedIntegerLinearProgram`.

INPUT:

EXAMPLES:

```sage: mip.<b> = MixedIntegerLinearProgram()
sage: (b[2]+2*b[3]) * vector([1,2]) <= b[8] * vector([2,3]) - 5
(1.0, 2.0)*x_0 + (2.0, 4.0)*x_1 <= (-5.0, -5.0) + (2.0, 3.0)*x_2
```
is_equation()#

Whether the constraint is a chained equation

OUTPUT:

Boolean.

EXAMPLES:

```sage: mip.<b> = MixedIntegerLinearProgram()
sage: (b[0] * vector([1,2]) == 0).is_equation()
True
sage: (b[0] * vector([1,2]) >= 0).is_equation()
False
```
is_less_or_equal()#

Whether the constraint is a chained less-or_equal inequality

OUTPUT:

Boolean.

EXAMPLES:

```sage: mip.<b> = MixedIntegerLinearProgram()
sage: (b[0] * vector([1,2]) == 0).is_less_or_equal()
False
sage: (b[0] * vector([1,2]) >= 0).is_less_or_equal()
True
```
lhs()#

Return the left side of the (in)equality.

OUTPUT:

Instance of `sage.numerical.linear_tensor_element.LinearTensor`. A linear function valued in a free module.

EXAMPLES:

```sage: mip.<x> = MixedIntegerLinearProgram()
sage: (x[0] * vector([1,2]) == 0).lhs()
(1.0, 2.0)*x_0
```
rhs()#

Return the right side of the (in)equality.

OUTPUT:

Instance of `sage.numerical.linear_tensor_element.LinearTensor`. A linear function valued in a free module.

EXAMPLES:

```sage: mip.<x> = MixedIntegerLinearProgram()
sage: (x[0] * vector([1,2]) == 0).rhs()
(0.0, 0.0)
```
sage.numerical.linear_tensor_constraints.LinearTensorConstraintsParent()#

Return the parent for linear functions over `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 linear constraints with the given linear functions.

EXAMPLES:

```sage: from sage.numerical.linear_functions import LinearFunctionsParent
sage: from sage.numerical.linear_tensor import LinearTensorParent
sage: from sage.numerical.linear_tensor_constraints import         ....:     LinearTensorConstraintsParent, LinearTensorConstraintsParent
sage: LF = LinearFunctionsParent(QQ)
sage: LT = LinearTensorParent(QQ^2, LF)
sage: LinearTensorConstraintsParent(LT)
Linear constraints in the tensor product of Vector space of dimension 2
over Rational Field and Linear functions over Rational Field
```
class sage.numerical.linear_tensor_constraints.LinearTensorConstraintsParent_class(linear_tensor_parent)#

Bases: `Parent`

Parent for `LinearTensorConstraint`

Warning

This class has no reason to be instantiated by the user, and is meant to be used by instances of `MixedIntegerLinearProgram`. Also, use the `LinearTensorConstraintsParent()` factory function.

INPUT/OUTPUT:

EXAMPLES:

```sage: p = MixedIntegerLinearProgram()
sage: LT = p.linear_functions_parent().tensor(RDF^2);  LT
Tensor product of Vector space of dimension 2 over Real Double
Field and Linear functions over Real Double Field
sage: from sage.numerical.linear_tensor_constraints import LinearTensorConstraintsParent
sage: LTC = LinearTensorConstraintsParent(LT);  LTC
Linear constraints in the tensor product of Vector space of
dimension 2 over Real Double Field and Linear functions over
Real Double Field
sage: type(LTC)
<class 'sage.numerical.linear_tensor_constraints.LinearTensorConstraintsParent_class'>
```
Element#

alias of `LinearTensorConstraint`

linear_functions()#

Return the parent for the linear functions

OUTPUT:

EXAMPLES:

```sage: mip.<x> = MixedIntegerLinearProgram()
sage: ieq = (x[0] * vector([1,2]) >= 0)
sage: ieq.parent().linear_functions()
Linear functions over Real Double Field
```
linear_tensors()#

Return the parent for the linear functions

OUTPUT:

EXAMPLES:

```sage: mip.<x> = MixedIntegerLinearProgram()
sage: ieq = (x[0] * vector([1,2]) >= 0)
sage: ieq.parent().linear_tensors()
Tensor product of Vector space of dimension 2 over Real Double
Field and Linear functions over Real Double Field
```
sage.numerical.linear_tensor_constraints.is_LinearTensorConstraint(x)#

Test whether `x` is a constraint on module-valued linear functions.

INPUT:

• `x` – anything.

OUTPUT:

Boolean.

EXAMPLES:

```sage: mip.<x> = MixedIntegerLinearProgram()
sage: vector_ieq = (x[0] * vector([1,2]) <= x[1] * vector([2,3]))
sage: from sage.numerical.linear_tensor_constraints import is_LinearTensorConstraint
sage: is_LinearTensorConstraint(vector_ieq)
True
sage: is_LinearTensorConstraint('a string')
False
```