A positive operator on a cone should send its generators into the cone::
sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim = 5)
+ 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
corollary in my paper::
sage: set_random_seed()
- sage: K = random_cone(max_ambient_dim = 5)
+ 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: expected = n**2 - K.dim()*K.dual().dim()
sage: actual == expected
True
+
+ The cone ``K`` is proper if and only if the cone of positive
+ operators on ``K`` is proper::
+
+ sage: set_random_seed()
+ sage: K = random_cone(max_ambient_dim=5)
+ sage: pi_of_K = positive_operator_gens(K)
+ sage: L = ToricLattice(K.lattice_dim()**2)
+ sage: pi_cone = Cone([p.list() for p in pi_of_K], lattice=L)
+ sage: K.is_proper() == pi_cone.is_proper()
+ 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
# not cross-positive ones.
M = MatrixSpace(F, n)
return [ -M(v.list()) for v in Sigma_cone.rays() ]
+
+
+def Z_cone(K):
+ gens = Z_transformation_gens(K)
+ L = None
+ if len(gens) == 0:
+ L = ToricLattice(0)
+ return Cone([ g.list() for g in gens ], lattice=L)
+
+def pi_cone(K):
+ gens = positive_operator_gens(K)
+ L = None
+ if len(gens) == 0:
+ L = ToricLattice(0)
+ return Cone([ g.list() for g in gens ], lattice=L)