]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
Fix the LL(K) code.
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 30 May 2015 22:41:01 +0000 (18:41 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sat, 30 May 2015 22:41:01 +0000 (18:41 -0400)
Implement lyapunov_rank(K) in terms of LL(K).

mjo/cone/cone.py

index a5482b3aa95f7198938007c4be615c4e7a97e17d..2e3dc8afb78cd1f4e1d5f368eb5f75733d127e82 100644 (file)
@@ -95,7 +95,7 @@ def LL(K):
 
     C_of_K = discrete_complementarity_set(K)
 
-    matrices = [x.tensor_product(s) for (x,s) in C_of_K]
+    tensor_products = [s.tensor_product(x) for (x,s) in C_of_K]
 
     # Sage doesn't think matrices are vectors, so we have to convert
     # our matrices to vectors explicitly before we can figure out how
@@ -108,7 +108,7 @@ def LL(K):
     W = VectorSpace(V.base_ring(), V.dimension()**2)
 
     # Turn our matrices into long vectors...
-    vectors = [ W(m.list()) for m in matrices ]
+    vectors = [ W(m.list()) for m in tensor_products ]
 
     # Vector space representation of Lyapunov-like matrices
     # (i.e. vec(L) where L is Luapunov-like).
@@ -118,9 +118,9 @@ def LL(K):
     # transformations.
     M = MatrixSpace(V.base_ring(), V.dimension())
 
-    matrices = [ M(v.list()) for v in LL_vector.basis() ]
+    matrix_basis = [ M(v.list()) for v in LL_vector.basis() ]
 
-    return matrices
+    return matrix_basis
 
 
 
@@ -247,40 +247,17 @@ def lyapunov_rank(K):
 
     The Lyapunov rank of a proper polyhedral cone in `n` dimensions can
     be any number between `1` and `n` inclusive, excluding `n-1`
-    [Gowda/Tao]_ (by accident, this holds for the trivial cone in a
-    trivial space as well)::
+    [Gowda/Tao]_. By accident, the `n-1` restriction will hold for the
+    trivial cone in a trivial space as well. However, in zero dimensions,
+    the Lyapunov rank of the trivial cone will be zero::
 
         sage: K = random_cone(max_dim=10, strictly_convex=True, solid=True)
         sage: b = lyapunov_rank(K)
         sage: n = K.lattice_dim()
-        sage: 1 <= b and b <= n
+        sage: (n == 0 or 1 <= b) and b <= n
         True
         sage: b == n-1
         False
 
     """
-    V = K.lattice().vector_space()
-
-    C_of_K = discrete_complementarity_set(K)
-
-    matrices = [x.tensor_product(s) for (x,s) in C_of_K]
-
-    # Sage doesn't think matrices are vectors, so we have to convert
-    # our matrices to vectors explicitly before we can figure out how
-    # many are linearly-indepenedent.
-    #
-    # The space W has the same base ring as V, but dimension
-    # dim(V)^2. So it has the same dimension as the space of linear
-    # transformations on V. In other words, it's just the right size
-    # to create an isomorphism between it and our matrices.
-    W = VectorSpace(V.base_ring(), V.dimension()**2)
-
-    def phi(m):
-        r"""
-        Convert a matrix to a vector isomorphically.
-        """
-        return W(m.list())
-
-    vectors = [phi(m) for m in matrices]
-
-    return (W.dimension() - W.span(vectors).rank())
+    return len(LL(K))