From: Michael Orlitzky Date: Mon, 12 Nov 2018 03:13:14 +0000 (-0500) Subject: cone/rearrangement.py: add a "lattice" argument. X-Git-Url: http://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=f6548daafb1a5c6352007d7518452169fcd84cf1;p=sage.d.git cone/rearrangement.py: add a "lattice" argument. --- diff --git a/mjo/cone/rearrangement.py b/mjo/cone/rearrangement.py index fd792c4..da6c595 100644 --- a/mjo/cone/rearrangement.py +++ b/mjo/cone/rearrangement.py @@ -1,6 +1,6 @@ from sage.all import * -def rearrangement_cone(p,n): +def rearrangement_cone(p,n,lattice=None): r""" Return the rearrangement cone of order ``p`` in ``n`` dimensions. @@ -19,14 +19,22 @@ def rearrangement_cone(p,n): INPUT: - - ``p`` -- The number of components to "rearrange." + - ``p`` -- The number of components to "rearrange." - - ``n`` -- The dimension of the ambient space for the resulting cone. + - ``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. + 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). REFERENCES: @@ -133,16 +141,38 @@ def rearrangement_cone(p,n): ... 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)) + 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) ] - return Cone(G) + return Cone(G, lattice=lattice)