]> gitweb.michael.orlitzky.com - sage.d.git/commitdiff
cone/rearrangement.py: add a "lattice" argument.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 12 Nov 2018 03:13:14 +0000 (22:13 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 12 Nov 2018 03:13:14 +0000 (22:13 -0500)
mjo/cone/rearrangement.py

index fd792c4b481351a37ab3a0d73227120109de1dc1..da6c595b29a39c79b8c44f90178a9ccf52c0174d 100644 (file)
@@ -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)