from sage.all import *
-def nonnegative_orthant(n):
+def nonnegative_orthant(n, lattice=None):
r"""
The nonnegative orthant in ``n`` dimensions.
- ``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 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
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)