From ebcc6728c67f92a5101fb80c0cb1087e0794bbc7 Mon Sep 17 00:00:00 2001 From: Kevin Sheppard Date: Fri, 4 Oct 2024 11:36:41 +0100 Subject: [PATCH] Final set of corner coverage --- randomgen/entropy.pyx | 7 ++---- randomgen/pcg32.pyx | 4 ++-- randomgen/pcg64.pyx | 4 ++-- randomgen/tests/test_common.py | 2 ++ randomgen/tests/test_direct.py | 4 ++++ randomgen/tests/test_extended_generator.py | 28 ++++++++++++++++++---- randomgen/tests/test_smoke.py | 5 ++-- 7 files changed, 38 insertions(+), 16 deletions(-) diff --git a/randomgen/entropy.pyx b/randomgen/entropy.pyx index 999ff4d6a..8fc1afbcf 100644 --- a/randomgen/entropy.pyx +++ b/randomgen/entropy.pyx @@ -97,14 +97,11 @@ def seed_by_array(object seed, Py_ssize_t n): obj = np.asarray(seed).astype(object) if obj.ndim != 1: raise ValueError("Array-valued seeds must be 1-dimensional") - if not np.isreal(obj).all(): + if not all((np.isscalar(v) and np.isreal(v)) for v in obj): raise TypeError(err_msg) if ((obj > int(2**64 - 1)) | (obj < 0)).any(): raise ValueError(err_msg) - try: - obj_int = obj.astype(np.uint64, casting="unsafe") - except ValueError: - raise ValueError(err_msg) + obj_int = obj.astype(np.uint64, casting="unsafe") if not (obj == obj_int).all(): raise TypeError(err_msg) seed_array = obj_int diff --git a/randomgen/pcg32.pyx b/randomgen/pcg32.pyx index a6c3cfd1c..08f815141 100644 --- a/randomgen/pcg32.pyx +++ b/randomgen/pcg32.pyx @@ -144,10 +144,10 @@ cdef class PCG32(BitGenerator): if inc is not None: err_msg = "inc must be a scalar integer between 0 and " \ "{ub}".format(ub=ub) - if inc < 0 or inc > ub or int(np.squeeze(inc)) != inc: - raise ValueError(err_msg) if not np.isscalar(inc): raise TypeError(err_msg) + if inc < 0 or inc > ub or int(np.squeeze(inc)) != inc: + raise ValueError(err_msg) BitGenerator._seed_with_seed_sequence(self, seed, inc=inc) @property diff --git a/randomgen/pcg64.pyx b/randomgen/pcg64.pyx index 3bd70b6cd..abed244b8 100644 --- a/randomgen/pcg64.pyx +++ b/randomgen/pcg64.pyx @@ -291,10 +291,10 @@ cdef class PCG64(BitGenerator): if inc is not None: err_msg = "inc must be a scalar integer between 0 and " \ "{ub}".format(ub=ub) - if inc < 0 or inc > ub or int(np.squeeze(inc)) != inc: - raise ValueError(err_msg) if not np.isscalar(inc): raise TypeError(err_msg) + if inc < 0 or inc > ub or int(np.squeeze(inc)) != inc: + raise ValueError(err_msg) BitGenerator._seed_with_seed_sequence(self, seed, inc=inc) @property diff --git a/randomgen/tests/test_common.py b/randomgen/tests/test_common.py index 6bab472b7..a10010ad4 100644 --- a/randomgen/tests/test_common.py +++ b/randomgen/tests/test_common.py @@ -107,6 +107,8 @@ def test_seed_array_errors(): seed_by_array(np.array([0.0 + 1j]), 1) with pytest.raises(TypeError): seed_by_array("1", 1) + with pytest.raises(TypeError): + seed_by_array(1.2, 1) with pytest.raises(ValueError): seed_by_array(-1, 1) with pytest.raises(ValueError): diff --git a/randomgen/tests/test_direct.py b/randomgen/tests/test_direct.py index ca36bf4b7..e76c463e6 100644 --- a/randomgen/tests/test_direct.py +++ b/randomgen/tests/test_direct.py @@ -2174,3 +2174,7 @@ def test_pcg64_errors(): p = PCG64(0) with pytest.raises(TypeError): p.seed(seed=0, inc=[3, 4]) + with pytest.raises(ValueError): + p.seed(seed=0, inc=-1) + with pytest.raises(ValueError): + p.seed(seed=0, inc=sum(2**i for i in range(129))) diff --git a/randomgen/tests/test_extended_generator.py b/randomgen/tests/test_extended_generator.py index 896dd7aa5..a2b121a1b 100644 --- a/randomgen/tests/test_extended_generator.py +++ b/randomgen/tests/test_extended_generator.py @@ -561,11 +561,29 @@ def test_mv_complex_normal(extended_gen, ex_gamma, ex_rel, ex_loc, size): loc = np.zeros(2) if ex_loc: loc = np.tile(loc, (4, 1, 1, 1)) - extended_gen.multivariate_complex_normal(np.zeros(2), size=size) - extended_gen.multivariate_complex_normal(np.zeros(2), size=size) - extended_gen.multivariate_complex_normal(np.zeros(2), gamma, size=size) - extended_gen.multivariate_complex_normal(np.zeros(2), gamma, rel, size=size) - extended_gen.multivariate_complex_normal(np.zeros(2), gamma, rel, size=size) + extended_gen.multivariate_complex_normal(loc, size=size) + extended_gen.multivariate_complex_normal(loc, gamma, size=size) + extended_gen.multivariate_complex_normal(loc, gamma, rel, size=size) + + +def test_mv_complex_normal_scalar_size(extended_gen): + gamma = np.array([[2, 0 + 1.0j], [-0 - 1.0j, 2]]) + rel = np.array([[0.22, 0 + 0.1j], [+0 + 0.1j, 0.22]]) + loc = np.zeros(2) + extended_gen.multivariate_complex_normal(loc, size=4) + extended_gen.multivariate_complex_normal(loc, gamma, size=4) + extended_gen.multivariate_complex_normal(loc, gamma, rel, size=4) + + +def test_extended_gen_state(extended_gen): + def _assert_state_equal(actual, target): + for key in actual: + if isinstance(actual[key], dict): + _assert_state_equal(actual[key], target[key]) + assert actual[key] == target[key] + + val = extended_gen.__getstate__() + _assert_state_equal(val, extended_gen.state) def test_mv_complex_normal_exceptions(extended_gen): diff --git a/randomgen/tests/test_smoke.py b/randomgen/tests/test_smoke.py index 86d9ae28f..cc50f0290 100644 --- a/randomgen/tests/test_smoke.py +++ b/randomgen/tests/test_smoke.py @@ -99,11 +99,11 @@ def params_1(f, bounded=False): def comp_state(state1, state2): identical = True + if type(state1) is not type(state2): + return False if isinstance(state1, dict): for key in state1: identical &= comp_state(state1[key], state2[key]) - elif type(state1) is not type(state2): - identical &= type(state1) is type(state2) else: if isinstance(state1, (list, tuple, np.ndarray)) and isinstance( state2, (list, tuple, np.ndarray) @@ -903,6 +903,7 @@ def test_numpy_state(self): state2 = self.rg.bit_generator.state assert_((state[1] == state2["state"]["key"]).all()) assert_(state[2] == state2["state"]["pos"]) + assert not comp_state(state, state2) class TestMT64(RNG):