A positive operator on a cone should send its generators into the cone::
- sage: K = random_cone(max_ambient_dim = 6)
+ sage: set_random_seed()
+ sage: K = random_cone(max_ambient_dim = 5)
sage: pi_of_K = positive_operator_gens(K)
sage: all([K.contains(p*x) for p in pi_of_K for x in K.rays()])
True
The dimension of the cone of positive operators is given by the
corollary in my paper::
- sage: K = random_cone(max_ambient_dim = 6)
+ sage: set_random_seed()
+ sage: K = random_cone(max_ambient_dim = 5)
sage: n = K.lattice_dim()
sage: m = K.dim()
sage: l = K.lineality()
sage: pi_of_K = positive_operator_gens(K)
- sage: actual = Cone([p.list() for p in pi_of_K]).dim()
- sage: expected = n**2 - l*(n - l) - (n - m)*m
+ sage: L = ToricLattice(n**2)
+ sage: actual = Cone([p.list() for p in pi_of_K], lattice=L).dim()
+ sage: expected = n**2 - l*(m - l) - (n - m)*m
sage: actual == expected
True
+ The lineality of the cone of positive operators is given by the
+ corollary in my paper::
+
+ sage: set_random_seed()
+ sage: K = random_cone(max_ambient_dim = 5)
+ sage: n = K.lattice_dim()
+ sage: pi_of_K = positive_operator_gens(K)
+ sage: L = ToricLattice(n**2)
+ sage: actual = Cone([p.list() for p in pi_of_K], lattice=L).lineality()
+ sage: expected = n**2 - K.dim()*K.dual().dim()
+ sage: actual == expected
+ True
"""
# Matrices are not vectors in Sage, so we have to convert them
# to vectors explicitly before we can find a basis. We need these
sage: z_cone.linear_subspace() == lls
True
+ And thus, the lineality of Z is the Lyapunov rank::
+
+ sage: set_random_seed()
+ sage: K = random_cone(min_ambient_dim = 1, max_ambient_dim = 6)
+ sage: z_cone = Cone([ z.list() for z in Z_transformation_gens(K) ])
+ sage: z_cone.lineality() == K.lyapunov_rank()
+ True
"""
# Matrices are not vectors in Sage, so we have to convert them
# to vectors explicitly before we can find a basis. We need these