diff --git a/bilby/core/prior/interpolated.py b/bilby/core/prior/interpolated.py index 1f57fe22192c086cdf17d41578dc1e9213875575..c66d1a77a67c417d3798e658e28c9ca29d220df6 100644 --- a/bilby/core/prior/interpolated.py +++ b/bilby/core/prior/interpolated.py @@ -44,6 +44,8 @@ class Interped(Prior): """ self.xx = xx + self.min_limit = min(xx) + self.max_limit = max(xx) self._yy = yy self.YY = None self.probability_density = None @@ -97,6 +99,8 @@ class Interped(Prior): Updates the prior distribution if minimum is set to a different value. + Yields an error if value is set below instantiated x-array minimum. + Returns ------- float: Minimum of the prior distribution @@ -106,6 +110,8 @@ class Interped(Prior): @minimum.setter def minimum(self, minimum): + if minimum < self.min_limit: + raise ValueError('Minimum cannot be set below {}.'.format(round(self.min_limit, 2))) self._minimum = minimum if '_maximum' in self.__dict__ and self._maximum < np.inf: self._update_instance() @@ -116,6 +122,8 @@ class Interped(Prior): Updates the prior distribution if maximum is set to a different value. + Yields an error if value is set above instantiated x-array maximum. + Returns ------- float: Maximum of the prior distribution @@ -125,6 +133,8 @@ class Interped(Prior): @maximum.setter def maximum(self, maximum): + if maximum > self.max_limit: + raise ValueError('Maximum cannot be set above {}.'.format(round(self.max_limit, 2))) self._maximum = maximum if '_minimum' in self.__dict__ and self._minimum < np.inf: self._update_instance() diff --git a/bilby/gw/prior.py b/bilby/gw/prior.py index e3523a36f8ed098113b08dbbf11c88518593707c..f8425955fb7cb3ae83a6c029af5eb868a8f1f8b4 100644 --- a/bilby/gw/prior.py +++ b/bilby/gw/prior.py @@ -139,7 +139,10 @@ class Cosmological(Interped): @minimum.setter def minimum(self, minimum): - self._set_limit(value=minimum, limit_dict=self._minimum) + if (self.name in self._minimum) and (minimum < self.minimum): + self._set_limit(value=minimum, limit_dict=self._minimum, recalculate_array=True) + else: + self._set_limit(value=minimum, limit_dict=self._minimum) @property def maximum(self): @@ -147,11 +150,14 @@ class Cosmological(Interped): @maximum.setter def maximum(self, maximum): - self._set_limit(value=maximum, limit_dict=self._maximum) + if (self.name in self._maximum) and (maximum > self.maximum): + self._set_limit(value=maximum, limit_dict=self._maximum, recalculate_array=True) + else: + self._set_limit(value=maximum, limit_dict=self._maximum) - def _set_limit(self, value, limit_dict): + def _set_limit(self, value, limit_dict, recalculate_array=False): """ - Set either the limits for redshift luminosity and comoving distances + Set either of the limits for redshift, luminosity, and comoving distances Parameters ---------- @@ -159,6 +165,8 @@ class Cosmological(Interped): Limit value in current class' parameter limit_dict: dict The limit dictionary to modify in place + recalculate_array: boolean + Determines if the distance arrays are recalculated """ cosmology = get_cosmology(self.cosmology) limit_dict[self.name] = value @@ -185,6 +193,13 @@ class Cosmological(Interped): limit_dict['luminosity_distance'] = ( cosmology.luminosity_distance(limit_dict['redshift']).value ) + if recalculate_array: + if self.name == 'redshift': + self.xx, self.yy = self._get_redshift_arrays() + elif self.name == 'comoving_distance': + self.xx, self.yy = self._get_comoving_distance_arrays() + elif self.name == 'luminosity_distance': + self.xx, self.yy = self._get_luminosity_distance_arrays() try: self._update_instance() except (AttributeError, KeyError): diff --git a/test/gw_prior_test.py b/test/gw_prior_test.py index 7e864bd65d08193d2a51a32ecfb6918c1e72545e..8ac622575285f074af85a8101658d28302d8a71f 100644 --- a/test/gw_prior_test.py +++ b/test/gw_prior_test.py @@ -458,6 +458,14 @@ class TestUniformComovingVolumePrior(unittest.TestCase): ) self.assertEqual(prior.maximum, 10000) + def test_increase_maximum(self): + prior = bilby.gw.prior.UniformComovingVolume( + minimum=10, maximum=10000, name="luminosity_distance" + ) + prior.maximum = 20000 + prior_sample = prior.sample(5000) + self.assertGreater(np.mean(prior_sample), 10000) + def test_zero_minimum_works(self): prior = bilby.gw.prior.UniformComovingVolume( minimum=0, maximum=10000, name="luminosity_distance"