From 571b3174b2c68c6d91f74e528d8ab145cc14b838 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:57:39 +0200 Subject: [PATCH 1/2] Reject boolean PyTorch normal parameters --- src/pyrecest/_backend/pytorch/random.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pyrecest/_backend/pytorch/random.py b/src/pyrecest/_backend/pytorch/random.py index ca7d1c4cf..a263fb9d3 100644 --- a/src/pyrecest/_backend/pytorch/random.py +++ b/src/pyrecest/_backend/pytorch/random.py @@ -244,6 +244,11 @@ def _normal_device(*values): return None +def _validate_normal_parameter(value, name): + if _contains_boolean_value(value): + raise TypeError(f"{name} must be real numeric, not boolean") + + def _normal_array_parameters(loc, scale): device = _normal_device(loc, scale) loc = _torch.as_tensor(loc, device=device) @@ -413,6 +418,8 @@ def multinomial(n, pvals, size=None): @_allow_complex_dtype def normal(loc=0.0, scale=1.0, size=None): + _validate_normal_parameter(loc, "loc") + _validate_normal_parameter(scale, "scale") size = _normal_size(size) if not (_is_array_parameter(loc) or _is_array_parameter(scale)): return _torch.normal(mean=loc, std=scale, size=size or ()) From 0da82fffcf86e75444ec82edd6573b2d12b5d2fc Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:58:53 +0200 Subject: [PATCH 2/2] Cover PyTorch normal boolean parameter validation --- tests/backend/test_pytorch_random_backend.py | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/backend/test_pytorch_random_backend.py b/tests/backend/test_pytorch_random_backend.py index 706291048..7f75638d5 100644 --- a/tests/backend/test_pytorch_random_backend.py +++ b/tests/backend/test_pytorch_random_backend.py @@ -163,6 +163,29 @@ def test_uniform_rejects_boolean_bounds(low, high): random.uniform(low, high) +@pytest.mark.parametrize( + ("loc", "scale"), + [ + (False, 1.0), + (0.0, True), + (np.bool_(True), 1.0), + (0.0, np.bool_(True)), + (torch.tensor(True), 1.0), + (0.0, torch.tensor(True)), + (torch.tensor([False, False]), torch.tensor([1.0, 2.0])), + ([False, 0.0], [1.0, 2.0]), + ([0.0, 0.5], [1.0, np.bool_(True)]), + ( + np.array([0.0, np.bool_(False)], dtype=object), + np.array([1.0, 2.0], dtype=object), + ), + ], +) +def test_normal_rejects_boolean_parameters(loc, scale): + with pytest.raises(TypeError, match="real numeric"): + random.normal(loc, scale) + + @pytest.mark.parametrize( ("low", "high"), [