
    Vpf'                        d dl mZ d dlmZ d dlmZ d dlZd dlmZ	 d dl
mZmZmZmZ d dlmZmZ d dlmZ d dlmZmZ e ed	d
           G d d                                  Zd Z eed           d             ZdS )    )	dataclass)partial)AnyN)jitlaxrandomvmap)check_arraylikepromote_dtypes_inexact)register_pytree_node_class)linalgspecialTF)frozeninitc                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ddZd	 Zd
 Ze	d             Z
ed             Zed             Zd Zd Zd Zd Zd ZddZd Zd ZddZddZd ZdS )gaussian_kdea  Gaussian Kernel Density Estimator

  JAX implementation of :class:`scipy.stats.gaussian_kde`.

  Parameters:
    dataset: arraylike, real-valued. Data from which to estimate the distribution.
      If 1D, shape is (n_data,). If 2D, shape is (n_dimensions, n_data).
    bw_method: string, scalar, or callable. Either "scott", "silverman", a scalar
      value, or a callable function which takes ``self`` as a parameter.
    weights: arraylike, optional. Weights of the same shape as the dataset.
  neffdatasetweights
covarianceinv_covNc                    t          d|           t          j        |          }t          j        t	          j        |          t          j                  rt          d          |j        dk    st          d          |j
        \  }}|t          d|           t          ||          \  }}t          j        |          }|t          j        |          z  }|j        dk    rt          d          t          |          |k    rt          d          n0t          |          \  }t          j        |d|z  |j                  }|                     d	|           |                     d
|           |                     ddt          j        |dz            z            }|dn|}|dk    rt          j        |d|dz   z            }n|dk    r%t          j        ||dz   z  dz  d|dz   z            }nVt          j        |          rt)          |t*                    s|}n*t-          |          r ||           }nt          d          t          j        t          j        |dd|                    }t          j                            |          }	||dz  z  }
|	|dz  z  }|                     d|
           |                     d|           d S )Nr   z*gaussian_kde does not support complex data   z.`dataset` input should have multiple elements.z*`weights` input should be one-dimensional.z%`weights` input should be of length n      ?)dtyper   r   r      scottg         	silvermang      @zD`bw_method` should be 'scott', 'silverman', a scalar, or a callable.F)rowvarbiasaweightsr   r   )r
   jnp
atleast_2d
issubdtyper   r   complexfloatingNotImplementedErrorsize
ValueErrorshaper   
atleast_1dsumndimlenfull_setattrpowerisscalar
isinstancestrcallablecovr   inv)selfr   	bw_methodr   dnr   factordata_covariancedata_inv_covr   r   s               X/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/scipy/stats/kde.py__init__zgaussian_kde.__init__0   s   NG,,,nW%%G
~ci((#*=>> N LMMM<!GHHH=DAqng.../AAgww''g!!!g			EFFF	W		@AAA 
 (00hgC!G7=999gMM)W%%%MM)W%%%==SWWaZ%8%8!899D$,)IGysa!e}--ff	k	!	!yQ#-sa!e}==ff	i	 	  Is)C)C ff	)		 yff
P   n@@@B BO:>>/22L 619,JVQY&GMM,
+++MM)W%%%%%    c                 >    t                               | ||           |S N)object__setattr__)r8   namevalues      r?   r0   zgaussian_kde._setattr`   s!     tT5)))LrA   c                 F    | j         | j        | j        | j        | j        fd fS rC   )r   r   r   r   r   r8   s    r?   tree_flattenzgaussian_kde.tree_flattenf   s*    YdlDO\ " "rA   c                 J   ~|                      |           }|                    d|d                    |                    d|d                    |                    d|d                    |                    d|d                    |                    d	|d
                    |S )Nr   r   r   r   r   r   r      r   r   )__new__r0   )clsaux_datachildrenkdes       r?   tree_unflattenzgaussian_kde.tree_unflattenj   s    
++c

CLL!%%%LLHQK(((LLHQK(((LLx{+++LLHQK(((JrA   c                 &    | j         j        d         S )Nr   r   r*   rI   s    r?   r:   zgaussian_kde.du       <a  rA   c                 &    | j         j        d         S )Nr   rT   rI   s    r?   r;   zgaussian_kde.ny   rU   rA   c                     t          d|           |                     |          }t          d| j        j        | j        dddf         |j        | j                  }|dddf         S )z.Evaluate the Gaussian KDE on the given points.evaluateFNr   r
   _reshape_points_gaussian_kernel_evalr   Tr   r   )r8   pointsresults      r?   rX   zgaussian_kde.evaluate}   sh    J'''!!&))F"5$,.$,qqq$w:O#)8T\; ;F!!!Q$<rA   c                 ,    |                      |          S rC   rX   )r8   r]   s     r?   __call__zgaussian_kde.__call__   s    ==   rA   c                 J   t          j        t          j        |                    }t          j        |          }|j        | j        fk    rt          d| j                   |j        | j        | j        fk    rt          d| j                   t          j        | j	        |z             }t          j
        dt          j        z            | j        z  t          j        t          j        |d                             z  }d|z  }t          ||| j        | j        |          S )z2Integrate the distribution weighted by a Gaussian.zmean does not have dimension z#covariance does not have dimension r   r   r   )r#   r+   squeezer$   r*   r:   r)   r   
cho_factorr   sqrtnppiproddiag_gaussian_kernel_convolver   r   )r8   meanr6   cholnorms        r?   integrate_gaussianzgaussian_kde.integrate_gaussian   s    >#+d++,,D
.

CzdfY?tv??@@@
yTVTV$$$ETVEEFFFT_s233D8AI&#(472C2C)D)DDD:D$T4t|%)+ + +rA   c                    | j         dk    rt          d          t          j        |          dk    st          j        |          dk    rt          d          t          j        t          j        | j                            }t          j        || j        z
  |z            }t          j        || j        z
  |z            }t          j        | j	        t          j        |          t          j        |          z
  z            S )z1Integrate the distribution over the given limits.r   z'integrate_box_1d() only handles 1D pdfsr   z=the limits of integration in integrate_box_1d must be scalars)r:   r)   r#   r-   rc   re   r   r   r,   r   r   ndtr)r8   lowhighsigmas       r?   integrate_box_1dzgaussian_kde.integrate_box_1d   s    v{{@AAA
x}}SXd^^q00
IK K KK1122E
+sT\)U2
3
3C;t|+u455D74<7<#5#5S8I8I#IJKKKrA   c           
      $   |j         | j         k    rt          d          t          j        | j        |j        z             }t          j        dt          j        z            | j         z  t          j	        t          j
        |d                             z  }d|z  }| j        |j        k     r| |fn|| f\  }} t          t          t          |||j        |j                  d          |j                  }t          j        ||j        z            S )z8Integrate the product of two Gaussian KDE distributions.z$KDEs are not the same dimensionalityr   r   r   r   in_axes)r:   r)   r   rd   r   r#   re   rf   rg   rh   ri   r;   r	   r   rj   r   r   r,   )r8   otherrl   rm   smlgr^   s          r?   integrate_kdezgaussian_kde.integrate_kde   s    w$&=>>>T_u/??@@D8AI&#(472C2C)D)DDD:D"fuw..dE]]UDMFBT'3T4*& &  Z) )F 76BJ&'''rA    c                 :   t          j        |          \  }}t          j        || j        || j                  }t          j        |t          j        | j        | j	        j
                  | j	        || j        j
                  j        }| j        dd|f         |z   S )aj  Randomly sample a dataset from the estimated pdf

    Args:
      key: a PRNG key used as the random key.
      shape: optional, a tuple of nonnegative integers specifying the result
        batch shape; that is, the prefix of the result shape excluding the last
        axis.

    Returns:
      The resampled dataset as an array with shape `(d,) + shape`.
    )r*   p)r*   r   N)r   splitchoicer;   r   multivariate_normalr#   zerosr:   r   r   r   r\   )r8   keyr*   ind_keyeps_keyindepss          r?   resamplezgaussian_kde.resample   s     |C((GW
-u
E
E
EC

$W%(Ytvt7L%M%M%)_+0+/<+=	? ? ? @A	 
 <3#%%rA   c                 ,    |                      |          S )zProbability density functionr`   )r8   xs     r?   pdfzgaussian_kde.pdf   s    ==rA   c                     t          d|           |                     |          }t          d| j        j        | j        dddf         |j        | j                  }|dddf         S )z Log probability density functionlogpdfTNr   rY   )r8   r   r^   s      r?   r   zgaussian_kde.logpdf   sh    Ha   QA"4aaag9N#$36 6F!!!Q$<rA   c                 &    ~~~t          d          )4This method is not implemented in the JAX interface.z>only 1D box integrations are supported; use `integrate_box_1d`r'   )r8   
low_boundshigh_boundsmaxptss       r?   integrate_boxzgaussian_kde.integrate_box   s!    K
HJ J JrA   c                 "    ~t          d          )r   z:dynamically changing the bandwidth method is not supportedr   )r8   r9   s     r?   set_bandwidthzgaussian_kde.set_bandwidth   s    
DF F FrA   c                    t          j        t          j        |          t           j                  rt          d          t          j        |          }|j        \  }}|| j        k    rV|dk    r(|| j        k    rt          j	        || j        df          }n(t          d                    || j                            |S )Nz1gaussian_kde does not support complex coordinatesr   z2points have dimension {}, dataset has dimension {})r#   r%   r   r   r&   r'   r$   r*   r:   reshaper)   format)r8   r]   r:   ms       r?   rZ   zgaussian_kde._reshape_points   s    
~ci'')<== ?
=? ? ?^F##F<DAqDF{{	
aAKKVdfa[11@GG46   	 MrA   )NN)r|   rC   )__name__
__module____qualname____doc__r   __annotations__r@   r0   rJ   classmethodrR   propertyr:   r;   rX   ra   rn   rt   r{   r   r   r   r   r   rZ   r|   rA   r?   r   r      s        
 
 	))),,,,,,///,,,.& .& .& .&`  " " "   ; ! ! 8! ! ! 8!  ! ! !+ + + 
L 
L 
L( ( (& & & &*    J J J JF F F F    rA   r   c                     ||d d d f         z
  }t          j        | |          }dt          j        ||z  d          z  }|t          j        t          j        |           |z            z  S )N      ?r   axis)r   	cho_solver#   r,   exp)rl   rm   targetr   rk   diffalphaargs           r?   rj   rj      sk    	$qqq$w-	$

4
&
&%cgdUl++++#	/00	00rA   )static_argnumsc                    	
 t          ||          \  }}j        d         }|j        d         |k    rt          d          |j        ||fk    rt          d          t          j        |d          }t          j        |          t          j        ||          }t          j        t          j        t          j	        |                              d|z  t          j        dt          j        z            z  z
  
 
fd	 rt          j        nt
          j        	fd	}t          |          } ||          S )
Nr   z)points and xi must have same trailing dimz%precision matrix must match data dimsT)lowerr   r   c                     dt          j        t          j        || z
                      z  z
  }rt          j        |          |z   S |t          j        |          z  S )Nr   )r#   r,   squarelogr   )x_testx_trainy_trainr   in_loglog_norms       r?   kernelz%_gaussian_kernel_eval.<locals>.kernel  s[    
S373:g.>#?#?@@@
@C $WW##sws||##rA   c                 R      t          d          |           d          S )N)Nr   r   rv   r   r   )r	   )r   r   r]   reducevaluess    r?   <lambda>z'_gaussian_kernel_eval.<locals>.<lambda>  s>    VV$FD$F$F$F%&%8 %8)*, , , rA   )r   r*   r)   r   choleskyr#   dotr,   r   ri   rf   rg   r   	logsumexpr	   )r   r]   r   xi	precisionr:   	whiteningreduced_kernelmapped_kernelr   r   r   s   ```      @@@r?   r[   r[      so   "8fb)#% #%&&"il1o!Xa[A
@
A
AA_A
<
=
==oit444)769%%&
wr9"WSW	hy   !AgBE	(:(::;($ $ $ $ $ $ !'37CG&, , , , , , ,. ~&&-	r		rA   )dataclassesr   	functoolsr   typingr   numpyrf   	jax.numpyr#   jaxr   r   r   r	   jax._src.numpy.utilr
   r   jax._src.tree_utilr   	jax.scipyr   r   r   rj   r[   r|   rA   r?   <module>r      s]   " ! ! ! ! !                       & & & & & & & & & & & & G G G G G G G G 9 9 9 9 9 9 % % % % % % % % 
$U###O O O O O O O $# Od1 1 1 	Q     rA   