import typing
import zfit_interface.typing as ztyping
from _typeshed import Incomplete
from collections.abc import Callable as Callable
from zfit import convert_to_parameter as convert_to_parameter, z as z
from zfit._variables.varsupport import VarSupports as VarSupports
from zfit.core.func import Func as Func
from zfit.core.values import ValueHolder as ValueHolder
from zfit.util.container import convert_to_container as convert_to_container
from zfit.util.exception import NotExtendedPDFError as NotExtendedPDFError, SpecificFunctionNotImplemented as SpecificFunctionNotImplemented, WorkInProgressError as WorkInProgressError
from zfit_interface.pdf import ZfitPDF
from zfit_interface.variables import ZfitParam as ZfitParam, ZfitSpace as ZfitSpace, ZfitVar as ZfitVar

class Integration:
    numeric_integrator: Incomplete
    mc_sampler: Incomplete
    draws_per_dim: Incomplete
    def __init__(self, mc_sampler=None, draws_per_dim=None, numeric_integrator=None) -> None: ...
    def register_on_object(self, var: ztyping.Variable, func: Callable, overwrite: bool = False): ...
    def get_available(self, var): ...
    def has_full(self, var): ...
    def has_partial(self, var): ...

class PDF(Func, ZfitPDF):
    supports: Incomplete
    norm: Incomplete
    integration: Incomplete
    def __init__(self, obs: typing.Mapping[str, ZfitSpace] | None = None, params: typing.Mapping[str, ZfitParam] | None = None, var: typing.Mapping[str, ZfitVar] | None = None, supports: typing.Mapping[str, typing.Mapping[str, VarSupports]] | None = None, extended: bool | None = None, norm: typing.Mapping[str, ZfitSpace] | None = None, label: str | None = None) -> None: ...
    @property
    def is_extended(self) -> bool: ...
    def __call__(self, var): ...
    def pdf(self, var: ztyping.VarInputType, norm: ztyping.NormInputType = None, *, options=None) -> ztyping.PDFReturnType: ...
    def ext_pdf(self, var: ztyping.VarInputType, norm: ztyping.NormInputType = None, *, options=None) -> ztyping.PDFReturnType: ...
    def integrate(self, limits, norm=None, *, var=None, options=None): ...
    def counts(self, *, var=None, norm=None, options=None): ...
    def rel_counts(self, *, var=None, norm=None, options=None): ...
    def ext_integrate(self, limits, norm=None, *, var=None, options=None): ...

class UnbinnedPDF(PDF):
    def __init__(self, obs, params=None, var=None, supports=None, extended=None, norm=None) -> None: ...

class HistPDF(PDF):
    def __init__(self, obs: typing.Mapping[str, ZfitSpace] | None = None, params: typing.Mapping[str, ZfitParam] | None = None, var: typing.Mapping[str, ZfitVar] | None = None, supports: typing.Mapping[str, typing.Mapping[str, VarSupports]] | None = None, extended: bool | None = None, norm: typing.Mapping[str, ZfitSpace] | None = None, label: str | None = None) -> None: ...
