diff --git a/src/pyrecest/distributions/circle/von_mises_distribution.py b/src/pyrecest/distributions/circle/von_mises_distribution.py index df4a11db9..5f6709b04 100644 --- a/src/pyrecest/distributions/circle/von_mises_distribution.py +++ b/src/pyrecest/distributions/circle/von_mises_distribution.py @@ -49,6 +49,7 @@ def __init__( self.mu = mu self.kappa = kappa self._norm_const = norm_const + self._norm_const_is_explicit = norm_const is not None def get_params(self): return self.mu, self.kappa @@ -61,7 +62,7 @@ def norm_const(self): def pdf(self, xs): xs = array(xs) - if self._norm_const is None: + if not getattr(self, "_norm_const_is_explicit", False): p = exp(self.kappa * (cos(xs - self.mu) - 1.0)) / ( 2.0 * pi * ive(0, self.kappa) ) diff --git a/tests/distributions/test_von_mises_distribution.py b/tests/distributions/test_von_mises_distribution.py index f7736977d..406e2fe20 100644 --- a/tests/distributions/test_von_mises_distribution.py +++ b/tests/distributions/test_von_mises_distribution.py @@ -41,6 +41,16 @@ def test_large_concentration_pdf_and_entropy_are_finite(self): self.assertGreater(float(mode_pdf[0]), 0.0) self.assertTrue(np.isfinite(float(entropy))) + def test_large_concentration_pdf_stays_stable_after_norm_const_access(self): + dist = VonMisesDistribution(0.3, 1000.0) + expected = VonMisesDistribution(0.3, 1000.0).pdf(array([0.3])) + + _ = dist.norm_const + mode_pdf = dist.pdf(array([0.3])) + + self.assertTrue(np.isfinite(float(mode_pdf[0]))) + npt.assert_allclose(mode_pdf, expected) + def test_pdf(self): dist = VonMisesDistribution(2, 1) xs = linspace(1, 7, 7)