From 6f947ce7e9967fb2237783e793973e71fc39189b Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:08:52 +0200 Subject: [PATCH 1/5] No-op test update From 6a82e319fb9f7775767d1b4f3699e6642a374912 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:09:25 +0200 Subject: [PATCH 2/5] Validate Autograd multinomial probabilities --- src/pyrecest/_backend/autograd/random.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/pyrecest/_backend/autograd/random.py b/src/pyrecest/_backend/autograd/random.py index f1ada7402..261164cec 100644 --- a/src/pyrecest/_backend/autograd/random.py +++ b/src/pyrecest/_backend/autograd/random.py @@ -1,6 +1,22 @@ """Autograd based random backend.""" import autograd.numpy as _np -from autograd.numpy.random import get_state, multinomial, randint, seed, set_state +from autograd.numpy.random import get_state, randint, seed, set_state +from autograd.numpy.random import multinomial as _autograd_multinomial from .._shared_numpy.random import choice, multivariate_normal, normal, rand, uniform + + +def _validate_multinomial_pvals(pvals): + try: + pvals_array = _np.asarray(pvals) + except (TypeError, ValueError) as exc: + raise TypeError("pvals must be real numeric") from exc + if pvals_array.dtype.kind not in "iuf": + raise TypeError("pvals must be real numeric") + return pvals_array + + +def multinomial(n, pvals, size=None): + pvals_array = _validate_multinomial_pvals(pvals) + return _autograd_multinomial(n, pvals_array, size=size) From e9020287820453331e9de5bcee90a4663953d55c Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:09:49 +0200 Subject: [PATCH 3/5] Add Autograd random backend test scaffold --- tests/backend/test_autograd_random_backend.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tests/backend/test_autograd_random_backend.py diff --git a/tests/backend/test_autograd_random_backend.py b/tests/backend/test_autograd_random_backend.py new file mode 100644 index 000000000..51d3a674e --- /dev/null +++ b/tests/backend/test_autograd_random_backend.py @@ -0,0 +1,9 @@ +import pytest + +pytest.importorskip("autograd") + +from pyrecest._backend.autograd import random # noqa: E402 + + +def test_autograd_random_backend_imports(): + assert random is not None From 4711743cecae1f864d9b5444b515d3cda73e0417 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:10:13 +0200 Subject: [PATCH 4/5] Add Autograd multinomial smoke test --- tests/backend/test_autograd_random_backend.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/backend/test_autograd_random_backend.py b/tests/backend/test_autograd_random_backend.py index 51d3a674e..06d322e44 100644 --- a/tests/backend/test_autograd_random_backend.py +++ b/tests/backend/test_autograd_random_backend.py @@ -1,3 +1,4 @@ +import numpy as np import pytest pytest.importorskip("autograd") @@ -5,5 +6,9 @@ from pyrecest._backend.autograd import random # noqa: E402 -def test_autograd_random_backend_imports(): - assert random is not None +def test_multinomial_accepts_real_probability_values(): + draw = getattr(random, "multinomial") + sample = draw(4, [0.25, 0.75]) + + assert sample.shape == (2,) + assert int(np.sum(sample)) == 4 From 9d4ca368c0a00ea983f705e1984c2376f6c5874d Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:10:43 +0200 Subject: [PATCH 5/5] Cover Autograd multinomial probability validation --- tests/backend/test_autograd_random_backend.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/backend/test_autograd_random_backend.py b/tests/backend/test_autograd_random_backend.py index 06d322e44..79a399d2e 100644 --- a/tests/backend/test_autograd_random_backend.py +++ b/tests/backend/test_autograd_random_backend.py @@ -12,3 +12,11 @@ def test_multinomial_accepts_real_probability_values(): assert sample.shape == (2,) assert int(np.sum(sample)) == 4 + + +def test_multinomial_rejects_non_numeric_dtype_probability_values(): + draw = getattr(random, "multinomial") + pvals = np.array([1, 0], dtype="?") + + with pytest.raises(TypeError, match="real numeric"): + draw(4, pvals)