ó
    Eñi[d  ã                   ó°   • S SK JrJr  S SKJrJr  S SKJrJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJr  S SKrSSKJrJr  SSKJr  S/r " S	 S5      rS
 rg)é    )ÚlinalgÚspecial)Úcheck_random_stateÚ	np_vecdot)Ú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                   óÊ   • \ rS rSrSrSS jrS r\rS rS r	SSS.S	 jjr
S
 rSS jrS rS r\rS\l        SS jrS r\S 5       rS rS rS r\S 5       r\S 5       rSrg)r   é$   ay  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
Nc                 ó0  • [        [        U5      5      U l        U R                  R                  S:”  d  [	        S5      eU R                  R
                  u  U l        U l        UbÆ  [        U5      R                  [        5      U l        U =R                  [        U R                  5      -  sl        U R                  R                  S:w  a  [	        S5      e[        U R                  5      U R                  :w  a  [	        S5      eS[!        U R                  U R                  5      -  U l        U R                  U R                  :”  a  Sn[	        U5      e U R%                  US9  g ! [&        R(                   a  nSn[&        R(                  " U5      UeS nAff = f)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Úlenr   Ú_neffÚset_bandwidthr   ÚLinAlgError)Úselfr!   r    r*   ÚmsgÚes         ÚM/home/mande/repo/quber/.venv/lib/python3.13/site-packages/scipy/stats/_kde.pyÚ__init__Úgaussian_kde.__init__Ñ   sB  € Ü!¤'¨'Ó"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Øœ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Å7FÆFc                 óÖ  • [        [        U5      5      nUR                  u  p#X R                  :w  aL  US:X  a)  X0R                  :X  a  [	        XR                  S45      nSnOSU SU R                   3n[        U5      e[        U R                  U5      u  pV[        U   " U R                  R                  U R                  SS2S4   UR                  U R                  U5      nUSS2S4   $ )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)r0   Úpointsr%   Úmr1   Úoutput_dtypeÚspecÚresults           r3   ÚevaluateÚgaussian_kde.evaluate÷   sÍ   € ô( œG F›OÓ,ˆà�|‰|‰ˆØ—‘‹;Ø�A‹v˜!Ÿv™v›+ä  ¯&©&°!¨Ó5�Ø‘à/°¨sð 30Ø04·±¨xð9�ä  “oÐ%ä.¨t¯©ÀÓGÑˆÜ)¨$Ò/Ø�L‰L�N‰N˜DŸL™Lª¨D¨Ñ1Ø�H‰H�d—l‘l Ló2ˆð ’a˜�d‰|Ðó    c                 óØ  • [        [        U5      5      n[        U5      nUR                  U R                  4:w  a  [        SU R                   35      eUR                  U R                  U R                  4:w  a  [        SU R                   35      eUSS2[        4   nU R                  U-   n[        R                  " U5      nU R                  U-
  n[        R                  " XE5      n[        R                  " [        R                  " US   5      5      n[        S[         -  UR                  S   S-  5      U-  n[#        XVSS9S-  n	[#        [%        U	* 5      U R&                  SS9U-  n
U
$ )aÇ  
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_solveÚnpÚprodÚdiagonalr   r   r   r   r*   )r0   Úmeanr   Úsum_covÚsum_cov_cholÚdiffÚtdiffÚsqrt_detÚ
norm_constÚenergiesrA   s              r3   Úintegrate_gaussianÚgaussian_kde.integrate_gaussian!  s3  € ô0 œ' $›-Ó(ˆÜ˜‹oˆà�:‰:˜$Ÿ&™&˜Ó"ÜÐ<¸T¿V¹V¸HÐEÓFÐFØ�9‰9˜Ÿ™ §¡Ð(Ó(ÜÐBÀ4Ç6Á6À(ÐKÓLÐLð ’A”w�JÑˆà—/‘/ CÑ'ˆô
 ×(Ò(¨Ó1ˆà�|‰|˜dÑ"ˆÜ× Ò  Ó4ˆä—7’7œ2Ÿ;š; |°A¡Ó7Ó8ˆÜ˜1œr™6 7§=¡=°Ñ#3°cÑ#9Ó:¸XÑEˆ
ä˜T¨qÑ1°CÑ7ˆÜœ3 ˜y›>¨4¯<©<¸aÑ@À:ÑMˆàˆrD   c                 ól  • U R                   S:w  a  [        S5      e[        [        U R                  5      5      S   n[        XR
                  -
  U-  5      n[        X R
                  -
  U-  5      n[        R                  " U5      [        R                  " U5      -
  n[        U R                  U5      nU$ )a4  
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*   )r0   ÚlowÚhighÚstdevÚnormalized_lowÚnormalized_highÚdeltaÚvalues           r3   Úintegrate_box_1dÚgaussian_kde.integrate_box_1dV  s�   € ð, �6‰6�Q‹;ÜÐFÓGÐGä”d˜4Ÿ?™?Ó+Ó,¨QÑ/ˆä §l¡lÑ 2°eÑ;Ó<ˆÜ ¯©Ñ!4¸Ñ =Ó>ˆä—’˜_Ó-´·²¸^Ó0LÑLˆÜ˜$Ÿ,™,¨Ó.ˆØˆrD   )Úrngc                óÊ   • XR                   R                  -
  X R                   R                  -
  pe[        R                  " XeU R                  UUS9n[        XpR                  SS9$ )a¶  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   Úmaxptsrd   éÿÿÿÿrH   )r!   r;   r   Úcdfr:   r   r*   )r0   Ú
low_boundsÚhigh_boundsrg   rd   r[   r\   Úvaluess           r3   Úintegrate_boxÚgaussian_kde.integrate_boxx  sR   € ð. §¡§¡Ñ/°¿|¹|¿~¹~Ñ1MˆTÜ$×(Ò(Ø t§¡¸vØñ
ˆô ˜§¡°BÑ7Ð7rD   c                 óÖ  • UR                   U R                   :w  a  [        S5      eUR                  U R                  :  a  UnU nOU nUnUR                  UR                  -   n[        R
                  " U5      nSn[        UR                  5       H  nUR                  SS2U[        4   nUR                  U-
  n	[        R                  " XY5      n
[        XšSS9S-  nU[        [        U* 5      UR                  SS9UR                  U   -  -  nM�     [        R                  " [        R                  " US   5      5      n[!        S["        -  UR$                  S   S-  5      U-  nXm-  nU$ )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*   rL   rM   rN   r   r   r$   )r0   ÚotherÚsmallÚlargerP   rQ   rA   ÚirO   rR   rS   rV   rT   rU   s                 r3   Úintegrate_kdeÚgaussian_kde.integrate_kde–  s?  € ð* �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–ˆAØ—=‘=¢ A¤w Ñ/ˆDØ—=‘= 4Ñ'ˆDÜ×$Ò$ \Ó8ˆEä  °1Ñ5¸Ñ;ˆHØ”i¤ X I£°·±ÀAÑFÀuÇ}Á}ÐUVÑGWÑWÑWŠFñ  ô —7’7œ2Ÿ;š; |°A¡Ó7Ó8ˆÜ˜1œr™6 7§=¡=°Ñ#3°cÑ#9Ó:¸XÑEˆ
àÑˆàˆrD   c                 ó8  • Uc  [        U R                  5      n[        U5      n[        UR	                  [        U R                  4[        5      U R                  US95      nUR                  U R                  XR                  S9nU R                  SS2U4   nXd-   $ )a±  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!   )r0   r"   ÚseedÚrandom_stateÚnormÚindicesÚmeanss          r3   ÚresampleÚgaussian_kde.resampleÈ  s�   € ð. ‰<Ü�t—y‘y“>ˆDä)¨$Ó/ˆÜ˜×9Ñ9Ü�4—6‘6�)œUÓ# T§_¡_¸4ð :ð 
ó ˆð ×%Ñ% d§f¡f°4¿<¹<Ð%ÐHˆØ—‘šQ ˜ZÑ(ˆà‰|ÐrD   c                 óN   • [        U R                  SU R                  S-   -  5      $ )zGCompute Scott's factor.

Returns
-------
s : float
    Scott's factor.
ç      ð¿é   ©r   rz   r%   ©r0   s    r3   Úscotts_factorÚgaussian_kde.scotts_factorë  s!   € ô �T—Y‘Y  T§V¡V¨A¡X¡Ó/Ð/rD   c                 ót   • [        U R                  U R                  S-   -  S-  SU R                  S-   -  5      $ )zSCompute the Silverman factor.

Returns
-------
s : float
    The silverman factor.
rG   g      @r„   r…   r†   r‡   s    r3   Úsilverman_factorÚgaussian_kde.silverman_factorõ  s3   € ô �T—Y‘Y §¡ s¡
Ñ+¨CÑ/°°d·f±f¸Q±h±Ó@Ð@rD   zÑ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`.c                 óv  ^ ^• Tc  O£TS:X  a  T R                   T l        O‹TS:X  a  T R                  T l        Os[        R                  " T5      (       a(  [        T[        5      (       d  ST l        U4S jT l        O0[        T5      (       a  TT l        U 4S jT l        OSn[        U5      eT R                  5         g)a*  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                  ó   >• T $ ©N© r   s   €r3   Ú<lambda>Ú,gaussian_kde.set_bandwidth.<locals>.<lambda>:  s   ø€ ©YrD   c                  ó&   >• T R                  T 5      $ r‘   )Ú
_bw_methodr‡   s   €r3   r“   r”   =  s   ø€ ¨T¯_©_¸TÔ-BrD   zC`bw_method` should be 'scott', 'silverman', a scalar or a callable.)rˆ   Úcovariance_factorr‹   rL   ÚisscalarÚ
isinstanceÚstrr–   Úcallabler#   Ú_compute_covariance)r0   r    r1   s   `` r3   r.   Úgaussian_kde.set_bandwidth  sœ   ù€ ðX ÑØØ˜'Ó!Ø%)×%7Ñ%7ˆDÕ"Ø˜+Ó%Ø%)×%:Ñ%:ˆDÕ"Ü�[Š[˜×#Ñ#¬J°yÄ#×,FÑ,FØ,ˆDŒOÜ%6ˆDÕ"Ü�i× Ñ Ø'ˆDŒOÜ%BˆDÕ"ð#ˆCä˜S“/Ð!à× Ñ Õ"rD   c           
      ó|  • U R                  5       U l        [        U S5      (       dR  [        [	        U R
                  SSU R                  S95      U l        [        R                  " U R                  SS9U l
        U R                  U R                  S-  -  U l        U R                  U R                  -  R                  [        R                  5      U l        S[        R                   " [        R"                  " U R                  [        R$                  " S[&        -  5      -  5      5      R)                  5       -  U l        g)	zSComputes 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'   rL   Úfloat64r<   ÚlogÚdiagr   r   r   Úlog_detr‡   s    r3   rœ   Ú gaussian_kde._compute_covarianceE  sì   € ð ×,Ñ,Ó.ˆŒä�t˜_×-Ñ-Ü$.¬s°4·<±<ÈØ49Ø8<¿¹ñ0Fó %GˆDÔ!ô "(§¢°×1FÑ1FØ7;ñ"=ˆDÔð ×/Ñ/°$·+±+¸q±.Ñ@ˆŒØ×*Ñ*¨T¯[©[Ñ8×@Ñ@ÄÇÁÓLˆŒØœŸš¤§¢¨¯©Ü*,¯'ª'°!´B±$«-ñ)8ó !9ó :ß:=¹#»%ñ@ˆ�rD   c           	      óè   • U R                  5       U l        [        [        U R                  SSU R
                  S95      U l        [        R                  " U R                  5      U R                  S-  -  $ )Nr   Fr    rF   )	r—   r¥   r   r   r!   r*   r§   r   Úinvr‡   s    r3   Úinv_covÚgaussian_kde.inv_covW  s]   € ð ×,Ñ,Ó.ˆŒÜ *¬3¨t¯|©|ÀAØ05ÀÇÁñ,Nó !OˆÔä�zŠz˜$×/Ñ/Ó0°4·;±;À±>ÑAÐArD   c                 ó$   • U R                  U5      $ )z§
Evaluate the estimated pdf on a provided set of points.

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

)rB   )r0   Úxs     r3   ÚpdfÚgaussian_kde.pdfc  s   € ð �}‰}˜QÓÐrD   c                 óÄ  • [        U5      nUR                  u  p4X0R                  :w  aL  US:X  a)  X@R                  :X  a  [        X R                  S45      nSnOSU SU R                   3n[	        U5      e[        U R                  U5      u  pg[        U   " U R                  R                  U R                  SS2S4   UR                  U R                  U5      nUSS2S4   $ )zD
Evaluate the log of the estimated pdf on a provided set of points.
r   r7   r8   Nr   )r   r$   r%   r	   r#   r9   r:   r   r!   r;   r*   r<   )	r0   r³   r=   r%   r>   r1   r?   r@   rA   s	            r3   ÚlogpdfÚgaussian_kde.logpdfo  sÈ   € ô ˜A“ˆà�|‰|‰ˆØ—‘‹;Ø�A‹v˜!Ÿv™v›+ä  ¯&©&°!¨Ó5�Ø‘à/°¨sð 30Ø04·±¨xð9�ä  “oÐ%ä.¨t¯©ÀÓGÑˆÜ-¨dÒ3Ø�L‰L�N‰N˜DŸL™Lª¨D¨Ñ1Ø�H‰H�d—l‘l Ló2ˆð ’a˜�d‰|ÐrD   c                 óf  • [         R                  " U5      n[         R                  " UR                  [         R                  5      (       d  Sn[        U5      e[        U R                  5      nUR                  5       nXBUS:     -   X"S:  '   [        [         R                  " U5      5      [        U5      :w  a  Sn[        U5      eUS:  X$:¬  -  n[         R                  " U5      (       a  SXV    SU S3n[        U5      eU R                  U   nU R                  n[        XpR                  5       US9$ )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*   )rL   r   Ú
issubdtypeÚdtypeÚintegerr#   r,   r!   ÚcopyÚuniqueÚanyr*   r   r—   )	r0   Ú
dimensionsÚdimsr1   r&   Úoriginal_dimsÚ	i_invalidr!   r*   s	            r3   ÚmarginalÚgaussian_kde.marginal‡  s  € ô* �}Š}˜ZÓ(ˆä�}Š}˜TŸZ™Z¬¯©×4Ñ4ð?ˆCä˜S“/Ð!ä�—‘ÓˆØŸ	™	›ˆà $¨¡(™^Ñ+ˆ�A‰X‰äŒr�yŠy˜‹Ó¤3 t£9Ó,ØAˆCÜ˜S“/Ð!à˜A‘X $¡)Ñ,ˆ	Ü�6Š6�)×ÑØ  Ñ!9Ð :ð ;,Ø,-¨3¨lð<ˆCä˜S“/Ð!à—,‘,˜tÑ$ˆØ—,‘,ˆä˜G×/EÑ/EÓ/GØ$+ñ-ð 	-rD   c                 ó¢   •  U R                   $ ! [         a6    [        U R                  5      U R                  -  U l         U R                   s $ f = fr‘   )r)   ÚAttributeErrorr   r&   r‡   s    r3   r*   Úgaussian_kde.weights¸  sB   € ð	!Ø—=‘=Ð øÜó 	!Ü  §¡›L¨¯©Ñ/ˆDŒMØ—=‘=Ò ð	!ús   ‚ Ž=AÁAc                 ó¤   •  U R                   $ ! [         a7    S[        U R                  U R                  5      -  U l         U R                   s $ f = f)Nr   )r-   rÇ   r   r*   r‡   s    r3   rz   Úgaussian_kde.neffÀ  sE   € ð	Ø—:‘:ÐøÜó 	Øœ9 T§\¡\°4·<±<Ó@Ñ@ˆDŒJØ—:‘:Òð	ús   ‚ Ž>AÁA)r–   rŸ   r§   r-   r)   r<   r:   r—   r%   r!   r¥   r¬   r&   )NNr‘   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r4   rB   Ú__call__rW   rb   rm   ru   r�   rˆ   r‹   r—   r.   rœ   Úpropertyr°   r´   r·   rÄ   r*   rz   Ú__static_attributes__r’   rD   r3   r   r   $   s¸   † ñkôX$1òL&ðP €Hò3òj ðD8Èö 8ò<0ôd!òF0òAð &Ðð!ÐÔô
=#ò~@ð$ ñ	Bó ð	Bò
 òò0/-ðb ñ!ó ð!ð ñó órD   c                 óÐ   • [         R                  " X5      n[         R                  " U5      R                  nUS:X  a  SnX$4$ US:X  a  SnX$4$ US;   a  SnX$4$ [	        U SU 35      e)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: )rL   Úcommon_typer»   Úitemsizer#   )r:   r=   r?   rÙ   r@   s        r3   r9   r9   É  sŽ   € ô —>’> *Ó5€LÜ�xŠx˜Ó%×.Ñ.€HØ�1ƒ}Øˆð ÐÐð 
�Q‹Øˆð ÐÐð 
�XÓ	Øˆð ÐÐô	 Ø�.Ð ;¸H¸:ÐFóð 	rD   ) Úscipyr   r   Úscipy._lib._utilr   r   Únumpyr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rL   Ú_statsr   r   Ú_multivariater   Ú__all__r   r9   r’   rD   r3   Ú<module>rà      sN   ð÷* "ß :÷÷ ÷ ÷ ó ó ÷ KÝ .àÐ
€÷b
ñ b
óJrD   