Source code for imagine.likelihoods.simple_likelihood

# %% IMPORTS
# Built-in imports
from copy import deepcopy
import logging as log

# Package imports
import numpy as np

# IMAGINE imports
from imagine.likelihoods import Likelihood
from imagine.observables.observable_dict import Simulations
from imagine.tools.parallel_ops import pslogdet, plu_solve

# All declaration
__all__ = ['SimpleLikelihood']


# %% CLASS DEFINITIONS
[docs]class SimpleLikelihood(Likelihood): """ A simple Likelihood class Parameters ---------- measurement_dict : imagine.observables.observable_dict.Measurements Measurements covariance_dict : imagine.observables.observable_dict.Covariances Covariances mask_dict : imagine.observables.observable_dict.Masks Masks """
[docs] def call(self, observable_dict): """ SimpleLikelihood object call function Parameters ---------- observable_dict : imagine.observables.observable_dict.Simulations Simulations object Returns ------ likelicache : float log-likelihood value (copied to all nodes) """ log.debug('@ simple_likelihood::__call__') assert isinstance(observable_dict, Simulations) # check dict entries assert (observable_dict.keys() == self._measurement_dict.keys()) likelicache = 0 if self._covariance_dict is None: # no covariance matrix for name in self._measurement_dict.keys(): obs_mean = deepcopy(observable_dict[name].ensemble_mean) # use mpi_mean, copied to all nodes data = deepcopy(self._measurement_dict[name].data) # to distributed data diff = np.nan_to_num(data - obs_mean) likelicache += -0.5*np.vdot(diff, diff) # copied to all nodes else: # with covariance matrix for name in self._measurement_dict.keys(): obs_mean = deepcopy(observable_dict[name].ensemble_mean) # use mpi_mean, copied to all nodes data = deepcopy(self._measurement_dict[name].data) # to distributed data diff = np.nan_to_num(data - obs_mean) if name in self._covariance_dict.keys(): # not all measreuments have cov cov = deepcopy(self._covariance_dict[name].data) # to distributed data sign, logdet = pslogdet(cov*2*np.pi) likelicache += -0.5*(np.vdot(diff, plu_solve(cov, diff))+sign*logdet) else: likelicache += -0.5*np.vdot(diff, diff) return likelicache