]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/cone/nonnegative_orthant.py
mjo/**/*.py: drop obsolete set_random_seed().
[sage.d.git] / mjo / cone / nonnegative_orthant.py
index c1163302b737b507db66cf344a644372e509227c..2bd1b3c85583370a7988ad66731ac5b2693e7173 100644 (file)
@@ -1,11 +1,11 @@
-"""
+r"""
 The nonnegative orthant in `\mathbb{Z}^{n}`. I'm sick and tired of
 typing it.
 """
 
 from sage.all import *
 
-def nonnegative_orthant(n):
+def nonnegative_orthant(n, lattice=None):
     r"""
     The nonnegative orthant in ``n`` dimensions.
 
@@ -13,12 +13,19 @@ def nonnegative_orthant(n):
 
       - ``n`` -- the dimension of the ambient space.
 
+      - ``lattice`` -- (default: ``None``) an ambient lattice of rank ``n``
+                       to be passed to the :func:`Cone` constructor.
+
     OUTPUT:
 
     The convex cone having ``n`` standard basis vectors as its
     generators. 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).
+
     SETUP::
 
         sage: from mjo.cone.nonnegative_orthant import nonnegative_orthant
@@ -41,13 +48,33 @@ def nonnegative_orthant(n):
 
     The nonnegative orthant is a proper cone::
 
-        sage: set_random_seed()
         sage: n = ZZ.random_element(10)
         sage: K = nonnegative_orthant(n)
         sage: K.is_proper()
         True
 
+    If a ``lattice`` was given, it is actually used::
+
+        sage: L = ToricLattice(3, 'M')
+        sage: nonnegative_orthant(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: nonnegative_orthant(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))
+
     I = identity_matrix(ZZ,n)
-    lattice = ToricLattice(n)
     return Cone(I.rows(), lattice)