X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fcone%2Fcone.py;h=777d45e1a3e7a72a5ebbb167fd1ef6540c745282;hb=81a763e35b3e4322be6c60a815064be1f0dfcc3c;hp=6ade5e628f1035c99294048c7fb55b4b9c1204d9;hpb=7d2f3fba7f494158dbce5f7a3eca1d15ee7f577e;p=sage.d.git diff --git a/mjo/cone/cone.py b/mjo/cone/cone.py index 6ade5e6..777d45e 100644 --- a/mjo/cone/cone.py +++ b/mjo/cone/cone.py @@ -8,126 +8,6 @@ addsitedir(abspath('../../')) from sage.all import * -def random_cone(min_dim=0, max_dim=None, min_rays=0, max_rays=None): - r""" - Generate a random rational convex polyhedral cone. - - Lower and upper bounds may be provided for both the dimension of the - ambient space and the number of generating rays of the cone. If a - lower bound is left unspecified, it defaults to zero. Unspecified - upper bounds will be chosen randomly. - - INPUT: - - - ``min_dim`` (default: zero) -- A nonnegative integer representing the - minimum dimension of the ambient lattice. - - - ``max_dim`` (default: random) -- A nonnegative integer representing - the maximum dimension of the ambient - lattice. - - - ``min_rays`` (default: zero) -- A nonnegative integer representing the - minimum number of generating rays of the - cone. - - - ``max_rays`` (default: random) -- A nonnegative integer representing the - maximum number of generating rays of the - cone. - - OUTPUT: - - A new, randomly generated cone. - - EXAMPLES: - - If we set the lower/upper bounds to zero, then our result is - predictable:: - - sage: random_cone(0,0,0,0) - 0-d cone in 0-d lattice N - - In fact, as long as we ask for zero rays, we should be able to predict - the output when ``min_dim == max_dim``:: - - sage: random_cone(min_dim=4, max_dim=4, min_rays=0, max_rays=0) - 0-d cone in 4-d lattice N - - TESTS: - - It's hard to test the output of a random process, but we can at - least make sure that we get a cone back:: - - sage: from sage.geometry.cone import is_Cone # long time - sage: K = random_cone() # long time - sage: is_Cone(K) # long time - True - - Ensure that an exception is raised when either lower bound is greater - than its respective upper bound:: - - sage: random_cone(min_dim=5, max_dim=2) - Traceback (most recent call last): - ... - ValueError: max_dim must be greater than or equal to min_dim. - - sage: random_cone(min_rays=5, max_rays=2) - Traceback (most recent call last): - ... - ValueError: max_rays must be greater than or equal to min_rays. - - """ - - # Catch obvious mistakes so that we can generate clear error - # messages. - - if min_dim < 0: - raise ValueError('min_dim must be nonnegative.') - - if min_rays < 0: - raise ValueError('min_rays must be nonnegative.') - - if max_dim is not None: - if max_dim < 0: - raise ValueError('max_dim must be nonnegative.') - if (min_dim > max_dim): - raise ValueError('max_dim must be greater than or equal to min_dim.') - - if max_rays is not None: - if max_rays < 0: - raise ValueError('max_rays must be nonnegative.') - if (min_rays > max_rays): - raise ValueError('max_rays must be greater than or equal to min_rays.') - - - def random_min_max(l,u): - r""" - We need to handle two cases for the upper bounds, and we need to do - the same thing for max_dim/max_rays. So we consolidate the logic here. - """ - if u is None: - # The upper bound is unspecified; return a random integer - # in [l,infinity). - return l + ZZ.random_element().abs() - else: - # We have an upper bound, and it's greater than or equal - # to our lower bound. So we generate a random integer in - # [0,u-l], and then add it to l to get something in - # [l,u]. To understand the "+1", check the - # ZZ.random_element() docs. - return l + ZZ.random_element(u - l + 1) - - - d = random_min_max(min_dim, max_dim) - r = random_min_max(min_rays, max_rays) - - L = ToricLattice(d) - rays = [L.random_element() for i in range(0,r)] - - # The lattice parameter is required when no rays are given, so we - # pass it just in case. - return Cone(rays, lattice=L) - - def discrete_complementarity_set(K): r""" Compute the discrete complementarity set of this cone.