X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fcone%2Fcone.py;h=a4e327248fd47bf700dd698b63e426f16f47037c;hb=41ce22703a7948acd99917ce655e321025836858;hp=421fb3c8f04abb23fd420271ed10e0a7e65815d4;hpb=f8e779ee533992a940e1014d00960fc58c3c4b79;p=sage.d.git diff --git a/mjo/cone/cone.py b/mjo/cone/cone.py index 421fb3c..a4e3272 100644 --- a/mjo/cone/cone.py +++ b/mjo/cone/cone.py @@ -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.