- We may need to isomorph twice to make sure we stop moving down to
- smaller spaces. (Once you've done this on a cone and its dual, the
- result should be proper.) OH AND YOU HAVE TO SORT THE CONES::
-
- sage: K = random_cone(max_dim=10, strictly_convex=False, solid=False)
- sage: L = K.lattice()
- sage: rename_lattice(L, 'L')
- sage: (phi, phi_inv) = span_iso(K)
- sage: K_S = phi(K)
- sage: (phi_dual, phi_dual_inv) = span_iso(K_S.dual())
- sage: J_T = phi_dual(K_S.dual()).dual()
- sage: phi_inv(phi_dual_inv(J_T)) == K
+ """
+ L = K.lattice()
+ F = L.base_field()
+ Q = L.quotient(K.sublattice_complement())
+ vecs = [ vector(F, reversed(list(Q(r)))) for r in K.rays() ]
+
+ newL = None
+ if len(vecs) == 0:
+ newL = ToricLattice(0)
+
+ return Cone(vecs, lattice=newL)
+
+
+
+def lineality(K):
+ r"""
+ Compute the lineality of this cone.
+
+ The lineality of a cone is the dimension of the largest linear
+ subspace contained in that cone.
+
+ OUTPUT:
+
+ A nonnegative integer; the dimension of the largest subspace
+ contained within this cone.
+
+ REFERENCES:
+
+ .. [Rockafellar] R.T. Rockafellar. Convex Analysis. Princeton
+ University Press, Princeton, 1970.
+
+ EXAMPLES:
+
+ The lineality of the nonnegative orthant is zero, since it clearly
+ contains no lines::
+
+ sage: K = Cone([(1,0,0), (0,1,0), (0,0,1)])
+ sage: lineality(K)
+ 0
+
+ However, if we add another ray so that the entire `x`-axis belongs
+ to the cone, then the resulting cone will have lineality one::
+
+ sage: K = Cone([(1,0,0), (-1,0,0), (0,1,0), (0,0,1)])
+ sage: lineality(K)
+ 1
+
+ If our cone is all of `\mathbb{R}^{2}`, then its lineality is equal
+ to the dimension of the ambient space (i.e. two)::
+
+ sage: K = Cone([(1,0), (-1,0), (0,1), (0,-1)])
+ sage: lineality(K)
+ 2
+
+ Per the definition, the lineality of the trivial cone in a trivial
+ space is zero::
+
+ sage: K = Cone([], lattice=ToricLattice(0))
+ sage: lineality(K)
+ 0
+
+ TESTS:
+
+ The lineality of a cone should be an integer between zero and the
+ dimension of the ambient space, inclusive::
+
+ sage: K = random_cone(max_dim = 10)
+ sage: l = lineality(K)
+ sage: l in ZZ