Source code for hierarc.Sampling.mcmc_sampling

import emcee
from hierarc.Likelihood.cosmo_likelihood import CosmoLikelihood
from lenstronomy.Util import sampling_util


[docs] class MCMCSampler(object): """Class which executes the different sampling methods.""" def __init__(self, *args, **kwargs): """Initialise the classes of the chain and for parameter options. :param args: positional arguments for the CosmoLikelihood() instance :param kwargs: keyword arguments for the CosmoLikelihood() instance. """ self.chain = CosmoLikelihood(*args, **kwargs) self.param = self.chain.param
[docs] def mcmc_emcee( self, n_walkers, n_burn, n_run, kwargs_mean_start, kwargs_sigma_start, continue_from_backend=False, **kwargs_emcee ): """Runs the EMCEE MCMC sampling. :param n_walkers: number of walkers :param n_burn: number of iteration of burn in (not stored in the output sample :param n_run: number of iterations (after burn in) to be sampled :param kwargs_mean_start: keyword arguments of the mean starting position :param kwargs_sigma_start: keyword arguments of the spread in the initial particles per parameter :param continue_from_backend: bool, if True and 'backend' in kwargs_emcee, will continue a chain sampling from backend :param kwargs_emcee: keyword argument for the emcee (e.g. to specify backend) :return: samples of the EMCEE run """ num_param = self.param.num_param sampler = emcee.EnsembleSampler( n_walkers, num_param, self.chain.likelihood, args=(), **kwargs_emcee ) mean_start = self.param.kwargs2args(**kwargs_mean_start) sigma_start = self.param.kwargs2args(**kwargs_sigma_start) p0 = sampling_util.sample_ball(mean_start, sigma_start, n_walkers) backend = kwargs_emcee.get("backend", None) if backend is not None: if continue_from_backend: p0 = None else: backend.reset(n_walkers, num_param) sampler.run_mcmc(p0, n_burn + n_run, progress=True) flat_samples = sampler.get_chain(discard=n_burn, thin=1, flat=True) log_prob = sampler.get_log_prob(discard=n_burn, thin=1, flat=True) return flat_samples, log_prob
[docs] def param_names(self, latex_style=False): """List of parameter names being sampled in the same order as the sampling. :param latex_style: bool, if True returns strings in latex symbols, else in the convention of the sampler :return: list of strings """ labels = self.param.param_list(latex_style=latex_style) return labels