Source code for firecrown.connector.cobaya.likelihood

"""Cobaya Likelihood Connector.

Module for providing a likelihood for use in Cobaya.

This module provides the class :class:`LikelihoodConnector`, which is an implementation
of a Cobaya likelihood.
"""

from typing import Union

import numpy as np
import numpy.typing as npt
from cobaya.likelihood import Likelihood

from firecrown.likelihood.likelihood import load_likelihood, NamedParameters
from firecrown.parameters import ParamsMap


[docs]class LikelihoodConnector(Likelihood): """A class implementing cobaya.likelihood.Likelihood.""" likelihood: Likelihood firecrownIni: str derived_parameters: list[str] = [] build_parameters: NamedParameters
[docs] def initialize(self): """Initialize the likelihood object by loading its Firecrown configuration.""" if not hasattr(self, "build_parameters"): build_parameters = NamedParameters() else: if isinstance(self.build_parameters, dict): build_parameters = NamedParameters(self.build_parameters) else: if not isinstance(self.build_parameters, NamedParameters): raise TypeError( "build_parameters must be a NamedParameters or dict" ) build_parameters = self.build_parameters self.likelihood, self.tools = load_likelihood( self.firecrownIni, build_parameters )
[docs] def initialize_with_params(self) -> None: """Required by Cobaya. This version has nothing to do. """
[docs] def initialize_with_provider(self, provider) -> None: """Required by Cobaya. Sets instance's provided to the given provider. """ self.provider = provider
[docs] def get_can_provide_params(self) -> list[str]: """Required by Cobaya. Returns an empty list. """ return self.derived_parameters
[docs] def get_allow_agnostic(self): """Required by Cobaya. Return False. """ return False
[docs] def get_requirements( self, ) -> dict[str, Union[None, dict[str, npt.NDArray[np.float64]], dict[str, object]]]: """Required by Cobaya. Returns a dictionary with keys corresponding the contained likelihood's required parameter, plus "pyccl". All values are None. """ likelihood_requires: dict[ str, Union[None, dict[str, npt.NDArray[np.float64]], dict[str, object]] ] = {"pyccl": None} required_params = ( self.likelihood.required_parameters() + self.tools.required_parameters() ) for param_name in required_params.get_params_names(): likelihood_requires[param_name] = None return likelihood_requires
[docs] def must_provide(self, **requirements): """Required by Cobaya. This version does nothing. """
[docs] def logp(self, **params_values) -> float: """Required by Cobaya. Return the (log) calculated likelihood. """ pyccl = self.provider.get_pyccl() self.likelihood.update(ParamsMap(params_values)) self.tools.update(ParamsMap(params_values)) self.tools.prepare(pyccl) loglike = self.likelihood.compute_loglike(self.tools) derived_params_collection = self.likelihood.get_derived_parameters() assert derived_params_collection is not None for section, name, val in derived_params_collection: params_values["_derived"][f"{section}__{name}"] = val self.likelihood.reset() self.tools.reset() return loglike