Source code for hepstats.utils.fit.diverse
from __future__ import annotations
from contextlib import ExitStack, contextmanager, suppress
import numpy as np
[docs]
def get_ndims(dataset):
"""Return the number of dimensions in the dataset"""
return len(dataset.obs)
[docs]
def get_value(value):
return np.array(value)
[docs]
def set_values_once(params, values):
with suppress(ImportError):
import zfit
return zfit.param.set_values(params, values) # more efficient
for p, v in zip(params, values):
p.set_value(v)
return None
[docs]
def eval_pdf(model, x, params=None, allow_extended=False):
"""Compute pdf of model at a given point x and for given parameters values"""
if params is None:
params = {}
def pdf(model, x):
ret = model.ext_pdf(x) if model.is_extended and allow_extended else model.pdf(x)
return get_value(ret)
with ExitStack() as stack:
for param in model.get_params():
if param in params:
value = params[param]["value"]
stack.enter_context(param.set_value(value))
return pdf(model, x)
[docs]
def pll(minimizer, loss, pois, init=None) -> float:
"""Compute minimum profile likelihood for fixed given parameters values."""
del init # unused currently
with ExitStack() as stack:
for p in pois:
param = p.parameter
stack.enter_context(param.set_value(p.value))
param.floating = False
if any(param_loss.floating for param_loss in loss.get_params()):
minimum = minimizer.minimize(loss=loss) # TODO: add init?
value = minimum.fmin
else:
value = get_value(loss.value())
for p in pois:
p.parameter.floating = True
return value
[docs]
@contextmanager
def set_values(params, values):
old_values = [p.value() for p in params]
for p, v in zip(params, values):
p.set_value(v)
yield
for p, v in zip(params, old_values):
p.set_value(v)
[docs]
def array2dataset(dataset_cls, obs, array, weights=None):
"""
dataset_cls: only used to get the class in which array/weights will be
converted.
"""
if hasattr(dataset_cls, "from_numpy"):
return dataset_cls.from_numpy(obs, array=array, weights=weights)
else:
return dataset_cls(obs, array=array, weights=weights)
[docs]
def get_nevents(dataset):
"""Returns the number of events in the dataset"""
return get_value(dataset.nevents)