diff --git a/bilby/core/prior/dict.py b/bilby/core/prior/dict.py index be3d543a9..4bb514c34 100644 --- a/bilby/core/prior/dict.py +++ b/bilby/core/prior/dict.py @@ -441,10 +441,26 @@ def constraint_keys(self): return [k for k, p in self.items() if isinstance(p, Constraint)] def sample_subset_constrained(self, keys=iter([]), size=None): + efficiency_warning_was_issued = False + + def check_efficiency(n_tested, n_valid): + nonlocal efficiency_warning_was_issued + if efficiency_warning_was_issued: + return + efficiency = n_valid / float(n_tested) + if n_tested >= 1e3 and efficiency < 1e-3: + logger.warning("Prior sampling efficiency is very low, please verify its validity.") + efficiency_warning_was_issued = True + + n_tested_samples, n_valid_samples = 0, 0 if size is None or size == 1: while True: sample = self.sample_subset(keys=keys, size=size) - if self.evaluate_constraints(sample): + is_valid = self.evaluate_constraints(sample) + n_tested_samples += 1 + n_valid_samples += int(is_valid) + check_efficiency(n_tested_samples, n_valid_samples) + if is_valid: return sample else: needed = np.prod(size) @@ -460,6 +476,9 @@ def sample_subset_constrained(self, keys=iter([]), size=None): all_samples[key] = np.hstack( [all_samples[key], samples[key][keep].flatten()] ) + n_tested_samples += needed + n_valid_samples += np.sum(keep) + check_efficiency(n_tested_samples, n_valid_samples) all_samples = { key: np.reshape(all_samples[key][:needed], size) for key in keys }