From c20bd29f428a4fe57edb77c3ac1c652e032b3dd0 Mon Sep 17 00:00:00 2001
From: Sylvia Biscoveanu <sylvia.biscoveanu@ligo.org>
Date: Wed, 23 Dec 2020 00:07:46 -0600
Subject: [PATCH] Only adds ultranest information gain if num_live_points is
 designated. Will later add information_gain property for
 ultranest.ReactiveNestedSampler runs.

---
 bilby/core/result.py            | 10 +++++++---
 bilby/core/sampler/cpnest.py    |  1 +
 bilby/core/sampler/dynesty.py   |  1 +
 bilby/core/sampler/nestle.py    |  1 +
 bilby/core/sampler/ultranest.py |  2 ++
 5 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/bilby/core/result.py b/bilby/core/result.py
index d604e52d1..9964ee5ca 100644
--- a/bilby/core/result.py
+++ b/bilby/core/result.py
@@ -238,8 +238,9 @@ class Result(object):
                  sampler_kwargs=None, injection_parameters=None,
                  meta_data=None, posterior=None, samples=None,
                  nested_samples=None, log_evidence=np.nan,
-                 log_evidence_err=np.nan, log_noise_evidence=np.nan,
-                 log_bayes_factor=np.nan, log_likelihood_evaluations=None,
+                 log_evidence_err=np.nan, information_gain=np.nan,
+                 log_noise_evidence=np.nan, log_bayes_factor=np.nan,
+                 log_likelihood_evaluations=None,
                  log_prior_evaluations=None, sampling_time=None, nburn=None,
                  num_likelihood_evaluations=None, walkers=None,
                  max_autocorrelation_time=None, use_ratio=None,
@@ -269,6 +270,8 @@ class Result(object):
             An array of the output posterior samples and the unweighted samples
         log_evidence, log_evidence_err, log_noise_evidence, log_bayes_factor: float
             Natural log evidences
+        information_gain: float
+            The Kullback-Leibler divergence
         log_likelihood_evaluations: array_like
             The evaluations of the likelihood for each sample point
         num_likelihood_evaluations: int
@@ -321,6 +324,7 @@ class Result(object):
         self.use_ratio = use_ratio
         self.log_evidence = log_evidence
         self.log_evidence_err = log_evidence_err
+        self.information_gain = information_gain
         self.log_noise_evidence = log_noise_evidence
         self.log_bayes_factor = log_bayes_factor
         self.log_likelihood_evaluations = log_likelihood_evaluations
@@ -573,7 +577,7 @@ class Result(object):
             'log_noise_evidence', 'log_bayes_factor', 'priors', 'posterior',
             'injection_parameters', 'meta_data', 'search_parameter_keys',
             'fixed_parameter_keys', 'constraint_parameter_keys',
-            'sampling_time', 'sampler_kwargs', 'use_ratio',
+            'sampling_time', 'sampler_kwargs', 'use_ratio', 'information_gain',
             'log_likelihood_evaluations', 'log_prior_evaluations',
             'num_likelihood_evaluations', 'samples', 'nested_samples',
             'walkers', 'nburn', 'parameter_labels', 'parameter_labels_with_unit',
diff --git a/bilby/core/sampler/cpnest.py b/bilby/core/sampler/cpnest.py
index 25183bd07..14a3bd3cb 100644
--- a/bilby/core/sampler/cpnest.py
+++ b/bilby/core/sampler/cpnest.py
@@ -132,6 +132,7 @@ class Cpnest(NestedSampler):
         self.result.nested_samples['weights'] = np.exp(log_weights)
         self.result.log_evidence = out.NS.state.logZ
         self.result.log_evidence_err = np.sqrt(out.NS.state.info / out.NS.state.nlive)
+        self.result.information_gain = out.NS.state.info
         return self.result
 
     def _verify_kwargs_against_default_kwargs(self):
diff --git a/bilby/core/sampler/dynesty.py b/bilby/core/sampler/dynesty.py
index 22811bccb..237bebd9c 100644
--- a/bilby/core/sampler/dynesty.py
+++ b/bilby/core/sampler/dynesty.py
@@ -401,6 +401,7 @@ class Dynesty(NestedSampler):
             sorted_samples=self.result.samples)
         self.result.log_evidence = out.logz[-1]
         self.result.log_evidence_err = out.logzerr[-1]
+        self.result.information_gain = out.information[-1]
 
     def _run_nested_wrapper(self, kwargs):
         """ Wrapper function to run_nested
diff --git a/bilby/core/sampler/nestle.py b/bilby/core/sampler/nestle.py
index 0b97daf72..73f88f1cb 100644
--- a/bilby/core/sampler/nestle.py
+++ b/bilby/core/sampler/nestle.py
@@ -74,6 +74,7 @@ class Nestle(NestedSampler):
             sorted_samples=self.result.samples)
         self.result.log_evidence = out.logz
         self.result.log_evidence_err = out.logzerr
+        self.result.information_gain = out.h
         self.calc_likelihood_count()
         return self.result
 
diff --git a/bilby/core/sampler/ultranest.py b/bilby/core/sampler/ultranest.py
index 9fa12578d..7e2cbcd69 100644
--- a/bilby/core/sampler/ultranest.py
+++ b/bilby/core/sampler/ultranest.py
@@ -366,6 +366,8 @@ class Ultranest(NestedSampler):
         self.result.nested_samples = nested_samples
         self.result.log_evidence = out["logz"]
         self.result.log_evidence_err = out["logzerr"]
+        if self.kwargs["num_live_points"] is not None:
+            self.result.information_gain = np.power(out["logzerr"], 2) * self.kwargs["num_live_points"]
 
         self.result.outputfiles_basename = self.outputfiles_basename
         self.result.sampling_time = datetime.timedelta(seconds=self.total_sampling_time)
-- 
GitLab