Source code for cosmofit.samplers.evaluate

"""
Evaluate the model at one point and report everything about it.

The first thing to run on a new input: it builds the model, evaluates
it once, and shows the log-prior, every likelihood's chi2 and every
derived parameter -- without sampling anything.
"""

from __future__ import annotations

import numpy as np

from .base import Sampler


__all__ = ["Evaluate"]


[docs] class Evaluate(Sampler): """ Options ------- override : dict, optional Values for sampled parameters. The rest are taken at their ``ref`` (or, failing that, their prior's center). """ defaults = {"override": None}
[docs] def initialize(self) -> None: override = dict(self.options["override"] or {}) unknown = set(override) - set(self.model.sampled_params) if unknown: raise ValueError( f"override: {sorted(unknown)} are not sampled parameters " f"(those are {self.model.sampled_params})." ) point = dict(zip( self.model.sampled_params, self.model.parameters.centers(), )) point.update({k: float(v) for k, v in override.items()}) self.point = point self.result = None
def run(self) -> None: self.result = self.model.logposterior(self.point) def products(self) -> dict: if self.result is None: raise RuntimeError("Call run() first.") r = self.result return { "point": dict(self.point), "logpost": r.logpost, "logprior": r.logprior, "loglikes": dict(r.loglikes), "chi2": r.chi2 if r.rejected is None else {}, "derived": dict(r.derived), "rejected": r.rejected, "finite": bool(np.isfinite(r.logpost)), }