Skip to content

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