o
    Eb                  	   @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
mZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZ d d
lm Z  G dd dZ!dde! ifddg difddg difdde! ifdde! ifde! d dfgZ"dd edfdd e#dfdd e$dfdd edfdd edfdd e#d fgZ%d!d edfd"d edfd#d e#dfd$d e$dfd%d e#d fgZ&g d&fd'd(ggd)fd*d+ej'd,gd-fd*d+ej(d,gd-fd(d(gd.fgZ)d/e*d0fd1e*d0fgZ+d2ed3fd4ed3fgZ,d5ed3fej(ej(fed3fej( ej( fed3fej(ej( fed3fej( ej'fe*d6fej'ej(fe*d6fgZ-d ej'fe*d6fej'ej'fe*d6fgZ.ej/0d7e,e+ e. ej/0d8e"d9d: Z1ej/0d8e"d;d< Z2d=d> Z3d?d@ Z4ej/0d8e"dAdB Z5ej/0dCg dDdEdF Z6dGdH Z7dIdJ Z8dKdL Z9G dMdN dNZ:G dOdP dPZ;G dQdR dRZ<G dSdT dTZ=G dUdV dVZ>G dWdX dXZ?dS )Y    N)deepcopy)assert_allcloseassert_equalsuppress_warnings)NumpyVersion)TransformedDensityRejectionDiscreteAliasUrnDiscreteGuideTableNumericalInversePolynomialNumericalInverseHermiteSimpleRatioUniformsUNURANError)stats)special)	chisquarecramervonmises)distdiscretedistcont)check_random_statec                   @   $   e Zd Zdd Zdd Zdd ZdS )StandardNormalc                 C   s&   dt dt j  t d| |  S N      ?       @      ࿩npZsqrtpiexpselfx r"   A/usr/lib/python3/dist-packages/scipy/stats/tests/test_sampling.pypdf   s   &zStandardNormal.pdfc                 C   s,   dt dt j  |  t d| |  S r   r   r   r"   r"   r#   dpdf"   s   ,zStandardNormal.dpdfc                 C   s
   t |S N)r   Zndtrr   r"   r"   r#   cdf%      
zStandardNormal.cdfN__name__
__module____qualname__r$   r%   r'   r"   r"   r"   r#   r      s    r   r   distr   ){Gz?
ףp=
?皙?r	   r
   r   r   )r-   modec                 C      |  S r&   r"   r!   r"   r"   r#   <lambda>7       r4   z...c                 C      g S r&   r"   r3   r"   r"   r#   r4   9       zmust be real number, not listc                 C      t S r&   foor3   r"   r"   r#   r4   ;   r7   name 'foo' is not definedc                 C      t jS r&   r   infr3   r"   r"   r#   r4   =   r5   c                 C   r<   r&   r   nanr3   r"   r"   r#   r4   ?   r5   c                   C      dS Nr   r"   r"   r"   r"   r#   r4   A   r7   ,takes 0 positional arguments but 1 was givenc                 C   r<   r&   r=   r3   r"   r"   r#   r4   I   r5   c                 C   r<   r&   r?   r3   r"   r"   r#   r4   K   r5   c                 C   r6   r&   r"   r3   r"   r"   r#   r4   M   r7   c                 C   r8   r&   r9   r3   r"   r"   r#   r4   O   r7   c                   C   rA   rB   r"   r"   r"   r"   r#   r4   Q   r7   z!must contain at least one elementr           z0wrong number of dimensions \(expected 1, got 2\)皙?皙?r0   )must contain only finite / non-nan values(must contain at least one non-zero value)         zmust be a length 2 tupler"   )rJ   rI   zleft >= right)rI   rI   )
   rL   zonly non-nan valuesdomain, err, msgzmethod, kwargsc                 C   sV   t tj|}tj||d |di |d| i W d    d S 1 s$w   Y  d S )Nmatchdomainr"   )getattrr   samplingpytestraises)rP   errmsgmethodkwargsMethodr"   r"   r#   test_bad_domain   s   "rZ   c                 C   s  t tj| }d}|di |d|i}|di |d|i}t|d|d tjd |di |}|d}tjd  |di |ddi}|d}t|| ttj	dk rtj
d}d}	|di |d|i}|di |d|	i}t|d|d |d}
|d}|d}t|
|d d  t||dd   d S tj
tjd}tjtjd}	|di |d|i}|di |d|	i}t|d|d d S )	N{   random_stated   z1.19.0i&  2   iX  r"   )rQ   r   rR   r   rvsr   randomseedr   __version__RandomStateZMT19937	Generator)rW   rX   rY   ra   rng1rng2rvs1rvs2Zseed1Zseed2Zrvs11Zrvs12r"   r"   r#   test_random_state   s8   





ri   c                  C   sr   t t dd} t t }|d t| d|d t t dd}|d}|d |d}t|| d S )Nr[   r\   r]   )r   r   Zset_random_stater   r_   )re   rf   rngrg   rh   r"   r"   r#   test_set_random_state   s   




rl   c                     s   d d dG dd d  fdd}  fdd}t j| d}t j|d}|  |  |  |  d	 d
ks>J d dksFJ d S )N)err1err2c                   @   r   )z.test_threading_behaviour.<locals>.Distributionc                 S   
   || _ d S r&   )pdf_msg)r    rp   r"   r"   r#   __init__   r(   z7test_threading_behaviour.<locals>.Distribution.__init__c                 S   s(   d|  k r
dk rn |S t | j|S )Ng33333H@g      I@)
ValueErrorrp   r   r"   r"   r#   r$      s   
z2test_threading_behaviour.<locals>.Distribution.pdfc                 S   rA   NrI   r"   r   r"   r"   r#   r%         z3test_threading_behaviour.<locals>.Distribution.dpdfN)r*   r+   r,   rq   r$   r%   r"   r"   r"   r#   Distribution       ru   c               
      \    d} t | ddd}z|d W d S  ty- } z|jd d< W Y d }~d S d }~ww )Nr:   rL   r]      rP   r\   順 r   rm   r   r_   rr   argsr-   rk   eru   errorsr"   r#   func1      z'test_threading_behaviour.<locals>.func1c               
      rw   )Nbarrx   rJ   rz   r{   r   rn   r|   r~   r   r"   r#   func2   r   z'test_threading_behaviour.<locals>.func2)targetrm   r:   rn   r   )	threadingZThreadstartjoin)r   r   t1t2r"   r   r#   test_threading_behaviour   s   
		r   c                 C   sP   t tj| }|di |ddi}t|}t|}t|d|d d S )Nr\   r[   r]   r"   )rQ   r   rR   pickledumpsloadsr   r_   )rW   rX   rY   re   objrf   r"   r"   r#   test_pickle   s
   

r   size)Nr   )r   rI   )rL   rK   )rJ   rK         )r   r   )r   rI   c                 C   sR   t t }| d u rt|| sJ d S t| r| f} || j| ks'J d S r&   )r   r   r   Zisscalarr_   shape)r   rk   r"   r"   r#   test_rvs_size   s   

r   c                  C   s   t  } tjd}t| |d}tjdddd}t|| |    t| 	||	| t jddd} t| |d}t|| |    t| 	||	| t 
d	d
} t| |d}|  }| t|d |d d }t|||    d S )Nr   rj   rI   r]   Znum      $@      @)locZscalerL   rE   )r   normr   r`   default_rngr   linspacecheck_cont_samplesr   ppfbinomr   supportpmfarangecheck_discr_samples)r-   urngrk   urP   pvr"   r"   r#   test_with_scipy_distribution	  s   r   c                 C   sn   |  d}| | f}t|d rt||ddd |  d}t|j|_t||jj	}|dks5J d S )Nr{   rI   gHz>皙?Zrtolatoli  )
r_   meanvarr   isfiniter   Z	vectorizer'   r   pvalue)rk   r-   mv_exr_   mvpvalr"   r"   r#   r     s   

r   c           	      C   s   |  d}| | f}t||ddd ||  }t|}tj|dd\}}||  }||d |j< t	||j
}|dksBJ d S )Nr{   MbP?r   r   T)Zreturn_counts)r_   r   r   r   sumr   Z
zeros_likeuniquer   r   r   )	rk   r   r   r_   r   Z	obs_freqs_Zfreqsr   r"   r"   r#   r   +  s   

r   c                
   @   s  e Zd ZG dd dZG dd dZG dd dZe e ededgZdd	gZdd
gZde	j
gZde	j
gZeeeegZejdeeedd Zdd edfgZee7 Zejdedd Zejdedd Zejdedd Zejdg ddd Zdd Zejd d!e	je	j
d"d#gd$d% Ze	jd&d'd(d)g g ge	jge	j
 e	je	j
gd&e	jd*d"gd+d,e	j
gg d-ggZ ejd.e d/d0 Z!d1d2 Z"d3S )4TestTransformedDensityRejectionc                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z%TestTransformedDensityRejection.dist0c                 C      dd||   S N      ?rI   r"   r   r"   r"   r#   r$   >     z)TestTransformedDensityRejection.dist0.pdfc                 C   s   dd|  S )Nr   r"   r   r"   r"   r#   r%   A  s   z*TestTransformedDensityRejection.dist0.dpdfc                 C      d||d d  d  S Nr   rK   gUUUUUU?r"   r   r"   r"   r#   r'   D     z)TestTransformedDensityRejection.dist0.cdfc                 C   rA   N)rI   r"   r    r"   r"   r#   r   G  rt   z-TestTransformedDensityRejection.dist0.supportNr*   r+   r,   r$   r%   r'   r   r"   r"   r"   r#   dist0=  
    r   c                   @   r   )z%TestTransformedDensityRejection.dist1c                 C      t j|d S Nr   r   r   Z_pdfr   r"   r"   r#   r$   L  r   z)TestTransformedDensityRejection.dist1.pdfc                 C   s   | d t j|d  S )N{Gz?r   r   r   r"   r"   r#   r%   O     z*TestTransformedDensityRejection.dist1.dpdfc                 C   r   r   r   r   Z_cdfr   r"   r"   r#   r'   R  r   z)TestTransformedDensityRejection.dist1.cdfNr)   r"   r"   r"   r#   dist1K      r   c                   @   r   )
z%TestTransformedDensityRejection.dist2c                 C   ro   r&   shiftr    r   r"   r"   r#   rq   Y  r(   z.TestTransformedDensityRejection.dist2.__init__c                 C   &   || j 8 }dt|d  }d| | S Nr         ?r   absr    r!   yr"   r"   r#   r$   \     
z)TestTransformedDensityRejection.dist2.pdfc                 C   s8   || j 8 }dt|d  }|| | }|dk r|S | S )Nr   rD   r   r   r"   r"   r#   r%   a  s   
z*TestTransformedDensityRejection.dist2.dpdfc                 C   .   || j 8 }|dkrdd|  S ddd|   S NrD   r   r   r   r   r"   r"   r#   r'   g     
z)TestTransformedDensityRejection.dist2.cdfN)r*   r+   r,   rq   r$   r%   r'   r"   r"   r"   r#   dist2X  s
    r   rD        @?r   dist, mv_exc                 C   sL   t  }|t t|dd}W d    n1 sw   Y  t||| d S N*   rj   )r   filterRuntimeWarningr   r   )r    r-   r   suprk   r"   r"   r#   
test_basicw  s
   
z*TestTransformedDensityRejection.test_basicc                 C   rA   )Nr   r"   r3   r"   r"   r#   r4     r7   z(TestTransformedDensityRejection.<lambda>50 : bad construction points.pdf, err, msgc                 C   sZ   G dd d}||_ dd |_tj||d t| W d    d S 1 s&w   Y  d S )Nc                   @      e Zd ZdS )z:TestTransformedDensityRejection.test_bad_pdf.<locals>.distNr*   r+   r,   r"   r"   r"   r#   r-         r-   c                 S   rA   rs   r"   r3   r"   r"   r#   r4     r7   z>TestTransformedDensityRejection.test_bad_pdf.<locals>.<lambda>rN   r$   r%   rS   rT   r   r    r$   rU   rV   r-   r"   r"   r#   test_bad_pdf  s   

"z,TestTransformedDensityRejection.test_bad_pdfzdpdf, err, msgc                 C   s^   G dd d}dd |_ ||_tj||d t|dd W d    d S 1 s(w   Y  d S )Nc                   @   r   )z;TestTransformedDensityRejection.test_bad_dpdf.<locals>.distNr   r"   r"   r"   r#   r-     r   r-   c                 S   s   | S r&   r"   r3   r"   r"   r#   r4     r7   z?TestTransformedDensityRejection.test_bad_dpdf.<locals>.<lambda>rN   rI   rL   rP   r   )r    r%   rU   rV   r-   r"   r"   r#   test_bad_dpdf  s   
"z-TestTransformedDensityRejection.test_bad_dpdfrM   c                 C   B   t j||d tt |d W d    d S 1 sw   Y  d S NrN   r   )rS   rT   r   r   r    rP   rU   rV   r"   r"   r#   test_inf_nan_domains     "z4TestTransformedDensityRejection.test_inf_nan_domainsconstruction_points)r   r   r   c                 C   sB   t jtdd tt |d W d    d S 1 sw   Y  d S )Nz1`construction_points` must be a positive integer.rN   r   rS   rT   rr   r   r   r    r   r"   r"   r#   #test_bad_construction_points_scalar  s
   "zCTestTransformedDensityRejection.test_bad_construction_points_scalarc                 C   s  g }t jtdd tt |d W d    n1 sw   Y  g d}t jtdd tt |d W d    n1 s=w   Y  tjtjtjg}t jt	dd tt |d W d    n1 scw   Y  ddg}t jtd	d tt d
|d W d    d S 1 sw   Y  d S )NzC`construction_points` must either be a scalar or a non-empty array.rN   r   )rI   rI   rI   rI   rI   rI   z:33 : starting points not strictly monotonically increasingr   rL   z!50 : starting point out of domain)rK   )rP   r   )
rS   rT   rr   r   r   warnsr   r   r@   r   r   r"   r"   r#   "test_bad_construction_points_array  s2   "zBTestTransformedDensityRejection.test_bad_construction_points_arrayc      r   r   c                 C   sF   d}t jt|d tt dd W d    d S 1 sw   Y  d S )Nz`c` must either be -0.5 or 0.rN   r  )r   r   )r    r   rV   r"   r"   r#   
test_bad_c  s   "z*TestTransformedDensityRejection.test_bad_cr   rI   i  r   r   rE   rF   r   rK   r   r   c                 C   s   t t dd}t +}|td |td |td |td ||}tj|}W d    n1 s8w   Y  t	||ddd	 |j
|j
ksMJ d S )
NgH.?)Zmax_squeeze_hat_ratio$invalid value encountered in greater*invalid value encountered in greater_equal!invalid value encountered in less'invalid value encountered in less_equalr   gh㈵>r   )r   r   r   r   r   Zppf_hatr   r   r   r   r   )r    r   rk   r   resexpectedr"   r"   r#   test_ppf_hat  s   
	z,TestTransformedDensityRejection.test_ppf_hatc                 C   s   G dd d}d}t jt|d t| W d    n1 sw   Y  G dd d}d}t jt|d t| W d    d S 1 sDw   Y  d S )Nc                   @   r   );TestTransformedDensityRejection.test_bad_dist.<locals>.distNr   r"   r"   r"   r#   r-     r   r-   z`pdf` required but not found.rN   c                   @      e Zd Zdd ZdS )r  c                 S   s   d| |   S rs   r"   r3   r"   r"   r#   r4     s    zDTestTransformedDensityRejection.test_bad_dist.<locals>.dist.<lambda>Nr*   r+   r,   r$   r"   r"   r"   r#   r-         z`dpdf` required but not found.)rS   rT   rr   r   )r    r-   rV   r"   r"   r#   test_bad_dist  s   

"z-TestTransformedDensityRejection.test_bad_distN)#r*   r+   r,   r   r   r   distsmv0mv1r   r>   mv2mv3mvsrS   markparametrizezipr   r   Zbad_pdfsbad_pdfs_commonr   bad_dpdf_commonr   inf_nan_domainsr   r   r   r@   r  r   r   r
  r  r"   r"   r"   r#   r   ;  sD    







$

r   c                	   @   s0  e Zd Zh dZejdedd Zdd e	dfdd e	dfd	d e	d
fdd e
dfdd e	dfdd edfdd edfgZejdedd Zejdg dg dgdd Zejdedd Zej ejfejejfej ej fdejfej dfgZejded d! Zd"d# Zd$d% Zd&S )'TestDiscreteAliasUrn   randintnchypergeom_fishernchypergeom_walleniusdistname, paramsc           
      C      || j v rd}t| t|ts|}ntt|}|| }| }t	|d |d  s1td t
|d |d d }||}|d}t|dd}	t|	|| d S )NzYDAU fails on these probably because of large domains and small computation errors in PMF.rI   r   z$DAU only works with a finite domain.r   r   rj   )basic_fail_distsrS   skip
isinstancestrrQ   r   r   r   r   r   r   r   r   
r    distnameparamsrV   r-   rP   kr   r   rk   r"   r"   r#   r     s   






zTestDiscreteAliasUrn.test_basicc                 C   r<   r&   r=   r3   r"   r"   r#   r4     r5   zTestDiscreteAliasUrn.<lambda>rG   c                 C   r<   r&   r?   r3   r"   r"   r#   r4     r5   c                 C   rA   )NrD   r"   r3   r"   r"   r#   r4   "  r7   rH   c                 C   r8   r&   r9   r3   r"   r"   r#   r4   %  r7   r;   c                 C   r6   r&   r"   r3   r"   r"   r#   r4   (  r7   z)setting an array element with a sequence.c                 C   r2   r&   r"   r3   r"   r"   r#   r4   +  r5   z50 : probability < 0c                   C   rA   rB   r"   r"   r"   r"   r#   r4   .  r7   rC   zpmf, err, msgc                 C   sT   G dd d}||_ tj||d t|dd W d    d S 1 s#w   Y  d S )Nc                   @   r   )z/TestDiscreteAliasUrn.test_bad_pmf.<locals>.distNr   r"   r"   r"   r#   r-   4  r   r-   rN   r   r   )r   rS   rT   r   )r    r   rU   rV   r-   r"   r"   r#   test_bad_pmf2  s
   "z!TestDiscreteAliasUrn.test_bad_pmfr   )r/   r.   r0   )r   r   g      @      @r   g      @c                 C   s~   t j|t jd}t|dd}|d}||  }t dt|}t j||d}t j|| d |d}||f}t	||| d S )N)Zdtyper[   rj   r{   r   )ZweightsrJ   )
r   ZasarrayZfloat64r   r_   r   r   lenZaverager   )r    r   rk   r_   ZvariatesZ
m_expectedZ
v_expectedZmv_expectedr"   r"   r#   test_sampling_with_pv:  s   
z*TestDiscreteAliasUrn.test_sampling_with_pvpv, msgc                 C   <   t jt|d t| W d    d S 1 sw   Y  d S NrN   rS   rT   rr   r   r    r   rV   r"   r"   r#   test_bad_pvH     
"z TestDiscreteAliasUrn.test_bad_pvr   rP   c                 C   H   t jtdd ttdd|d W d    d S 1 sw   Y  d S Nzmust be finiterN   rL   rE   r   )rS   rT   rr   r   r   r   r    rP   r"   r"   r#   test_inf_domainR     "z$TestDiscreteAliasUrn.test_inf_domainc                 C   sD   t jtdd tddgdd W d    d S 1 sw   Y  d S )Nzrelative urn size < 1.rN   r   r   )Z
urn_factor)rS   r   r   r   r   r"   r"   r#   test_bad_urn_factorW  s   "z(TestDiscreteAliasUrn.test_bad_urn_factorc                 C   sN   d}G dd d}t jt|d t| W d    d S 1 s w   Y  d S )NzG`domain` must be provided when the probability vector is not available.c                   @   r  )z0TestDiscreteAliasUrn.test_bad_args.<locals>.distc                 S   s   |S r&   r"   r   r"   r"   r#   r   `  rt   z4TestDiscreteAliasUrn.test_bad_args.<locals>.dist.pmfN)r*   r+   r,   r   r"   r"   r"   r#   r-   _  r  r-   rN   r2  )r    rV   r-   r"   r"   r#   test_bad_args[  s
   
"z"TestDiscreteAliasUrn.test_bad_argsN)r*   r+   r,   r#  rS   r  r  r   r   rr   	NameErrorr   	TypeErrorZbad_pmfr+  r.  bad_pv_commonr4  r   r>   
inf_domainr9  r;  r<  r"   r"   r"   r#   r    sR    



$
r  c                   @   sV  e Zd ZG dd dZG dd dZG dd dZG dd dZe e e e gZd	d
gZd	dgZ	de
j dde
jd   gZde
j dde
jd   gZee	eegZejdeeedd Zg dZdgZdgZg dZejjejdedd Zejdedd Zejdedd  Ze
jd!d"d#d$g g ge
j ge
j! e
j e
j!gd!e
j d%d&gd'd(e
j!gg d)ggZ"ejd*e"d+d, Z#e
jd-d.d#d$g g ge
j ge
j! e
j e
j!gd!e
j d%d&gd'd(e
j!ge
j! d/d0gggZ$ejd1e$d2d3 Z%d4d5 Z&d"d6d7e
j!e
j gZ'd8d&e
j!e
j gZ(ejd9e'd:d; Z)ejd<e(d=d> Z*d?d@ Z+dAS )BTestNumericalInversePolynomialc                   @   r   )z$TestNumericalInversePolynomial.dist0c                 C   r   r   r"   r   r"   r"   r#   r$   j  r   z(TestNumericalInversePolynomial.dist0.pdfc                 C   r   r   r"   r   r"   r"   r#   r'   m  r   z(TestNumericalInversePolynomial.dist0.cdfc                 C   rA   r   r"   r   r"   r"   r#   r   p  rt   z,TestNumericalInversePolynomial.dist0.supportNr*   r+   r,   r$   r'   r   r"   r"   r"   r#   r   i  r   r   c                   @   s   e Zd Zdd Zdd ZdS )z$TestNumericalInversePolynomial.dist1c                 C   r   r   r   r   r"   r"   r#   r$   u  r   z(TestNumericalInversePolynomial.dist1.pdfc                 C   r   r   r   r   r"   r"   r#   r'   x  r   z(TestNumericalInversePolynomial.dist1.cdfN)r*   r+   r,   r$   r'   r"   r"   r"   r#   r   t  s    r   c                   @   r   )z$TestNumericalInversePolynomial.dist2c                 C   s    dddt dt j |    S )N皙??rI   rJ   r   Zsinr   r   r"   r"   r#   r$     s    z(TestNumericalInversePolynomial.dist2.pdfc                 C   sD   d|d  dddt j d|   t dt j |   dt j   S )NrC  rI   g?r   r   r,  r   r   cosr   r"   r"   r#   r'     s
   
,z(TestNumericalInversePolynomial.dist2.cdfc                 C   rA   r   r"   r   r"   r"   r#   r     rt   z,TestNumericalInversePolynomial.dist2.supportNrB  r"   r"   r"   r#   r     rv   r   c                   @   r   )z$TestNumericalInversePolynomial.dist3c                 C   s$   ddddt dt j |     S )NrE   rC  rD  rI   rJ   rE  r   r"   r"   r#   r$     s   $z(TestNumericalInversePolynomial.dist3.pdfc                 C   s>   |d d ddt j  t dt j t dt j |    S )Nr   r   g
ףp=
?rJ   rL   rF  r   r"   r"   r#   r'     s   $z(TestNumericalInversePolynomial.dist3.cdfc                 C   rA   )N)r   r"   r   r"   r"   r#   r     rt   z,TestNumericalInversePolynomial.dist3.supportNrB  r"   r"   r"   r#   dist3  s    rI  rD   r   r   gܿUUUUUU?gQ?rJ   g @r   c                 C   s   t |dd}t||| d S r   )r
   r   r    r-   r   rk   r"   r"   r#   r     s   z)TestNumericalInversePolynomial.test_basic)studentized_rangeZ	trapezoidZtriangvonmiseslevy_stablekappa4ksonekstwoZlevy_l
gausshyperZanglituniformbeta)	ncfZparetoZchi2ZfatiguelifeZhalfgennormZgilbratZlognormZncx2tr!  c                 C   s   || j v rtd|  || jv rtd|  || jv r$td || jv r1td|  t|tr;t	t
|n|}|| }t }|t t|dd}W d    n1 sZw   Y  t||| | g d S )NzPINV too slow for zPINV fails for zPINV fails for unbounded PDFs.zPINV segmentation faults for r   rj   )very_slow_distsrS   r$  
fail_distsunbounded_pdf_fail_distsfatal_fail_distsxfailr%  r&  rQ   r   r   r   r   r
   r   r   r   )r    r(  r)  r-   r   rk   r"   r"   r#   test_basic_all_scipy_dists  s$   





z9TestNumericalInversePolynomial.test_basic_all_scipy_distsr   c                 C   sX   G dd d}||_ tj||d t|ddgd W d    d S 1 s%w   Y  d S )Nc                   @   r   )z9TestNumericalInversePolynomial.test_bad_pdf.<locals>.distNr   r"   r"   r"   r#   r-     r   r-   rN   r   r   r   )r$   rS   rT   r
   r   r"   r"   r#   r     s
   "z+TestNumericalInversePolynomial.test_bad_pdfrM   c                 C   r   r   )rS   rT   r
   r   r   r"   r"   r#   r     r   z3TestNumericalInversePolynomial.test_inf_nan_domainsr   rI   '  r   r   r   rE   rF   r  r   c                 C      t  }t|dd}t +}|td |td |td |td ||}tj|}W d    n1 s:w   Y  t||ddd |j	|j	ksOJ d S 	N+=u_resolutionr  r  r  r  gdy=r   )
r   r
   r   r   r   r   r   r   r   r   r    r   r-   rk   r   r  r	  r"   r"   r#   test_ppf     
	z'TestNumericalInversePolynomial.test_ppfr   rL   rK   r   r!   c                 C   r^  r_  )
r   r
   r   r   r   r'   r   r   r   r   )r    r!   r-   rk   r   r  r	  r"   r"   r#   test_cdf   re  z'TestNumericalInversePolynomial.test_cdfc                 C   sj   t  }t|dd}| \}}|dk sJ ||ksJ t|dd}| \}}|dk s-J ||ks3J d S Ng|=ra  r`  )r   r
   u_error)r    r-   rk   	max_errormaer"   r"   r#   test_u_error  s   z+TestNumericalInversePolynomial.test_u_errorg      @   g#B;orderc                 C   sJ   t  }d}tjt|d t||d W d    d S 1 sw   Y  d S )Nz2`order` must be an integer in the range \[3, 17\].rN   rm  )r   rS   rT   rr   r
   )r    rm  r-   rV   r"   r"   r#   test_bad_orders   s
   "z.TestNumericalInversePolynomial.test_bad_ordersrb  c                 C   sF   d}t jt|d tt |d W d    d S 1 sw   Y  d S )Nz.`u_resolution` must be between 1e-15 and 1e-5.rN   ra  )rS   rT   rr   r
   r   )r    rb  rV   r"   r"   r#   test_bad_u_resolution(  s   "z4TestNumericalInversePolynomial.test_bad_u_resolutionc                 C   s   t  }t|}d}tjt|d |d W d    n1 s w   Y  G dd d}| }t|}d}tjt|d |  W d    d S 1 sLw   Y  d S )Nz4`sample_size` must be greater than or equal to 1000.rN   rL   c                   @   r  )zBTestNumericalInversePolynomial.test_bad_args.<locals>.Distributionc                 S   s   t d| | S )Nr   )r   r   r   r"   r"   r#   r$   7  s   zFTestNumericalInversePolynomial.test_bad_args.<locals>.Distribution.pdfNr  r"   r"   r"   r#   ru   6  r  ru   z!Exact CDF required but not found.)r   r
   rS   rT   rr   rh  )r    r-   rk   rV   ru   r"   r"   r#   r<  /  s   
"z,TestNumericalInversePolynomial.test_bad_argsN),r*   r+   r,   r   r   r   rI  r  r  r  r   r   r  r  r  rS   r  r  r  r   rW  rZ  rY  rX  xslowr   r\  r  r   r  r   r   r@   r>   r   rd  r!   rf  rk  Z
bad_ordersZbad_u_resolutionro  rp  r<  r"   r"   r"   r#   rA  g  s`    

	

"


rA  c                
   @   sn  e Zd ZG dd dZG dd dZe e gZddej  ddd	ej ej   gZd
dddej ej   d gZ	ee	gZ
ejdeee
ejdddgdd Zejdedd Zejjejdedd Zdd ZddejdgZeejdkreejd de fddgZejd eejd!ed"d# Zeejdkrde j!j"ddd$e j!j#ddd$gZ$ng Z$de fd%d&d'd(gZde fde fd)gZ%ejd*e$ejd!eejd+e%d,d- Z&d.d/ Z'd0d1 Z(d2d3 Z)ej*d4d5d6d7g g gej+gej, ej+ej,gdej+d8d9gd:d;ej,gg d<ggZ-ejd=e-d>d? Z.d@dA Z/dBdC Z0dS )DTestNumericalInverseHermitec                   @   r   )
z!TestNumericalInverseHermite.dist0c                 C   s   ddt dt j |   S )Nr   r   r   rE  r   r"   r"   r#   r$   G  s   z%TestNumericalInverseHermite.dist0.pdfc                 C   s   t jt dt j |  S )Nr   rF  r   r"   r"   r#   r%   J  r   z&TestNumericalInverseHermite.dist0.dpdfc                 C   s4   ddt j d|   t dt j |  dt j  S )Nr   r   rI   r,  rF  r   r"   r"   r#   r'   M  s   4z%TestNumericalInverseHermite.dist0.cdfc                 C   rA   r   r"   r   r"   r"   r#   r   P  rt   z)TestNumericalInverseHermite.dist0.supportNr   r"   r"   r"   r#   r   F  r   r   c                   @   r   )
z!TestNumericalInverseHermite.dist1c                 C   s\   |dkrt dt j | d t j S |dk rdS |dkr,t dt j | d t j S d S )Nr   r   r   rD   rE  r   r"   r"   r#   r$   X  s   z%TestNumericalInverseHermite.dist1.pdfc                 C   s`   |dkrt dt j | t j t j S |dk rdS |dkr.t dt j | t j t j S d S )Nr   r   rD   r   r   rG  r   r   r"   r"   r#   r%   `  s     z&TestNumericalInverseHermite.dist1.dpdfc                 C   sX   |dkrddt dt j |   S |dk rdS |dkr*ddt dt j |   S d S )Nr   g      ?rI   r   rD   r   r   rs  r   r"   r"   r#   r'   h  s   z%TestNumericalInverseHermite.dist1.cdfc                 C   rA   )N)r   r   r"   r   r"   r"   r#   r   p  rt   z)TestNumericalInverseHermite.dist1.supportNr   r"   r"   r"   r#   r   W  s
    r   r   rJ   rJ  rI   r   g      пg      ?g      ?r   rm  rK   r   c                 C   s   t ||dd}t||| d S )Nr   )rm  r\   )r   r   )r    r-   r   rm  rk   r"   r"   r#   r   z  s   z&TestNumericalInverseHermite.test_basicrM   c                 C   r   r   )rS   rT   r   r   r   r"   r"   r#   r     r   z0TestNumericalInverseHermite.test_inf_nan_domains)r(  shapesc              	   C   s  h d}h d}||v rt d ||v rt d tjd tt|| }tj	 }|
td |
td |
td t|}W d    n1 sMw   Y  tjd	}tt|||| t|| }	tt|||| }
|	d
k sJ |
dk sJ d S )N>   skewnormrP  rQ  rN  >   nctwaldinvgaussgeninvgaussnorminvgaussgenhyperbolicrU  rT  rO  rM  rR  rL  zDistribution is too slowz)Fails - usually due to inaccurate CDF/PDFr   zoverflow encounteredzdivide by zerozinvalid value encounteredrL   :0yE>-q=)rS   r$  r[  r   r`   ra   rQ   r   Ztestingr   r   r   r   Zrandmaxr   r   r'   )r    r(  rt  Z
slow_distsrX  r-   r   fnir!   Zp_tolZu_tolr"   r"   r#   r\    s&   


0 z6TestNumericalInverseHermite.test_basic_all_scipy_distsc                 C   s  d}t jt|d tt dd W d    n1 sw   Y  d}t jt|d td W d    n1 s8w   Y  d}t jt|d tt dd	 W d    n1 sXw   Y  d
}t jt|d tt dd W d    n1 sxw   Y  d}t jt|d tt }|jdd W d    n1 sw   Y  ttjdkrtt }d}t jt|d |jdt	j
dd W d    d S 1 sw   Y  d S d S )Nz"`order` must be either 1, 3, or 5.rN   rJ   rn  z`cdf` required but not foundr   z!could not convert string to floatZekkira  z`max_intervals' must be...r   )Zmax_intervalsz&`qmc_engine` must be an instance of...r   )
qmc_engine1.18.06`d` must be consistent with dimension of `qmc_engine`.rK   dr  )rS   rT   rr   r   r   qrvsr   r   rb   r   qmcHalton)r    rO   r  r"   r"   r#   test_input_validation  s<   


"z1TestNumericalInverseHermite.test_input_validationNr   r  )   )r  )r   r      r  rk   zsize_in, size_outc           
      C   st   t  }t|}t|}|j||d}|d ur|j|ksJ |d ur8t|}|j|d}tj	|}	t
||	 d S d S )N)r   r\   )r   )r   r   r   r_   r   r   rS  r   r   r   r   )
r    rk   size_insize_outr-   r  rf   r_   rS  rh   r"   r"   r#   test_RVS  s   z$TestNumericalInverseHermite.test_RVSra   )rI   )rI   )r   r   )r  r  )rJ   r   r  )rK   )rK   qrngzd_in, d_outc                 C   s  t  }t|}|d ur8|d ur8|j|kr8d}tjt|d |j|||d W d    d S 1 s1w   Y  d S |d u rI|d urI|jdkrI|jf}|| }	t|}
|j|||d}|d urd|j|	ksdJ |
d ur|
	t
|ppd}tj||	}t||dd d S d S )Nr  rN   r  rI   r   r  r  r}  r   )r   r   r  rS   rT   rr   r  r   r   r`   r   prodr   r   r   reshaper   )r    r  r  r  Zd_inZd_outr-   r  rO   Zshape_expectedqrng2r  rS  qrvs2r"   r"   r#   	test_QRVS  s,   
z%TestNumericalInverseHermite.test_QRVSc                 C   s   t tjdkrtd t }t|}d}d}tjj	|dd}tjj	|dd}|
t|}|j|||d}tj|}	t|D ]}
|d|
f }|	d d |
f |}t||d	d
 qAd S )Nr  z$QMC doesn't play well with old NumPy)rK   r   r   r   r  r  .r}  r  )r   r   rb   rS   r$  r   r   r   r  r  r`   r  r  r   r   ranger  r   )r    r-   r  r   r  r  r  rS  r  r  iZsampleZsample2r"   r"   r#   test_QRVS_size_tuple  s    

z0TestNumericalInverseHermite.test_QRVS_size_tuplec                 C   sZ   d}d}t jt|d ttj|  W d    n1 sw   Y  ttj| dd d S )N)gdsz@g@e?zg98 : one or more intervals very short; possibly due to numerical problems with a pole or very flat tailrN   r|  ra  )rS   r   r   r   r   rT  )r    rt  rO   r"   r"   r#   test_inaccurate_CDF$  s   z/TestNumericalInverseHermite.test_inaccurate_CDFc                 C   s<   t  }t|}t }t|}t|jdd|jdd d S )Nr   rj   )r   r   r   r   r   r_   )r    r   Zfni1r   Zfni2r"   r"   r#   test_custom_distribution2  s
   z4TestNumericalInverseHermite.test_custom_distributionrD   r   r]  r   r   r   rE   rF   r  r   c                 C   s   t  }t|dd}t +}|td |td |td |td ||}tj|}W d    n1 s:w   Y  t||ddd	 |j	|j	ksOJ d S )
Nr}  ra  r  r  r  r  g&.>gLa㧝=r   )
r   r   r   r   r   r   r   r   r   r   rc  r"   r"   r#   rd  J  re  z$TestNumericalInverseHermite.test_ppfc                 C   s   t  }t|dd}| \}}|dk sJ ||ksJ t }|t t|dd}W d    n1 s4w   Y  | \}}|dk sEJ ||ksKJ d S rg  )r   r   rh  r   r   r   )r    r-   rk   ri  rj  r   r"   r"   r#   rk  \  s   
z(TestNumericalInverseHermite.test_u_errorc                 C   sF   d}t jt|d tt dd W d    d S 1 sw   Y  d S )Nzn`tol` has been deprecated and replaced with `u_resolution`. It will be completely removed in a future release.rN   r}  )Ztol)rS   r   DeprecationWarningr   r   )r    rV   r"   r"   r#   test_deprecationsj  s   "z-TestNumericalInverseHermite.test_deprecations)1r*   r+   r,   r   r   r  r   r   r  r  r  rS   r  r  r  r   r  r   rq  r   r\  r  r`   rc   Zrngsr   rb   appendr   tupleZsizesr  r   r  ZSobolr  ZqrngsZdsr  r  r  r  r   r@   r>   r   rd  rk  r  r"   r"   r"   r#   rr  A  sb    & 
$
rr  c                
   @   s
  e Zd Zh dZdd Zdd Zdd Zej	de
d	d
 Zejddddg g gejgej ejejgdejddgddejgg dggZej	dedd Zej	dedd Zej ejfejejfej ej fdejfej dfgZej	dedd ZdS )TestDiscreteGuideTabler  c                 C   P   g d}t j }tt t||dd W d    d S 1 s!w   Y  d S )Nr   g333333?g333333?   r\   Zguide_factorr   r`   r   rS   r   r   r	   r    r   r   r"   r"   r#   $test_guide_factor_gt3_raises_warningx  
   
"z;TestDiscreteGuideTable.test_guide_factor_gt3_raises_warningc                 C   r  )Nr  r   r  r  r  r"   r"   r#   %test_guide_factor_zero_raises_warning~  r  z<TestDiscreteGuideTable.test_guide_factor_zero_raises_warningc                 C   r  )Nr  r   r  r  r  r"   r"   r#   )test_negative_guide_factor_raises_warning  s
   
"z@TestDiscreteGuideTable.test_negative_guide_factor_raises_warningr!  c           
      C   r"  )NzYDGT fails on these probably because of large domains and small computation errors in PMF.rI   r   z$DGT only works with a finite domain.r   r   rj   )r#  rS   r$  r%  r&  rQ   r   r   r   r   r   r   r	   r   r'  r"   r"   r#   r     s   






z!TestDiscreteGuideTable.test_basicr   rI   r]  r   r   r   rE   rF   r  r   c           	      C   s   d\}}t ||}t|dd}t -}|td |td |td |td ||}t j|||}W d    n1 sCw   Y  t|j|j t|| d S )N)r   r   r   rj   r  r  r  r  )	r   r   r	   r   r   r   r   r   r   )	r    r   npr-   rk   r   r  r	  r"   r"   r#   rd    s   

zTestDiscreteGuideTable.test_ppfr/  c                 C   r0  r1  )rS   rT   rr   r	   r3  r"   r"   r#   r4    r5  z"TestDiscreteGuideTable.test_bad_pvrP   c                 C   r6  r7  )rS   rT   rr   r	   r   r   r8  r"   r"   r#   r9    r:  z&TestDiscreteGuideTable.test_inf_domainN)r*   r+   r,   r#  r  r  r  rS   r  r  r   r   r   r   r@   r>   r   rd  r?  r4  r@  r9  r"   r"   r"   r#   r  q  s,    	


$r  c                   @   s   e Zd ZG dd dZededgZdejgZdejgZeegZ	e
jdeee	dd Ze
jded	d
 Zdd ZdS )TestSimpleRatioUniformsc                   @   r   )zTestSimpleRatioUniforms.distc                 C   s   || _ || _d S r&   )r   r1   r   r"   r"   r#   rq     s   
z%TestSimpleRatioUniforms.dist.__init__c                 C   r   r   r   r   r"   r"   r#   r$     r   z TestSimpleRatioUniforms.dist.pdfc                 C   r   r   r   r   r"   r"   r#   r'     r   z TestSimpleRatioUniforms.dist.cdfN)r*   r+   r,   rq   r$   r'   r"   r"   r"   r#   r-     s    r-   rD   r   r   c                 C   sF   t ||jdd}t||| t ||j||jdd}t||| d S )Nr   )r1   r\   )r1   Zcdf_at_moder\   )r   r1   r   r'   rK  r"   r"   r#   r     s   
z"TestSimpleRatioUniforms.test_basicrM   c                 C   r   r   )rS   rT   r   r   r   r"   r"   r#   r     r   z,TestSimpleRatioUniforms.test_inf_nan_domainsc                 C   sD   t jtdd tt ddd W d    d S 1 sw   Y  d S )Nz`pdf_area` must be > 0rN   r   r   )r1   Zpdf_area)rS   rT   rr   r   r   r   r"   r"   r#   r<    s   "z%TestSimpleRatioUniforms.test_bad_argsN)r*   r+   r,   r-   r  r   r>   r  r  r  rS   r  r  r  r   r  r   r<  r"   r"   r"   r#   r    s    




r  )@Zmathr   r   rS   copyr   Znumpyr   Znumpy.testingr   r   r   Z	numpy.libr   Zscipy.stats.samplingr   r   r	   r
   r   r   r   Zscipyr   r   Zscipy.statsr   r   Zscipy.stats._distr_paramsr   r   Zscipy._lib._utilr   r   Zall_methodsr>  r=  r  r  r@   r>   r?  rr   Zbad_sized_domainsZbad_domainsr  Znan_domainsr  r  rZ   ri   rl   r   r   r   r   r   r   r   r  rA  rr  r  r  r"   r"   r"   r#   <module>   s    $	
	
(1

 ?n [  2i