From e636e4f6f3127f6d032a910ce23c8fee30e21b45 Mon Sep 17 00:00:00 2001 From: Moritz <email@moritz-huebner.de> Date: Thu, 24 Oct 2019 11:32:17 +1100 Subject: [PATCH] Created a generic conditional prior example --- examples/core_examples/conditional_prior.py | 11 ++- .../injection_examples/conditional_prior.py | 90 ------------------- 2 files changed, 7 insertions(+), 94 deletions(-) delete mode 100644 examples/gw_examples/injection_examples/conditional_prior.py diff --git a/examples/core_examples/conditional_prior.py b/examples/core_examples/conditional_prior.py index 3e4679983..2475e479d 100644 --- a/examples/core_examples/conditional_prior.py +++ b/examples/core_examples/conditional_prior.py @@ -3,31 +3,33 @@ import numpy as np # This tutorial demonstrates how we can sample a prior in the shape of a ball # Note that this will not end up sampling uniformly in that space, constraint priors are more suitable for that. -# This implementation will draw a value for the x-coordinate, and given that draw a value for the -# y-coordinate, and given that draw a value for the z-coordinate. +# This implementation will draw a value for the x-coordinate from p(x), and given that draw a value for the +# y-coordinate from p(y|x), and given that draw a value for the z-coordinate from p(z|x,y). # Only the x-coordinate will end up being uniform for this class ZeroLikelihood(bilby.core.likelihood.Likelihood): """ Flat likelihood. This always returns 0. - This way we can see if we correctly sampled uniformly in the prior space""" + This way our posterior distribution is exactly the prior distribution.""" def log_likelihood(self): return 0 def condition_func_y(reference_params, x): + """ Condition function for our p(y|x) prior.""" radius = 0.5 * (reference_params['maximum'] - reference_params['minimum']) y_max = np.sqrt(radius**2 - x**2) return dict(minimum=-y_max, maximum=y_max) def condition_func_z(reference_params, x, y): - """""" + """ Condition function for our p(z|x, y) prior.""" radius = 0.5 * (reference_params['maximum'] - reference_params['minimum']) z_max = np.sqrt(radius**2 - x**2 - y**2) return dict(minimum=-z_max, maximum=z_max) +# Set up the conditional priors and the flat likelihood priors = bilby.core.prior.ConditionalPriorDict() priors['x'] = bilby.core.prior.Uniform(minimum=-1, maximum=1, latex_label="$x$") priors['y'] = bilby.core.prior.ConditionalUniform(condition_func=condition_func_y, minimum=-1, @@ -36,6 +38,7 @@ priors['z'] = bilby.core.prior.ConditionalUniform(condition_func=condition_func_ maximum=1, latex_label="$z$") likelihood = ZeroLikelihood(parameters=dict(x=0, y=0, z=0)) +# Sample the prior distribution res = bilby.run_sampler(likelihood=likelihood, priors=priors, sampler='dynesty', npoints=5000, walks=100, label='conditional_prior', outdir='outdir', resume=False, clean=True) res.plot_corner() diff --git a/examples/gw_examples/injection_examples/conditional_prior.py b/examples/gw_examples/injection_examples/conditional_prior.py deleted file mode 100644 index 4774c9aca..000000000 --- a/examples/gw_examples/injection_examples/conditional_prior.py +++ /dev/null @@ -1,90 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np - -import bilby.gw.prior - - -def condition_function(reference_params, mass_1): - return dict(minimum=reference_params['minimum'], maximum=mass_1) - - -mass_1_min = 5 -mass_1_max = 100 - -mass_1 = bilby.core.prior.Uniform(minimum=mass_1_min, maximum=mass_1_max, name='mass_1', - latex_label='$m_1$', boundary='reflective') -mass_2 = bilby.core.prior.ConditionalUniform(minimum=mass_1_min, maximum=mass_1_max, name='mass_2', - latex_label='$m_2$', condition_func=condition_function, - boundary='reflective') - -conditional_dict = bilby.core.prior.ConditionalPriorDict(dictionary=dict(mass_1=mass_1, mass_2=mass_2)) - - -res = conditional_dict.sample(100000) - -plt.hist(res['mass_1'], bins='fd', alpha=0.6, density=True, label='Sampled') -plt.plot(np.linspace(2, 100, 200), conditional_dict['mass_1'].prob(np.linspace(2, 100, 200)), label='Uniform prior') -plt.xlabel('$m_1$') -plt.ylabel('$p(m_1)$') -plt.legend() -plt.tight_layout() -plt.show() -plt.clf() - - -plt.hist(res['mass_2'], bins='fd', alpha=0.6, density=True, label='Sampled') -plt.xlabel('$m_2$') -plt.ylabel('$p(m_2 | m_1)$') -plt.legend() -plt.tight_layout() -plt.show() -plt.clf() - - -duration = 4. -sampling_frequency = 2048. -outdir = 'outdir' -label = 'conditional_prior' -bilby.core.utils.setup_logger(outdir=outdir, label=label) - -np.random.seed(88170235) - -injection_parameters = dict( - mass_1=30., mass_2=30, a_1=0.4, a_2=0.3, tilt_1=0.5, tilt_2=1.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=1500., theta_jn=0.4, psi=2.659, - phase=1.3, geocent_time=1126259642.413, ra=1.375, dec=-1.2108) - -waveform_arguments = dict(waveform_approximant='IMRPhenomPv2', - reference_frequency=50., minimum_frequency=20.) - -waveform_generator = bilby.gw.WaveformGenerator( - duration=duration, sampling_frequency=sampling_frequency, - frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, - waveform_arguments=waveform_arguments) - -ifos = bilby.gw.detector.InterferometerList(['H1', 'L1']) -ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=sampling_frequency, duration=duration, - start_time=injection_parameters['geocent_time'] - 3) -ifos.inject_signal(waveform_generator=waveform_generator, - parameters=injection_parameters) - -priors = bilby.core.prior.ConditionalPriorDict() -for key in ['a_1', 'a_2', 'tilt_1', 'tilt_2', 'phi_12', 'phi_jl', 'psi', 'ra', - 'dec', 'geocent_time', 'phase', 'theta_jn', 'luminosity_distance']: - priors[key] = injection_parameters[key] -priors['mass_1'] = mass_1 -priors['mass_2'] = mass_2 - -# Initialise the likelihood by passing in the interferometer data (ifos) and -# the waveform generator -likelihood = bilby.gw.GravitationalWaveTransient( - interferometers=ifos, waveform_generator=waveform_generator) - -# Run sampler. In this case we're going to use the `dynesty` sampler -result = bilby.run_sampler( - likelihood=likelihood, priors=priors, sampler='dynesty', npoints=100, - injection_parameters=injection_parameters, outdir=outdir, label=label, clean=True, resume=False) - -# Make a corner plot. -result.plot_corner() -- GitLab