+++ /dev/null
-from sage.all import *
-
-def rearrangement_cone(p,n,lattice=None):
- r"""
- Return the rearrangement cone of order ``p`` in ``n`` dimensions.
-
- The rearrangement cone in ``n`` dimensions has as its elements
- vectors of length ``n``. For inclusion in the cone, the smallest
- ``p`` components of a vector must sum to a nonnegative number.
-
- For example, the rearrangement cone of order ``p == 1`` has its
- single smallest component nonnegative. This implies that all
- components are nonnegative, and that therefore the rearrangement
- cone of order one is the nonnegative orthant.
-
- When ``p == n``, the sum of all components of a vector must be
- nonnegative for inclusion in the cone. That is, the cone is a
- half-space in ``n`` dimensions.
-
- INPUT:
-
- - ``p`` -- The number of components to "rearrange."
-
- - ``n`` -- The dimension of the ambient space for the resulting cone.
-
- - ``lattice`` -- (default: ``None``) an ambient lattice of rank ``n``
- to be passed to the :func:`Cone` constructor.
-
- OUTPUT:
-
- A polyhedral closed convex cone object representing a rearrangement
- cone of order ``p`` in ``n`` dimensions. Each generating ray will
- have the integer ring as its base ring.
-
- If a ``lattice`` was specified, then the resulting cone will live in
- that lattice unless its rank is incompatible with the dimension
- ``n`` (in which case a ``ValueError`` is raised).
-
- ALGORITHM:
-
- 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::
-
- sage: from mjo.cone.rearrangement import rearrangement_cone
-
- EXAMPLES:
-
- The rearrangement cones of order one are nonnegative orthants::
-
- sage: rearrangement_cone(1,1) == Cone([(1,)])
- True
- sage: rearrangement_cone(1,2) == Cone([(0,1),(1,0)])
- True
- sage: rearrangement_cone(1,3) == Cone([(0,0,1),(0,1,0),(1,0,0)])
- True
-
- When ``p == n``, the resulting cone will be a half-space, so we
- expect its lineality to be one less than ``n`` because it will
- contain a hyperplane but is not the entire space::
-
- sage: rearrangement_cone(5,5).lineality()
- 4
-
- 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 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,
- by [Jeong]_ Corollary 5.2.4::
-
- sage: all( rearrangement_cone(p,n).lyapunov_rank() == n
- ....: 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 range(3, 10)
- ....: for p in range(2, n-1) )
- True
-
- TESTS:
-
- 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)
- sage: K = rearrangement_cone(p,n)
- sage: P = SymmetricGroup(n).random_element().matrix()
- sage: all( K.contains(P*r) for r in K )
- True
-
- The smallest ``p`` components of every element of the rearrangement
- cone should sum to a nonnegative number (this tests that the
- generators really are what we think they are)::
-
- 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 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`` 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(p+1,n)
- 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)
- Traceback (most recent call last):
- ...
- ValueError: order p=0 should be between 1 and n=3, inclusive
- sage: rearrangement_cone(5,3)
- Traceback (most recent call last):
- ...
- ValueError: order p=5 should be between 1 and n=3, inclusive
-
- If a ``lattice`` was given, it is actually used::
-
- sage: L = ToricLattice(3, 'M')
- sage: rearrangement_cone(2, 3, lattice=L)
- 3-d cone in 3-d lattice M
-
- Unless the rank of the lattice disagrees with ``n``::
-
- sage: L = ToricLattice(1, 'M')
- sage: rearrangement_cone(2, 3, lattice=L)
- Traceback (most recent call last):
- ...
- ValueError: lattice rank=1 and dimension n=3 are incompatible
-
- """
- if p < 1 or p > n:
- raise ValueError('order p=%d should be between 1 and n=%d, inclusive'
- %
- (p,n))
-
- if lattice is None:
- lattice = ToricLattice(n)
-
- if lattice.rank() != n:
- raise ValueError('lattice rank=%d and dimension n=%d are incompatible'
- %
- (lattice.rank(), 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)