From 956239a99b30b0bf2d85de1306db5852572dbbd8 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 20:24:11 +0200 Subject: [PATCH 1/2] Reject boolean NumPy multinomial sizes --- src/pyrecest/_backend/numpy/random.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pyrecest/_backend/numpy/random.py b/src/pyrecest/_backend/numpy/random.py index b35084e6d..ea24531f6 100644 --- a/src/pyrecest/_backend/numpy/random.py +++ b/src/pyrecest/_backend/numpy/random.py @@ -73,7 +73,14 @@ def _validate_multinomial_pvals(pvals): return pvals_array +def _validate_multinomial_size(size): + if size is not None and _contains_boolean_value(size): + raise TypeError("size must be None, an integer, or a sequence of integers") + return size + + def multinomial(n, pvals, size=None): n = _validate_multinomial_sample_count(n) pvals_array = _validate_multinomial_pvals(pvals) + size = _validate_multinomial_size(size) return _np.random.multinomial(n, pvals_array, size=size) From 3776820a76e0bdce5c9120fa60280a1244f53ff7 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 20:25:06 +0200 Subject: [PATCH 2/2] Test NumPy multinomial boolean size rejection --- tests/backend/test_numpy_random_backend.py | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/backend/test_numpy_random_backend.py b/tests/backend/test_numpy_random_backend.py index 50da29082..c834684c3 100644 --- a/tests/backend/test_numpy_random_backend.py +++ b/tests/backend/test_numpy_random_backend.py @@ -101,6 +101,32 @@ def test_multinomial_accepts_integer_like_scalar_sample_counts(): assert np.all(samples.sum(axis=1) == 2) +@pytest.mark.parametrize( + "bad_size", + [ + True, + False, + np.bool_(True), + (True,), + [np.bool_(False), 2], + np.array(True), + np.array([True, 2], dtype=object), + ], +) +def test_multinomial_rejects_boolean_size_arguments(bad_size): + with pytest.raises(TypeError, match="size"): + random.multinomial(2, [0.25, 0.75], size=bad_size) + + +def test_multinomial_accepts_integer_like_size_argument(): + random.seed(0) + + samples = random.multinomial(2, [0.25, 0.75], size=np.array(3, dtype=np.int64)) + + assert samples.shape == (3, 2) + assert np.all(samples.sum(axis=1) == 2) + + @pytest.mark.parametrize( ("low", "high"), [