]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/cone/rearrangement.py
mjo/**/*.py: drop obsolete set_random_seed().
[sage.d.git] / mjo / cone / rearrangement.py
index da6c595b29a39c79b8c44f90178a9ccf52c0174d..0bbf95bb7603bed819d4b9e91a4b148856dc464c 100644 (file)
@@ -36,20 +36,26 @@ def rearrangement_cone(p,n,lattice=None):
     that lattice unless its rank is incompatible with the dimension
     ``n`` (in which case a ``ValueError`` is raised).
 
-    REFERENCES:
+    ALGORITHM:
 
-    .. [HenrionSeeger] Rene Henrion and Alberto Seeger.
-       Inradius and Circumradius of Various Convex Cones Arising in
-       Applications. Set-Valued and Variational Analysis, 18(3-4),
-       483-511, 2010. doi:10.1007/s11228-010-0150-z
+    The generators for the rearrangement cone are given by [Jeong]_
+    Theorem 5.2.3.
+
+    REFERENCES:
 
     .. [GowdaJeong] Muddappa Seetharama Gowda and Juyoung Jeong.
        Spectral cones in Euclidean Jordan algebras.
        Linear Algebra and its Applications, 509, 286-305.
        doi:10.1016/j.laa.2016.08.004
 
+    .. [HenrionSeeger] Rene Henrion and Alberto Seeger.
+       Inradius and Circumradius of Various Convex Cones Arising in
+       Applications. Set-Valued and Variational Analysis, 18(3-4),
+       483-511, 2010. doi:10.1007/s11228-010-0150-z
+
     .. [Jeong] Juyoung Jeong.
        Spectral sets and functions on Euclidean Jordan algebras.
+       University of Maryland, Baltimore County, Ph.D. thesis, 2017.
 
     SETUP::
 
@@ -73,28 +79,31 @@ def rearrangement_cone(p,n,lattice=None):
         sage: rearrangement_cone(5,5).lineality()
         4
 
-    All rearrangement cones are proper::
+    All rearrangement cones are proper when ``p`` is less than ``n`` by
+    [Jeong]_ Proposition 5.2.1::
 
         sage: all( rearrangement_cone(p,n).is_proper()
-        ....:              for n in xrange(10)
-        ....:              for p in xrange(1, n) )
+        ....:              for n in range(10)
+        ....:              for p in range(1, n) )
         True
 
     The Lyapunov rank of the rearrangement cone of order ``p`` in ``n``
-    dimensions is ``n`` for ``p == 1`` or ``p == n`` and one otherwise::
+    dimensions is ``n`` for ``p == 1`` or ``p == n`` and one otherwise,
+    by [Jeong]_ Corollary 5.2.4::
 
         sage: all( rearrangement_cone(p,n).lyapunov_rank() == n
-        ....:              for n in xrange(2, 10)
+        ....:              for n in range(2, 10)
         ....:              for p in [1, n-1] )
         True
         sage: all( rearrangement_cone(p,n).lyapunov_rank() == 1
-        ....:              for n in xrange(3, 10)
-        ....:              for p in xrange(2, n-1) )
+        ....:              for n in range(3, 10)
+        ....:              for p in range(2, n-1) )
         True
 
     TESTS:
 
-    The rearrangement cone is permutation-invariant::
+    All rearrangement cones are permutation-invariant by [Jeong]_
+    Proposition 5.2.1::
 
         sage: n = ZZ.random_element(2,10).abs()
         sage: p = ZZ.random_element(1,n)
@@ -107,22 +116,20 @@ def rearrangement_cone(p,n,lattice=None):
     cone should sum to a nonnegative number (this tests that the
     generators really are what we think they are)::
 
-        sage: set_random_seed()
         sage: def _has_rearrangement_property(v,p):
         ....:     return sum( sorted(v)[0:p] ) >= 0
         sage: all( _has_rearrangement_property(
         ....:      rearrangement_cone(p,n).random_element(),
         ....:      p
         ....:    )
-        ....:    for n in xrange(2, 10)
-        ....:    for p in xrange(1, n-1)
+        ....:    for n in range(2, 10)
+        ....:    for p in range(1, n-1)
         ....: )
         True
 
-    The rearrangenent cone of order ``p`` is contained in the
-    rearrangement cone of order ``p + 1``::
+    The rearrangenent cone of order ``p`` is contained in the rearrangement
+    cone of order ``p + 1`` by [Jeong]_ Proposition 5.2.1::
 
-        sage: set_random_seed()
         sage: n = ZZ.random_element(2,10)
         sage: p = ZZ.random_element(1,n)
         sage: K1 = rearrangement_cone(p,n)
@@ -130,6 +137,18 @@ def rearrangement_cone(p,n,lattice=None):
         sage: all( x in K2 for x in K1 )
         True
 
+    The rearrangement cone of order ``p`` is linearly isomorphic to the
+    rearrangement cone of order ``n - p`` when ``p`` is less than ``n``,
+    by [Jeong]_ Proposition 5.2.1::
+
+        sage: n = ZZ.random_element(2,10)
+        sage: p = ZZ.random_element(1,n)
+        sage: K1 = rearrangement_cone(p,n)
+        sage: K2 = rearrangement_cone(n-p, n)
+        sage: Mp = (1/p)*matrix.ones(QQ,n) - identity_matrix(QQ,n)
+        sage: Cone( (Mp*K2.rays()).columns() ).is_equivalent(K1)
+        True
+
     The order ``p`` should be between ``1`` and ``n``, inclusive::
 
         sage: rearrangement_cone(0,3)
@@ -169,10 +188,7 @@ def rearrangement_cone(p,n,lattice=None):
                          %
                          (lattice.rank(), n))
 
-    def d(j):
-        v = [1]*n    # Create the list of all ones...
-        v[j] = 1 - p # Now "fix" the ``j``th entry.
-        return v
-
-    G = identity_matrix(ZZ,n).rows() + [ d(j) for j in xrange(n) ]
+    I = identity_matrix(ZZ,n)
+    M = matrix.ones(ZZ,n) - p*I
+    G = identity_matrix(ZZ,n).rows() + M.rows()
     return Cone(G, lattice=lattice)