diff options
-rw-r--r-- | numpy/random/mtrand/mtrand.pyx | 108 | ||||
-rw-r--r-- | numpy/random/tests/test_random.py | 40 |
2 files changed, 88 insertions, 60 deletions
diff --git a/numpy/random/mtrand/mtrand.pyx b/numpy/random/mtrand/mtrand.pyx index 44ae956c8..abf7a4102 100644 --- a/numpy/random/mtrand/mtrand.pyx +++ b/numpy/random/mtrand/mtrand.pyx @@ -1903,15 +1903,13 @@ cdef class RandomState: if oloc.shape == oscale.shape == (): floc = PyFloat_AsDouble(loc) fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") - + if np.signbit(fscale): + raise ValueError("scale < 0") return cont2_array_sc(self.internal_state, rk_normal, size, floc, fscale, self.lock) - if np.any(np.less_equal(oscale, 0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont2_array(self.internal_state, rk_normal, size, oloc, oscale, self.lock) @@ -2029,14 +2027,13 @@ cdef class RandomState: if oscale.shape == (): fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont1_array_sc(self.internal_state, rk_exponential, size, fscale, self.lock) - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont1_array(self.internal_state, rk_exponential, size, oscale, self.lock) @@ -2147,14 +2144,13 @@ cdef class RandomState: if oshape.shape == (): fshape = PyFloat_AsDouble(shape) - - if fshape <= 0: - raise ValueError("shape <= 0") + if np.signbit(fshape): + raise ValueError("shape < 0") return cont1_array_sc(self.internal_state, rk_standard_gamma, size, fshape, self.lock) - if np.any(np.less_equal(oshape, 0.0)): - raise ValueError("shape <= 0") + if np.any(np.signbit(oshape)): + raise ValueError("shape < 0") return cont1_array(self.internal_state, rk_standard_gamma, size, oshape, self.lock) @@ -2240,18 +2236,17 @@ cdef class RandomState: if oshape.shape == oscale.shape == (): fshape = PyFloat_AsDouble(shape) fscale = PyFloat_AsDouble(scale) - - if fshape <= 0: - raise ValueError("shape <= 0") - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fshape): + raise ValueError("shape < 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont2_array_sc(self.internal_state, rk_gamma, size, fshape, fscale, self.lock) - if np.any(np.less_equal(oshape, 0.0)): - raise ValueError("shape <= 0") - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oshape)): + raise ValueError("shape < 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont2_array(self.internal_state, rk_gamma, size, oshape, oscale, self.lock) @@ -3122,14 +3117,13 @@ cdef class RandomState: if oa.shape == (): fa = PyFloat_AsDouble(a) - - if fa <= 0: - raise ValueError("a <= 0") + if np.signbit(fa): + raise ValueError("a < 0") return cont1_array_sc(self.internal_state, rk_weibull, size, fa, self.lock) - if np.any(np.less_equal(oa, 0.0)): - raise ValueError("a <= 0") + if np.any(np.signbit(oa)): + raise ValueError("a < 0") return cont1_array(self.internal_state, rk_weibull, size, oa, self.lock) @@ -3235,14 +3229,13 @@ cdef class RandomState: if oa.shape == (): fa = PyFloat_AsDouble(a) - - if fa <= 0: - raise ValueError("a <= 0") + if np.signbit(fa): + raise ValueError("a < 0") return cont1_array_sc(self.internal_state, rk_power, size, fa, self.lock) - if np.any(np.less_equal(oa, 0.0)): - raise ValueError("a <= 0") + if np.any(np.signbit(oa)): + raise ValueError("a < 0") return cont1_array(self.internal_state, rk_power, size, oa, self.lock) def laplace(self, loc=0.0, scale=1.0, size=None): @@ -3333,14 +3326,13 @@ cdef class RandomState: if oloc.shape == oscale.shape == (): floc = PyFloat_AsDouble(loc) fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont2_array_sc(self.internal_state, rk_laplace, size, floc, fscale, self.lock) - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont2_array(self.internal_state, rk_laplace, size, oloc, oscale, self.lock) @@ -3465,14 +3457,13 @@ cdef class RandomState: if oloc.shape == oscale.shape == (): floc = PyFloat_AsDouble(loc) fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont2_array_sc(self.internal_state, rk_gumbel, size, floc, fscale, self.lock) - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont2_array(self.internal_state, rk_gumbel, size, oloc, oscale, self.lock) @@ -3559,14 +3550,13 @@ cdef class RandomState: if oloc.shape == oscale.shape == (): floc = PyFloat_AsDouble(loc) fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont2_array_sc(self.internal_state, rk_logistic, size, floc, fscale, self.lock) - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0") return cont2_array(self.internal_state, rk_logistic, size, oloc, oscale, self.lock) @@ -3684,14 +3674,13 @@ cdef class RandomState: if omean.shape == osigma.shape == (): fmean = PyFloat_AsDouble(mean) fsigma = PyFloat_AsDouble(sigma) - - if fsigma <= 0: - raise ValueError("sigma <= 0") + if np.signbit(fsigma): + raise ValueError("sigma < 0") return cont2_array_sc(self.internal_state, rk_lognormal, size, fmean, fsigma, self.lock) - if np.any(np.less_equal(osigma, 0.0)): - raise ValueError("sigma <= 0.0") + if np.any(np.signbit(osigma)): + raise ValueError("sigma < 0.0") return cont2_array(self.internal_state, rk_lognormal, size, omean, osigma, self.lock) @@ -3764,14 +3753,13 @@ cdef class RandomState: if oscale.shape == (): fscale = PyFloat_AsDouble(scale) - - if fscale <= 0: - raise ValueError("scale <= 0") + if np.signbit(fscale): + raise ValueError("scale < 0") return cont1_array_sc(self.internal_state, rk_rayleigh, size, fscale, self.lock) - if np.any(np.less_equal(oscale, 0.0)): - raise ValueError("scale <= 0.0") + if np.any(np.signbit(oscale)): + raise ValueError("scale < 0.0") return cont1_array(self.internal_state, rk_rayleigh, size, oscale, self.lock) diff --git a/numpy/random/tests/test_random.py b/numpy/random/tests/test_random.py index 013205835..a06de58e3 100644 --- a/numpy/random/tests/test_random.py +++ b/numpy/random/tests/test_random.py @@ -485,6 +485,10 @@ class TestRandomDist(TestCase): [0.68717433461363442, 1.69175666993575979]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_exponential_0(self): + assert_equal(np.random.exponential(scale=0), 0) + assert_raises(ValueError, np.random.exponential, scale=-0.) + def test_f(self): np.random.seed(self.seed) actual = np.random.f(12, 77, size=(3, 2)) @@ -501,6 +505,10 @@ class TestRandomDist(TestCase): [31.71863275789960568, 33.30143302795922011]]) assert_array_almost_equal(actual, desired, decimal=14) + def test_gamma_0(self): + assert_equal(np.random.gamma(shape=0, scale=0), 0) + assert_raises(ValueError, np.random.gamma, shape=-0., scale=-0.) + def test_geometric(self): np.random.seed(self.seed) actual = np.random.geometric(.123456789, size=(3, 2)) @@ -517,6 +525,10 @@ class TestRandomDist(TestCase): [1.10651090478803416, -0.69535848626236174]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_gumbel_0(self): + assert_equal(np.random.gumbel(scale=0), 0) + assert_raises(ValueError, np.random.gumbel, scale=-0.) + def test_hypergeometric(self): np.random.seed(self.seed) actual = np.random.hypergeometric(10.1, 5.5, 14, size=(3, 2)) @@ -551,6 +563,10 @@ class TestRandomDist(TestCase): [-0.05391065675859356, 1.74901336242837324]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_laplace_0(self): + assert_equal(np.random.laplace(scale=0), 0) + assert_raises(ValueError, np.random.laplace, scale=-0.) + def test_logistic(self): np.random.seed(self.seed) actual = np.random.logistic(loc=.123456789, scale=2.0, size=(3, 2)) @@ -559,6 +575,10 @@ class TestRandomDist(TestCase): [-0.21682183359214885, 2.63373365386060332]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_laplace_0(self): + assert_(np.random.laplace(scale=0) in [0, 1]) + assert_raises(ValueError, np.random.laplace, scale=-0.) + def test_lognormal(self): np.random.seed(self.seed) actual = np.random.lognormal(mean=.123456789, sigma=2.0, size=(3, 2)) @@ -567,6 +587,10 @@ class TestRandomDist(TestCase): [65.72798501792723869, 86.84341601437161273]]) assert_array_almost_equal(actual, desired, decimal=13) + def test_lognormal_0(self): + assert_equal(np.random.lognormal(sigma=0), 1) + assert_raises(ValueError, np.random.lognormal, sigma=-0.) + def test_logseries(self): np.random.seed(self.seed) actual = np.random.logseries(p=.923456789, size=(3, 2)) @@ -657,6 +681,10 @@ class TestRandomDist(TestCase): [4.18552478636557357, 4.46410668111310471]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_normal_0(self): + assert_equal(np.random.normal(scale=0), 0) + assert_raises(ValueError, np.random.normal, scale=-0.) + def test_pareto(self): np.random.seed(self.seed) actual = np.random.pareto(a=.123456789, size=(3, 2)) @@ -704,6 +732,10 @@ class TestRandomDist(TestCase): [11.06066537006854311, 17.35468505778271009]]) assert_array_almost_equal(actual, desired, decimal=14) + def test_rayleigh_0(self): + assert_equal(np.random.rayleigh(scale=0), 0) + assert_raises(ValueError, np.random.rayleigh, scale=-0.) + def test_standard_cauchy(self): np.random.seed(self.seed) actual = np.random.standard_cauchy(size=(3, 2)) @@ -728,6 +760,10 @@ class TestRandomDist(TestCase): [7.54838614231317084, 8.012756093271868]]) assert_array_almost_equal(actual, desired, decimal=14) + def test_standard_gamma_0(self): + assert_equal(np.random.standard_gamma(shape=0), 0) + assert_raises(ValueError, np.random.standard_gamma, shape=-0.) + def test_standard_normal(self): np.random.seed(self.seed) actual = np.random.standard_normal(size=(3, 2)) @@ -803,6 +839,10 @@ class TestRandomDist(TestCase): [0.67057783752390987, 1.39494046635066793]]) assert_array_almost_equal(actual, desired, decimal=15) + def test_weibull_0(self): + assert_equal(np.random.weibull(a=0), 0) + assert_raises(ValueError, np.random.weibull, a=-0.) + def test_zipf(self): np.random.seed(self.seed) actual = np.random.zipf(a=1.23, size=(3, 2)) |