Source code for zfit.core.basefunc

#  Copyright (c) 2023 zfit
"""Baseclass for ``Function``. Inherits from Model.

TODO(Mayou36): subclassing?
"""
from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    import zfit

import abc
import typing

from ..util.exception import ShapeIncompatibleError, SpecificFunctionNotImplemented
from .basemodel import BaseModel
from .interfaces import ZfitFunc
from ..settings import ztypes
from ..util import ztyping


[docs] class BaseFuncV1(BaseModel, ZfitFunc): def __init__( self, obs=None, dtype: 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? def copy(self, **override_params): new_params = self.params new_params.update(override_params) return type(self)(new_params) def gradient( self, x: ztyping.XType, norm: 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 SpecificFunctionNotImplemented
[docs] def func(self, x: ztyping.XType, name: str = "value") -> ztyping.XType: """The function evaluated at ``x``. Args: x: name: Returns: # 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): 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." ) from error
[docs] def as_pdf(self) -> zfit.core.interfaces.ZfitPDF: """Create a PDF out of the function. Returns: 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(norm=norm_range, none_is_error=none_is_error)