o
    ?Hh                  	   @   sR  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Z	d dl
mZmZmZ d dlmZ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 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%ej&j'dkrej&j(dk rdZ)ndZ)dd edfdd e*e)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*e)fd'd e+dfd(d e*d#fgZ-d)d e*e)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/d0ggd1fd2d3e	j/d4gd5fd2d3e	j0d4gd5fd0d0gd6fgZ1d7e2d8fd9e2d8fgZ3d:ed;fd<ed;fgZ4d=ed;fe	j0e	j0fed;fe	j0 e	j0 fed;fe	j0e	j0 fed;fe	j0 e	j/fe2d>fe	j/e	j0fe2d>fgZ5d e	j/fe2d>fe	j/e	j/fe2d>fgZ6ej78d?e4e3 e6 ej78d@e%dAdB Z9ej78d@e%dCdD Z:dEdF Z;dGdH Z<ej78d@e%dIdJ Z=ej78dKg dLdMdN Z>dOdP Z?dndSdTZ@dodVdWZAdXdY ZBej78dZg d[d\d] ZCej78dZddgG d^d_ d_ZDG d`da daZEG dbdc dcZFG ddde deZGG dfdg dgZHG dhdi diZIG djdk dkZJG dldm dmZKdS )p    N)deepcopy)assert_allcloseassert_equalsuppress_warnings)TransformedDensityRejectionDiscreteAliasUrnDiscreteGuideTableNumericalInversePolynomialNumericalInverseHermiteRatioUniformsSimpleRatioUniformsUNURANError)raises)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$   _/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-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   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   )r0   modepypy)      
   z.unsupported operand type for float\(\): 'list'zmust be real number, not listc                 C      |  S r(   r$   r#   r$   r$   r%   <lambda>@       r;   z...c                 C      g S r(   r$   r:   r$   r$   r%   r;   B       c                 C      t S r(   foor:   r$   r$   r%   r;   D   r>   name 'foo' is not definedc                 C      t jS r(   r   infr:   r$   r$   r%   r;   F   r<   c                 C   rC   r(   r   nanr:   r$   r$   r%   r;   H   r<   c                   C      dS Nr   r$   r$   r$   r$   r%   r;   J   r>   ,takes 0 positional arguments but 1 was givenc                 C   rC   r(   rD   r:   r$   r$   r%   r;   Q   r<   c                 C   rC   r(   rF   r:   r$   r$   r%   r;   S   r<   c                 C   r=   r(   r$   r:   r$   r$   r%   r;   U   r>   c                 C   r?   r(   r@   r:   r$   r$   r%   r;   W   r>   c                   C   rH   rI   r$   r$   r$   r$   r%   r;   Y   r>   c                 C   r=   r(   r$   r:   r$   r$   r%   r;   `   r>   c                 C   r?   r(   r@   r:   r$   r$   r%   r;   b   r>   c                 C   rC   r(   rD   r:   r$   r$   r%   r;   d   r<   c                 C   rC   r(   rF   r:   r$   r$   r%   r;   f   r<   c                   C   rH   rI   r$   r$   r$   r$   r%   r;   h   r>   z!must contain at least one elementr           z0wrong number of dimensions \(expected 1, got 2\)皙?皙?r3   )must contain only finite / non-nan values(must contain at least one non-zero value)      r7   zmust be a length 2 tupler$   )rQ   rP   zleft >= right)rP   rP   )r8   r8   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pytestr   )rU   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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   r$   )rV   r   rW   r   rvsr   randomseedRandomStateMT19937	Generator)
r[   r\   r]   rd   rng1rng2rvs1rvs2seed1seed2r$   r$   r%   test_random_state   s"   


rn   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`   ra   )r   r   set_random_stater   rb   )rh   ri   rngrj   rk   r$   r$   r%   test_set_random_state   s   




rr   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"   rv   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@)
ValueErrorrv   r!   r$   r$   r%   r&      s   
z2test_threading_behaviour.<locals>.Distribution.pdfc                 S   rH   NrP   r$   r!   r$   r$   r%   r'         z3test_threading_behaviour.<locals>.Distribution.dpdfN)r-   r.   r/   rw   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 )NrA   r8   ra      rU   r`   順 r   rs   r   rb   rx   argsr0   rq   er{   errorsr$   r%   func1      z'test_threading_behaviour.<locals>.func1c               
      r}   )Nbarr~   rQ   r   r   r   rt   r   r   r   r$   r%   func2   r   z'test_threading_behaviour.<locals>.func2)targetrs   rA   rt   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_   ra   r$   )rV   r   rW   pickledumpsloadsr   rb   )r[   r\   r]   rh   objri   r$   r$   r%   test_pickle   s
   

r   size)Nr   )r   rP   )r8   r7   )rQ   r7         )r   r   )r   rP   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   isscalarrb   shape)r   rq   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   ro   rP   ra   num      $@      @)locscaler8   rL   )r   normr   rc   default_rngr
   linspacecheck_cont_samplesr   ppfbinomr   supportpmfarangecheck_discr_samples)r0   urngrq   urU   pvr$   r$   r%   test_with_scipy_distribution  s   r   Hz>皙?c                 C   sn   |  d}| | f}t|d rt||||d |  d}t|j|_t||jj	}|dks5J d S )Nr   rP   rtolatoli  r   )
rb   meanvarr   isfiniter   	vectorizer*   r   pvalue)rq   r0   mv_exr   r   rb   mvpvalr$   r$   r%   r   )  s   

r   MbP?c                 C   s   |  d}| | f}t||||d ||  }t|}tj|dd\}}	|	|	  }	|	|d |	j< t	||j
}
|
dksBJ d S )Nr   r   T)return_countsr   )rb   r   r   r   sumr   
zeros_likeuniquer   r   r   )rq   r   r   r   r   rb   r   	obs_freqs_freqsr   r$   r$   r%   r   6  s   

r   c                  C   s   d} t jt| d tt ddd W d    n1 sw   Y  t jt| d tt dd W d    d S 1 s;w   Y  d S )Nz.102 : center moved into domain of distributionrS   r   r7   r   )centerrU   rU   )rX   warnsRuntimeWarningr	   r   )rZ   r$   r$   r%   !test_warning_center_not_in_domainF  s   "r   r[   )r   r	   r   c                 C   sT   t tj| }d}tjt|d |t ddd W d    d S 1 s#w   Y  d S )Nz17 : mode not in domainrS   r   r   )r4   rU   )rV   r   rW   rX   r   r   r   )r[   r]   rZ   r$   r$   r%   test_error_mode_not_in_domainP  s
   "r   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...rS   r   )
qmc_engine6`d` must be consistent with dimension of `qmc_engine`.r7   rQ   dr   )
rX   r   rx   rV   r   rW   r   qrvsqmcHalton)r"   r[   rT   r]   genr$   r$   r%   test_input_validationa  s   

"zTestQRVS.test_input_validationNrP   r   rd   r7   )rP   rP   )r   r   )r   r   )rQ   r   r   )r7   r7   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   rS   r   rP   r   r   r   -q=r   )sysplatformarchitecturerX   xfailr   rV   r   rW   r   r   rx   r   r   r   rc   r   prodr   r   reshaper   )r"   r   size_insize_outd_ind_outr[   w32r0   r]   r   rT   shape_expectedqrng2r   uniformqrvs2r$   r$   r%   test_QRVS_shape_consistencyw  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)r7   r   r   r   r   r   .r   r   )r   rV   r   rW   r   r   rc   r   r   r   r   r   ranger   r   )r"   r[   r0   r]   r   r   r   r   r   r   r   r   isamplesample2r$   r$   r%   test_QRVS_size_tuple  s   zTestQRVS.test_QRVS_size_tuple)r-   r.   r/   r   r   r   Sobolr   qrngstuplesizesdsrX   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      ?rP   r$   r!   r$   r$   r%   r&        z)TestTransformedDensityRejection.dist0.pdfc                 C   s   dd|  S )Nr  r$   r!   r$   r$   r%   r'        z*TestTransformedDensityRejection.dist0.dpdfc                 C      d||d d  d  S Nr  r7   gUUUUUU?r$   r!   r$   r$   r%   r*        z)TestTransformedDensityRejection.dist0.cdfc                 C   rH   N)rP   r$   r"   r$   r$   r%   r     rz   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   ru   r(   shiftr"   r  r$   r$   r%   rw     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   rK   r"  r$  r$   r$   r%   r'     s   
z*TestTransformedDensityRejection.dist2.dpdfc                 C   .   || j 8 }|dkrdd|  S ddd|   S NrK   r!  r   r  r!   r$   r$   r%   r*        
z)TestTransformedDensityRejection.dist2.cdfN)r-   r.   r/   rw   r&   r'   r*   r$   r$   r$   r%   dist2  s
    r*  rK        @?r  dist, mv_exc                 C   sL   t  }|t t|dd}W d    n1 sw   Y  t||| d S N*   ro   )r   filterr   r   r   )r"   r0   r   suprq   r$   r$   r%   
test_basic  s
   
z*TestTransformedDensityRejection.test_basicc                 C   rH   )Nr   r$   r:   r$   r$   r%   r;     r>   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%   r0         r0   c                 S   rH   ry   r$   r:   r$   r$   r%   r;   	  r>   z>TestTransformedDensityRejection.test_bad_pdf.<locals>.<lambda>rS   r&   r'   rX   r   r   r"   r&   rY   rZ   r0   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                   @   r5  )z;TestTransformedDensityRejection.test_bad_dpdf.<locals>.distNr6  r$   r$   r$   r%   r0     r7  r0   c                 S   s   | S r(   r$   r:   r$   r$   r%   r;     r>   z?TestTransformedDensityRejection.test_bad_dpdf.<locals>.<lambda>rS   rP   r8   r   r8  )r"   r'   rY   rZ   r0   r$   r$   r%   test_bad_dpdf  s   
"z-TestTransformedDensityRejection.test_bad_dpdfrR   c                 C   B   t j||d tt |d W d    d S 1 sw   Y  d S NrS   r   )rX   r   r   r   r"   rU   rY   rZ   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.rS   rB  rX   r   rx   r   r   r"   rB  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.rS   rC  )rP   rP   rP   rP   rP   rP   z:33 : starting points not strictly monotonically increasingr3  r8   z!50 : starting point out of domain)r7   )rU   rB  )
rX   r   rx   r   r   r   r   r   rG   r   rE  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.rS   rK  )rJ  rD  )r"   rJ  rZ   r$   r$   r%   
test_bad_cI  s   "z*TestTransformedDensityRejection.test_bad_cr   rP     r   r!  rL   rM   r  r7   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   h㈵>r   )r   r   r   r0  r   ppf_hatr   r   r   r   r   )r"   r   rq   r1  resexpectedr$   r$   r%   test_ppf_hatS  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                   @   r5  );TestTransformedDensityRejection.test_bad_dist.<locals>.distNr6  r$   r$   r$   r%   r0   i  r7  r0   z`pdf` required but not found.rS   c                   @      e Zd Zdd ZdS )rY  c                 S   s   d| |   S ry   r$   r:   r$   r$   r%   r;   r      zDTestTransformedDensityRejection.test_bad_dist.<locals>.dist.<lambda>Nr-   r.   r/   r&   r$   r$   r$   r%   r0   q      z`dpdf` required but not found.)rX   r   rx   r   )r"   r0   rZ   r$   r$   r%   test_bad_distg  s   

"z-TestTransformedDensityRejection.test_bad_distN)#r-   r.   r/   r  r  r*  distsmv0mv1r   rE   mv2mv3mvsrX   r   r   zipr2  r   bad_pdfsbad_pdfs_commonr:  bad_dpdf_commonr<  inf_nan_domainsr@  rF  rI  rG   rL  r   r   rX  r^  r$   r$   r$   r%   r    sD    







$

r  c                	   @   s8  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&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.rP   r   z$DAU only works with a finite domain.r   r/  ro   )basic_fail_distsrX   skip
isinstancestrrV   r   r   r   r   r   r   r   r   
r"   distnameparamsrZ   r0   rU   kr   r   rq   r$   r$   r%   r2    s   






zTestDiscreteAliasUrn.test_basicc                 C   rC   r(   rD   r:   r$   r$   r%   r;     r<   zTestDiscreteAliasUrn.<lambda>rN   c                 C   rC   r(   rF   r:   r$   r$   r%   r;     r<   c                 C   rH   )NrK   r$   r:   r$   r$   r%   r;     r>   rO   c                 C   r?   r(   r@   r:   r$   r$   r%   r;     r>   rB   c                 C   r=   r(   r$   r:   r$   r$   r%   r;     r>   z)setting an array element with a sequence.c                 C   r9   r(   r$   r:   r$   r$   r%   r;     r<   z50 : probability < 0c                   C   rH   rI   r$   r$   r$   r$   r%   r;     r>   rJ   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                   @   r5  )z/TestDiscreteAliasUrn.test_bad_pmf.<locals>.distNr6  r$   r$   r$   r%   r0     r7  r0   rS   r;  r   )r   rX   r   r   )r"   r   rY   rZ   r0   r$   r$   r%   test_bad_pmf  s
   "z!TestDiscreteAliasUrn.test_bad_pmfr   )r2   r1   r3   )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_   ro   r   r   )weightsrQ   )
r   asarrayfloat64r   rb   r   r   lenaverager   )r"   r   rq   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 NrS   rX   r   rx   r   r"   r   rZ   r$   r$   r%   test_bad_pv     
"z TestDiscreteAliasUrn.test_bad_pvr   rU   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 finiterS   r8   rL   r   )rX   r   rx   r   r   r   r"   rU   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.rS   r!  r  )
urn_factor)rX   r   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                   @   rZ  )z0TestDiscreteAliasUrn.test_bad_args.<locals>.distc                 S   s   |S r(   r$   r!   r$   r$   r%   r     rz   z4TestDiscreteAliasUrn.test_bad_args.<locals>.dist.pmfN)r-   r.   r/   r   r$   r$   r$   r%   r0     r]  r0   rS   r  )r"   rZ   r0   r$   r$   r%   test_bad_args  s
   
"z"TestDiscreteAliasUrn.test_bad_argsc                 C   s0   t td}t|dd}t||ddd d S )N)i  r/  ro   )g     @g    
Ag{Gzt?)r   )r   softmaxr   onesr   r   )r"   r   rq   r$   r$   r%   test_gh19359  s
   
z!TestDiscreteAliasUrn.test_gh19359N)r-   r.   r/   rp  rX   r   r   r   r2  rx   	NameErrorr   	TypeErrorbad_pmfrx  r  bad_pv_commonr  r   rE   
inf_domainr  r  r  r  r$   r$   r$   r%   rj  y  sT    



$
rj  c                   @   s`  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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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d0e"d1d2 Z#ejj$d3d4 Z%d!d5d6e
je
jgZ&d7d%e
je
jgZ'ejd8e&d9d: Z(ejd;e'd<d= Z)d>d? Z*d@dA Z+dBS )C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   rH   r  r$   r  r$   r$   r%   r     rz   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皙??rP   rQ   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  rP   g?r   r   ry  r   r   cosr!   r$   r$   r%   r*     s
   
,z(TestNumericalInversePolynomial.dist2.cdfc                 C   rH   r  r$   r  r$   r$   r%   r     rz   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 )NrL   r  r  rP   rQ   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=
?rQ   r8   r  r!   r$   r$   r%   r*     s   $z(TestNumericalInversePolynomial.dist3.cdfc                 C   rH   )N)r   r$   r  r$   r$   r%   r      rz   z,TestNumericalInversePolynomial.dist3.supportNr  r$   r$   r$   r%   dist3  s    r  rK   r,  r  gܿUUUUUU?gQ?rQ   g @r-  c                 C   s   t |dd}t||| d S r.  )r	   r   r"   r0   r   rq   r$   r$   r%   r2  ,  s   z)TestNumericalInversePolynomial.test_basicrn  c           	      C   s   g d}g d}dg}||v rt d|  ||v r#t d|  t|tr-tt|n|}|| }t }|t t	|dd}W d    n1 sLw   Y  ||v rWd S t
||| | g d S )N)anglit
gausshyperkappa4ksonekstwolevy_llevy_stablestudentized_range	trapezoidtriangvonmises)	chi2fatiguelifegibrathalfgennormlognormncfncx2paretotrel_breitwignerzPINV too slow for zPINV fails for r/  ro   )rX   rq  rr  rs  rV   r   r   r0  r   r	   r   r   r   )	r"   ru  rv  very_slow_dists
fail_distsskip_sample_moment_checkr0   r1  rq   r$   r$   r%   test_basic_all_scipy_dists2  s&   
z9TestNumericalInversePolynomial.test_basic_all_scipy_distsr4  c                 C   X   G dd d}||_ tj||d t|ddgd W d    d S 1 s%w   Y  d S )Nc                   @   r5  )z9TestNumericalInversePolynomial.test_bad_pdf.<locals>.distNr6  r$   r$   r$   r%   r0   V  r7  r0   rS   r   r   r   )r&   rX   r   r	   r9  r$   r$   r%   r:  T  
   "z+TestNumericalInversePolynomial.test_bad_pdfzlogpdf, err, msgc                 C   r  )Nc                   @   r5  )z<TestNumericalInversePolynomial.test_bad_logpdf.<locals>.distNr6  r$   r$   r$   r%   r0   ^  r7  r0   rS   r   r   r   )logpdfrX   r   r	   )r"   r  rY   rZ   r0   r$   r$   r%   test_bad_logpdf\  r  z.TestNumericalInversePolynomial.test_bad_logpdfrR   c                 C   r=  r>  )rX   r   r	   r   r?  r$   r$   r%   r@  f  rA  z3TestNumericalInversePolynomial.test_inf_nan_domainsr   rP   '  r   r!  r   rL   rM   rN  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_resolutionrP  rQ  rR  rS  gdy=r   )
r   r	   r   r0  r   r   r   r   r   r   r"   r   r0   rq   r1  rV  rW  r$   r$   r%   test_ppfz     
	z'TestNumericalInversePolynomial.test_ppfrG  r8   r7   r   r#   c                 C   r  r  )
r   r	   r   r0  r   r*   r   r   r   r   )r"   r#   r0   rq   r1  rV  rW  r$   r$   r%   test_cdf  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"   r0   rq   	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\].rS   r  )r   rX   r   rx   r	   )r"   r  r0   rZ   r$   r$   r%   test_bad_orders  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.rS   r  )rX   r   rx   r	   r   )r"   r  rZ   r$   r$   r%   test_bad_u_resolution  s   "z4TestNumericalInversePolynomial.test_bad_u_resolutionc                 C   s   G dd d}| }d}t jt|d t|}W d    n1 s"w   Y  t }t|}d}t jt|d |d W d    n1 sGw   Y  G dd d}| }t|}d	}t jt|d |  W d    d S 1 ssw   Y  d S )
Nc                   @   rZ  )z=TestNumericalInversePolynomial.test_bad_args.<locals>.BadDistc                 S   s   t j|S r(   r  r!   r$   r$   r%   r*     r  zATestNumericalInversePolynomial.test_bad_args.<locals>.BadDist.cdfN)r-   r.   r/   r*   r$   r$   r$   r%   BadDist  r]  r  z9Either of the methods `pdf` or `logpdf` must be specifiedrS   z4`sample_size` must be greater than or equal to 1000.r8   c                   @   rZ  )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.pdfNr\  r$   r$   r$   r%   r{     r]  r{   z!Exact CDF required but not found.)rX   r   rx   r	   r   r  )r"   r  r0   rZ   rq   r{   r$   r$   r%   r    s&   

"z,TestNumericalInversePolynomial.test_bad_argsc                 C   sh   G dd d}| }dd |_ t|}| }dd |_t|}tjdddd	}t|||| d S )
Nc                   @   r5  )zJTestNumericalInversePolynomial.test_logpdf_pdf_consistency.<locals>.MyDistNr6  r$   r$   r$   r%   MyDist  r7  r  c                 S   s   t |  |  d S NrQ   )mathr    r:   r$   r$   r%   r;     s    zLTestNumericalInversePolynomial.test_logpdf_pdf_consistency.<locals>.<lambda>c                 S   s   |  |  d S r  r$   r:   r$   r$   r%   r;     s    rT  gwJ?ra   r   )r&   r	   r  r   r   r   r   )r"   r  dist_pdfrh   dist_logpdfri   qr$   r$   r%   test_logpdf_pdf_consistency  s   

z:TestNumericalInversePolynomial.test_logpdf_pdf_consistencyN),r-   r.   r/   r  r  r*  r  r_  r`  ra  r   r   rb  rc  rd  rX   r   r   re  r2  xslowr   r  rg  r:  bad_logpdfs_commonr  ri  r@  r   rG   rE   r   r  r#   r  slowr  
bad_ordersbad_u_resolutionr  r  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dd Zejdejjejdedd Zejdejddd Zdd Zd d!ejd!gZe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%d0d1gd2d3ej&gg d4ggZ'ejd5e'd6d7 Z(ejj)d8d9 Z*d S ):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   rP   ry  r  r!   r$   r$   r%   r*     s   4z%TestNumericalInverseHermite.dist0.cdfc                 C   rH   r  r$   r  r$   r$   r%   r     rz   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!  rK   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   rK   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         ?rP   r   rK   r!  r  r  r!   r$   r$   r%   r*     s   z%TestNumericalInverseHermite.dist1.cdfc                 C   rH   )N)r  r!  r$   r  r$   r$   r%   r     rz   z)TestNumericalInverseHermite.dist1.supportNr  r$   r$   r$   r%   r    s
    r  r  rQ   r  rP   r   g      пg      ?g      ?r-  r  r7   r   c                 C   s   t ||dd}t||| d S )Nr/  )r  r`   )r
   r   )r"   r0   r   r  rq   r$   r$   r%   r2  )  s   z&TestNumericalInverseHermite.test_basicrR   c                 C   r=  r>  )rX   r   r
   r   r?  r$   r$   r%   r@  2  rA  z0TestNumericalInverseHermite.test_inf_nan_domainsc           
   	   C   s   h d}h d}||v rt d ||v rt d tjd tt|| }t|}tj	d}t
t|||| t|| }t
t|||| }	|dk s_J |	dk seJ 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   r8   :0yE>r   )rX   rq  r   r   rc   rd   rV   r   r
   randmaxr#  r   r*   )
r"   ru  shapes
slow_distsr  r0   fnir#   p_tolu_tolr$   r$   r%   basic_test_all_scipy_dists7  s   

0 z6TestNumericalInverseHermite.basic_test_all_scipy_distszignore::RuntimeWarning)ru  r  c                 C   s   |  || d S r(   r  )r"   ru  r  r$   r$   r%   r  P  s   z6TestNumericalInverseHermite.test_basic_all_scipy_distsc                 C   s   |  dd d S )N	truncnorm)r   rQ   r  r  r$   r$   r%   test_basic_truncnorm_gh17155X  s   z8TestNumericalInverseHermite.test_basic_truncnorm_gh17155c                 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    d S 1 sYw   Y  d S )
Nz"`order` must be either 1, 3, or 5.rS   rQ   r  z`cdf` required but not foundr   z!could not convert string to floatekkir  )rX   r   rx   r
   r   )r"   rT   r$   r$   r%   r   ]  s   
"z1TestNumericalInverseHermite.test_input_validationNr   )   )r  )r   r      r   rq   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   rb   r   r   r   r   r   r   r   )
r"   rq   r   r   r0   r  ri   rb   r   rk   r$   r$   r%   test_RVSo  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 tailrS   r  r  )rX   r   r   r
   r   r  )r"   r  rT   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   ro   )r   r
   r   r   r   rb   )r"   r  fni1r*  fni2r$   r$   r%   test_custom_distribution  s
   z4TestNumericalInverseHermite.test_custom_distributionrK   r   r  r   r!  r   rL   rM   rN  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  rP  rQ  rR  rS  g&.>gLa㧝=r   )
r   r
   r   r0  r   r   r   r   r   r   r  r$   r$   r%   r    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   r0  r   )r"   r0   rq   r  r  r1  r$   r$   r%   r    s   
z(TestNumericalInverseHermite.test_u_error)+r-   r.   r/   r  r  r_  r   r   r`  ra  rd  rX   r   r   re  r2  ri  r@  r  filterwarningsr  r   r  	fail_slowr  r   rc   re   rngsappendr   r   r   r  r  r  r   rG   rE   r   r  r  r  r$   r$   r$   r%   r    sR    & 




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>   rk  rl  rm  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?r6   r`   guide_factorr   rc   r   rX   r   r   r   r"   r   r   r$   r$   r%   $test_guide_factor_gt3_raises_warning  
   
"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_warningrn  c           
      C   ro  )NzYDGT fails on these probably because of large domains and small computation errors in PMF.rP   r   z$DGT only works with a finite domain.r   r/  ro   )rp  rX   rq  rr  rs  rV   r   r   r   r   r   r   r   r   rt  r$   r$   r%   r2    s   






z!TestDiscreteGuideTable.test_basicr   rP   r  r   r!  r   rL   rM   rN  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/  ro   rP  rQ  rR  rS  )	r   r   r   r   r0  r   r   r   r   )	r"   r   npr0   rq   r1  rV  rW  r$   r$   r%   r    s   

zTestDiscreteGuideTable.test_ppfr  c                 C   r  r  )rX   r   rx   r   r  r$   r$   r%   r  !  r  z"TestDiscreteGuideTable.test_bad_pvrU   c                 C   r  r  )rX   r   rx   r   r   r   r  r$   r$   r%   r  +  r  z&TestDiscreteGuideTable.test_inf_domainN)r-   r.   r/   rp  r  r  r  rX   r   r   r   r2  r   r   rG   rE   r   r  r  r  r  r  r$   r$   r$   r%   r    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  r4   r  r$   r$   r%   rw   6  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/   rw   r&   r*   r$   r$   r$   r%   r0   5  s    r0   rK   r+  r-  c                 C   sF   t ||jdd}t||| t ||j||jdd}t||| d S )Nr/  )r4   r`   )r4   cdf_at_moder`   )r   r4   r   r*   r  r$   r$   r%   r2  M  s   
z"TestSimpleRatioUniforms.test_basicrR   c                 C   r=  r>  )rX   r   r   r   r?  r$   r$   r%   r@  Y  rA  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 > 0rS   r   r  )r4   pdf_area)rX   r   rx   r   r   r  r$   r$   r%   r  ^  s   "z%TestSimpleRatioUniforms.test_bad_argsN)r-   r.   r/   r0   r_  r   rE   ra  rb  rd  rX   r   r   re  r2  ri  r@  r  r$   r$   r$   r%   r  1  s    




r  c                   @   r  )
TestRatioUniformsc                 C   s   t jj}t|tdtd }t|d}t||| |dd}tt |ddd dkd	 td
d dddt	d dd}tt |ddd dkd	 d S )NrQ   r   i90  umaxvminvmaxr`   i	  r   rP   r  Tc                 S   s   t |  S r(   r  r:   r$   r$   r%   r;   o  r[  z6TestRatioUniforms.test_rv_generation.<locals>.<lambda>r  rM  expon)
r   r   r&   r   r   r   r   kstestrb   r    )r"   fvr   r   r$   r$   r%   test_rv_generatione  s    
$z$TestRatioUniforms.test_rv_generationc                 C   s  t jj}t|tdtd }t|d}t||| |dd}t||| |dd}t||| |dd}|d|d|d}}}	t|| t||	  t|j	d t|	j	d t||| |dd}
t||| |dd}|
jd	d
|jdd
}}t| | t|j	d	 t||| |dd}t||| |dd}t||| |dd}| |d|d}}}t|| t|| d S )NrQ   r     r  r7   r   )r7   rP   r   )r7   r7   r7   r     rP   r   )
r   r   r&   r   r   r   rb   r   flattenr   )r"   r#  r$  r   gen1gen2gen3r1r2r3gen4gen5r4r5gen6gen7gen8r6r7r8r$   r$   r%   
test_shapes  s,   "
 
zTestRatioUniforms.test_shapec                 C   s   t jj}t|tdtd }t|d}t||| |dd}|d}tjd t||| |d}|d}t	|| d S )NrQ   r   r&  r  r8   )r  r  r   )
r   r   r&   r   r   r   rb   rc   rd   r   )r"   r#  r$  r  r)  r,  r*  r-  r$   r$   r%   rn     s   

z#TestRatioUniforms.test_random_statec                 C   s   t jj}ttdd t|dddd W d    n1 sw   Y  ttdd t|dddd W d    n1 s;w   Y  ttdd t|dddd W d    n1 sYw   Y  ttdd t|dddd W d    d S 1 sxw   Y  d S )	Nzvmin must be smaller than vmaxrS   rP   r7   )r&   r  r  r   zumax must be positiver  r   )r   r   r&   assert_raisesrx   r   )r"   r#  r$   r$   r%   test_exceptions  s   "z!TestRatioUniforms.test_exceptionsN)r-   r.   r/   r%  r9  rn   r;  r$   r$   r$   r%   r  d  s
    r  )r   r   )r   r   )Lr   r   rX   copyr   r   r   r  numpyr   numpy.testingr   r   r   scipy.stats.samplingr   r   r   r	   r
   r   r   r   r   r:  scipyr   r   scipy.statsr   r   scipy.stats._distr_paramsr   r   scipy._lib._utilr   r   all_methodsimplementationnameversionfloaterrr  r  rg  rh  r  rG   rE   r  rx   bad_sized_domainsbad_domainsri  nan_domainsr   r   r^   rn   rr   r   r   r   r   r   r   r   r   r   r  rj  r  r  r  r  r  r$   r$   r$   r%   <module>   s    (
	
	
1






[ ?u   Yi3