W = VectorSpace(F, n**2)
vectors = [ W(tp.list()) for tp in tensor_products ]
- # Create the *dual* cone of the positive operators, expressed as
- # long vectors. WARNING: check=True is necessary even though it
- # makes Cone() take forever. For an example take
- # K = Cone([(1,0,0),(0,0,1),(0,0,-1)]).
- pi_dual = Cone(vectors, ToricLattice(W.dimension()))
+ check = True
+ if K.is_solid() or K.is_strictly_convex():
+ # The lineality space of either ``K`` or ``K.dual()`` is
+ # trivial and it's easy to show that our generating set is
+ # minimal. I would love a proof that this works when ``K`` is
+ # neither pointed nor solid.
+ #
+ # Note that in that case we can get *duplicates*, since the
+ # tensor product of (x,s) is the same as that of (-x,-s).
+ check = False
+
+ # Create the dual cone of the positive operators, expressed as
+ # long vectors.
+ pi_dual = Cone(vectors, ToricLattice(W.dimension()), check=check)
# Now compute the desired cone from its dual...
pi_cone = pi_dual.dual()
# And finally convert its rays back to matrix representations.
M = MatrixSpace(F, n)
- return [ M(v.list()) for v in pi_cone.rays() ]
+ return [ M(v.list()) for v in pi_cone ]
def Z_transformation_gens(K):
W = VectorSpace(F, n**2)
vectors = [ W(m.list()) for m in tensor_products ]
- # Create the *dual* cone of the cross-positive operators,
- # expressed as long vectors. WARNING: check=True is necessary
- # even though it makes Cone() take forever. For an example take
- # K = Cone([(1,0,0),(0,0,1),(0,0,-1)]).
- Sigma_dual = Cone(vectors, lattice=ToricLattice(W.dimension()))
+ check = True
+ if K.is_solid() or K.is_strictly_convex():
+ # The lineality space of either ``K`` or ``K.dual()`` is
+ # trivial and it's easy to show that our generating set is
+ # minimal. I would love a proof that this works when ``K`` is
+ # neither pointed nor solid.
+ #
+ # Note that in that case we can get *duplicates*, since the
+ # tensor product of (x,s) is the same as that of (-x,-s).
+ check = False
+
+ # Create the dual cone of the cross-positive operators,
+ # expressed as long vectors.
+ Sigma_dual = Cone(vectors, lattice=ToricLattice(W.dimension()), check=check)
# Now compute the desired cone from its dual...
Sigma_cone = Sigma_dual.dual()
# But first, make them negative, so we get Z-transformations and
# not cross-positive ones.
M = MatrixSpace(F, n)
- return [ -M(v.list()) for v in Sigma_cone.rays() ]
+ return [ -M(v.list()) for v in Sigma_cone ]
def Z_cone(K):