Ë
    ÏÍ:jêf  ã                   ó¸   — d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ d dlZddlmZmZ ddlmZ d	gZ G d
„ d	«      Zd„ Z y)é    )ÚGenericAlias)ÚlinalgÚspecial)Úcheck_random_state)ÚasarrayÚ
atleast_2dÚreshapeÚzerosÚnewaxisÚexpÚpiÚsqrtÚravelÚpowerÚ
atleast_1dÚsqueezeÚsumÚ	transposeÚonesÚcovNé   )Úgaussian_kernel_estimateÚgaussian_kernel_estimate_log)Úmultivariate_normalÚgaussian_kdec                   óÔ   — e Zd ZU dZ ee«      Zeed<   dd„Zd„ Z	e	Z
d„ Zd„ Zdddœd	„Zd
„ Zdd„Zd„ Zd„ ZeZde_        dd„Zd„ Zed„ «       Zd„ Zd„ Zd„ Zed„ «       Zed„ «       Zy)r   a­  Representation of a kernel-density estimate using Gaussian kernels.

    Kernel density estimation is a way to estimate the probability density
    function (PDF) of a random variable in a non-parametric way.
    `gaussian_kde` works for both uni-variate and multi-variate data.   It
    includes automatic bandwidth determination.  The estimation works best for
    a unimodal distribution; bimodal or multi-modal distributions tend to be
    oversmoothed.

    Parameters
    ----------
    dataset : array_like
        Datapoints to estimate from. In case of univariate data this is a 1-D
        array, otherwise a 2-D array with shape (# of dims, # of data).
    bw_method : str, scalar or callable, optional
        The method used to calculate the bandwidth factor.  This can be
        'scott', 'silverman', a scalar constant or a callable.  If a scalar,
        this will be used directly as `factor`.  If a callable, it should
        take a `gaussian_kde` instance as only parameter and return a scalar.
        If None (default), 'scott' is used.  See Notes for more details.
    weights : array_like, optional
        weights of datapoints. This must be the same shape as dataset.
        If None (default), the samples are assumed to be equally weighted

    Attributes
    ----------
    dataset : ndarray
        The dataset with which `gaussian_kde` was initialized.
    d : int
        Number of dimensions.
    n : int
        Number of datapoints.
    neff : int
        Effective number of datapoints.

        .. versionadded:: 1.2.0
    factor : float
        The bandwidth factor obtained from `covariance_factor`.
    covariance : ndarray
        The kernel covariance matrix; this is the data covariance matrix
        multiplied by the square of the bandwidth factor, e.g.
        ``np.cov(dataset) * factor**2``.
    inv_cov : ndarray
        The inverse of `covariance`.

    Methods
    -------
    evaluate
    __call__
    integrate_gaussian
    integrate_box_1d
    integrate_box
    integrate_kde
    pdf
    logpdf
    resample
    set_bandwidth
    covariance_factor
    marginal

    Notes
    -----
    Bandwidth selection strongly influences the estimate obtained from the KDE
    (much more so than the actual shape of the kernel).  Bandwidth selection
    can be done by a "rule of thumb", by cross-validation, by "plug-in
    methods" or by other means; see [3]_, [4]_ for reviews.  `gaussian_kde`
    uses a rule of thumb, the default is Scott's Rule.

    Scott's Rule [1]_, implemented as `scotts_factor`, is::

        n**(-1./(d+4)),

    with ``n`` the number of data points and ``d`` the number of dimensions.
    In the case of unequally weighted points, `scotts_factor` becomes::

        neff**(-1./(d+4)),

    with ``neff`` the effective number of datapoints.
    Silverman's suggestion for *multivariate* data [2]_, implemented as
    `silverman_factor`, is::

        (n * (d + 2) / 4.)**(-1. / (d + 4)).

    or in the case of unequally weighted points::

        (neff * (d + 2) / 4.)**(-1. / (d + 4)).

    Note that this is not the same as "Silverman's rule of thumb" [6]_, which
    may be more robust in the univariate case; see documentation of the
    ``set_bandwidth`` method for implementing a custom bandwidth rule.

    Good general descriptions of kernel density estimation can be found in [1]_
    and [2]_, the mathematics for this multi-dimensional implementation can be
    found in [1]_.

    With a set of weighted samples, the effective number of datapoints ``neff``
    is defined by::

        neff = sum(weights)^2 / sum(weights^2)

    as detailed in [5]_.

    `gaussian_kde` does not currently support data that lies in a
    lower-dimensional subspace of the space in which it is expressed. For such
    data, consider performing principal component analysis / dimensionality
    reduction and using `gaussian_kde` with the transformed data.

    References
    ----------
    .. [1] D.W. Scott, "Multivariate Density Estimation: Theory, Practice, and
           Visualization", John Wiley & Sons, New York, Chicester, 1992.
    .. [2] B.W. Silverman, "Density Estimation for Statistics and Data
           Analysis", Vol. 26, Monographs on Statistics and Applied Probability,
           Chapman and Hall, London, 1986.
    .. [3] B.A. Turlach, "Bandwidth Selection in Kernel Density Estimation: A
           Review", CORE and Institut de Statistique, Vol. 19, pp. 1-33, 1993.
    .. [4] D.M. Bashtannyk and R.J. Hyndman, "Bandwidth selection for kernel
           conditional density estimation", Computational Statistics & Data
           Analysis, Vol. 36, pp. 279-298, 2001.
    .. [5] Gray P. G., 1969, Journal of the Royal Statistical Society.
           Series A (General), 132, 272
    .. [6] Kernel density estimation. *Wikipedia.*
           https://en.wikipedia.org/wiki/Kernel_density_estimation

    Examples
    --------
    Generate some random two-dimensional data:

    >>> import numpy as np
    >>> from scipy import stats
    >>> def measure(n):
    ...     "Measurement model, return two coupled measurements."
    ...     m1 = np.random.normal(size=n)
    ...     m2 = np.random.normal(scale=0.5, size=n)
    ...     return m1+m2, m1-m2

    >>> m1, m2 = measure(2000)
    >>> xmin = m1.min()
    >>> xmax = m1.max()
    >>> ymin = m2.min()
    >>> ymax = m2.max()

    Perform a kernel density estimate on the data:

    >>> X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
    >>> positions = np.vstack([X.ravel(), Y.ravel()])
    >>> values = np.vstack([m1, m2])
    >>> kernel = stats.gaussian_kde(values)
    >>> Z = np.reshape(kernel(positions).T, X.shape)

    Plot the results:

    >>> import matplotlib.pyplot as plt
    >>> fig, ax = plt.subplots()
    >>> ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,
    ...           extent=[xmin, xmax, ymin, ymax])
    >>> ax.plot(m1, m2, 'k.', markersize=2)
    >>> ax.set_xlim([xmin, xmax])
    >>> ax.set_ylim([ymin, ymax])
    >>> plt.show()

    Compare against manual KDE at a point:

    >>> point = [1, 2]
    >>> mean = values.T
    >>> cov = kernel.factor**2 * np.cov(values)
    >>> X = stats.multivariate_normal(cov=cov)
    >>> res = kernel.pdf(point)
    >>> ref = X.pdf(point - mean).sum() / len(mean)
    >>> np.allclose(res, ref)
    True
    Ú__class_getitem__Nc                 ó<  — t        t        |«      «      | _        | j                  j                  dkD  st	        d«      ‚| j                  j
                  \  | _        | _        |�Ît        |«      j                  t        «      | _        | xj                  t        | j                  «      z  c_        | j                  j                  dk7  rt	        d«      ‚t        | j                  «      | j                  k7  rt	        d«      ‚dt!        j"                  | j                  | j                  «      z  | _        | j                  | j                  kD  rd}t	        |«      ‚	 | j'                  |¬«       y # t(        j*                  $ r}d}t)        j*                  |«      |‚d }~ww xY w)Nr   z.`dataset` input should have multiple elements.z*`weights` input should be one-dimensional.z%`weights` input should be of length na1  Number of dimensions is greater than number of samples. This results in a singular data covariance matrix, which cannot be treated using the algorithms implemented in `gaussian_kde`. Note that `gaussian_kde` interprets each *column* of `dataset` to be a point; consider transposing the input to `dataset`.©Ú	bw_methodab  The data appears to lie in a lower-dimensional subspace of the space in which it is expressed. This has resulted in a singular data covariance matrix, which cannot be treated using the algorithms implemented in `gaussian_kde`. Consider performing principal component analysis / dimensionality reduction and using `gaussian_kde` with the transformed data.)r   r   ÚdatasetÚsizeÚ
ValueErrorÚshapeÚdÚnr   ÚastypeÚfloatÚ_weightsr   ÚweightsÚndimÚlenÚnpÚvecdotÚ_neffÚset_bandwidthr   ÚLinAlgError)Úselfr!   r    r*   ÚmsgÚes         úe/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/scipy/stats/_kde.pyÚ__init__zgaussian_kde.__init__×   sF  € Ü!¤'¨'Ó"2Ó3ˆŒØ�|‰|× Ñ  1Ò$ÜÐMÓNÐNàŸ™×+Ñ+‰ˆŒ�”àÐÜ& wÓ/×6Ñ6´uÓ=ˆDŒMØ�MŠMœS §¡Ó/Ñ/�MØ�|‰|× Ñ  AÒ%Ü Ð!MÓNÐNÜ�4—=‘=Ó! T§V¡VÒ+Ü Ð!HÓIÐIØœ2Ÿ9™9 T§]¡]°D·M±MÓBÑBˆDŒJð �6‰6�D—F‘FŠ?ð-ˆCô ˜S“/Ð!ð
	1Ø×Ñ¨ÐÕ3øÜ×!Ñ!ò 	1ð?ˆCô ×$Ñ$ SÓ)¨qÐ0ûð	1ús   ÅE+ Å+FÅ>FÆFc                 óØ  — t        t        |«      «      }|j                  \  }}|| j                  k7  rL|dk(  r*|| j                  k(  rt	        || j                  df«      }d}nd|› d| j                  › �}t        |«      ‚t        | j                  |«      \  }}t        |   | j                  j                  | j                  dd…df   |j                  | j                  |«      }|dd…df   S )a  Evaluate the estimated pdf on a set of points.

        Parameters
        ----------
        points : (# of dimensions, # of points)-array
            Alternatively, a (# of dimensions,) vector can be passed in and
            treated as a single point.

        Returns
        -------
        values : (# of points,)-array
            The values at each point.

        Raises
        ------
        ValueError : if the dimensionality of the input points is different than
                     the dimensionality of the KDE.

        r   úpoints have dimension ú, dataset has dimension Nr   )r   r   r$   r%   r	   r#   Ú_get_output_dtypeÚ
covariancer   r!   ÚTr*   Úcho_cov)r2   Úpointsr%   Úmr3   Úoutput_dtypeÚspecÚresults           r5   Úevaluatezgaussian_kde.evaluateý   s×   € ô( œG F›OÓ,ˆà�|‰|‰ˆˆ1Ø�—‘Š;Ø�AŠv˜!˜tŸv™vš+ä  ¨$¯&©&°!¨Ó5�Ø‘à/°¨sð 30Ø04·±¨xð9�ä  “oÐ%ä.¨t¯©ÀÓGÑˆ�dÜ)¨$Ñ/Ø�L‰L�N‰N˜DŸL™Lª¨D¨Ñ1Ø�H‰H�d—l‘l Ló2ˆð ’a˜�d‰|Ðó    c                 ó  — t        t        |«      «      }t        |«      }|j                  | j                  fk7  rt        d| j                  › �«      ‚|j                  | j                  | j                  fk7  rt        d| j                  › �«      ‚|dd…t        f   }| j                  |z   }t        j                  |«      }| j                  |z
  }t        j                  ||«      }t        j                  t        j                  |d   «      «      }t        dt         z  |j                  d   dz  «      |z  }t        j"                  ||d¬«      dz  }	t        j"                  t%        |	 «      | j&                  d¬«      |z  }
|
S )aW  
        Multiply estimated density by a multivariate Gaussian and integrate
        over the whole space.

        Parameters
        ----------
        mean : aray_like
            A 1-D array, specifying the mean of the Gaussian.
        cov : array_like
            A 2-D array, specifying the covariance matrix of the Gaussian.

        Returns
        -------
        result : scalar
            The value of the integral.

        Raises
        ------
        ValueError
            If the mean or covariance of the input Gaussian differs from
            the KDE's dimensionality.

        zmean does not have dimension z#covariance does not have dimension Nr   é   ç       @©Úaxis)r   r   r   r$   r%   r#   r   r;   r   Ú
cho_factorr!   Ú	cho_solver-   ÚprodÚdiagonalr   r   r.   r   r*   )r2   Úmeanr   Úsum_covÚsum_cov_cholÚdiffÚtdiffÚsqrt_detÚ
norm_constÚenergiesrB   s              r5   Úintegrate_gaussianzgaussian_kde.integrate_gaussian'  s?  € ô0 œ' $›-Ó(ˆÜ˜‹oˆà�:‰:˜$Ÿ&™&˜Ò"ÜÐ<¸T¿V¹V¸HÐEÓFÐFØ�9‰9˜Ÿ™ §¡Ð(Ò(ÜÐBÀ4Ç6Á6À(ÐKÓLÐLð ’A”w�JÑˆà—/‘/ CÑ'ˆô
 ×(Ñ(¨Ó1ˆà�|‰|˜dÑ"ˆÜ× Ñ  ¨tÓ4ˆä—7‘7œ2Ÿ;™; |°A¡Ó7Ó8ˆÜ˜1œr™6 7§=¡=°Ñ#3°cÑ#9Ó:¸XÑEˆ
ä—9‘9˜T 5¨qÔ1°CÑ7ˆÜ—‘œ3 ˜y›>¨4¯<©<¸aÔ@À:ÑMˆàˆrD   c                 ó~  — | j                   dk7  rt        d«      ‚t        t        | j                  «      «      d   }t        || j
                  z
  |z  «      }t        || j
                  z
  |z  «      }t        j                  |«      t        j                  |«      z
  }t        j                  | j                  |«      }|S )a´  
        Computes the integral of a 1D pdf between two bounds.

        Parameters
        ----------
        low : scalar
            Lower bound of integration.
        high : scalar
            Upper bound of integration.

        Returns
        -------
        value : scalar
            The result of the integral.

        Raises
        ------
        ValueError
            If the KDE is over more than one dimension.

        r   z'integrate_box_1d() only handles 1D pdfsr   )r%   r#   r   r   r;   r!   r   Úndtrr-   r.   r*   )r2   ÚlowÚhighÚstdevÚnormalized_lowÚnormalized_highÚdeltaÚvalues           r5   Úintegrate_box_1dzgaussian_kde.integrate_box_1d\  s˜   € ð, �6‰6�QŠ;ÜÐFÓGÐGä”d˜4Ÿ?™?Ó+Ó,¨QÑ/ˆä  d§l¡lÑ 2°eÑ;Ó<ˆÜ ¨¯©Ñ!4¸Ñ =Ó>ˆä—‘˜_Ó-´·±¸^Ó0LÑLˆÜ—	‘	˜$Ÿ,™,¨Ó.ˆØˆrD   )Úrngc                óò   — || j                   j                  z
  || j                   j                  z
  }}t        j                  ||| j                  ||¬«      }t        j                  || j                  d¬«      S )aF  Computes the integral of a pdf over a rectangular interval.

        Parameters
        ----------
        low_bounds : array_like
            A 1-D array containing the lower bounds of integration.
        high_bounds : array_like
            A 1-D array containing the upper bounds of integration.
        maxpts : int, optional
            The maximum number of points to use for integration.
        rng : `numpy.random.Generator`, optional
            Pseudorandom number generator state. When `rng` is None, a new
            generator is created using entropy from the operating system. Types
            other than `numpy.random.Generator` are passed to
            `numpy.random.default_rng` to instantiate a ``Generator``.

        Returns
        -------
        value : scalar
            The result of the integral.

        )Úlower_limitr   Úmaxptsra   éÿÿÿÿrH   )r!   r<   r   Úcdfr;   r-   r.   r*   )r2   Ú
low_boundsÚhigh_boundsrd   ra   rY   rZ   Úvaluess           r5   Úintegrate_boxzgaussian_kde.integrate_box~  s`   € ð.  §¡§¡Ñ/°¸t¿|¹|¿~¹~Ñ1MˆTˆÜ$×(Ñ(Ø˜c t§¡¸vØô
ˆô �y‰y˜ §¡°BÔ7Ð7rD   c                 ó   — |j                   | j                   k7  rt        d«      ‚|j                  | j                  k  r|}| }n| }|}|j                  |j                  z   }t	        j
                  |«      }d}t        |j                  «      D ]™  }|j                  dd…|t        f   }|j                  |z
  }	t	        j                  ||	«      }
t        j                  |	|
d¬«      dz  }|t        j                  t        | «      |j                  d¬«      |j                  |   z  z  }Œ› t        j                  t        j                  |d   «      «      }t!        dt"        z  |j$                  d   dz  «      |z  }||z  }|S )aŸ  
        Computes the integral of the product of this  kernel density estimate
        with another.

        Parameters
        ----------
        other : gaussian_kde instance
            The other kde.

        Returns
        -------
        value : scalar
            The result of the integral.

        Raises
        ------
        ValueError
            If the KDEs have different dimensionality.

        z$KDEs are not the same dimensionalityg        Nr   rH   rG   rF   )r%   r#   r&   r;   r   rJ   Úranger!   r   rK   r-   r.   r   r*   rL   rM   r   r   r$   )r2   ÚotherÚsmallÚlargerO   rP   rB   ÚirN   rQ   rR   rU   rS   rT   s                 r5   Úintegrate_kdezgaussian_kde.integrate_kdeœ  sT  € ð* �7‰7�d—f‘fÒÜÐCÓDÐDð �7‰7�T—V‘VÒØˆEØ‰EàˆEØˆEà×"Ñ" U×%5Ñ%5Ñ5ˆÜ×(Ñ(¨Ó1ˆØˆÜ�u—w‘w“ò 	XˆAØ—=‘=¢ A¤w Ñ/ˆDØ—=‘= 4Ñ'ˆDÜ×$Ñ$ \°4Ó8ˆEä—y‘y  u°1Ô5¸Ñ;ˆHØ”b—i‘i¤ X I£°·±ÀAÔFÀuÇ}Á}ÐUVÑGWÑWÑW‰Fð	Xô —7‘7œ2Ÿ;™; |°A¡Ó7Ó8ˆÜ˜1œr™6 7§=¡=°Ñ#3°cÑ#9Ó:¸XÑEˆ
à�*ÑˆàˆrD   c                 óF  — |€t        | j                  «      }t        |«      }t        |j	                  t        | j                  ft        «      | j                  |¬«      «      }|j                  | j                  || j                  ¬«      }| j                  dd…|f   }||z   S )aA  Randomly sample a dataset from the estimated pdf.

        Parameters
        ----------
        size : int, optional
            The number of samples to draw.  If not provided, then the size is
            the same as the effective number of samples in the underlying
            dataset.
        seed : {None, int, `numpy.random.Generator`, `numpy.random.RandomState`}, optional
            If `seed` is None (or `np.random`), the `numpy.random.RandomState`
            singleton is used.
            If `seed` is an int, a new ``RandomState`` instance is used,
            seeded with `seed`.
            If `seed` is already a ``Generator`` or ``RandomState`` instance then
            that instance is used.

        Returns
        -------
        resample : (self.d, `size`) ndarray
            The sampled dataset.

        N)r"   )r"   Úp)ÚintÚneffr   r   r   r
   r%   r(   r;   Úchoicer&   r*   r!   )r2   r"   ÚseedÚrandom_stateÚnormÚindicesÚmeanss          r5   Úresamplezgaussian_kde.resampleÎ  s‘   € ð. ˆ<Ü�t—y‘y“>ˆDä)¨$Ó/ˆÜ˜×9Ñ9Ü�4—6‘6�)œUÓ# T§_¡_¸4ð :ó 
ó ˆð ×%Ñ% d§f¡f°4¸4¿<¹<Ð%ÓHˆØ—‘šQ ˜ZÑ(ˆà�t‰|ÐrD   c                 óN   — t        | j                  d| j                  dz   z  «      S )zoCompute Scott's factor.

        Returns
        -------
        s : float
            Scott's factor.
        ç      ð¿é   ©r   ru   r%   ©r2   s    r5   Úscotts_factorzgaussian_kde.scotts_factorñ  s!   € ô �T—Y‘Y  T§V¡V¨A¡X¡Ó/Ð/rD   c                 ót   — t        | j                  | j                  dz   z  dz  d| j                  dz   z  «      S )z{Compute the Silverman factor.

        Returns
        -------
        s : float
            The silverman factor.
        rG   g      @r~   r   r€   r�   s    r5   Úsilverman_factorzgaussian_kde.silverman_factorû  s3   € ô �T—Y‘Y §¡ s¡
Ñ+¨CÑ/°°d·f±f¸Q±h±Ó@Ð@rD   a4  Computes the bandwidth factor `factor`.
        The default is `scotts_factor`.  A subclass can overwrite this
        method to provide a different method, or set it through a call to
        `set_bandwidth`.

        Returns
        -------
        factor : float
            The bandwidth factor.
        c                 óL  ‡ ‡— ‰€n�‰dk(  r‰ j                   ‰ _        nx‰dk(  r‰ j                  ‰ _        nat        j                  ‰«      r"t        ‰t        «      sd‰ _        ˆfd„‰ _        n*t        ‰«      r‰‰ _        ˆ fd„‰ _        nd}t        |«      ‚‰ j                  «        y)aJ  Compute the bandwidth factor with given method.

        The new bandwidth calculated after a call to `set_bandwidth` is used
        for subsequent evaluations of the estimated density.

        Parameters
        ----------
        bw_method : str, scalar or callable, optional
            The method used to calculate the bandwidth factor.  This can be
            'scott', 'silverman', a scalar constant or a callable.  If a
            scalar, this will be used directly as `factor`.  If a callable,
            it should take a `gaussian_kde` instance as only parameter and
            return a scalar.  If None (default), nothing happens; the current
            `covariance_factor` method is kept.

        Notes
        -----
        .. versionadded:: 0.11

        Examples
        --------
        >>> import numpy as np
        >>> import scipy.stats as stats
        >>> x1 = np.array([-7, -5, 1, 4, 5.])
        >>> kde = stats.gaussian_kde(x1)
        >>> xs = np.linspace(-10, 10, num=50)
        >>> y1 = kde(xs)
        >>> kde.set_bandwidth(bw_method='silverman')
        >>> y2 = kde(xs)
        >>> kde.set_bandwidth(bw_method=kde.factor / 3.)
        >>> y3 = kde(xs)

        >>> import matplotlib.pyplot as plt
        >>> fig, ax = plt.subplots()
        >>> ax.plot(x1, np.full(x1.shape, 1 / (4. * x1.size)), 'bo',
        ...         label='Data points (rescaled)')
        >>> ax.plot(xs, y1, label='Scott (default)')
        >>> ax.plot(xs, y2, label='Silverman')
        >>> ax.plot(xs, y3, label='Const (1/3 * Silverman)')
        >>> ax.legend()
        >>> plt.show()

        NÚscottÚ	silvermanzuse constantc                  ó   •— ‰ S ©N© r   s   €r5   ú<lambda>z,gaussian_kde.set_bandwidth.<locals>.<lambda>F  s   ø€ ¨Y€ rD   c                  ó&   •— ‰ j                  ‰ «      S r‰   )Ú
_bw_methodr�   s   €r5   r‹   z,gaussian_kde.set_bandwidth.<locals>.<lambda>I  s   ø€ ¨T¯_©_¸TÓ-B€ rD   zC`bw_method` should be 'scott', 'silverman', a scalar or a callable.)r‚   Úcovariance_factorr„   r-   ÚisscalarÚ
isinstanceÚstrr�   Úcallabler#   Ú_compute_covariance)r2   r    r3   s   `` r5   r0   zgaussian_kde.set_bandwidth  s“   ù€ ðX ÐØØ˜'Ò!Ø%)×%7Ñ%7ˆDÕ"Ø˜+Ò%Ø%)×%:Ñ%:ˆDÕ"Ü�[‰[˜Ô#¬J°yÄ#Ô,FØ,ˆDŒOÛ%6ˆDÕ"Ü�iÔ Ø'ˆDŒOÛ%BˆDÕ"ð#ˆCä˜S“/Ð!à× Ñ Õ"rD   c           
      óv  — | j                  «       | _        t        | d«      sWt        t	        | j
                  dd| j                  ¬«      «      | _        t        j                  | j                  d¬«      | _
        | j                  | j                  dz  z  | _        | j                  | j                  z  j                  t        j                  «      | _        dt        j                   t        j"                  | j                  t        j$                  dt&        z  «      z  «      «      j)                  «       z  | _        y)	zcComputes the covariance matrix for each Gaussian kernel using
        covariance_factor().
        Ú_data_cho_covr   F©ÚrowvarÚbiasÚaweightsT)ÚlowerrF   N)rŽ   ÚfactorÚhasattrr   r   r!   r*   Ú_data_covariancer   Úcholeskyr•   r;   r'   r-   Úfloat64r=   ÚlogÚdiagr   r   r   Úlog_detr�   s    r5   r“   z gaussian_kde._compute_covarianceQ  sé   € ð ×,Ñ,Ó.ˆŒä�t˜_Ô-Ü$.¬s°4·<±<ÈØ49Ø8<¿¹ô0Fó %GˆDÔ!ô "(§¡°×1FÑ1FØ7;ô"=ˆDÔð ×/Ñ/°$·+±+¸q±.Ñ@ˆŒØ×*Ñ*¨T¯[©[Ñ8×@Ñ@ÄÇÁÓLˆŒØœŸ™¤§¡¨¯©Ü*,¯'©'°!´B±$«-ñ)8ó !9ó :ß:=¹#»%ñ@ˆ�rD   c                 óì   — | j                  «       | _        t        t        | j                  dd| j
                  ¬«      «      | _        t        j                  | j                  «      | j                  dz  z  S )Nr   Fr–   rF   )	rŽ   r›   r   r   r!   r*   r�   r   Úinvr�   s    r5   Úinv_covzgaussian_kde.inv_covc  s]   € ð ×,Ñ,Ó.ˆŒÜ *¬3¨t¯|©|ÀAØ05ÀÇÁô,Nó !OˆÔä�z‰z˜$×/Ñ/Ó0°4·;±;À±>ÑAÐArD   c                 ó$   — | j                  |«      S )a£  
        Evaluate the estimated pdf on a provided set of points.

        Parameters
        ----------
        x : array_like
            Points at which to evaluate the pdf.

        Returns
        -------
        pdf : ndarray
            The pdf evaluated at `x`.

        Notes
        -----
        This is an alias for `gaussian_kde.evaluate`.  See the ``evaluate``
        docstring for more details.

        )rC   )r2   Úxs     r5   Úpdfzgaussian_kde.pdfo  s   € ð( �}‰}˜QÓÐrD   c                 óÆ  — t        |«      }|j                  \  }}|| j                  k7  rL|dk(  r*|| j                  k(  rt        || j                  df«      }d}nd|› d| j                  › �}t	        |«      ‚t        | j                  |«      \  }}t        |   | j                  j                  | j                  dd…df   |j                  | j                  |«      }|dd…df   S )a+  
        Evaluate the log of the estimated pdf on a provided set of points.

        Parameters
        ----------
        x : array_like
            Points at which to evaluate the log-pdf.

        Returns
        -------
        logpdf : ndarray
            The log-pdf evaluated at `x`.
        r   r8   r9   Nr   )r   r$   r%   r	   r#   r:   r;   r   r!   r<   r*   r=   )	r2   r§   r>   r%   r?   r3   r@   rA   rB   s	            r5   Úlogpdfzgaussian_kde.logpdf…  sÒ   € ô ˜A“ˆà�|‰|‰ˆˆ1Ø�—‘Š;Ø�AŠv˜!˜tŸv™vš+ä  ¨$¯&©&°!¨Ó5�Ø‘à/°¨sð 30Ø04·±¨xð9�ä  “oÐ%ä.¨t¯©ÀÓGÑˆ�dÜ-¨dÑ3Ø�L‰L�N‰N˜DŸL™Lª¨D¨Ñ1Ø�H‰H�d—l‘l Ló2ˆð ’a˜�d‰|ÐrD   c                 óX  — t        j                  |«      }t        j                  |j                  t         j                  «      sd}t        |«      ‚t        | j                  «      }|j                  «       }|||dk     z   ||dk  <   t        t        j                  |«      «      t        |«      k7  rd}t        |«      ‚|dk  ||k\  z  }t        j                  |«      rd||   › d|› d�}t        |«      ‚| j                  |   }| j                  }t        || j                  «       |¬«      S )a*  Return a marginal KDE distribution.

        Parameters
        ----------
        dimensions : int or 1-d array_like
            The dimensions of the multivariate distribution corresponding
            with the marginal variables, that is, the indices of the dimensions
            that are being retained. The other dimensions are marginalized out.

        Returns
        -------
        marginal_kde : gaussian_kde
            An object representing the marginal distribution.

        Notes
        -----
        .. versionadded:: 1.10.0

        zaElements of `dimensions` must be integers - the indices of the marginal variables being retained.r   z,All elements of `dimensions` must be unique.zDimensions z# are invalid for a distribution in z dimensions.)r    r*   )r-   r   Ú
issubdtypeÚdtypeÚintegerr#   r,   r!   ÚcopyÚuniqueÚanyr*   r   rŽ   )	r2   Ú
dimensionsÚdimsr3   r&   Úoriginal_dimsÚ	i_invalidr!   r*   s	            r5   Úmarginalzgaussian_kde.marginal§  s  € ô* �}‰}˜ZÓ(ˆä�}‰}˜TŸZ™Z¬¯©Ô4ð?ˆCä˜S“/Ð!ä�—‘ÓˆØŸ	™	›ˆà˜T $¨¡(™^Ñ+ˆˆT�A‰X‰äŒr�y‰y˜‹Ó¤3 t£9Ò,ØAˆCÜ˜S“/Ð!à˜A‘X $¨!¡)Ñ,ˆ	Ü�6‰6�)ÔØ  ¨yÑ!9Ð :ð ;,Ø,-¨3¨lð<ˆCä˜S“/Ð!à—,‘,˜tÑ$ˆØ—,‘,ˆä˜G¨t×/EÑ/EÓ/GØ$+ô-ð 	-rD   c                 ó    — 	 | j                   S # t        $ r6 t        | j                  «      | j                  z  | _         | j                   cY S w xY wr‰   )r)   ÚAttributeErrorr   r&   r�   s    r5   r*   zgaussian_kde.weightsØ  sB   € ð	!Ø—=‘=Ð øÜò 	!Ü  §¡›L¨¯©Ñ/ˆDŒMØ—=‘=Ò ð	!ús   ‚ Ž<AÁAc                 ó¶   — 	 | j                   S # t        $ rA dt        j                  | j                  | j                  «      z  | _         | j                   cY S w xY w)Nr   )r/   r¸   r-   r.   r*   r�   s    r5   ru   zgaussian_kde.neffà  sI   € ð	Ø—:‘:ÐøÜò 	Øœ2Ÿ9™9 T§\¡\°4·<±<Ó@Ñ@ˆDŒJØ—:‘:Òð	ús   ‚ ŽAAÁA)NNr‰   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r   Ú__annotations__r6   rC   Ú__call__rV   r`   rj   rq   r|   r‚   r„   rŽ   r0   r“   Úpropertyr¥   r¨   rª   r¶   r*   ru   rŠ   rD   r5   r   r   &   sË   … ñkñ\ &1°Ó%>Ð�{Ó>ó$1òL&ðP €Hò3òj ðD8Èô 8ò<0ód!òF0òAð &Ðð	!ÐÔó=#ò~@ð$ ñ	Bó ð	Bò ò, òD/-ðb ñ!ó ð!ð ñó ñrD   c                 óÌ   — t        j                  | |«      }t        j                  |«      j                  }|dk(  rd}||fS |dk(  rd}||fS |dv rd}||fS t	        |› d|› �«      ‚)zÒ
    Calculates the output dtype and the "spec" (=C type name).

    This was necessary in order to deal with the fused types in the Cython
    routine `gaussian_kernel_estimate`. See gh-10824 for details.
    r   r(   é   Údouble)é   é   zlong doublez has unexpected item size: )r-   Úcommon_typer­   Úitemsizer#   )r;   r>   r@   rÈ   rA   s        r5   r:   r:   é  s–   € ô —>‘> *¨fÓ5€LÜ�x‰x˜Ó%×.Ñ.€HØ�1‚}Øˆð ˜ÐÐð 
�QŠØˆð ˜ÐÐð 
�XÑ	Øˆð ˜ÐÐô	 Ø�.Ð ;¸H¸:ÐFóð 	rD   )!Útypesr   Úscipyr   r   Úscipy._lib._utilr   Únumpyr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r-   Ú_statsr   r   Ú_multivariater   Ú__all__r   r:   rŠ   rD   r5   ú<module>rÐ      sS   ðõ( ÷ "Ý /÷÷ ÷ ÷ ó ó ÷ KÝ .àÐ
€÷@ñ @óFrD   