Source code for zfit.core.basefunc
"""Baseclass for `Function`. Inherits from Model.
TODO(Mayou36): subclassing?
"""
import abc
import typing
import tensorflow as tf
import zfit
from zfit.util.exception import ShapeIncompatibleError
from .basemodel import BaseModel
from .interfaces import ZfitFunc
from ..settings import ztypes
from ..util import ztyping
[docs]class BaseFunc(BaseModel, ZfitFunc):
def __init__(self, obs=None, dtype: typing.Type = ztypes.float, name: str = "BaseFunc",
params: typing.Any = None):
"""TODO(docs): explain subclassing"""
super().__init__(obs=obs, dtype=dtype, name=name, params=params)
def _func_to_integrate(self, x: ztyping.XType):
return self.func(x=x)
def _func_to_sample_from(self, x):
return self.func(x=x)
# TODO(Mayou36): how to deal with copy properly?
[docs] def copy(self, **override_params):
new_params = self.params
new_params.update(override_params)
return type(self)(new_params)
[docs] def gradients(self, x: ztyping.XType, norm_range: ztyping.LimitsType = None, params: ztyping.ParamsTypeOpt = None):
# TODO(Mayou36): well, really needed... this gradient?
raise NotImplementedError("What do you need? Use tf.gradient...")
@abc.abstractmethod
def _func(self, x):
raise NotImplementedError
[docs] def func(self, x: ztyping.XType, name: str = "value") -> ztyping.XType:
"""The function evaluated at `x`.
Args:
x (`Data`):
name (str):
Returns:
tf.Tensor: # TODO(Mayou36): or dataset? Update: rather not, what would obs be?
"""
with self._convert_sort_x(x) as x:
return self._single_hook_value(x=x, name=name)
def _single_hook_value(self, x, name):
return self._hook_value(x, name)
def _hook_value(self, x, name='_hook_value'):
return self._call_value(x=x, name=name)
def _call_value(self, x, name):
with self._name_scope(name, values=[x]):
try:
return self._func(x=x)
except ValueError as error:
raise ShapeIncompatibleError("Most probably, the number of obs the func was designed for"
"does not coincide with the `n_obs` from the `space`/`obs`"
"it received on initialization."
"Original Error: {}".format(error))
[docs] def as_pdf(self) -> "zfit.core.interfaces.ZfitPDF":
"""Create a PDF out of the function
Returns:
:py:class:`~zfit.core.interfaces.ZfitPDF`: a PDF with the current function as the unnormalized probability.
"""
from zfit.core.operations import convert_func_to_pdf
return convert_func_to_pdf(func=self)
def _check_input_norm_range_default(self, norm_range, caller_name="", none_is_error=True): # TODO(Mayou36): default
return self._check_input_norm_range(norm_range=norm_range, caller_name=caller_name, none_is_error=none_is_error)