From 5f6a355210842c3ca93dabb3f85bad468854f495 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Sat, 18 May 2024 16:55:25 -0400 Subject: [PATCH] mjo/cone/schur.py: bye, use sage's cones.schur() instead --- mjo/cone/all.py | 1 - mjo/cone/schur.py | 131 ---------------------------------------------- 2 files changed, 132 deletions(-) delete mode 100644 mjo/cone/schur.py diff --git a/mjo/cone/all.py b/mjo/cone/all.py index 7ce56c0..18fb052 100644 --- a/mjo/cone/all.py +++ b/mjo/cone/all.py @@ -9,7 +9,6 @@ from mjo.cone.faces import * from mjo.cone.nonnegative_orthant import * from mjo.cone.permutation_invariant import * from mjo.cone.rearrangement import * -from mjo.cone.schur import * from mjo.cone.symmetric_pd import * from mjo.cone.symmetric_psd import * from mjo.cone.trivial_cone import * diff --git a/mjo/cone/schur.py b/mjo/cone/schur.py deleted file mode 100644 index 1fa1e52..0000000 --- a/mjo/cone/schur.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -The Schur cone, as described in the "Critical angles..." papers by -Iusem, Seeger, and Sossa. It defines the Schur ordering on `R^{n}`. -""" - -from sage.all import * - -def schur_cone(n, lattice=None): - r""" - Return the Schur cone in ``n`` dimensions that induces the - majorization ordering. - - INPUT: - - - ``n`` -- the dimension the ambient space. - - - ``lattice`` -- (default: ``None``) an ambient lattice of rank ``n`` - to be passed to the :func:`Cone` constructor. - - OUTPUT: - - A rational closed convex Schur cone of dimension ``n``. 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). - - REFERENCES: - - .. [GourionSeeger] Daniel Gourion and Alberto Seeger. - Critical angles in polyhedral convex cones: numerical and - statistical considerations. Mathematical Programming, 123:173-198, - 2010, doi:10.1007/s10107-009-0317-2. - - .. [IusemSeegerOnPairs] Alfredo Iusem and Alberto Seeger. - On pairs of vectors achieving the maximal angle of a convex cone. - Mathematical Programming, 104(2-3):501-523, 2005, - doi:10.1007/s10107-005-0626-z. - - .. [SeegerSossaI] Alberto Seeger and David Sossa. - Critical angles between two convex cones I. General theory. - TOP, 24(1):44-65, 2016, doi:10.1007/s11750-015-0375-y. - - SETUP:: - - sage: from mjo.cone.nonnegative_orthant import nonnegative_orthant - sage: from mjo.cone.schur import schur_cone - - EXAMPLES: - - Verify the claim that the maximal angle between any two generators - of the Schur cone and the nonnegative quintant is ``3*pi/4``:: - - sage: P = schur_cone(5) - sage: Q = nonnegative_orthant(5) - sage: G = ( g.change_ring(QQbar).normalized() for g in P ) - sage: H = ( h.change_ring(QQbar).normalized() for h in Q ) - sage: actual = max(arccos(u.inner_product(v)) for u in G for v in H) - sage: expected = 3*pi/4 - sage: abs(actual - expected).n() < 1e-12 - True - - The dual of the Schur cone is the "downward monotonic cone" - [GourionSeeger]_, whose elements' entries are in non-increasing - order:: - - sage: n = ZZ.random_element(10) - sage: K = schur_cone(n).dual() - sage: x = K.random_element() - sage: all( x[i] >= x[i+1] for i in range(n-1) ) - True - - TESTS: - - We get the trivial cone when ``n`` is zero:: - - sage: schur_cone(0).is_trivial() - True - - The Schur cone induces the majorization ordering:: - - sage: def majorized_by(x,y): - ....: return (all(sum(x[0:i]) <= sum(y[0:i]) - ....: for i in range(x.degree()-1)) - ....: and sum(x) == sum(y)) - sage: n = ZZ.random_element(10) - sage: V = VectorSpace(QQ, n) - sage: S = schur_cone(n) - sage: majorized_by(V.zero(), S.random_element()) - True - sage: x = V.random_element() - sage: y = V.random_element() - sage: majorized_by(x,y) == ( (y-x) in S ) - True - - If a ``lattice`` was given, it is actually used:: - - sage: L = ToricLattice(3, 'M') - sage: schur_cone(3, lattice=L) - 2-d cone in 3-d lattice M - - Unless the rank of the lattice disagrees with ``n``:: - - sage: L = ToricLattice(1, 'M') - sage: schur_cone(3, lattice=L) - Traceback (most recent call last): - ... - ValueError: lattice rank=1 and dimension n=3 are incompatible - - """ - 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)) - - def _f(i,j): - if i == j: - return 1 - elif j - i == 1: - return -1 - else: - return 0 - - # The "max" below catches the trivial case where n == 0. - S = matrix(ZZ, max(0,n-1), n, _f) - - return Cone(S.rows(), lattice) -- 2.44.2