]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/cone/cone.py
Switch existing tests to use the lineality() method.
[sage.d.git] / mjo / cone / cone.py
index 421fb3c8f04abb23fd420271ed10e0a7e65815d4..a4e327248fd47bf700dd698b63e426f16f47037c 100644 (file)
@@ -60,6 +60,75 @@ def project_span(K):
 
 
 
+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
+        True
+        sage: (0 <= l) and (l <= K.lattice_dim())
+        True
+
+    A strictly cone should have lineality zero::
+
+        sage: K = random_cone(max_dim = 10, strictly_convex = True)
+        sage: lineality(K)
+        0
+
+    """
+    return K.linear_subspace().dimension()
+
+
 def discrete_complementarity_set(K):
     r"""
     Compute the discrete complementarity set of this cone.
@@ -424,7 +493,7 @@ def lyapunov_rank(K):
         sage: actual = lyapunov_rank(K)
         sage: K_S = project_span(K)
         sage: P = project_span(K_S.dual()).dual()
-        sage: l = K.linear_subspace().dimension()
+        sage: l = lineality(K)
         sage: codim = K.lattice_dim() - K.dim()
         sage: expected = lyapunov_rank(P) + K.dim()*(l + codim) + codim**2
         sage: actual == expected
@@ -441,7 +510,7 @@ def lyapunov_rank(K):
 
     m = K.dim()
     n = K.lattice_dim()
-    l = K.linear_subspace().dimension()
+    l = lineality(K)
 
     if m < n:
         # K is not solid, project onto its span.