]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
Add a cone lineality function.
authorMichael Orlitzky <michael@orlitzky.com>
Thu, 4 Jun 2015 16:51:34 +0000 (12:51 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Thu, 4 Jun 2015 16:51:34 +0000 (12:51 -0400)
mjo/cone/cone.py

index 421fb3c8f04abb23fd420271ed10e0a7e65815d4..d77793550aa44f02ea7047e2049b852b40db936f 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.