diff --git a/.gitignore b/.gitignore index 62320b39c291edb6566079d8cd19798ff9e1f137..88717818866b233ab49b644f24d116aa61efea91 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ MANIFEST *.dat *.version *.ipynb_checkpoints -outdir/* \ No newline at end of file +outdir/* +.idea/* diff --git a/bilby/core/prior.py b/bilby/core/prior.py index 48cdd527d1fa59cf6030abd391e80962951658e4..c1a11013e1e86b76bafcc86de649f41e82ccf5f0 100644 --- a/bilby/core/prior.py +++ b/bilby/core/prior.py @@ -1237,12 +1237,19 @@ class SymmetricLogUniform(Prior): Union[float, array_like]: Rescaled probability """ self.test_valid_for_rescaling(val) - if val < 0.5: - return -self.maximum * np.exp(-2 * val * np.log(self.maximum / self.minimum)) - elif val > 0.5: - return self.minimum * np.exp(np.log(self.maximum / self.minimum) * (2 * val - 1)) + if isinstance(val, (float, int)): + if val < 0.5: + return -self.maximum * np.exp(-2 * val * np.log(self.maximum / self.minimum)) + else: + return self.minimum * np.exp(np.log(self.maximum / self.minimum) * (2 * val - 1)) else: - raise ValueError("Rescale not valid for val=0.5") + vals_less_than_5 = val < 0.5 + rescaled = np.empty_like(val) + rescaled[vals_less_than_5] = -self.maximum * np.exp(-2 * val[vals_less_than_5] * + np.log(self.maximum / self.minimum)) + rescaled[~vals_less_than_5] = self.minimum * np.exp(np.log(self.maximum / self.minimum) * + (2 * val[~vals_less_than_5] - 1)) + return rescaled def prob(self, val): """Return the prior probability of val diff --git a/test/prior_test.py b/test/prior_test.py index a0123982de0e92ee0f07f0c7f92e8fba54d72e6e..8f58d41e57fcea98a6d19ec9f5cc386e756fdd98 100644 --- a/test/prior_test.py +++ b/test/prior_test.py @@ -274,6 +274,16 @@ class TestPriorClasses(unittest.TestCase): # the prob and ln_prob functions, it must be ignored in this test. self.assertAlmostEqual(np.log(prior.prob(sample)), prior.ln_prob(sample), 12) + def test_many_prob_and_many_ln_prob(self): + for prior in self.priors: + samples = prior.sample(10) + if not isinstance(prior, bilby.core.prior.MultivariateGaussian): + ln_probs = prior.ln_prob(samples) + probs = prior.prob(samples) + for sample, logp, p in zip(samples, ln_probs, probs): + self.assertAlmostEqual(prior.ln_prob(sample), logp) + self.assertAlmostEqual(prior.prob(sample), p) + def test_cdf_is_inverse_of_rescaling(self): domain = np.linspace(0, 1, 100) threshold = 1e-9