From 5e37ceaa4d5b043ecd1d60e68a960fe9a0d05a1c Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:34:15 +0200 Subject: [PATCH 1/2] Reject non-real wrapped Laplace rates --- .../circle/wrapped_laplace_distribution.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pyrecest/distributions/circle/wrapped_laplace_distribution.py b/src/pyrecest/distributions/circle/wrapped_laplace_distribution.py index dba7f71c7..9c3f56e4f 100644 --- a/src/pyrecest/distributions/circle/wrapped_laplace_distribution.py +++ b/src/pyrecest/distributions/circle/wrapped_laplace_distribution.py @@ -1,7 +1,8 @@ # pylint: disable=no-name-in-module,no-member from numbers import Integral -from pyrecest.backend import all, asarray, exp, isfinite, mod, ndim, pi +import numpy as np +from pyrecest.backend import all, asarray, exp, isfinite, mod, ndim, pi, to_numpy from .abstract_circular_distribution import AbstractCircularDistribution @@ -10,9 +11,14 @@ def _validate_positive_scalar(value, name): - value = asarray(value) - if value.shape not in ((), (1,)): - raise ValueError(f"{name} must be a positive scalar.") + message = f"{name} must be a positive real scalar." + try: + value = asarray(value) + numpy_value = np.asarray(to_numpy(value)) + except (TypeError, ValueError, RuntimeError, OverflowError) as exc: + raise ValueError(message) from exc + if numpy_value.shape not in ((), (1,)) or numpy_value.dtype.kind not in "iuf": + raise ValueError(message) if not bool(all(isfinite(value))): raise ValueError(f"{name} must be finite.") if not bool(all(value > 0.0)): From 7d9ebeaaaf62244071e16dacfa458f0aa9695344 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:34:24 +0200 Subject: [PATCH 2/2] Test wrapped Laplace rate validation --- .../test_wrapped_laplace_real_parameters.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/distributions/test_wrapped_laplace_real_parameters.py diff --git a/tests/distributions/test_wrapped_laplace_real_parameters.py b/tests/distributions/test_wrapped_laplace_real_parameters.py new file mode 100644 index 000000000..a0930dc47 --- /dev/null +++ b/tests/distributions/test_wrapped_laplace_real_parameters.py @@ -0,0 +1,17 @@ +import pytest + +from pyrecest.distributions.circle.wrapped_laplace_distribution import ( + WrappedLaplaceDistribution, +) + + +@pytest.mark.parametrize("parameter_name", ["lambda_", "kappa_"]) +@pytest.mark.parametrize("invalid_value", [True, 1.0 + 1.0j]) +def test_wrapped_laplace_rejects_non_real_rate_parameters( + parameter_name, invalid_value +): + parameters = {"lambda_": 2.0, "kappa_": 1.3} + parameters[parameter_name] = invalid_value + + with pytest.raises(ValueError, match=parameter_name): + WrappedLaplaceDistribution(**parameters)