a
    ߙfbey                     @   s  d dl Z d dlZd dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ dd Zd	d
 Zdd Zdd Zdd Zdd Ze jddd Ze jddd Zdd Zdd Zdd Ze jddd Zd d! Zd"d# Zd$d% Z e j!d&d'd( Z"d)d* Z#d+d, Z$d-d. Z%d/d0 Z&d1d2 Z'd3d4 Z(d5d6 Z)e jde j*d7g d8d9d: Z+d;d< Z,e jdd=d> Z-d?d@ Z.dAdB Z/e jddCdD Z0e jddEdF Z1e jddGdH Z2e jddIdJ Z3e jde j*dKg dLdMdN Z4e jddOdP Z5e jdQdRdS Z6e jddTdU Z7e jddVdW Z8e jdXdYdZ Z9e jde j*d[g d\d]d^ Z:e jde j*d_g d`dadb Z;e jde j*d_g d`dcdd Z<e jddedf Z=e jde j*d_g d`dgdh Z>e jddidj Z?e jddkdl Z@e jde j*dmg dndodp ZAe jde j*dqe jBdrdsdte jCdudve jBdwdsdxe jCdudvdydzgd{d| ZDdS )}    N)assert_equalassert_allclose)	HAS_SCIPY
HAS_MPMATH)funcs)units)NumpyRNGContextc                     sz  t dZ tjd} t| }| d} tj| dd}t|dksJJ |j| jk sZJ tj| dd}t|dksxJ |j| jk sJ t	d	 t
 fd
dtt D ddd}t|}|dksJ tj|dd}t|g dg dg dg dg tj|dd}t|g dg dg dg tj|dd}t|g dg dg dg W d    n1 sl0    Y  d S )N90  '  )
        axisr   r   r   <   c                    s    g | ]}t  d |d  qS Nr   )sum.0ix =lib/python3.9/site-packages/astropy/stats/tests/test_funcs.py
<listcomp>       z2test_median_absolute_deviation.<locals>.<listcomp>         g     Xx@)g     @j@g     l@g     @o@g     p@g      r@)g     `s@g     t@g     u@g      w@g     `x@)g     y@g     z@g      |@g     `}@g     ~@)g     @g     @g     0@g     Ё@g     p@)g     ;@g     @@@g     B@g     @E@g     G@)g     _@g     `@g     0a@g     a@g     pb@)g     pl@g     m@g     m@g     Pn@g     n@   )g      @g       @g      *@g      2@)g      7@g      <@g     @@g      C@)g     E@g      H@g     J@g      M@)r   nprandomZrandnr   median_absolute_deviationZreshapelensizearangearrayranger   )Zrandvarmadar   r   r   test_median_absolute_deviation   s<    


*



r*   c                  C   s  t jg d} t| dks"J t jjg dg dd} t| dksLJ t| t| | j  kslJ t jjddgddggddgddggd} t|  t| dksJ t| jd	ksJ t jtj| dd
jddg t jtj| dd
jddg d S )Nr   r   r   r   )r   r   r   )r   r   r   maskr   r   r         ?r   )	r    mar&   r   r"   r-   dataZtestingZassert_array_equalr&   r   r   r   %test_median_absolute_deviation_masked1   s"    (
r2   c                  C   s`   t dddt jgddt jdgg} ttj| t jddddg t j| } t| dks\J d S )Nr   r   r   r   r   )funcr   )	r    r&   nanr   r   r"   Z	nanmedianr/   Zmasked_invalidr1   r   r   r   #test_median_absolute_deviation_nansP   s    r5   c                  C   sb   t dt jdt jg} t jj| dd}tj| dd}tj|dd}t|| t 	|d s^J dS )	z}
    Regression test to ensure ignore_nan=True gives same results for
    ndarray and masked arrays that contain +/-inf.
          ?r   Fr,   T
ignore_nanr   N)
r    r&   r4   infr/   Zmasked_arrayr   r"   r   isnan)Zdata1Zdata2mad1mad2r   r   r   *test_median_absolute_deviation_nans_maskedZ   s    
r=   c                  C   s`   t dt dd d t jt jf  } tj| dd}tj| dd}t|t d t|| d S )N)r   r   r   r   r   r   r   )r   r   )r    onesr%   Znewaxisr   r"   r   zeros)r&   r;   r<   r   r   r   ,test_median_absolute_deviation_multidim_axisj   s
    &rA   c                  C   sH   t g dtj } t| }|j| jks.J |jt| jksDJ d S )N)r      r   )r    r&   umr   r"   Zunitvalue)r)   r(   r   r   r   'test_median_absolute_deviation_quantityr   s    
rF   znot HAS_SCIPYc                     s  dg d} dD ]X t j|  dd}|dk|dk@  s>J t j|  dd}|dk|dk@  sJ qg d	} d
d t j|  dd}tg dg dg}t||ddd t fdd| D  }t||ddd t j|  dd}tg dg dg}t||ddd t jdddd}t|d t jdddd}t|d t jddddd}t|d ddtd   t|d ddtd   d} d
dD ]&}t j| |d}|jd ksJ qt| } dD ]&}t j| |d}|jd ksJ qtdD ]&}t j| |d}|jd ksJ qtg d!} dD ]&}t j| |d}|jd"ksHJ qHtg d#dD ]&}t j| |d}|jd"ksJ qd S )$Nr   )r   r   r   )        r.   r6   wilsonconfidence_levelintervalrG   r6   jeffreys)r   r   r   r   r      ffffff?)rG   gMb?gp=
ף?gn?gʡE?)g㥛 ?gx&1?g#~j?gPn?gZd;O?MbP?)atolrtolc                    s   g | ]}t j| d dqS )rL   rI   )r   binom_conf_interval)r   Zkvalconfnr   r   r      s   
z,test_binom_conf_interval.<locals>.<listcomp>flat)rG   gTN?g6Yѵ?gW?gW?)g.4i?g+?gO@a?gOc*?ge1?r   waldrK     r   g鲘?r.        @@r   r   )rW   rH   rL   rV   )r   )r   r   r   )r   r   )r   r   r   )	r   rR   allr    r&   r   Z	transposesqrtshape)kresresulttablerK   r   rS   r   test_binom_conf_interval   sl    






rb   c                  C   s   d} t ddd}t jt|td}tj||| d\}}}}|j| fksLJ |j| fks\J |j| fkslJ |jd| fks~J |dk sJ d	|d d < tj||| d\}}}}|dk sJ d S )
N   rG         $@d   )Zdtype)binsr   r6   F)	r    Zlinspacer?   r#   boolr   binned_binom_proportionr]   r[   )Znbinsr   ZsuccessZbin_ctrZbin_hwpZperrr   r   r   test_binned_binom_proportion   s     rj   c                   C   sD   t t& tjdgddgdd W d    n1 s60    Y  d S )Nr   r   r   g      ?rJ   )pytestraises
ValueErrorr   rh   r   r   r   r   &test_binned_binom_proportion_exception   s    ro   c               	   C   s   t dddddd} d| ks J t ddddddd} d| ksBJ t dddddd} | dk sbJ t dddddd} | dk sJ t dddddd} | dk sJ t dddddd} | dksJ d S )Nr      r         @r   r   )r   Zsignal_to_noise_oir_ccd)r`   r   r   r   test_signal_to_noise_oir_ccd   s    rr   c                  C   s   t g d} t g dg dg}td" t|t| d W d    n1 sT0    Y  td< t tj| dt jd}tt | |dd	 W d    n1 s0    Y  d S )
N
r   r   r   r   r      rM      	   r   )
rM   r   ru   r   rM   r   r   rM   ru   r   
r   ru   ru   r   rt   r   r   ru   rt   r   *   r   r
   bootfunc{Gz?rP   )r    r&   r   r   r   	bootstrapZmeanr   )bootarranswer
bootresultr   r   r   test_bootstrap   s    

0
r   c                     sf  ddl m  td\ tg dg dgj} td} fdd}tj| d	|d
}t||dd W d    n1 sv0    Y  td\ tg dg dgj} td} fdd}tj| d	|d
}t||dd W d    n1 s0    Y  tdT td} fdd}tj| d|d
}|j	dks4J t||dd W d    n1 sX0    Y  d S )Nr   	spearmanrrx   rs   rw   )gw/?gKq?c                    s    | d S )Nr   r   r   r   r   r   rz     r   z1test_bootstrap_multiple_outputs.<locals>.bootfuncr   ry   rO   r|   )鷯?眢#?c                    s    | d S r   r   r   r   r   r   rz   (  r   ))gq?r   )gAf?r   )g2ı.n?gʡE?c                    s    | S )Nr   r   r   r   r   rz   5  r   r   )r   r   )
scipy.statsr   r   r    r&   Tr   r}   r   r]   )r~   r   rz   r   r   r   r   test_bootstrap_multiple_outputs  s:    


,


,

r   c                  C   sR   t d6 tjjdddd} tt| ddd W d    n1 sD0    Y  d S )	Nr	   r   r   re   re   r$          @皙?rQ   )r   r    r!   normalr   r   mad_stdr0   r   r   r   test_mad_std>  s    
r   c                  C   s   t d tjjdddd} tjt| | } t| }t	|sHJ tj
| d< tj| dd}t	|snJ t| }t	|sJ t|sJ W d    n1 s0    Y  d S )	Nr	   r   r   r   r   r   r   r   Tr7   )r   r    r!   r   r/   masked_wherer:   r   r   Zisscalarr4   r0   Zrsltr   r   r   test_mad_std_scalar_returnD  s    



r   c                  C   sd   t dH tjjdddd} tj| d< tj| dd}t|sBJ W d    n1 sV0    Y  d S )	Nr	   r   r   r   r   r   Fr7   )r   r    r!   r   r4   r   r   r:   r   r   r   r   test_mad_std_warnsV  s
    

r   z*ignore:Invalid value encountered in medianc               
   C   s   t df tddg} tj| d d < tjjdddd| ddddf< ttj| d	d
ddd W d    n1 st0    Y  t	tdddddtjgsJ ttjdddddtjgd	d
d d S )Nr	   f   r   r   r   r   r   Tr7   r   r   r   r   r   gtV?)
r   r    emptyr4   r!   r   r   r   r   r:   r   r   r   r   test_mad_std_withnan^  s    
"6"r   c                  C   s^   t g dg dg} t g d}t ddg}ttj| dd| ttj| dd| d S )N)r   r   r   r   )r   r   r   r   )#>ԍ@.?r   r   .?r   r   r   )r    r&   r   r   r   r0   Zresult_axis0Zresult_axis1r   r   r   test_mad_std_with_axisk  s    
r   c                  C   s   t ddddt jgddddt jgg} t ddddt jg}t ddg}tjtdd	< ttj| d
dd| ttj| ddd| W d    n1 s0    Y  d S )Nr   r   r   r   r   r   r   All-NaN slice encounteredmatchr   Tr   r8   )	r    r&   r4   rl   warnsRuntimeWarningr   r   r   r   r   r   r   test_mad_std_with_axis_and_nanv  s    
r   c                  C   s   t ddddt jgddddt jgg} tjtdd  tj| ddd	}W d    n1 sZ0    Y  t j	|rtJ t j
t | | } tj| ddd	}t j	|sJ d S )
Nr   r   r   r   r   r   r   Tr   )r    r&   r4   rl   r   r   r   r   r/   ZisMaskedArrayr   r:   )r0   r`   r   r   r   )test_mad_std_with_axis_and_nan_array_type  s    .r   c                  C   s0   dt dt d  } ttj|  ddd d S )Nr   r6   ư>r   )r    r\   logr   r   gaussian_fwhm_to_sigma)Zfwhmr   r   r   test_gaussian_fwhm_to_sigma  s    r   c                  C   s4   ddt dt d   } ttj|  ddd d S )Nr6   r   r   r   )r    r\   r   r   r   gaussian_sigma_to_fwhmsigmar   r   r   test_gaussian_sigma_to_fwhm  s    r   c                   C   s   t tjtj d d S )Nr6   )r   r   r   r   r   r   r   r   $test_gaussian_sigma_to_fwhm_to_sigma  s
    r   c                   C   s   t tjdddd d S )NrB   root-nrX   )   rc   r   r   poisson_conf_intervalr   r   r   r    test_poisson_conf_interval_rootn  s    r   rK   )root-n-0pearsonsherpagehrelsfrequentist-confidencec                 C   s*   d}t tj|ddtj|| ddd d S )Nre   r   rX   {Gz?r   r   )rK   rU   r   r   r   test_poisson_conf_large  s
    r   c                  C   sh   t d} ttj| ddtj| d ddd d d d d f t |   t t tj| ddrdJ d S )Nr   r   r   r   rX   r   r   r   r    r@   r   r   r   	ones_likeanyr:   rU   r   r   r   #test_poisson_conf_array_rootn0_zero  s    
*r   c                  C   sh   t d} ttj| ddtj| d ddd d d d d f t |   t t tj| ddrdJ d S )Nr   r   rX   r   r   r   r   r   r   r   3test_poisson_conf_array_frequentist_confidence_zero  s    
*r   c                  C   sJ   g d} t tj| ddg dg dg tttj| ddrFJ d S )Nr   r   rX   )r   r   r   )r   r   r   r    r   r:   r   r   r   r   "test_poisson_conf_list_rootn0_zero  s    r   c                  C   st   dt d } ttj| ddtj| d ddd d d d d f t |   d| d< t t tj| ddrpJ d S )NrM   r   r   rX   r   r   r+   r    r?   r   r   r   r   r   r:   r   r   r   r   test_poisson_conf_array_rootn0  s    *r   c                  C   st   dt d } ttj| ddtj| d ddd d d d d f t |   d| d< t t tj| ddrpJ d S )NrM   r   r   rX   r   r   r+   r   r   r   r   r   test_poisson_conf_array_fc  s    *r   c                  C   sJ   t g d} ttj| dddf dd| ddddf jddd dS )	6Test intervals against those published in Gehrels 1986))r   r   g~jt?)r   g/$?gffffff
@)r   g-?gZd;O@)r   gZd;?gy&1@)r   g㥛  @gx@)r   gQ@g$ @)rt   g(\@g^I+#@)rM   gV@g
ףp=%@)ru   g!rh@gfffff'@)rv   g|?5^:@gQ8*@)r   gMb@g
ףp=,@Nr   r   rX   r   rO   )rQ   rP   r    r&   r   r   r   r   Znlhr   r   r   0test_poisson_conf_frequentist_confidence_gehrels  s    r   c                  C   sJ   t g d} ttj| dddf dddj| ddddf dd dS )	a   Test intervals against those published in Gehrels 1986

    Note: I think there's a typo (transposition of digits) in Gehrels 1986,
    specifically for the two-sigma lower limit for 3 events; they claim
    0.569 but this function returns 0.59623...

    ))r   r   r   g$C@)r   r   gZd;O?gZd@)r   r   gq=
ףp?g1Zd@)r   r   gOn?g!@)r   r   g!rh?gHz$@)r   r   gS?gp=
ף'@)rt   r   gMbX9@gq=
ףp*@)rM   r   gMb@gGz.-@)ru   r   gT㥛 @gzG/@)rv   r   gv/@gQE1@)r   r   gK7A@gGz2@Nr   r   r   r   rK   r{   r   r   r   r   r   r   7test_poisson_conf_frequentist_confidence_gehrels_2sigma  s    	r   c                  C   sL   t g d} ttj| dddf dddj| ddddf dd	d
 dS )r   ))r   r   r   g;On@)r   r   g_vOV?g!@)r   r   ghs?g=
ףp%@)r   r   gA`"?g\(\)@)r   r   g(\?gHz,@)r   r   gMbX?gHz0@)rt   r   g?gQ1@)rM   r   gS?gQ+3@)ru   r   g%C @gq=
ף4@)rv   r   g/$@gGz.6@)r   r   gy&1@gp=
ף7@Nr   r   r   r   r   r{   T)rQ   verboser   r   r   r   r   7test_poisson_conf_frequentist_confidence_gehrels_3sigma  s    r   rU   )r   r   r   r   r   rc   re   c                 C   s.   t tj| ddd tj| ddd dd d S )Nr   rX   r   r   r   r   r   r   r   r   r   test_poisson_conf_gehrels86*  s
    r   c                  C   s"  t tdddddd t ttdddddd t ttdddddd t tdtddddd t tdtddddd t tddtdddd t tddtdddd tjddgd	dd
gddgd} t | dddf ddd t | dddf ddd dS )zTest that the lower-level routine gives the snae number.

    Test numbers are from table1 1, 3 in
    Kraft, Burrows and Nousek in
    `ApJ 374, 344 (1991) <https://ui.adsabs.harvard.edu/abs/1991ApJ...374..344K>`_
    r         @Gz?r   gףp=
W%@rO   r   rq   rt   kraft-burrows-nousekr   ?
backgroundrJ   Nr   r   gQ?g{G!@{Gzt?)	r   r   Z_scipy_kraft_burrows_nousekr    int32int64float32float64r   )rT   r   r   r   test_scipy_poisson_limit3  s6    r   znot HAS_MPMATHc                  C   sb  t tdddddd t tdddd	dd t td
ddddd t td
ddddd t ttdddddd t ttdddddd t tdtddddd t tdtddddd t tddtdddd t tddtdddd t td
ddddd t tjdddddd d df d tddd} d S )Nr6   g?r   )rG   g)\(@r   r   r.   rN   )rG   gq=
ףp@rq   rG   )gQ?gp=
ף*@r   r   rO   rt   r   r   r         @   gL7A`Qc@r   )rU   r   rJ   rK   r   )r   gM>@rZ   g      @)	r   r   Z_mpmath_kraft_burrows_nousekr    r   r   r   r   r   )_r   r   r   test_mpmath_poisson_limitP  sT    
r   c                   C   s  t jtdd$ tjddgddd W d    n1 s80    Y  t jtdd( tjddgd	d
dgd W d    n1 s~0    Y  t jtdd( tjddgdd
dgd W d    n1 s0    Y  t jtdd tdd W d    n1 s0    Y  d S )NzOnly sigma=1 supportedr   r   rt   r   r   r   zbackground not supportedr   r   r   r   zconfidence_level not supportedr   rk   zInvalid methodr   Zfoo)rl   rm   rn   r   r   r   r   r   r   test_poisson_conf_value_errorsr  s    26$r   c                   C   sP  t jtdd" tjddddd W d    n1 s60    Y  t jtdd  tjdddd	 W d    n1 st0    Y  t jtd
d" tjddddd W d    n1 s0    Y  t jtdd" tjddddd W d    n1 s0    Y  t jtdd. tjddgdddgddgd W d    n1 sB0    Y  d S )Nznumber between 0 and 1r   r   r   r   c   r   zSet confidence_level for methodr   zBackground must beg      r   z Number of counts must be integerrq   r   r   r   )rl   rm   rn   r   r   	TypeErrorr   r   r   r   "test_poisson_conf_kbn_value_errors  s.    $$$$r   zHAS_SCIPY or HAS_MPMATHc                   C   s@   t t" tjddddd W d    n1 s20    Y  d S )Nrc   r   rd   rN   )rK   r   rJ   )rl   rm   ImportErrorr   r   r   r   r   r   !test_poisson_limit_nodependencies  s    r   N)r   re   r   r
   c                 C   sJ   t d. ttj| d dks(J W d    n1 s<0    Y  d S Nr	   r   r{   )r   r   kuiperr    r!   r   r   r   r   test_uniform  s    
r   zN,M)r   )rc   re   )re   rc   )r   rc   r   )r   re   c                 C   sT   t d8 ttj| tj|d dks2J W d    n1 sF0    Y  d S r   r   r   
kuiper_twor    r!   r   Mr   r   r   test_kuiper_two_uniform  s    

r   c                 C   s\   t d@ ttj| d tj|d d dks:J W d    n1 sN0    Y  d S )Nr	   r   r   r{   r   r   r   r   r   test_kuiper_two_nonuniform  s    
r   c                  C   s\   t d@ ttjdd tjd\} }|dk s:J W d    n1 sN0    Y  d S )Nr	   rY   r.   r{   r   )Dfr   r   r    test_detect_kuiper_two_different  s
    

r   c           	      C   s   ddl m} td d}d}d}t|D ]4}ttj| tj|\}}||k r*|d7 }q*||||d dks|J |||	|d dksJ W d    n1 s0    Y  d S )Nr   binomr	   re   r   r   r   )
r   r   r   r'   r   r   r    r!   sfcdf)	r   r   r   RfppZfpsr   r   r   r   r   r   test_fpp_kuiper_two  s    
 
r   c                  C   s   t dd} | dksJ d S )Ng^s!?g     p@r   )r   Z!kuiper_false_positive_probability)r   r   r   r   &test_kuiper_false_positive_probability  s    r   c            
      C   s   ddl m}  td d\}}tj||dd }t||d||  fg\}}td||}tj	|t
|d	d
\}}t|}t
|| | t
| t
|| | t
|  }}t|d | d }	| t
||	dksJ | t
||	dksJ W d    n1 s0    Y  d S )Nr   )chi2  )g333333?gQ	@r
   r   r6   rB   r   r   )rf   r'   r   r{   )r   r  r   r    r!   Zuniformr   Zfold_intervalshistogram_intervalsZ	histogramr#   r\   r   r   r   )
r  r)   bswhZnnZbbuuZc2r   r   r   test_histogram  s    

2r
  zii,rr)))r   r  r   r   r   r   r   ))r   r  r  r   r   ))r   r   r.   r   r  r  ))r   r  r>   )r   r   r   r   ))r   r  r>   )r   g      ?r   c                 C   s<   t d  ttj|  | W d    n1 s.0    Y  d S )Nr  )r   r   r   r  )ZiiZrrr   r   r   test_histogram_intervals_known  s    	
r  zN,m,pre   r
   r{   zTest too slow)Zmarksi,  rO   )r   r
   rO   )r   r
   rO   c                    s   ddl m} td t fddt|D }|dk sBJ |dk sRJ |||dd}|||dd	}|t||k   k r|k sn J W d
   n1 s0    Y  d
S )a'  Check that the false positive probability is right

    In particular, run m trials with N uniformly-distributed photons
    and check that the number of false positives is consistent with
    a binomial distribution. The more trials, the tighter the bounds
    but the longer the runtime.

    r   r   r  c                    s"   g | ]}t tj d  qS r  )r   r   r    r!   r   r   r   r   r     s   z)test_uniform_binomial.<locals>.<listcomp>r   )rU   ri   r{   r   N)	r   r   r   r    r&   r'   r[   Zppfr   )r   rD   ri   r   ZfppsZlowZhighr   r   r   test_uniform_binomial  s    
r  )Erl   Znumpyr    Znumpy.testingr   r   Z"astropy.utils.compat.optional_depsr   r   Zastropy.statsr   Zastropyr   rC   Zastropy.utils.miscr   r*   r2   r5   r=   rA   rF   ZmarkZskipifrb   rj   ro   rr   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   Zparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  Zparamskipr  r   r   r   r   <module>   s   "


H



2


	


	













!




















