From 71dc6e976a1b2a2c3dacb566e543378343f47f42 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 7 Nov 2024 13:30:33 +0000 Subject: [PATCH 1/4] BUG: issue warning when prior sampling efficiency is below 1e-3. --- bilby/core/prior/dict.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/bilby/core/prior/dict.py b/bilby/core/prior/dict.py index be3d543a9..fb78c4a1b 100644 --- a/bilby/core/prior/dict.py +++ b/bilby/core/prior/dict.py @@ -441,10 +441,25 @@ 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.debug("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 +475,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 } From ce4f0f6fb5dead382165027d97937f44cfe383dc Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 7 Nov 2024 13:35:15 +0000 Subject: [PATCH 2/4] STY: Fix pep8 in sample_subset_constrained. --- bilby/core/prior/dict.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bilby/core/prior/dict.py b/bilby/core/prior/dict.py index fb78c4a1b..2bb95d22f 100644 --- a/bilby/core/prior/dict.py +++ b/bilby/core/prior/dict.py @@ -442,6 +442,7 @@ def constraint_keys(self): 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: From e4ee28ba68249e7de5e13da1bc5bc8d06e7e6d5c Mon Sep 17 00:00:00 2001 From: AlexandreGoettel <33029077+AlexandreGoettel@users.noreply.github.com> Date: Fri, 8 Nov 2024 16:03:41 +0000 Subject: [PATCH 3/4] Change logger.debug to logger.warning for prior warning --- bilby/core/prior/dict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bilby/core/prior/dict.py b/bilby/core/prior/dict.py index 2bb95d22f..de7ec1ceb 100644 --- a/bilby/core/prior/dict.py +++ b/bilby/core/prior/dict.py @@ -449,7 +449,7 @@ def check_efficiency(n_tested, n_valid): return efficiency = n_valid / float(n_tested) if n_tested >= 1e3 and efficiency < 1e-3: - logger.debug("Warning: prior sampling efficiency is very low, please verify its validity.") + logger.warning("Warning: prior sampling efficiency is very low, please verify its validity.") efficiency_warning_was_issued = True n_tested_samples, n_valid_samples = 0, 0 From 70f988276b6d35c2799220e8b12f45d8973aa6b8 Mon Sep 17 00:00:00 2001 From: AlexandreGoettel <33029077+AlexandreGoettel@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:17:49 +0000 Subject: [PATCH 4/4] Remove warning redundancy --- bilby/core/prior/dict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bilby/core/prior/dict.py b/bilby/core/prior/dict.py index de7ec1ceb..4bb514c34 100644 --- a/bilby/core/prior/dict.py +++ b/bilby/core/prior/dict.py @@ -449,7 +449,7 @@ def check_efficiency(n_tested, n_valid): return efficiency = n_valid / float(n_tested) if n_tested >= 1e3 and efficiency < 1e-3: - logger.warning("Warning: prior sampling efficiency is very low, please verify its validity.") + 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