check_draw doesn't catch nan log_likelihood values.
I've been getting dynesty errors from nan loglikelihoods during construction of the Dynesty sampler object. I was stepping through the bilby internals with pdb and was finding that the nan loglikelihoods were happening in get_initial_points_from_prior in the base_sampler.py. I was confused as to why the function check_draw wasn't preventing theta's which produce nan loglikelihoods from being added to the returned list. I believe the reason is a bug in check_draw, which has the following implementation.
def check_draw(self, theta, warning=True):
bad_values = [np.inf, np.nan_to_num(np.inf), np.nan]
if abs(self.log_prior(theta)) in bad_values:
if warning:
logger.warning('Prior draw {} has inf prior'.format(theta))
return False
if abs(self.log_likelihood(theta)) in bad_values:
if warning:
logger.warning('Prior draw {} has inf likelihood'.format(theta))
return False
return True
However, nan's don't behave as other values with respect to equality. nan != nan is True, so if self.log_likelihood(theta) is nan, then the check becomes abs(np.nan) in [np.nan] which is False, so the function returns True when it shouldn't.
Edited by Eamonn O'Shea