Skip to content
Snippets Groups Projects
sampler_run_test.py 7.97 KiB
Newer Older
import unittest
Colm Talbot's avatar
Colm Talbot committed
import pytest
import shutil
Colm Talbot's avatar
Colm Talbot committed
import sys

import bilby
import numpy as np


class TestRunningSamplers(unittest.TestCase):
    def setUp(self):
        np.random.seed(42)
        bilby.core.utils.command_line_args.bilby_test_mode = False
        self.x = np.linspace(0, 1, 11)
        self.model = lambda x, m, c: m * x + c
        self.injection_parameters = dict(m=0.5, c=0.2)
        self.sigma = 0.1
        self.y = self.model(self.x, **self.injection_parameters) + np.random.normal(
            0, self.sigma, len(self.x)
        )
        self.likelihood = bilby.likelihood.GaussianLikelihood(
            self.x, self.y, self.model, self.sigma
        )

        self.priors = bilby.core.prior.PriorDict()
        self.priors["m"] = bilby.core.prior.Uniform(0, 5, boundary="periodic")
        self.priors["c"] = bilby.core.prior.Uniform(-2, 2, boundary="reflective")
        self.kwargs = dict(
            save=False,
            conversion_function=self.conversion_function,
        )
        bilby.core.utils.check_directory_exists_and_if_not_mkdir("outdir")

    @staticmethod
    def conversion_function(parameters, likelihood, prior):
        converted = parameters.copy()
        if 'derived' not in converted:
            converted['derived'] = converted['m'] * converted['c']
        return converted

    def tearDown(self):
        del self.likelihood
        del self.priors
        bilby.core.utils.command_line_args.bilby_test_mode = False
        shutil.rmtree("outdir")

    def test_run_cpnest(self):
        pytest.importorskip("cpnest")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="cpnest",
            nlive=100,
            resume=False,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
Colm Talbot's avatar
Colm Talbot committed
    def test_run_dnest4(self):
        pytest.importorskip("dnest4")
        res = bilby.run_sampler(
Colm Talbot's avatar
Colm Talbot committed
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="dnest4",
            max_num_levels=2,
            num_steps=10,
            new_level_interval=10,
            num_per_step=10,
            thread_steps=1,
            num_particles=50,
Colm Talbot's avatar
Colm Talbot committed
        )
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
Colm Talbot's avatar
Colm Talbot committed

    def test_run_dynesty(self):
        pytest.importorskip("dynesty")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="dynesty",
            nlive=100,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_dynamic_dynesty(self):
        pytest.importorskip("dynesty")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="dynamic_dynesty",
            nlive_init=100,
            nlive_batch=100,
            dlogz_init=1.0,
            maxbatch=0,
            maxcall=100,
            bound="single",
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_emcee(self):
        pytest.importorskip("emcee")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="emcee",
            iterations=1000,
            nwalkers=10,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_kombine(self):
        pytest.importorskip("kombine")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="kombine",
            iterations=2000,
            nwalkers=20,
            autoburnin=False,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_nestle(self):
        pytest.importorskip("nestle")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="nestle",
            nlive=100,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
Michael Williams's avatar
Michael Williams committed
    def test_run_nessai(self):
        pytest.importorskip("nessai")
        res = bilby.run_sampler(
Michael Williams's avatar
Michael Williams committed
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="nessai",
            nlive=100,
            poolsize=1000,
            max_iteration=1000,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
    def test_run_pypolychord(self):
Colm Talbot's avatar
Colm Talbot committed
        pytest.importorskip("pypolychord")
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="pypolychord",
            nlive=100,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_ptemcee(self):
        pytest.importorskip("ptemcee")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="ptemcee",
            nsamples=100,
            nwalkers=50,
            burn_in_act=1,
            ntemps=1,
            frac_threshold=0.5,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
Colm Talbot's avatar
Colm Talbot committed
    @pytest.mark.skipif(sys.version_info[1] <= 6, reason="pymc3 is broken in py36")
    def test_run_pymc3(self):
        pytest.importorskip("pymc3")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="pymc3",
            draws=50,
            tune=50,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_pymultinest(self):
        pytest.importorskip("pymultinest")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="pymultinest",
            nlive=100,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_PTMCMCSampler(self):
        pytest.importorskip("PTMCMCSampler")
        res = bilby.run_sampler(
            likelihood=self.likelihood,
            priors=self.priors,
            sampler="PTMCMCsampler",
            Niter=101,
            burn=2,
            isave=100,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

    def test_run_ultranest(self):
        pytest.importorskip("ultranest")
        # run using NestedSampler (with nlive specified)
            likelihood=self.likelihood, priors=self.priors,
            sampler="ultranest", nlive=100, **self.kwargs,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

        # run using ReactiveNestedSampler (with no nlive given)
            likelihood=self.likelihood, priors=self.priors,
            sampler='ultranest', **self.kwargs,
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None
    def test_run_bilby_mcmc(self):
            likelihood=self.likelihood, priors=self.priors,
            sampler="bilby_mcmc", nsamples=200, **self.kwargs,
            printdt=1,
        )
        assert 'derived' in res.posterior
        assert res.log_likelihood_evaluations is not None

if __name__ == "__main__":
    unittest.main()