- Z-operators on the nonnegative orthant are just Z-matrices.
- That is, matrices whose off-diagonal elements are nonnegative::
-
- sage: K = Cone([(1,0),(0,1)])
- sage: Z_operator_gens(K)
- [
- [ 0 -1] [ 0 0] [-1 0] [1 0] [ 0 0] [0 0]
- [ 0 0], [-1 0], [ 0 0], [0 0], [ 0 -1], [0 1]
- ]
- sage: K = Cone([(1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)])
- sage: all([ z[i][j] <= 0 for z in Z_operator_gens(K)
- ....: for i in range(z.nrows())
- ....: for j in range(z.ncols())
- ....: if i != j ])
- True
-
- The trivial cone in a trivial space has no Z-operators::
-
- sage: K = Cone([], ToricLattice(0))
- sage: Z_operator_gens(K)
- []
-
- Every operator is a Z-operator on the ambient vector space::
-
- sage: K = Cone([(1,),(-1,)])
- sage: K.is_full_space()
- True
- sage: Z_operator_gens(K)
- [[-1], [1]]
-
- sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)])
- sage: K.is_full_space()
- True
- sage: Z_operator_gens(K)
- [
- [-1 0] [1 0] [ 0 -1] [0 1] [ 0 0] [0 0] [ 0 0] [0 0]
- [ 0 0], [0 0], [ 0 0], [0 0], [-1 0], [1 0], [ 0 -1], [0 1]
- ]
-
- A non-obvious application is to find the Z-operators on the
- right half-plane::
-
- sage: K = Cone([(1,0),(0,1),(0,-1)])
- sage: Z_operator_gens(K)
- [
- [-1 0] [1 0] [ 0 0] [0 0] [ 0 0] [0 0]
- [ 0 0], [0 0], [-1 0], [1 0], [ 0 -1], [0 1]
- ]
-
- Z-operators on a subspace are Lyapunov-like and vice-versa::
-
- sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)])
- sage: K.is_full_space()
- True
- sage: lls = span([ vector(l.list()) for l in K.lyapunov_like_basis() ])
- sage: zs = span([ vector(z.list()) for z in Z_operator_gens(K) ])
- sage: zs == lls
- True
-
- TESTS:
-
- The Z-property is possessed by every Z-operator::
-
- sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim=4)
- sage: Z_of_K = Z_operator_gens(K)
- sage: dcs = K.discrete_complementarity_set()
- sage: all([(z*x).inner_product(s) <= 0 for z in Z_of_K
- ....: for (x,s) in dcs])
- True
-
- The lineality space of the cone of Z-operators is the space of
- Lyapunov-like operators::
-
- sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim=4)
- sage: L = ToricLattice(K.lattice_dim()**2)
- sage: Z_cone = Cone([ z.list() for z in Z_operator_gens(K) ],
- ....: lattice=L,
- ....: check=False)
- sage: ll_basis = [ vector(l.list()) for l in K.lyapunov_like_basis() ]
- sage: lls = L.vector_space().span(ll_basis)
- sage: Z_cone.linear_subspace() == lls
- True
-
- The lineality of the Z-operators on a cone is the Lyapunov
- rank of that cone::