import abc
from .. import z as z
from ..core.integration import Integration as Integration
from ..settings import ztypes as ztypes
from ..util import ztyping as ztyping
from ..util.cache import GraphCachable as GraphCachable
from ..util.deprecation import deprecated_args as deprecated_args, deprecated_norm_range as deprecated_norm_range
from ..util.exception import AnalyticIntegralNotImplemented as AnalyticIntegralNotImplemented, AnalyticSamplingNotImplemented as AnalyticSamplingNotImplemented, BasePDFSubclassingError as BasePDFSubclassingError, BreakingAPIChangeError as BreakingAPIChangeError, CannotConvertToNumpyError as CannotConvertToNumpyError, FunctionNotImplemented as FunctionNotImplemented, MultipleLimitsNotImplemented as MultipleLimitsNotImplemented, NormRangeNotImplemented as NormRangeNotImplemented, SpaceIncompatibleError as SpaceIncompatibleError, SpecificFunctionNotImplemented as SpecificFunctionNotImplemented, SubclassingError as SubclassingError, WorkInProgressError as WorkInProgressError
from .baseobject import BaseNumeric as BaseNumeric
from .data import Data as Data, SamplerData as SamplerData, convert_to_data as convert_to_data
from .dimension import BaseDimensional as BaseDimensional
from .sample import UniformSampleAndWeights as UniformSampleAndWeights
from .space import Space as Space, convert_to_space as convert_to_space, supports as supports
from _typeshed import Incomplete
from collections.abc import Callable as Callable
from zfit._interfaces import ZfitData as ZfitData, ZfitModel as ZfitModel, ZfitParameter as ZfitParameter, ZfitSpace as ZfitSpace

class ParamArgsNotImplemented(Exception): ...

class BaseModel(BaseNumeric, GraphCachable, BaseDimensional, ZfitModel, metaclass=abc.ABCMeta):
    DEFAULTS_integration: Incomplete
    integration: Incomplete
    def __init__(self, obs: ztyping.ObsTypeInput, params: dict[str, ZfitParameter] | None = None, name: str = 'BaseModel', dtype=..., **kwargs) -> None: ...
    @classmethod
    def __init_subclass__(cls, **kwargs) -> None: ...
    @property
    def space(self) -> ZfitSpace: ...
    def update_integration_options(self, draws_per_dim=None, mc_sampler=None, tol=None, max_draws=None, draws_simpson=None) -> None: ...
    @deprecated_norm_range
    def integrate(self, limits: ztyping.LimitsType, norm: ztyping.LimitsType = None, *, options=None, params: ztyping.ParamTypeInput = None, var=None) -> ztyping.XType: ...
    @classmethod
    def register_analytic_integral(cls, func: Callable, limits: ztyping.LimitsType = None, priority: int | float = 50, *, supports_norm: bool | None = None, supports_norm_range: bool | None = None, supports_multiple_limits: bool | None = None) -> None: ...
    @classmethod
    def register_inverse_analytic_integral(cls, func: Callable) -> None: ...
    @deprecated_norm_range
    def analytic_integrate(self, limits: ztyping.LimitsType, norm: ztyping.LimitsType = None, *, params: ztyping.ParamsTypeInput | None = None) -> ztyping.XType: ...
    @property
    def has_analytic_integral(self): ...
    @deprecated_norm_range
    def numeric_integrate(self, limits: ztyping.LimitsType, norm: ztyping.LimitsType = None, *, options=None, params: ztyping.ParamsTypeInput = None) -> ztyping.XType: ...
    @deprecated_norm_range
    def partial_integrate(self, x: ztyping.XTypeInput, limits: ztyping.LimitsType, *, norm=None, options=None, params: ztyping.ParamsTypeInput = None) -> ztyping.XTypeReturn: ...
    @deprecated_norm_range
    def partial_analytic_integrate(self, x: ztyping.XTypeInput, limits: ztyping.LimitsType, norm: ztyping.LimitsType = None, *, params: ztyping.ParamTypeInput = None) -> ztyping.XTypeReturn: ...
    @deprecated_norm_range
    def partial_numeric_integrate(self, x: ztyping.XType, limits: ztyping.LimitsType, norm: ztyping.LimitsType = None, *, params: ztyping.ParamTypeInput = None) -> ztyping.XType: ...
    def create_sampler(self, n: ztyping.nSamplingTypeIn = None, limits: ztyping.LimitsType = None, *, fixed_params: bool | list[ZfitParameter] | tuple[ZfitParameter] | None = None, params: ztyping.ParamTypeInput = None) -> SamplerData: ...
    def sample(self, n: ztyping.nSamplingTypeIn = None, limits: ztyping.LimitsType = None, *, x: ztyping.DataInputType | None = None, params: ztyping.ParamTypeInput = None) -> Data: ...
    def __add__(self, other): ...
    def __radd__(self, other): ...
    def __mul__(self, other): ...
    def __rmul__(self, other): ...

class SimpleModelSubclassMixin:
    def __init__(self, *args, **kwargs) -> None: ...
