a
    /'aF                     @   sx  d dl 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 d dlZd dlmZmZmZ d dlm
Z d dl 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 dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd  Z'd!d" Z(d#d$ Z)e j*+d%g d&d'd( Z,d)d* Z-d+d, Z.d-d. Z/G d/d0 d0Z0G d1d2 d2Z1e j*+d3g d4g d5gd6d7 Z2dS )8    N)	betabinom	hypergeom
nhypergeom	bernoulli	boltzmannskellamzipfzipfianbinomnbinomnchypergeom_fishernchypergeom_walleniusrandint)assert_almost_equalassert_equalassert_allclose)r
   )root_scalar)quadc            
      C   s   d} d}d}d}t | |||}t ||  ||| |}t ||  |||| }t | |||}t||dd t||dd t||dd d} d}d}d}t | |||}t| || }	t||	dd d S )N   2   
      )Zdecimal      )r   Zlogpmfr   r   )
kNKnZlogpmf1Zlogpmf2Zlogpmf3Zlogpmf4Zhypergeom_logpmfZbernoulli_logpmf r   Elib/python3.9/site-packages/scipy/stats/tests/test_discrete_distns.pytest_hypergeom_logpmf   s$    r    c                  C   sh   d\} }}d}t || ||}t|| ||| d | | |d   | || d   }t||dd d S )N)-            r   g|=rtol)r   pmfr   r   )Mr   rr   ZNHGZHGr   r   r   test_nhypergeom_pmf(   s
    
8r*   c                  C   sb   d} d}d}t |d }t|| ||}t|| ||}t|g ddd t|g ddd d S )	Nr#         r   )$I$I?g۶m۶m?m۶m?r.   vIh%<=r%   )r-   $I$I?g%I$I?      ?)nparanger   r'   cdfr   )r(   r   r)   supportr'   r4   r   r   r   test_nhypergeom_pmfcdf1   s    r6   c                  C   sF   d} d}d}t g dg dg| ||}t|g dg dgdd	 d S )
Nr   r+   r   )r   r      r   )r   r7   r   r+   )r   r   r   r   )r   r   r   r   r/   r%   )r   r'   r   )r(   r   r)   r'   r   r   r   test_nhypergeom_r0=   s
    r8   c                  C   s0   t jdg ddgdggdd} | jdks,J d S )N   )r   r#   	   r   r"   r   r   r7   r+   size)r   rvsshape)xr   r   r   test_nhypergeom_rvs_shapeF   s    rA   c                  C   sV   t jd tjddddd} t jd t jjdd}t|ddd}t| | d S )Nr   r9   r      d   r<   )r2   randomseedr   r>   Zuniformppfr   )r@   pyr   r   r   test_nhypergeom_accuracyN   s    rI   c                  C   s   t dd} d}t| d|}| dk}t|| t d}d}t| ||}g d}t||d	d
 t| ||}g d}t||d	d
 d S )Nr   r   grh|?r   r7   r+   )r   r   r   $I$I?r0   g$I$I?r   r   r/   r%   )r   r   r   rK   g۶m۶m?r   r   r   )r2   r3   r   r'   r   logr   r4   )r   r   rG   expectedZlamcr   r   r   test_boltzmann_upper_boundY   s    

rO   c                  C   sJ   d} t | d }t| dd|}t d| d  | d }t|| d S )N   r   )r2   r3   r   r'   repeatr   )r   r   rG   rM   r   r   r   test_betabinom_a_and_b_unityl   s
    rR   c                  C   sH   d} d}t d}td| ||}t| | |  |}t|| d S )Ngffffff@g)\(?r7   r   )r2   r3   r   r'   r   r   )abr   rG   rM   r   r   r   test_betabinom_bernoulliv   s    
rU   c                  C   s$   d\} }}t tj| ||dd d S )N)g?r   r   Zalphar   rG   r   r   )r   r   intervalrV   r   r   r   test_issue_10317   s    
rY   c                  C   s$   d\} }}t tj| ||dd d S )N)gffffff?r   r   rV   rW   )r   r
   rX   rV   r   r   r   test_issue_11134   s    
rZ   c                   C   sT   t jd ttt jdddd ttdddd ttdddd d S )Nr   r         ?r   )r2   rD   rE   r   r
   rF   randr   r   r   r   test_issue_7406   s    r^   c                  C   sv   d} t jjddd}d}t||| }t|d t ddd}t||| }t|d d}t||| }t|| d S )	Nr   rC   r   r<   r\   {Gz?gGz?r   )r2   rD   r   r
   rF   r   Zlinspace)rG   r   r@   rF   r   r   r   test_issue_5122   s    

r`   c                   C   s"   t tdtdddd d S )N  rJ   ir_   r   )r   r
   r2   logspacerF   r   r   r   r   test_issue_1603   s    rc   c                  C   s2   d} t ddd}tt|d| | ddd d S )Nr[   r+      r   r7   r_   )atol)r2   rb   r   r
   r4   )rG   r@   r   r   r   test_issue_5503   s    rf   zx, n, p, cdf_desired)	)i,  ra   333333?g24?)i  i'  rg   gU7i(?)i0u  i rg   gέ̑?)i i@B rg   g8@
?)i- 逖 rg   gf(G?)i rg   gwtg ?)iri   rg   gV}ֈ?)ipri   rg   gz̍?)i0 ri   rg   gnC:c                 C   s   t t| ||| d S Nr   r
   r4   )r@   r   rG   Zcdf_desiredr   r   r   test_issue_5503pt2   s    rl   c                   C   s   t tdddd d S )Nr7   l    J)g-q=gB.+n?rk   r   r   r   r   test_issue_5503pt3   s    rm   c                   C   s   t tdddd d S )N   r   gAA?g_[Cˮi8)r   r   sfr   r   r   r   test_issue_6682   s    rp   c                  C   s,   g d} t d| | }g d}t|| d S )N)	r   r   rC   ra   i  i  i  i  ip  r   )	g>l?gzo?gVrRs?g$?gVWCW?g4yB?g4.?g.Lr?gD?)r   r4   r   )mur4   Zcdf_expectedr   r   r   test_skellam_gh11474   s    rr   c                   @   sl   e Zd Zdd Zdd Zdd Zejd e	e
dd	d
ejddd
fjZejdedd ZdS )TestZipfianc                 C   s   d}d}t dd}tt|||t|| tt|||t|| tt|||t|| ttj||ddtj|dd d S )Ng      @rh   r      msvkZmoments)	r2   r3   r   r	   r'   r   r4   ro   stats)selfrS   r   r   r   r   r   test_zipfian_asymptotic   s    z#TestZipfian.test_zipfian_asymptoticc                 C   s   d\}}d}t d|d }tt|||t||| tt|||t||| tt|||t||| ttj||ddtj||dddd d S )N)gG?g1  ?   r   ru   rv   gH׊>r%   )r2   r3   r   r	   r'   r4   ro   rw   )rx   Zalt1Zagt1r   r   r   r   r   test_zipfian_continuity   s    z#TestZipfian.test_zipfian_continuityc                 C   s   t jd t jjdddd}t jdd d }t jjdddd}g d}g d}tt|||dd  |dd  d	d
 tt|||dd  |dd  dd
 d S )Nr   r   rP   r   r<   rC   )
gĹԨ?gءk>	]x[?g>g	W4?g
-?g$fhn=g9[.>g`֔>gnm?)
gaj?gZk=?r|   g?g90?gɸU?r1   gJ_9?g2h2-?gB0?ư>r%   g-C6
?)	r2   rD   rE   r   r]   r   r	   r'   r4   )rx   r   rS   r   r'   r4   r   r   r   test_zipfian_R   s    (zTestZipfian.test_zipfian_Rr   r   r   r7   (   za, nc                    s   t jdd  t j fdd}t |d }||||}t |}t j||d}t j|| d |d}|d }	t j|| |	 d	 |d}
t j|| |	 d
 |dd	 }tt|||| tt|||| ttj	||dd|||
|g d S )Nc                 S   s   dt d| d |   S )z$Naive implementation of harmonic sumr   )r2   r3   sum)r   sr   r   r   Hns  s    z+TestZipfian.test_zipfian_naive.<locals>.Hnsc                    s.   | dk s| |krdS d| |   || S dS )z#Naive implementation of zipfian pmfr   g        Nr   )r   rS   r   r   r   r   pzip  s    z,TestZipfian.test_zipfian_naive.<locals>.pzipr   )Zweightsr7   r[   r+   r,   Zmvskrv   )
r2   	vectorizer3   ZcumsumZaverager   r	   r'   r4   rw   )rx   rS   r   r   r   r'   r4   meanvarZstdZskewZkurtosisr   r   r   test_zipfian_naive  s"    


zTestZipfian.test_zipfian_naiveN)__name__
__module____qualname__ry   r{   r~   r2   rD   rE   Zvstackrb   r   TZnaive_testspytestmarkparametrizer   r   r   r   r   rs      s   rs   c                   @   s   e Zd Zejd dZdZejjdeedZ	ejjdeedZ
e	e
 ZejdeejdZedee
 Zeee	ZejeeejdZejjej d Zejddd	gd
d Zdd Zdd Zdd Zejddd	gdd ZdS )TestNCHr7   r7   r,   r+   rC   r   r<   r   	dist_namer   r   c                 C   sX   t td}|| }| j| j| j| jf\}}}}t|j||||ddt|||| d S )Nr   r   r   )odds)	r   r   r@   r   m1r   r   r'   r   )rx   r   distsdistr@   r   r   r   r   r   r   test_nch_hypergeom9  s    zTestNCH.test_nch_hypergeomc           
      C   s   | j | j| j| j| jf\}}}}}tjdd }||||||\}}}	tt	|||||| ttj
||||dd| ttj
||||dd|	 d S )Nc                    s   | t d t fdd  fdd}|d}|d}|d} | | }	|| }
|| || d  }|	|
|fS )Nr   c                    s(   t  | }t |  }|| |   S rj   )special_binom)r@   t1t2r   m2r   wr   r   fP  s    
zFTestNCH.test_nchypergeom_fisher_naive.<locals>.pmf_mean_var.<locals>.fc                    s"   t  fddtd D S )Nc                 3   s   | ]} ||  V  qd S rj   r   ).0rH   )r   r   r   r   	<genexpr>V      zYTestNCH.test_nchypergeom_fisher_naive.<locals>.pmf_mean_var.<locals>.P.<locals>.<genexpr>r   )r   ranger   )r   xlxur   r   PU  s    zFTestNCH.test_nchypergeom_fisher_naive.<locals>.pmf_mean_var.<locals>.Pr   r7   r2   maximumminimum)r@   r   r   r   r   r   ZP0ZP1ZP2r'   r   r   r   )r   r   r   r   r   r   r   r   pmf_mean_varI  s    z;TestNCH.test_nchypergeom_fisher_naive.<locals>.pmf_mean_varmrv   v)r@   r   r   r   r   r2   r   r   r   r'   rw   )
rx   r@   r   r   r   r   r   r'   r   r   r   r   r   test_nchypergeom_fisher_naiveE  s    "
z%TestNCH.test_nchypergeom_fisher_naivec              	      s   t jd d}d}t jjd||d}t jjd||d}|| }tjd||jd}t d|| }t ||}tj|||jd}	t jj|	j d }
dd t j	fd	d
 t
t||||
 ||||
dd t j	 fdd}t
tj||||
dd|||||
dd t j	fdd}||	||||
}t|	||||
}d\}}t || ||t |  k }| t |d ksJ t||  ||  ||  |
|  D ]r\}}}}
|| }||||
\}}t ||d }	||	||||
 dk sJ t
t|	||||
 d qd S )Nr7   r   rC   r   r<   r   c                 S   s,   | | }t d|| }t ||}||fS )Nr   r   )r   r   r   r   r   r   r   r   r   r   r5   v  s    z9TestNCH.test_nchypergeom_wallenius_naive.<locals>.supportc                    s>   |   |  \}} fdd}t |||fdjS )Nc                    s    |   d|      d S Nr   r   )ur   r   r   fun  s    zCTestNCH.test_nchypergeom_wallenius_naive.<locals>.mean.<locals>.fun)Zbracket)r   root)r   r   r   r   r   r   r   r5   r   r   r   |  s    z6TestNCH.test_nchypergeom_wallenius_naive.<locals>.meang{Gz?r%   c                    sZ   | | } | |||}|||  }|| || |  }| | | | d || ||    S r   r   )r   r   r   r   r   r   rS   rT   )r   r   r   variance  s
    z:TestNCH.test_nchypergeom_wallenius_naive.<locals>.variancer   rv   g?c                    sH   | |\}}fdd  fdd}|S )Nc                    sH         }d| |    d| d|      }|S r   r   )tDres)r   r   r   r   r@   r   r   	integrand  s    ,zHTestNCH.test_nchypergeom_wallenius_naive.<locals>.pmf.<locals>.integrandc                    s:   t | }t |  }t ddddd}|| |d  S )Nr   r   gؗҜ<)ZepsrelZepsabs)r   r   )r@   r   r   Zthe_integral)r   r   r   r   r   r   r     s    
z@TestNCH.test_nchypergeom_wallenius_naive.<locals>.pmf.<locals>.fr   )r@   r   r   r   r   r   r   r   r   )r   r   r   r   r   r@   r   r'     s
    z5TestNCH.test_nchypergeom_wallenius_naive.<locals>.pmf)r}   r}   r[   )r2   rD   rE   r   r>   r?   r   r   r]   r   r   r   r   rw   r'   absr   Zprodzipr3   )rx   r?   max_mr   r   r   r   r   r   r@   r   r   r'   Zpmf0Zpmf1re   r&   ir   )r   r5   r    test_nchypergeom_wallenius_naiveg  sF    	 2z(TestNCH.test_nchypergeom_wallenius_naivec           	      C   s   d}d}d}d}t d}t g d}d}d}tt||||||d	d	d
 tt|||||d	d tt|||||dd d S )Nr   rz   rP   g      @rt   )g9T;gr<gD,P=g4 V=g'	,=gCG>gyztj>gt>g+k?g MeGD?gqNZVɒo?gc2n?g~ZN?gE}?Y?g?g·aQ?g]??gr)?gp{?g39	y?g m>?gJ򕴝-@gih@r/   )r&   re   r%   gdy=)r2   r3   Zarrayr   r   r'   r   r   )	rx   r(   r   r   r   Zsupr'   r   r   r   r   r   test_wallenius_against_mpmath  s"    
z%TestNCH.test_wallenius_against_mpmathc                 C   sD   t td}|| }|jdddgdggg ddd}|jdks@J d S )	Nr   r   rz   r   rP   )r[   r1   g       @r;   r<   )r   r   r>   r?   )rx   r   r   r   r@   r   r   r   test_rvs_shape  s     zTestNCH.test_rvs_shapeN)r   r   r   r2   rD   rE   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   +  s,   

"S*r   zmu, q, expected)r   x   g@	#)i  r   g"qVUc                 C   s.   d}||||    }}t t|||| d S )NrP   )r   r   Zlogcdf)rq   qrM   r=   r   rG   r   r   r   test_nbinom_11465  s    r   )3r   Zscipy.statsr   r   r   r   r   r   r   r	   r
   r   r   r   r   Znumpyr2   Znumpy.testingr   r   r   Zscipy.specialr   Zscipy.optimizer   Zscipy.integrater   r    r*   r6   r8   rA   rI   rO   rR   rU   rY   rZ   r^   r`   rc   rf   r   r   rl   rm   rp   rr   rs   r   r   r   r   r   r   <module>   sH   <		

	
S G