o
    5ήc                  	   @   s  d dl Z d dlZd dlZd dlmZ d dlZd dl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j01d7e-e, e/ ej01d8e#d9d: Z2ej01d8e#d;d< Z3d=d> Z4d?d@ Z5ej01d8e#dAdB Z6ej01dCg dDdEdF Z7dGdH Z8dIdJ Z9dKdL Z:ej01dMddgG dNdO dOZ;G dPdQ dQZ<G dRdS dSZ=G dTdU dUZ>G dVdW dWZ?G dXdY dYZ@G dZd[ d[ZAdS )\    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      ?       @      ࿩npsqrtpiexpselfx r#   F/tmp/pip-target-vg8gfxp4/lib/python/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   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>8       r6   z...c                 C      g S r'   r#   r5   r#   r#   r$   r6   :       zmust be real number, not listc                 C      t S r'   foor5   r#   r#   r$   r6   <   r9   name 'foo' is not definedc                 C      t jS r'   r   infr5   r#   r#   r$   r6   >   r7   c                 C   r>   r'   r   nanr5   r#   r#   r$   r6   @   r7   c                   C      dS Nr   r#   r#   r#   r#   r$   r6   B   r9   ,takes 0 positional arguments but 1 was givenc                 C   r>   r'   r?   r5   r#   r#   r$   r6   J   r7   c                 C   r>   r'   rA   r5   r#   r#   r$   r6   L   r7   c                 C   r8   r'   r#   r5   r#   r#   r$   r6   N   r9   c                 C   r:   r'   r;   r5   r#   r#   r$   r6   P   r9   c                   C   rC   rD   r#   r#   r#   r#   r$   r6   R   r9   z!must contain at least one elementr           z0wrong number of dimensions \(expected 1, got 2\)皙?皙?r2   )must contain only finite / non-nan values(must contain at least one non-zero value)         zmust be a length 2 tupler#   )rL   rK   zleft >= right)rK   rK   )
   rN   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)rR   errmsgmethodkwargsMethodr#   r#   r$   test_bad_domain   s   "r\   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#   )rS   r   rT   r   rvsr   randomseedr   __version__RandomStateMT19937	Generator)rY   rZ   r[   rc   rng1rng2rvs1rvs2seed1seed2rvs11rvs12r#   r#   r$   test_random_state   s8   





rp   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   set_random_stater   ra   )rh   ri   rngrj   rk   r#   r#   r$   test_set_random_state   s   




rt   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!   rx   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@)
ValueErrorrx   r    r#   r#   r$   r%      s   
z2test_threading_behaviour.<locals>.Distribution.pdfc                 S   rC   NrK   r#   r    r#   r#   r$   r&         z3test_threading_behaviour.<locals>.Distribution.dpdfN)r,   r-   r.   ry   r%   r&   r#   r#   r#   r$   Distribution       r}   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<   rN   r_      rR   r^   順 r   ru   r   ra   rz   argsr/   rs   er}   errorsr#   r$   func1      z'test_threading_behaviour.<locals>.func1c               
      r   )Nbarr   rL   r   r   r   rv   r   r   r   r#   r$   func2   r   z'test_threading_behaviour.<locals>.func2)targetru   r<   rv   r   )	threading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#   )rS   r   rT   pickledumpsloadsr   ra   )rY   rZ   r[   rh   objri   r#   r#   r$   test_pickle   s
   

r   size)Nr   )r   rK   )rN   rM   )rL   rM         )r   r   )r   rK   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   isscalarra   shape)r   rs   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   rq   rK   r_   num      $@      @)locscalerN   rG   )r   normr   rb   default_rngr   linspacecheck_cont_samplesr   ppfbinomr   supportpmfarangecheck_discr_samples)r/   urngrs   urR   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   rK   gHz>皙?rtolatoli  )
ra   meanvarr   isfiniter   	vectorizer)   r   pvalue)rs   r/   mv_exra   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)return_counts)ra   r   r   r   sumr   
zeros_likeuniquer   r   r   )	rs   r   r   ra   r   	obs_freqs_freqsr   r#   r#   r$   r   ,  s   

r   rY   c                   @   s   e Zd Zdd Zdejjdddejjddd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dS )TestQRVSc                 C   s   d}t jt|d ttj|}|t }|jdd W d    n1 s%w   Y  ttj|}|t }d}t jt|d |jdtj	dd W d    d S 1 sUw   Y  d S )	Nz&`qmc_engine` must be an instance of...rP   r   )
qmc_engine6`d` must be consistent with dimension of `qmc_engine`.rM   rL   dr   )
rU   rV   rz   rS   r   rT   r   qrvsqmcHalton)r!   rY   rQ   r[   genr#   r#   r$   test_input_validation?  s   

"zTestQRVS.test_input_validationNrK   r   rc   rM   )rK   )rK   )r   r   )r   r   )rL   r   r   )rM   )rM   qrngsize_in, size_outzd_in, d_outc                 C   sH  t jdkot d dk}|r|dkrtd t }ttj|}	|	|}
|d urV|d urV|j	|krVd}tj
t|d |
j|||d W d    d S 1 sOw   Y  d S |d u rg|d urg|j	d	krg|j	f}|| }t|}|
j|||d
}|d ur|j|ksJ |d ur|t|pd	}tj||}t||dd d S d S )Nwin32r   32bitr
   z4NumericalInversePolynomial.qrvs fails for Win 32-bitr   rP   r   rK   r   r   r   -q=r   )sysplatformarchitecturerU   xfailr   rS   r   rT   r   rV   rz   r   r   r   rb   r   prodr   r   reshaper   )r!   r   size_insize_outd_ind_outrY   w32r/   r[   r   rQ   shape_expectedqrng2r   uniformqrvs2r#   r#   r$   test_QRVS_shape_consistencyU  s4   

z$TestQRVS.test_QRVS_shape_consistencyc                 C   s   t  }ttj|}||}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 q;d S )	N)rM   r   r   r   r   r   .r   r   )r   rS   r   rT   r   r   rb   r   r   r   r   r   ranger   r   )r!   rY   r/   r[   r   r   r   r   r   r   r   r   isamplesample2r#   r#   r$   test_QRVS_size_tuplez  s   zTestQRVS.test_QRVS_size_tuple)r,   r-   r.   r   r   r   Sobolr   qrngstuplesizesdsrU   markparametrizer   r   r#   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      ?rK   r#   r    r#   r#   r$   r%        z)TestTransformedDensityRejection.dist0.pdfc                 C   s   dd|  S )Nr   r#   r    r#   r#   r$   r&     s   z*TestTransformedDensityRejection.dist0.dpdfc                 C      d||d d  d  S Nr   rM   gUUUUUU?r#   r    r#   r#   r$   r)        z)TestTransformedDensityRejection.dist0.cdfc                 C   rC   N)rK   r#   r!   r#   r#   r$   r     r|   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   _pdfr    r#   r#   r$   r%     r   z)TestTransformedDensityRejection.dist1.pdfc                 C   s   | d t j|d  S )N{Gz?r   r  r    r#   r#   r$   r&        z*TestTransformedDensityRejection.dist1.dpdfc                 C   r	  r
  r   r   _cdfr    r#   r#   r$   r)     r   z)TestTransformedDensityRejection.dist1.cdfNr+   r#   r#   r#   r$   dist1      r  c                   @   r   )
z%TestTransformedDensityRejection.dist2c                 C   rw   r'   shiftr!   r  r#   r#   r$   ry     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   rF   r  r  r#   r#   r$   r&     s   
z*TestTransformedDensityRejection.dist2.dpdfc                 C   .   || j 8 }|dkrdd|  S ddd|   S NrF   r  r   r  r    r#   r#   r$   r)        
z)TestTransformedDensityRejection.dist2.cdfN)r,   r-   r.   ry   r%   r&   r)   r#   r#   r#   r$   dist2  s
    r!  rF        @?r  dist, mv_exc                 C   sL   t  }|t t|dd}W d    n1 sw   Y  t||| d S N*   rq   )r   filterRuntimeWarningr   r   )r!   r/   r   suprs   r#   r#   r$   
test_basic  s
   
z*TestTransformedDensityRejection.test_basicc                 C   rC   )Nr   r#   r5   r#   r#   r$   r6     r9   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   rC   r{   r#   r5   r#   r#   r$   r6     r9   z>TestTransformedDensityRejection.test_bad_pdf.<locals>.<lambda>rP   r%   r&   rU   rV   r   r!   r%   rW   rX   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#   r5   r#   r#   r$   r6     r9   z?TestTransformedDensityRejection.test_bad_dpdf.<locals>.<lambda>rP   rK   rN   rR   r0  )r!   r&   rW   rX   r/   r#   r#   r$   test_bad_dpdf  s   
"z-TestTransformedDensityRejection.test_bad_dpdfrO   c                 C   B   t j||d tt |d W d    d S 1 sw   Y  d S NrP   r4  )rU   rV   r   r   r!   rR   rW   rX   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.rP   r;  rU   rV   rz   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.rP   r<  )rK   rK   rK   rK   rK   rK   z:33 : starting points not strictly monotonically increasingr+  rN   z!50 : starting point out of domain)rM   )rR   r;  )
rU   rV   rz   r   r   warnsr(  r   rB   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.rP   rE  )rD  r=  )r!   rD  rX   r#   r#   r$   
test_bad_c'  s   "z*TestTransformedDensityRejection.test_bad_cr   rK   i  r   r  rG   rH   r   rM   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.?)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(  ppf_hatr   r   r   r   r   )r!   r   rs   r)  resexpectedr#   r#   r$   test_ppf_hat1  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/   G  r/  r/   z`pdf` required but not found.rP   c                   @      e Zd Zdd ZdS )rQ  c                 S   s   d| |   S r{   r#   r5   r#   r#   r$   r6   P  s    zDTestTransformedDensityRejection.test_bad_dist.<locals>.dist.<lambda>Nr,   r-   r.   r%   r#   r#   r#   r$   r/   O      z`dpdf` required but not found.)rU   rV   rz   r   )r!   r/   rX   r#   r#   r$   test_bad_distE  s   

"z-TestTransformedDensityRejection.test_bad_distN)#r,   r-   r.   r  r  r!  distsmv0mv1r   r@   mv2mv3mvsrU   r   r   zipr*  r   bad_pdfsbad_pdfs_commonr2  bad_dpdf_commonr5  inf_nan_domainsr9  r?  rC  rB   rF  r   r   rP  rU  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.rK   r   z$DAU only works with a finite domain.r   r&  rq   )basic_fail_distsrU   skip
isinstancestrrS   r   r   r   r   r   r   r   r   
r!   distnameparamsrX   r/   rR   kr   r   rs   r#   r#   r$   r*  `  s   






zTestDiscreteAliasUrn.test_basicc                 C   r>   r'   r?   r5   r#   r#   r$   r6   z  r7   zTestDiscreteAliasUrn.<lambda>rI   c                 C   r>   r'   rA   r5   r#   r#   r$   r6   }  r7   c                 C   rC   )NrF   r#   r5   r#   r#   r$   r6     r9   rJ   c                 C   r:   r'   r;   r5   r#   r#   r$   r6     r9   r=   c                 C   r8   r'   r#   r5   r#   r#   r$   r6     r9   z)setting an array element with a sequence.c                 C   r4   r'   r#   r5   r#   r#   r$   r6     r7   z50 : probability < 0c                   C   rC   rD   r#   r#   r#   r#   r$   r6     r9   rE   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/     r/  r/   rP   r3  r4  )r   rU   rV   r   )r!   r   rW   rX   r/   r#   r#   r$   test_bad_pmf  s
   "z!TestDiscreteAliasUrn.test_bad_pmfr   )r1   r0   r2   )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)dtyper]   rq   r   r   )weightsrL   )
r   asarrayfloat64r   ra   r   r   lenaverager   )r!   r   rs   ra   variates
m_expected
v_expected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 NrP   rU   rV   rz   r   r!   r   rX   r#   r#   r$   test_bad_pv     
"z TestDiscreteAliasUrn.test_bad_pvr   rR   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 finiterP   rN   rG   r4  )rU   rV   rz   r   r   r   r!   rR   r#   r#   r$   test_inf_domain     "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.rP   r  r  )
urn_factor)rU   rB  r(  r   r  r#   r#   r$   test_bad_urn_factor  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                   @   rR  )z0TestDiscreteAliasUrn.test_bad_args.<locals>.distc                 S   s   |S r'   r#   r    r#   r#   r$   r     r|   z4TestDiscreteAliasUrn.test_bad_args.<locals>.dist.pmfN)r,   r-   r.   r   r#   r#   r#   r$   r/     rT  r/   rP   r  )r!   rX   r/   r#   r#   r$   test_bad_args  s
   
"z"TestDiscreteAliasUrn.test_bad_argsN)r,   r-   r.   rg  rU   r   r   r   r*  rz   	NameErrorr   	TypeErrorbad_pmfro  r{  bad_pv_commonr  r   r@   
inf_domainr  r  r  r#   r#   r#   r$   ra  W  sR    



$
ra  c                   @   sJ  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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-d.gggZ"ejd/e"d0d1 Z#d2d3 Z$d d4d5e
je
jgZ%d6d$e
je
jgZ&ejd7e%d8d9 Z'ejd:e&d;d< Z(d=d> Z)d?S )@TestNumericalInversePolynomialc                   @   r   )z$TestNumericalInversePolynomial.dist0c                 C   r   r   r#   r    r#   r#   r$   r%     r   z(TestNumericalInversePolynomial.dist0.pdfc                 C   r   r  r#   r    r#   r#   r$   r)     r  z(TestNumericalInversePolynomial.dist0.cdfc                 C   rC   r  r#   r  r#   r#   r$   r     r|   z,TestNumericalInversePolynomial.dist0.supportNr,   r-   r.   r%   r)   r   r#   r#   r#   r$   r    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%     r   z(TestNumericalInversePolynomial.dist1.pdfc                 C   r	  r
  r  r    r#   r#   r$   r)     r   z(TestNumericalInversePolynomial.dist1.cdfN)r,   r-   r.   r%   r)   r#   r#   r#   r$   r    s    r  c                   @   r   )z$TestNumericalInversePolynomial.dist2c                 C   s    dddt dt j |    S )N皙??rK   rL   r   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 )Nr  rK   g?r   r   rp  r   r   cosr    r#   r#   r$   r)     s
   
,z(TestNumericalInversePolynomial.dist2.cdfc                 C   rC   r  r#   r  r#   r#   r$   r     r|   z,TestNumericalInversePolynomial.dist2.supportNr  r#   r#   r#   r$   r!    r~   r!  c                   @   r   )z$TestNumericalInversePolynomial.dist3c                 C   s$   ddddt dt j |     S )NrG   r  r  rK   rL   r  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=
?rL   rN   r  r    r#   r#   r$   r)     s   $z(TestNumericalInversePolynomial.dist3.cdfc                 C   rC   )N)r   r#   r  r#   r#   r$   r     r|   z,TestNumericalInversePolynomial.dist3.supportNr  r#   r#   r#   r$   dist3  s    r  rF   r#  r  gܿUUUUUU?gQ?rL   g @r$  c                 C   s   t |dd}t||| d S r%  )r
   r   r!   r/   r   rs   r#   r#   r$   r*    s   z)TestNumericalInversePolynomial.test_basic)studentized_range	trapezoidtriangvonmiseslevy_stablekappa4ksonekstwolevy_l
gausshyperanglit)	ncfparetochi2fatiguelifehalfgennormgibratlognormncx2tre  c                 C   s   || j v rtd|  || jv rtd|  t|tr$tt|n|}|| }t }|	t
 t|dd}W d    n1 sCw   Y  t||| | g d S )NzPINV too slow for zPINV fails for r&  rq   )very_slow_distsrU   rh  
fail_distsri  rj  rS   r   r   r'  r(  r
   r   r   r   )r!   rl  rm  r/   r)  rs   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/   rP   r   r   r4  )r%   rU   rV   r
   r1  r#   r#   r$   r2  "  s
   "z+TestNumericalInversePolynomial.test_bad_pdfrO   c                 C   r6  r7  )rU   rV   r
   r   r8  r#   r#   r$   r9  ,  r:  z3TestNumericalInversePolynomial.test_inf_nan_domainsr   rK   '  r   r  r   rG   rH   rG  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_resolutionrI  rJ  rK  rL  gdy=r   )
r   r
   r   r'  r(  r   r   r   r   r   r!   r   r/   rs   r)  rN  rO  r#   r#   r$   test_ppf@     
	z'TestNumericalInversePolynomial.test_ppfr@  rN   rM   r   r"   c                 C   r  r  )
r   r
   r   r'  r(  r)   r   r   r   r   )r!   r"   r/   rs   r)  rN  rO  r#   r#   r$   test_cdfV  r  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|=r  r  )r   r
   u_error)r!   r/   rs   	max_errormaer#   r#   r$   test_u_errorh  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\].rP   r  )r   rU   rV   rz   r
   )r!   r  r/   rX   r#   r#   r$   test_bad_ordersv  s
   "z.TestNumericalInversePolynomial.test_bad_ordersr  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.rP   r  )rU   rV   rz   r
   r   )r!   r  rX   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.rP   rN   c                   @   rR  )zBTestNumericalInversePolynomial.test_bad_args.<locals>.Distributionc                 S   s   t d| | S )Nr   )r   r   r    r#   r#   r$   r%     s   zFTestNumericalInversePolynomial.test_bad_args.<locals>.Distribution.pdfNrS  r#   r#   r#   r$   r}     rT  r}   z!Exact CDF required but not found.)r   r
   rU   rV   rz   r  )r!   r/   rs   rX   r}   r#   r#   r$   r    s   
"z,TestNumericalInversePolynomial.test_bad_argsN)*r,   r-   r.   r  r  r!  r  rV  rW  rX  r   r   rY  rZ  r[  rU   r   r   r\  r*  r  r  xslowr   r  r^  r2  r`  r9  r   rB   r@   r   r  r"   r  r  
bad_ordersbad_u_resolutionr  r  r  r#   r#   r#   r$   r    s\    

	

"


r  c                
   @   s  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d$d% Z 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 d0ggZ%ejd1e%d2d3 Z&d4d5 Z'd6d7 Z(dS )8TestNumericalInverseHermitec                   @   r   )
z!TestNumericalInverseHermite.dist0c                 C   s   ddt dt j |   S )Nr  r   r   r  r    r#   r#   r$   r%     s   z%TestNumericalInverseHermite.dist0.pdfc                 C   s   t jt dt j |  S )Nr   r  r    r#   r#   r$   r&     r  z&TestNumericalInverseHermite.dist0.dpdfc                 C   s4   ddt j d|   t dt j |  dt j  S )Nr   r   rK   rp  r  r    r#   r#   r$   r)     s   4z%TestNumericalInverseHermite.dist0.cdfc                 C   rC   r  r#   r  r#   r#   r$   r     r|   z)TestNumericalInverseHermite.dist0.supportNr  r#   r#   r#   r$   r    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  rF   r  r    r#   r#   r$   r%     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   rF   r  r   r  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      ?rK   r   rF   r  r   r  r    r#   r#   r$   r)     s   z%TestNumericalInverseHermite.dist1.cdfc                 C   rC   )N)r  r  r#   r  r#   r#   r$   r     r|   z)TestNumericalInverseHermite.dist1.supportNr  r#   r#   r#   r$   r    s
    r  r  rL   r  rK   r   g      пg      ?g      ?r$  r  rM   r   c                 C   s   t ||dd}t||| d S )Nr&  )r  r^   )r   r   )r!   r/   r   r  rs   r#   r#   r$   r*    s   z&TestNumericalInverseHermite.test_basicrO   c                 C   r6  r7  )rU   rV   r   r   r8  r#   r#   r$   r9    r:  z0TestNumericalInverseHermite.test_inf_nan_domains)rl  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>   r  r  skewnormr  >   r  nctbetawaldr  invgaussr  r  geninvgaussnorminvgaussgenhyperbolicr  zDistribution is too slowz)Fails - usually due to inaccurate CDF/PDFr   zoverflow encounteredzdivide by zerozinvalid value encounteredrN   :0yE>r   )rU   rh  r   r   rb   rc   rS   r   testingr   r'  r(  r   randmaxr  r   r)   )r!   rl  r  
slow_distsr  r/   r)  fnir"   p_tol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    d S 1 syw   Y  d S )Nz"`order` must be either 1, 3, or 5.rP   rL   r  z`cdf` required but not foundr   z!could not convert string to floatekkir  z`max_intervals' must be...r  )max_intervals)rU   rV   rz   r   r   )r!   rQ   r#   r#   r$   r     s$   
"z1TestNumericalInverseHermite.test_input_validationNr   z1.18.0)   )r  )r   r      r  rs   r   c           
      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   ra   r   r   r   r   r   r   r   )
r!   rs   r   r   r/   r  ri   ra   r   rk   r#   r#   r$   test_RVS  s   z$TestNumericalInverseHermite.test_RVSc                 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 tailrP   r  r  )rU   rB  r(  r   r   r  )r!   r  rQ   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   rq   )r   r   r   r   r   ra   )r!   r  fni1r!  fni2r#   r#   r$   test_custom_distribution4  s
   z4TestNumericalInverseHermite.test_custom_distributionrF   r   r  r   r  r   rG   rH   rG  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   r  rI  rJ  rK  rL  g&.>gLa㧝=r   )
r   r   r   r'  r(  r   r   r   r   r   r  r#   r#   r$   r  L  r  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 r  )r   r   r  r   r'  r(  )r!   r/   rs   r  r  r)  r#   r#   r$   r  ^  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 )Nzj`tol` has been deprecated and replaced with `u_resolution`. It will be completely removed in SciPy 1.10.0.rP   r   )tol)rU   rB  DeprecationWarningr   r   )r!   rX   r#   r#   r$   test_deprecationsl  s   "z-TestNumericalInverseHermite.test_deprecations))r,   r-   r.   r  r  rV  r   r   rW  rX  r[  rU   r   r   r\  r*  r`  r9  r  r   r  r   rb   re   rngsr   rd   appendr   r   r   r  r  r  r   rB   r@   r   r  r  r  r#   r#   r#   r$   r    sJ    & 

r  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 )TestDiscreteGuideTable>   rb  rc  rd  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^   guide_factorr   rb   r   rU   rB  r(  r	   r!   r   r   r#   r#   r$   $test_guide_factor_gt3_raises_warningz  
   
"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_warningre  c           
      C   rf  )NzYDGT fails on these probably because of large domains and small computation errors in PMF.rK   r   z$DGT only works with a finite domain.r   r&  rq   )rg  rU   rh  ri  rj  rS   r   r   r   r   r   r   r	   r   rk  r#   r#   r$   r*    s   






z!TestDiscreteGuideTable.test_basicr   rK   r  r   r  r   rG   rH   rG  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&  rq   rI  rJ  rK  rL  )	r   r   r	   r   r'  r(  r   r   r   )	r!   r   npr/   rs   r)  rN  rO  r#   r#   r$   r    s   

zTestDiscreteGuideTable.test_ppfr|  c                 C   r}  r~  )rU   rV   rz   r	   r  r#   r#   r$   r    r  z"TestDiscreteGuideTable.test_bad_pvrR   c                 C   r  r  )rU   rV   rz   r	   r   r   r  r#   r#   r$   r    r  z&TestDiscreteGuideTable.test_inf_domainN)r,   r-   r.   rg  r  r  r  rU   r   r   r   r*  r   r   rB   r@   r   r  r  r  r  r  r#   r#   r#   r$   r  s  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  r3   r  r#   r#   r$   ry     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.   ry   r%   r)   r#   r#   r#   r$   r/     s    r/   rF   r"  r$  c                 C   sF   t ||jdd}t||| t ||j||jdd}t||| d S )Nr&  )r3   r^   )r3   cdf_at_moder^   )r   r3   r   r)   r  r#   r#   r$   r*    s   
z"TestSimpleRatioUniforms.test_basicrO   c                 C   r6  r7  )rU   rV   r   r   r8  r#   r#   r$   r9    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 > 0rP   r   r  )r3   pdf_area)rU   rV   rz   r   r   r  r#   r#   r$   r  	  s   "z%TestSimpleRatioUniforms.test_bad_argsN)r,   r-   r.   r/   rV  r   r@   rX  rY  r[  rU   r   r   r\  r*  r`  r9  r  r#   r#   r#   r$   r    s    




r  )Br   r   rU   copyr   r   r   numpyr   numpy.testingr   r   r   	numpy.libr   scipy.stats.samplingr   r   r	   r
   r   r   r   scipyr   r   scipy.statsr   r   scipy.stats._distr_paramsr   r   scipy._lib._utilr   r   all_methodsr  r  r^  r_  rB   r@   r  rz   bad_sized_domainsbad_domainsr`  nan_domainsr   r   r\   rp   rt   r   r   r   r   r   r   r   r   ra  r  r  r  r  r#   r#   r#   r$   <module>   s    $	
	
(1


[ ?n S ]i