- Cross-positive operators on the nonnegative orthant are negations
- of Z-matrices; that is, matrices whose off-diagonal elements are
- nonnegative::
-
- sage: K = Cone([(1,0),(0,1)])
- sage: cross_positive_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([ c[i][j] >= 0 for c in cross_positive_operator_gens(K)
- ....: for i in range(c.nrows())
- ....: for j in range(c.ncols())
- ....: if i != j ])
- True
-
- The trivial cone in a trivial space has no cross-positive operators::
-
- sage: K = Cone([], ToricLattice(0))
- sage: cross_positive_operator_gens(K)
- []
-
- Every operator is a cross-positive operator on the ambient vector
- space::
-
- sage: K = Cone([(1,),(-1,)])
- sage: K.is_full_space()
- True
- sage: cross_positive_operator_gens(K)
- [[1], [-1]]
-
- sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)])
- sage: K.is_full_space()
- True
- sage: cross_positive_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 cross-positive operators
- on the right half-plane::
-
- sage: K = Cone([(1,0),(0,1),(0,-1)])
- sage: cross_positive_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]
- ]
-
- Cross-positive 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: cs = span([ vector(c.list()) for c in cross_positive_operator_gens(K) ])
- sage: cs == lls
- True
-
- TESTS:
-
- The cross-positive property is possessed by every cross-positive
- operator::
-
- sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim=4)
- sage: Sigma_of_K = cross_positive_operator_gens(K)
- sage: dcs = K.discrete_complementarity_set()
- sage: all([(c*x).inner_product(s) >= 0 for c in Sigma_of_K
- ....: for (x,s) in dcs])
- True
-
- The lineality space of the cone of cross-positive 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: Sigma_cone = Cone([ c.list() for c in cross_positive_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: Sigma_cone.linear_subspace() == lls
- True
-
- The lineality of the cross-positive operators on a cone is the
- Lyapunov rank of that cone::
-
- sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim=4)
- sage: Sigma_of_K = cross_positive_operator_gens(K)
- sage: L = ToricLattice(K.lattice_dim()**2)
- sage: Sigma_cone = Cone([ c.list() for c in Sigma_of_K ],
- ....: lattice=L,
- ....: check=False)
- sage: Sigma_cone.lineality() == K.lyapunov_rank()
- True
-
- The lineality spaces of the duals of the positive and cross-positive
- operator cones are equal. From this it follows that the dimensions of
- the cross-positive operator cone and positive operator cone are equal::