a
    /'aD@                     @   sx  d dl mZ d dlZd dlmZmZmZmZm	Z	 d dl
Z
d dl
mZ dd Zdd Ze
jjd	d
 Ze
jjdd Zdd Zdd ZG dd dejZG dd dejZG dd dejZG dd dejZdd Zdd Zdd Zdd  Zg d!Ze
jd"ed#d$g e
jd%ee
jd&ee
jd'ed(d) Z d*d+ Z!d,d- Z"e
jj#d.d/ Z$d0d1 Z%d2d3 Z&d4d5 Z'dS )6    )statsN)assert_almost_equalassert_assert_array_almost_equalassert_array_almost_equal_nulpassert_allclose)raisesc                  C   sH  t jd d} t j| }| }|jdd}t|}t ddd}|	|}tj
j|||d}|d |d	  }tt || d
 | dk  ||t j}	|t j |}
t|	ddd t|
ddd t||t j|	dd t|t j ||
dd t|||d
  | d
d t|||d
 ||  | d
d d S )N      )Zddof     ZlocZscaler      {Gz?      ?Zdecimal   )nprandomseedrandnmeanZstdr   gaussian_kdelinspaceevaluatenormpdfr   sumintegrate_box_1dinfr   integrate_boxintegrate_kdeintegrate_gaussian)n_basesamplexnxnmeanxnstdgkdexskdepdfnormpdf	intervallprob1prob2 r0   <lib/python3.9/site-packages/scipy/stats/tests/test_kdeoth.pytest_kde_1d	   s.    


r2   c                  C   sn  t jd d} t j| }t j| }t j||d}t t j|| d |d}tj||d}t 	ddd}|
|}tjj|||d}|d	 |d
  }	tt || d |	 dk  ||t j}
|t j |}t|
dd	d t|dd	d t||t j|
dd t|t j ||dd t|||d  |	 dd t|||d ||  |	 dd d S )Nr	   r
   weightsr   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   randZaveragesqrtr   r   r   r   r   r   r   r   r    r!   r   r"   r#   r$   )r%   r&   wnr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r0   r1   test_kde_1d_weighted(   s0    

r8   c                  C   s  t jd d} t ddg}t ddgddgg}t jj||| dj}t|}t jdd	d
dd	d
f \}}t 	|
 |
 g}||}|dd}tjjt ||g||d}	|
 d |
 d  }
tt ||	 d |
d  dk  d}d}|||d g||g}|||g||d g}t|ddd t|ddd t|||d  |
d  dd t|||||	  |
d  dd d S )Nr	   r
         ?      @       @      @sizer   r                @@r   Zcovr   r   r   r   }Ô%I}Ô%ITr   r   )r   r   r   arraymultivariate_normalTr   r   mgridvstackravelr   reshaper   dstackr   r   r"   r   r#   r$   )r%   r   
covariancer&   r)   xygrid_coordsr+   r,   r-   smalllarger.   r/   r0   r0   r1   test_kde_2dH   s2    

"
rQ   c                  C   s  t jd d} t ddg}t ddgddgg}t jj||| dj}t j| }tj||d}t j	d	d
dd	d
df \}}t 
| | g}||}	|	dd}	tjjt ||g||d}
| d | d  }tt |	|
 d |d  dk  d}d}|||d g||g}|||g||d g}t|ddd t|ddd t|||	d  |d  dd t||||	|
  |d  dd d S )Nr	   r
   r9   r:   r;   r<   r=   r3   r   r   r?   r@   r   r   r   r   rA   rB   r   r   )r   r   r   rC   rD   rE   r5   r   r   rF   rG   rH   r   rI   r   rJ   r   r   r"   r   r#   r$   )r%   r   rK   r&   r7   r)   rL   rM   rN   r+   r,   r-   rO   rP   r.   r/   r0   r0   r1   test_kde_2d_weightedo   s4    
"
rR   c            
      C   s   dd } t jd d}t j|}t|}tj|| d}tj||jd}t ddd}||}||}t	|| ||}	t	||	 t
ttj|d	d d S )
Nc                 S   s   t | jd| jd  S z*Same as default, just check that it works.g         )r   powerndZkde_objr0   r0   r1   scotts_factor   s    z0test_kde_bandwidth_method.<locals>.scotts_factorr	   2   	bw_methodr   r   3   wrongstringr   r   r   r   r   r   factorr   r   r   assert_raises
ValueError
rY   r%   r&   r)   Zgkde2Zgkde3r*   r+   Zkdepdf2Zkdepdf3r0   r0   r1   test_kde_bandwidth_method   s    





rd   c            
      C   s   dd } t jd d}t j|}t|}tj|| d}tj||jd}t ddd}||}||}t	|| ||}	t	||	 t
ttj|d	d d S )
Nc                 S   s   t | jd| jd  S rS   )r   rU   ZneffrW   rX   r0   r0   r1   rY      s    z9test_kde_bandwidth_method_weighted.<locals>.scotts_factorr	   rZ   r[   r   r   r]   r^   r_   rc   r0   r0   r1   "test_kde_bandwidth_method_weighted   s    





re   c                   @   s   e Zd Zdd ZdS )_kde_subclass1c                 C   s0   t || _| jj\| _| _| j| _|   d S N)	r   Z
atleast_2ddatasetshaperW   rV   rY   covariance_factor_compute_covarianceselfrh   r0   r0   r1   __init__   s    z_kde_subclass1.__init__N)__name__
__module____qualname__rn   r0   r0   r0   r1   rf      s   rf   c                       s   e Zd Z fddZ  ZS )_kde_subclass2c                    s   | j | _t | d S rg   )rY   rj   superrn   rl   	__class__r0   r1   rn      s    z_kde_subclass2.__init__)ro   rp   rq   rn   __classcell__r0   r0   rt   r1   rr      s   rr   c                   @   s   e Zd Zdd Zdd ZdS )_kde_subclass3c                 C   s   || _ tj| | d S rg   )rK   r   r   rn   )rm   rh   rK   r0   r0   r1   rn      s    z_kde_subclass3.__init__c                 C   s4   t j| j| _t t jdt j | j | _d S )Nr   )	r   ZlinalginvrK   Zinv_covr6   ZdetZpiZ_norm_factorrm   r0   r0   r1   rk      s    z"_kde_subclass3._compute_covarianceN)ro   rp   rq   rn   rk   r0   r0   r0   r1   rw      s   rw   c                   @   s   e Zd Zdd ZdS )_kde_subclass4c                 C   s   d|    S )Nr   )silverman_factorry   r0   r0   r1   rj      s    z _kde_subclass4.covariance_factorN)ro   rp   rq   rj   r0   r0   r0   r1   rz      s   rz   c                     s   t jg dtd} t jdddd}t|   |}t| }||}t||dd t| }||}t||dd t	|  j
}||}t||dd t| }	|	| }
g d}t||
d	d
  } fdd|_|  ||}t||dd d S )Nr   r   rT      dtype
   rZ   ZnumZnulp)gn,?gǻe??gW[3?ga )?gKd8;?   r   c                      s    j S rg   )r`   r0   kder0   r1   <lambda>      z/test_gaussian_kde_subclassing.<locals>.<lambda>)r   rC   floatr   r   r   rf   r   rr   rw   rK   rz   r   rj   rk   )x1r*   ZysZkde1y1kde2y2Zkde3Zy3Zkde4Zy4
y_expectedZkde5Zy5r0   r   r1   test_gaussian_kde_subclassing   s,    
r   c                  C   sf   t jg dtd} t jdddd}g d}t| }|jdd	 |jd
d	 ||}t||dd d S )Nr|   r   r   r   r~   r   )g>L\9?gp4=?gH꟫?g8(H	MT?gĲCR?r   r[   scottr   r   )r   rC   r   r   r   r   Zset_bandwidthr   )r   r*   r   r   r   r0   r0   r1   $test_gaussian_kde_covariance_caching  s    
r   c                  C   sl   t jg dtd} t jdddd}t| }|j|_|  ||}tj| dd}||}t	||dd	 d
S )zUgly, but people may rely on this.  See scipy pull request 123,
    specifically the linked ML thread "Width of the Gaussian in stats.kde".
    If it is necessary to break this later on, that is to be discussed on ML.
    r|   r   r   r   rZ   r   	silvermanr[   r   N)
r   rC   r   r   r   r   r{   rj   rk   r   )r   r*   r   r   r   r   r0   r0   r1   test_gaussian_kde_monkeypatch"  s    
r   c                  C   s2   t d} t| }g d}t|| |dd dS )zRegression test for #1181.r~   )B\A?筱ES?g
f?r   r   r   r   N)r   aranger   r   r   )r   r   r   r0   r0   r1   test_kde_integer_input7  s    

r   )Zfloat32float64Zfloat96Zfloat128Zint32Zint64bw_typer   r   weights_typedataset_type
point_typec           
      C   s   t t| d } t t|d }t t|d }|dv r2|}nt t|d }|rJ|dnd }tdd | |||fD rpt  tjd|d}tjd|d}tjj|||d}tjd| d}||}	|	j	t
||t||jksJ d S )N)r   r      c                 s   s   | ]}|d u V  qd S rg   r0   ).0Zdtr0   r0   r1   	<genexpr>Q  r   z(test_kde_output_dtype.<locals>.<genexpr>r~   r   )r\   r4   )getattrr   anypytestskipr   r   r   r   r   Zresult_typer   r`   )
r   r   r   r   Zbwr4   rh   kZpointsresultr0   r0   r1   test_kde_output_dtypeA  s"    r   c                  C   s   t jd d} t j| }t|}t ddd}||}||}t	||dd t 
|}||}t	||dd t|}t 
||}||}t	||dd d S )Nr   rZ         r   )r   r   r   r   r   r   r   r   r   r   loglogpdf)r%   r&   r)   r*   r   pdf2r   logpdf2r0   r0   r1   test_pdf_logpdf^  s    






r   c            	      C   s   t jd d} t j| }t j| }tj||d}t ddd}||}|	|}t
||dd t |}||}t
||dd tj|t jt|d}t ||}||}t
||dd d S )Nr   rZ   r3   r   r   r   r   )r   r   r   r   r5   r   r   r   r   r   r   r   r   len)	r%   r&   r7   r)   r*   r   r   r   r   r0   r0   r1   test_pdf_logpdf_weightedv  s     




r   c                     s   t jd d} d t  fddtd| D }t|}|t d| }t j	
t |d d t j	
t |d d d S )Nr   i	  i  c                    s   g | ]}t j | qS r0   )r   r   r   )r   rV   Z	n_samplesr0   r1   
<listcomp>  r   z(test_logpdf_overflow.<locals>.<listcomp>r   F)r   r   r   rC   ranger   r   r   r   ZtestingZassert_equalZisneginfZisnan)Zn_dimensionsr&   r)   r   r0   r   r1   test_logpdf_overflow  s    

r   c                  C   s`   t jd t jjdd} t jjg d| jd}| }tjt 	| |d t
||ddd d S )N90  d   r=   )r9   g      $@r   r3   +=atolZrtol)r   r   r   Z	lognormalZchoicer>   copyr   r   Zlog10r   )Zvalsr4   Zorig_weightsr0   r0   r1   test_weights_intact  s    r   c                  C   sf   t jd g d} g d}tj| |d}tj| t |d}g d}t||||ddd d S )Nr   )g?g      +@g      5@g     R@g     X@)r   r   rT         r3   )g333333?   X   r   r   )r   r   r   r   r   r   r   r   )valuesr4   Zpdf_iZpdf_fr&   r0   r0   r1   test_weights_integer  s    
r   c                  C   s   dd } t jd d}t j|}t j|}t|}| | tj||d}| | t ddg}t ddgdd	gg}t jj|||d
j	}t|}	| |	 tj||d}
| |
 d S )Nc                 S   s   d}|  |}|  |}ttt||dd d}| j ||d}| j ||d}t||dd tjjdd}| j ||d}tjjdd}| j ||d}t||dd ttjdrtjd}| j ||d d S )	N   gvIh%<=)r   i?  )r      default_rngi  )	Zresamplera   AssertionErrorr   r   r   ZRandomStatehasattrr   )Z
gkde_trailZn_sampleZsamp1Zsamp2r   Zrstate1Zrstate2rngr0   r0   r1   test_seed_sub  s$    


z test_seed.<locals>.test_seed_subr	   r
   r3   r9   r:   r;   r<   r=   )
r   r   r   r5   r   r   r   rC   rD   rE   )r   r%   r7   Zxn_1dZgkde_1dZgkde_1d_weightedr   rK   Zxn_2dZgkde_2dZgkde_2d_weightedr0   r0   r1   	test_seed  s     

r   )(Zscipyr   Znumpyr   Znumpy.testingr   r   r   r   r   r   r   ra   r2   r8   ZmarkZslowrQ   rR   rd   re   r   rf   rr   rw   rz   r   r   r   r   Z_ftypesZparametrizer   r   r   Zxslowr   r   r   r   r0   r0   r0   r1   <module>   sB    
&
'
&
