U
    HvfE                     @   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 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dddgifdddddgifdde# ifdde# ifde# d dfgZ$ej%j&dkrRej%j'dk rRd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 d0fd1d2ggd3fd4d5e	j.dgd6fd4d5e	j/dgd6fd2d2gd7fgZ0d8e1d9fd:e1d9fgZ2d;ed<fd=ed<fgZ3d>ed<fe	j/e	j/fed<fe	j/ e	j/ fed<fe	j/e	j/ fed<fe	j/ e	j.fe1d?fe	j.e	j/fe1d?fgZ4d e	j.fe1d?fe	j.e	j.fe1d?fgZ5ej67d@e3e2 e5 ej67dAe$dBdC Z8ej67dAe$dDdE Z9dFdG Z:dHdI Z;ej67dAe$dJdK Z<ej67dLdd dMdNdOdPdQdRgdSdT Z=dUdV Z>dWdX Z?dYdZ Z@d[d\ ZAej67d]dddgd^d_ ZBej67d]ddgG d`da daZCG dbdc dcZDG ddde deZEG dfdg dgZFG dhdi diZGG djdk dkZHG dldm dmZIdS )n    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                   @   s$   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"   C/tmp/pip-unpacked-wheel-96ln3f52/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'   s    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,   modepypy)      
   z.unsupported operand type for float\(\): 'list'zmust be real number, not listc                 C   s   |  S r&   r"   r!   r"   r"   r#   <lambda>?       r6   z...c                 C   s   g S r&   r"   r5   r"   r"   r#   r6   A   r7   c                 C   s   t S r&   foor5   r"   r"   r#   r6   C   r7   name 'foo' is not definedc                 C   s   t jS r&   r   infr5   r"   r"   r#   r6   E   r7   c                 C   s   t jS r&   r   nanr5   r"   r"   r#   r6   G   r7   c                   C   s   dS Nr   r"   r"   r"   r"   r#   r6   I   r7   ,takes 0 positional arguments but 1 was givenc                 C   s   t jS r&   r;   r5   r"   r"   r#   r6   P   r7   c                 C   s   t jS r&   r=   r5   r"   r"   r#   r6   R   r7   c                 C   s   g S r&   r"   r5   r"   r"   r#   r6   T   r7   c                 C   s   t S r&   r8   r5   r"   r"   r#   r6   V   r7   c                   C   s   dS r?   r"   r"   r"   r"   r#   r6   X   r7   c                 C   s   g S r&   r"   r5   r"   r"   r#   r6   _   r7   c                 C   s   t S r&   r8   r5   r"   r"   r#   r6   a   r7   c                 C   s   t jS r&   r;   r5   r"   r"   r#   r6   c   r7   c                 C   s   t jS r&   r=   r5   r"   r"   r#   r6   e   r7   c                   C   s   dS r?   r"   r"   r"   r"   r#   r6   g   r7   z!must contain at least one elementr           z0wrong number of dimensions \(expected 1, got 2\)皙?皙?)must contain only finite / non-nan values(must contain at least one non-zero value)      r3   zmust be a length 2 tupler"   )rG   rF   zleft >= right)rF   rF   )r4   r4   zonly non-nan valuesdomain, err, msgzmethod, kwargsc              	   C   s<   t tj|}tj||d |f |d| i W 5 Q R X d S )Nmatchdomain)getattrr   samplingpytestraises)rK   errmsgmethodkwargsMethodr"   r"   r#   test_bad_domain   s    rU   c           
      C   s  t tj| }d}|f |d|i}|f |d|i}t|d|d tjd |f |}|d}tjd  |f |ddi}|d}t|| tjtj	d}tj
tj	d}	|f |d|i}|f |d|	i}t|d|d d S )N{   random_stated   )rL   r   rM   r   rvsr   randomseedRandomStateZMT19937	Generator)
rR   rS   rT   r[   rng1rng2rvs1rvs2Zseed1Zseed2r"   r"   r#   test_random_state   s"    



rb   c                  C   sr   t t dd} t t }|d t| d|d t t dd}|d}|d |d}t|| d S )NrV   rW   rX   )r   r   Zset_random_stater   rY   )r^   r_   rngr`   ra   r"   r"   r#   test_set_random_state   s    




re   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|td dkstd S )N)err1err2c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z.test_threading_behaviour.<locals>.Distributionc                 S   s
   || _ d S r&   )pdf_msg)r    rh   r"   r"   r#   __init__   s    z7test_threading_behaviour.<locals>.Distribution.__init__c                 S   s&   d|  k rdk r"n n
t | j|S )Ng33333H@g      I@)
ValueErrorrh   r   r"   r"   r#   r$      s    
z2test_threading_behaviour.<locals>.Distribution.pdfc                 S   s   dS NrF   r"   r   r"   r"   r#   r%      s    z3test_threading_behaviour.<locals>.Distribution.dpdfN)r)   r*   r+   ri   r$   r%   r"   r"   r"   r#   Distribution   s   rl   c               
      sZ    d} t | ddd}z|d W n0 tk
rT } z|jd d< W 5 d }~X Y nX d S )Nr9   r4   rX      rK   rW   順 r   rf   r   rY   rj   argsr,   rd   erl   errorsr"   r#   func1   s    z'test_threading_behaviour.<locals>.func1c               
      sZ    d} t | ddd}z|d W n0 tk
rT } z|jd d< W 5 d }~X Y nX d S )Nbarrm   rG   ro   rp   r   rg   rq   rs   ru   r"   r#   func2   s    z'test_threading_behaviour.<locals>.func2)targetrf   r9   rg   rx   )	threadingThreadstartjoinAssertionError)rw   ry   t1t2r"   ru   r#   test_threading_behaviour   s    
		r   c                 C   sL   t tj| }|f |ddi}t|}t|}t|d|d d S )NrW   rV   rX   )rL   r   rM   pickledumpsloadsr   rY   )rR   rS   rT   r^   objr_   r"   r"   r#   test_pickle   s
    

r   size)r   rF   )r4   r3   )rG   r3         )r   r   )r   rF   c                 C   sP   t t }| d kr(t|| sLtn$t| r8| f} || j| ksLtd S r&   )r   r   r   ZisscalarrY   r   shape)r   rd   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   rc   rF   rX   num      $@      @)locZscaler4   rB   )r   normr   rZ   default_rngr   linspacecheck_cont_samplesr   ppfbinomr   supportpmfarangecheck_discr_samples)r,   urngrd   urK   pvr"   r"   r#   test_with_scipy_distribution  s    r   c                 C   sn   |  d}| | f}t|d r8t||ddd |  d}t|j|_t||jj	}|dksjt
d S )Nrp   rF   gHz>皙?Zrtolatoli  )rY   meanvarr   isfiniter   Z	vectorizer'   r   pvaluer   )rd   r,   mv_exrY   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std S )Nrp   MbP?r   r   T)Zreturn_counts)rY   r   r   r   sumr   Z
zeros_likeuniquer   r   r   r   )	rd   r   r   rY   r   Z	obs_freqs_Zfreqsr   r"   r"   r#   r   5  s    

r   c               	   C   sZ   d} t jt| d tt ddd W 5 Q R X t jt| d tt dd W 5 Q R X d S )Nz.102 : center moved into domain of distributionrI   r   r3   r   )centerrK   rK   )rN   warnsRuntimeWarningr
   r   )rQ   r"   r"   r#   !test_warning_center_not_in_domainE  s
    r   rR   c              	   C   s>   t tj| }d}tjt|d |t ddd W 5 Q R X d S )Nz17 : mode not in domainrI   r   r   )r0   rK   )rL   r   rM   rN   rO   r   r   )rR   rT   rQ   r"   r"   r#   test_error_mode_not_in_domainO  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 5 Q R X ttj|}|t }d}t jt|d |jdtj	dd W 5 Q R X d S )	Nz&`qmc_engine` must be an instance of...rI   r   )
qmc_engine6`d` must be consistent with dimension of `qmc_engine`.r3   rG   dr   )
rN   rO   rj   rL   r   rM   r   qrvsqmcHalton)r    rR   rJ   rT   genr"   r"   r#   test_input_validation`  s    

zTestQRVS.test_input_validationNrF   r   r[   r3   )rF   )rF   )r   r   )r   r   )rG   r   r   )r3   )r3   qrngsize_in, size_outzd_in, d_outc              	   C   s2  t jdkot d dk}|r0|dkr0td t }ttj|}	|	|}
|d k	r|d k	r|j	|krd}tj
t|d |
j|||d W 5 Q R X d S |d kr|d k	r|j	d	kr|j	f}|| }t|}|
j|||d
}|d k	r|j|kst|d k	r.|t|p
d	}tj||}t||dd d S )Nwin32r   32bitr
   z4NumericalInversePolynomial.qrvs fails for Win 32-bitr   rI   r   rF   r   r   r   -q=r   )sysplatformarchitecturerN   xfailr   rL   r   rM   r   rO   rj   r   r   r   r   rZ   r   prodr   r   reshaper   )r    r   size_insize_outZd_inZd_outrR   Zw32r,   rT   r   rJ   Zshape_expectedqrng2r   uniformqrvs2r"   r"   r#   test_QRVS_shape_consistencyv  s,    

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 ]4}|
d|f }|d d |f |}t||dd qvd S )	N)r3   r   r   r   r   r   .r   r   )r   rL   r   rM   r   r   rZ   r   r   r   r   r   ranger   r   )r    rR   r,   rT   r   r   r   r   r   r   r   r   isampleZsample2r"   r"   r#   test_QRVS_size_tuple  s    zTestQRVS.test_QRVS_size_tuple)r)   r*   r+   r   r   r   ZSobolr   ZqrngstuplesizesZdsrN   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dddg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d-d.d/gggZ ejd0e d1d2 Z!d3d4 Z"d5S )6TestTransformedDensityRejectionc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z%TestTransformedDensityRejection.dist0c                 C   s   dd||   S N      ?rF   r"   r   r"   r"   r#   r$     s    z)TestTransformedDensityRejection.dist0.pdfc                 C   s   dd|  S )Nr   r"   r   r"   r"   r#   r%     s    z*TestTransformedDensityRejection.dist0.dpdfc                 C   s   d||d d  d  S Nr   r3   gUUUUUU?r"   r   r"   r"   r#   r'     s    z)TestTransformedDensityRejection.dist0.cdfc                 C   s   dS N)rF   r"   r    r"   r"   r#   r     s    z-TestTransformedDensityRejection.dist0.supportNr)   r*   r+   r$   r%   r'   r   r"   r"   r"   r#   dist0  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z%TestTransformedDensityRejection.dist1c                 C   s   t j|d S Nr   r   r   Z_pdfr   r"   r"   r#   r$     s    z)TestTransformedDensityRejection.dist1.pdfc                 C   s   | d t j|d  S )N{Gz?r   r   r   r"   r"   r#   r%     s    z*TestTransformedDensityRejection.dist1.dpdfc                 C   s   t j|d S r   r   r   Z_cdfr   r"   r"   r#   r'     s    z)TestTransformedDensityRejection.dist1.cdfNr(   r"   r"   r"   r#   dist1  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z%TestTransformedDensityRejection.dist2c                 C   s
   || _ d S r&   shiftr    r   r"   r"   r#   ri     s    z.TestTransformedDensityRejection.dist2.__init__c                 C   s&   || j 8 }dt|d  }d| | S Nr         ?r   absr    r!   yr"   r"   r#   r$     s    
z)TestTransformedDensityRejection.dist2.pdfc                 C   s8   || j 8 }dt|d  }|| | }|dk r2|S | S )Nr   rA   r   r   r"   r"   r#   r%     s    
z*TestTransformedDensityRejection.dist2.dpdfc                 C   s2   || j 8 }|dkrdd|  S ddd|   S d S NrA   r   r   r   r   r"   r"   r#   r'     s    
z)TestTransformedDensityRejection.dist2.cdfN)r)   r*   r+   ri   r$   r%   r'   r"   r"   r"   r#   dist2  s   r   rA        @?r   dist, mv_exc              	   C   s8   t  }|t t|dd}W 5 Q R X t||| d S N*   rc   )r   filterr   r   r   )r    r,   r   suprd   r"   r"   r#   
test_basic  s    
z*TestTransformedDensityRejection.test_basicc                 C   s   dS )Nr   r"   r5   r"   r"   r#   r6      r7   z(TestTransformedDensityRejection.<lambda>50 : bad construction points.pdf, err, msgc              	   C   sD   G dd d}||_ dd |_tj||d t| W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z:TestTransformedDensityRejection.test_bad_pdf.<locals>.distNr)   r*   r+   r"   r"   r"   r#   r,     s   r,   c                 S   s   dS rk   r"   r5   r"   r"   r#   r6     r7   z>TestTransformedDensityRejection.test_bad_pdf.<locals>.<lambda>rI   r$   r%   rN   rO   r   r    r$   rP   rQ   r,   r"   r"   r#   test_bad_pdf  s
    
z,TestTransformedDensityRejection.test_bad_pdfzdpdf, err, msgc              	   C   sH   G dd d}dd |_ ||_tj||d t|dd W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z;TestTransformedDensityRejection.test_bad_dpdf.<locals>.distNr  r"   r"   r"   r#   r,     s   r,   c                 S   s   | S r&   r"   r5   r"   r"   r#   r6     r7   z?TestTransformedDensityRejection.test_bad_dpdf.<locals>.<lambda>rI   rF   r4   r   r  )r    r%   rP   rQ   r,   r"   r"   r#   test_bad_dpdf  s
    
z-TestTransformedDensityRejection.test_bad_dpdfrH   c              	   C   s,   t j||d tt |d W 5 Q R X d S NrI   r   )rN   rO   r   r   r    rK   rP   rQ   r"   r"   r#   test_inf_nan_domains  s    z4TestTransformedDensityRejection.test_inf_nan_domainsconstruction_pointsr   r   r   c              	   C   s,   t jtdd tt |d W 5 Q R X d S )Nz1`construction_points` must be a positive integer.rI   r
  rN   rO   rj   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 5 Q R X ddddddg}t jtdd tt |d W 5 Q R X tjtjtjg}t jt	dd tt |d W 5 Q R X ddg}t jtd	d tt d
|d W 5 Q R X d S )NzC`construction_points` must either be a scalar or a non-empty array.rI   r  rF   z:33 : starting points not strictly monotonically increasingr   r4   z!50 : starting point out of domain)r3   )rK   r
  )
rN   rO   rj   r   r   r   r   r   r>   r   r  r"   r"   r#   "test_bad_construction_points_array$  s2        zBTestTransformedDensityRejection.test_bad_construction_points_arrayc      r   c              	   C   s0   d}t jt|d tt dd W 5 Q R X d S )Nz`c` must either be -0.5 or 0.rI   r  )r  r  )r    r  rQ   r"   r"   r#   
test_bad_cH  s    z*TestTransformedDensityRejection.test_bad_crF   i  r   r   rB   rC   r   r3   r   r   c              	   C   s   t t dd}t L}|td |td |td |td ||}tj|}W 5 Q R X t	||ddd	 |j
|j
kst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   h㈵>r   )r   r   r   r   r   Zppf_hatr   r   r   r   r   r   )r    r   rd   r   resexpectedr"   r"   r#   test_ppf_hatR  s    
z,TestTransformedDensityRejection.test_ppf_hatc              	   C   sl   G dd d}d}t jt|d t| W 5 Q R X G dd d}d}t jt|d t| W 5 Q R X d S )Nc                   @   s   e Zd ZdS );TestTransformedDensityRejection.test_bad_dist.<locals>.distNr  r"   r"   r"   r#   r,   h  s   r,   z`pdf` required but not found.rI   c                   @   s   e Zd Zdd ZdS )r  c                 S   s   d| |   S rk   r"   r5   r"   r"   r#   r6   q  r7   zDTestTransformedDensityRejection.test_bad_dist.<locals>.dist.<lambda>Nr)   r*   r+   r$   r"   r"   r"   r#   r,   p  s   z`dpdf` required but not found.)rN   rO   rj   r   )r    r,   rQ   r"   r"   r#   test_bad_distf  s    z-TestTransformedDensityRejection.test_bad_distN)#r)   r*   r+   r   r   r   distsmv0mv1r   r<   mv2mv3mvsrN   r   r   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                
   @   s<  e Zd Zdddh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dddgddddd d!g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 )0TestDiscreteAliasUrnnchypergeom_fishernchypergeom_walleniusrandintdistname, paramsc           
      C   s   || j krd}t| t|ts(|}n
tt|}|| }| }t	|d |d  sbt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.rF   r   z$DAU only works with a finite domain.r   r   rc   )basic_fail_distsrN   skip
isinstancestrrL   r   r   r   r   r   r   r   r   
r    distnameparamsrQ   r,   rK   kr   r   rd   r"   r"   r#   r     s    






zTestDiscreteAliasUrn.test_basicc                 C   s   t jS r&   r;   r5   r"   r"   r#   r6     r7   zTestDiscreteAliasUrn.<lambda>rD   c                 C   s   t jS r&   r=   r5   r"   r"   r#   r6     r7   c                 C   s   dS )NrA   r"   r5   r"   r"   r#   r6     r7   rE   c                 C   s   t S r&   r8   r5   r"   r"   r#   r6     r7   r:   c                 C   s   g S r&   r"   r5   r"   r"   r#   r6     r7   z)setting an array element with a sequence.c                 C   s   |  S r&   r"   r5   r"   r"   r#   r6     r7   z50 : probability < 0c                   C   s   dS r?   r"   r"   r"   r"   r#   r6     r7   r@   zpmf, err, msgc              	   C   s>   G dd d}||_ tj||d t|dd W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z/TestDiscreteAliasUrn.test_bad_pmf.<locals>.distNr  r"   r"   r"   r#   r,     s   r,   rI   r  r   )r   rN   rO   r   )r    r   rP   rQ   r,   r"   r"   r#   test_bad_pmf  s    z!TestDiscreteAliasUrn.test_bad_pmfr   r.   r-   r/   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dtyperV   rc   rp   r   )weightsrG   )
r   ZasarrayZfloat64r   rY   r   r   lenZaverager   )r    r   rd   rY   ZvariatesZ
m_expectedZ
v_expectedZmv_expectedr"   r"   r#   test_sampling_with_pv  s    
z*TestDiscreteAliasUrn.test_sampling_with_pvpv, msgc              	   C   s&   t jt|d t| W 5 Q R X d S NrI   rN   rO   rj   r   r    r   rQ   r"   r"   r#   test_bad_pv  s    z TestDiscreteAliasUrn.test_bad_pvr   rK   c              	   C   s2   t jtdd ttdd|d W 5 Q R X d S Nzmust be finiterI   r4   rB   r   )rN   rO   rj   r   r   r   r    rK   r"   r"   r#   test_inf_domain  s    z$TestDiscreteAliasUrn.test_inf_domainc              	   C   s.   t jtdd tddgdd W 5 Q R X d S )Nzrelative urn size < 1.rI   r   r   )Z
urn_factor)rN   r   r   r   r   r"   r"   r#   test_bad_urn_factor  s    z(TestDiscreteAliasUrn.test_bad_urn_factorc              	   C   s8   d}G dd d}t jt|d t| W 5 Q R X d S )NzG`domain` must be provided when the probability vector is not available.c                   @   s   e Zd Zdd ZdS )z0TestDiscreteAliasUrn.test_bad_args.<locals>.distc                 S   s   |S r&   r"   r   r"   r"   r#   r     s    z4TestDiscreteAliasUrn.test_bad_args.<locals>.dist.pmfN)r)   r*   r+   r   r"   r"   r"   r#   r,     s   r,   rI   r>  )r    rQ   r,   r"   r"   r#   test_bad_args  s    z"TestDiscreteAliasUrn.test_bad_argsN)r)   r*   r+   r/  rN   r   r   r   r   rj   	NameErrorr   	TypeErrorZbad_pmfr7  r;  bad_pv_commonr@  r   r<   
inf_domainrC  rD  rE  r"   r"   r"   r#   r*  x  sX   



$ 

r*  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dddddddddddgZdd d!d"d#d$d%d&d'g	Zejjejd(ed)d* Zejd+ed,d- Zejd.ed/d0 Zejd1ed2d3 Ze
jd4d5d6d7g g ge
j ge
j! e
j e
j!gd4e
j d8d9gd:d;e
j!gd<d=d>gggZ"ejd?e"d@dA Z#e
jdBdCd6d7g g ge
j ge
j! e
j e
j!gd4e
j d8d9gd:d;e
j!ge
j! d=d>gggZ$ejdDe$dEdF Z%dGdH Z&d5dIdJe
j!e
j gZ'dKd9e
j!e
j gZ(ejdLe'dMdN Z)ejdOe(dPdQ Z*dRdS Z+dTdU Z,dVS )WTestNumericalInversePolynomialc                   @   s$   e Zd Zdd Zdd Zdd ZdS )z$TestNumericalInversePolynomial.dist0c                 C   s   dd||   S r   r"   r   r"   r"   r#   r$     s    z(TestNumericalInversePolynomial.dist0.pdfc                 C   s   d||d d  d  S r   r"   r   r"   r"   r#   r'     s    z(TestNumericalInversePolynomial.dist0.cdfc                 C   s   dS r   r"   r   r"   r"   r#   r     s    z,TestNumericalInversePolynomial.dist0.supportNr)   r*   r+   r$   r'   r   r"   r"   r"   r#   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )z$TestNumericalInversePolynomial.dist1c                 C   s   t j|d S r   r   r   r"   r"   r#   r$     s    z(TestNumericalInversePolynomial.dist1.pdfc                 C   s   t j|d S r   r   r   r"   r"   r#   r'     s    z(TestNumericalInversePolynomial.dist1.cdfN)r)   r*   r+   r$   r'   r"   r"   r"   r#   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z$TestNumericalInversePolynomial.dist2c                 C   s    dddt dt j |    S )N皙??rF   rG   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 )NrL  rF   g?r   r   r8  r   r   cosr   r"   r"   r#   r'     s
    
,z(TestNumericalInversePolynomial.dist2.cdfc                 C   s   dS r   r"   r   r"   r"   r#   r     s    z,TestNumericalInversePolynomial.dist2.supportNrK  r"   r"   r"   r#   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z$TestNumericalInversePolynomial.dist3c                 C   s$   ddddt dt j |     S )NrB   rL  rM  rF   rG   rN  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=
?rG   r4   rP  r   r"   r"   r#   r'     s    $z(TestNumericalInversePolynomial.dist3.cdfc                 C   s   dS )N)r   r"   r   r"   r"   r#   r     s    z,TestNumericalInversePolynomial.dist3.supportNrK  r"   r"   r"   r#   dist3  s   rS  rA   r   r   gܿUUUUUU?gQ?rG   g @r   c                 C   s   t |dd}t||| d S r   )r
   r   r    r,   r   rd   r"   r"   r#   r   $  s    z)TestNumericalInversePolynomial.test_basicstudentized_rangeZ	trapezoidZtriangvonmiseslevy_stablekappa4ksonekstwoZlevy_l
gausshyperZanglitncfZparetoZchi2ZfatiguelifeZhalfgennormZgibratZlognormZncx2tr.  c              	   C   s   || j krtd|  || jkr4td|  t|trHtt|n|}|| }t }|	t
 t|dd}W 5 Q R X t||| | g d S )NzPINV too slow for zPINV fails for r   rc   )very_slow_distsrN   r0  
fail_distsr1  r2  rL   r   r   r   r   r
   r   r   r   )r    r4  r5  r,   r   rd   r"   r"   r#   test_basic_all_scipy_dists3  s    


z9TestNumericalInversePolynomial.test_basic_all_scipy_distsr   c              	   C   sB   G dd d}||_ tj||d t|ddgd W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z9TestNumericalInversePolynomial.test_bad_pdf.<locals>.distNr  r"   r"   r"   r#   r,   E  s   r,   rI   r   r   r   )r$   rN   rO   r
   r  r"   r"   r#   r  C  s    z+TestNumericalInversePolynomial.test_bad_pdfzlogpdf, err, msgc              	   C   sB   G dd d}||_ tj||d t|ddgd W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z<TestNumericalInversePolynomial.test_bad_logpdf.<locals>.distNr  r"   r"   r"   r#   r,   M  s   r,   rI   r   r   r   )logpdfrN   rO   r
   )r    rb  rP   rQ   r,   r"   r"   r#   test_bad_logpdfK  s    z.TestNumericalInversePolynomial.test_bad_logpdfrH   c              	   C   s,   t j||d tt |d W 5 Q R X d S r  )rN   rO   r
   r   r  r"   r"   r#   r	  U  s    z3TestNumericalInversePolynomial.test_inf_nan_domainsr   rF   '  r   r   r   rB   rC   r   r3   r   r   c              	   C   s   t  }t|dd}t L}|td |td |td |td ||}tj|}W 5 Q R X t||ddd |j	|j	kst
d S 	N+=u_resolutionr  r  r  r  gdy=r   )r   r
   r   r   r   r   r   r   r   r   r   r    r   r,   rd   r   r  r  r"   r"   r#   test_ppfi  s    
z'TestNumericalInversePolynomial.test_ppfr  r4   r!   c              	   C   s   t  }t|dd}t L}|td |td |td |td ||}tj|}W 5 Q R X t||ddd |j	|j	kst
d S re  )r   r
   r   r   r   r'   r   r   r   r   r   )r    r!   r,   rd   r   r  r  r"   r"   r#   test_cdf  s    
z'TestNumericalInversePolynomial.test_cdfc                 C   sj   t  }t|dd}| \}}|dk s*t||ks6tt|dd}| \}}|dk sZt||ksftd S Ng|=rg  rf  )r   r
   u_errorr   )r    r,   rd   	max_errormaer"   r"   r#   test_u_error  s    z+TestNumericalInversePolynomial.test_u_errorg      @   g#B;orderc              	   C   s4   t  }d}tjt|d t||d W 5 Q R X d S )Nz2`order` must be an integer in the range \[3, 17\].rI   rr  )r   rN   rO   rj   r
   )r    rr  r,   rQ   r"   r"   r#   test_bad_orders  s    z.TestNumericalInversePolynomial.test_bad_ordersrh  c              	   C   s0   d}t jt|d tt |d W 5 Q R X d S )Nz.`u_resolution` must be between 1e-15 and 1e-5.rI   rg  )rN   rO   rj   r
   r   )r    rh  rQ   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 5 Q R X t }t|}d}t jt|d |d W 5 Q R X G dd d}| }t|}d	}t jt|d |  W 5 Q R X d S )
Nc                   @   s   e Zd Zdd ZdS )z=TestNumericalInversePolynomial.test_bad_args.<locals>.BadDistc                 S   s   t j|S r&   r   r   r"   r"   r#   r'     s    zATestNumericalInversePolynomial.test_bad_args.<locals>.BadDist.cdfN)r)   r*   r+   r'   r"   r"   r"   r#   BadDist  s   rv  z9Either of the methods `pdf` or `logpdf` must be specifiedrI   z4`sample_size` must be greater than or equal to 1000.r4   c                   @   s   e Zd Zdd ZdS )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#   rl     s   rl   z!Exact CDF required but not found.)rN   rO   rj   r
   r   rm  )r    rv  r,   rQ   rd   rl   r"   r"   r#   rE    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                   @   s   e Zd ZdS )zJTestNumericalInversePolynomial.test_logpdf_pdf_consistency.<locals>.MyDistNr  r"   r"   r"   r#   MyDist  s   rw  c                 S   s   t |  |  d S NrG   )mathr   r5   r"   r"   r#   r6     r7   zLTestNumericalInversePolynomial.test_logpdf_pdf_consistency.<locals>.<lambda>c                 S   s   |  |  d S rx  r"   r5   r"   r"   r#   r6     r7   r  gwJ?rX   r   )r$   r
   rb  r   r   r   r   )r    rw  Zdist_pdfr^   Zdist_logpdfr_   qr"   r"   r#   test_logpdf_pdf_consistency  s    

z:TestNumericalInversePolynomial.test_logpdf_pdf_consistencyN)-r)   r*   r+   r   r   r   rS  r   r!  r"  r   r   r#  r$  r%  rN   r   r   r&  r   r_  r`  xslowr   ra  r'  r  bad_logpdfs_commonrc  r)  r	  r   r>   r<   r   rj  r!   rk  rp  Z
bad_ordersZbad_u_resolutionrt  ru  rE  r{  r"   r"   r"   r#   rJ    s   
     
   

	
  
 "


rJ  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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d4dd	gggZ&ejd5e&d6d7 Z'd8d9 Z(d S ):TestNumericalInverseHermitec                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z!TestNumericalInverseHermite.dist0c                 C   s   ddt dt j |   S )Nr   r   r   rN  r   r"   r"   r#   r$     s    z%TestNumericalInverseHermite.dist0.pdfc                 C   s   t jt dt j |  S )Nr   rP  r   r"   r"   r#   r%     s    z&TestNumericalInverseHermite.dist0.dpdfc                 C   s4   ddt j d|   t dt j |  dt j  S )Nr   r   rF   r8  rP  r   r"   r"   r#   r'     s    z%TestNumericalInverseHermite.dist0.cdfc                 C   s   dS r   r"   r   r"   r"   r#   r     s    z)TestNumericalInverseHermite.dist0.supportNr   r"   r"   r"   r#   r     s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z!TestNumericalInverseHermite.dist1c                 C   s\   |dkr&t dt j | d t j S |dk r2dS |dkrXt dt j | d t j S d S )Nr   r   r   rA   rN  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 r4dS |dkr\t dt j | t j t j S d S )Nr   r   rA   r   r   rQ  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 r0dS |dkrTddt dt j |   S d S )Nr   g      ?rF   r   rA   r   r   r  r   r"   r"   r#   r'     s    z%TestNumericalInverseHermite.dist1.cdfc                 C   s   dS )N)r   r   r"   r   r"   r"   r#   r     s    z)TestNumericalInverseHermite.dist1.supportNr   r"   r"   r"   r#   r     s   r   r   rG   rT  rF   r   g      пg      ?g      ?r   rr  r3   r   c                 C   s   t ||dd}t||| d S )Nr   )rr  rW   )r   r   )r    r,   r   rr  rd   r"   r"   r#   r     s    z&TestNumericalInverseHermite.test_basicrH   c              	   C   s,   t j||d tt |d W 5 Q R X d S r  )rN   rO   r   r   r  r"   r"   r#   r	     s    z0TestNumericalInverseHermite.test_inf_nan_domainsc           
      C   s   ddddh}ddddd	d
ddddddh}||kr:t d ||krLt d tjd tt|| }t|}tj	d}t
t|||| t|| }t
t|||| }	|dk st|	dk std S )NrZ  r[  rX  Zskewnormbetar\  Zgeninvgaussr]  ZnctZnorminvgaussZgenhyperbolicrV  rW  rY  ZinvgaussZwaldzDistribution is too slowz)Fails - usually due to inaccurate CDF/PDFr   r4   :0yE>r   )rN   r0  r   r   rZ   r[   rL   r   r   Zrandmaxr   r   r'   r   )
r    r4  shapesZ
slow_distsr`  r,   fnir!   Zp_tolZu_tolr"   r"   r#   basic_test_all_scipy_dists%  s,    
     

0 z6TestNumericalInverseHermite.basic_test_all_scipy_distszignore::RuntimeWarning)r4  r  c                 C   s   |  || d S r&   r  )r    r4  r  r"   r"   r#   ra  >  s    z6TestNumericalInverseHermite.test_basic_all_scipy_distsc                 C   s   |  dd d S )NZ	truncnorm)r   rG   r  r   r"   r"   r#   test_basic_truncnorm_gh17155F  s    z8TestNumericalInverseHermite.test_basic_truncnorm_gh17155c              	   C   s   d}t jt|d tt dd W 5 Q R X d}t jt|d td W 5 Q R X d}t jt|d tt dd	 W 5 Q R X d S )
Nz"`order` must be either 1, 3, or 5.rI   rG   rs  z`cdf` required but not foundr   z!could not convert string to floatZekkirg  )rN   rO   rj   r   r   )r    rJ   r"   r"   r#   r   J  s    z1TestNumericalInverseHermite.test_input_validationNr   )   )r  )r   r      r  rd   r   c           
      C   sp   t  }t|}t|}|j||d}|d k	r:|j|ks:t|d k	rlt|}|j|d}tj	
|}	t||	 d S )N)r   rW   )r   )r   r   r   rY   r   r   r   r   r   r   r   r   )
r    rd   r   r   r,   r  r_   rY   r   ra   r"   r"   r#   test_RVS\  s    z$TestNumericalInverseHermite.test_RVSc              	   C   sF   d}d}t jt|d ttj|  W 5 Q R X 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 tailrI   r  rg  )rN   r   r   r   r   r  )r    r  rJ   r"   r"   r#   test_inaccurate_CDFm  s
    z/TestNumericalInverseHermite.test_inaccurate_CDFc                 C   s<   t  }t|}t }t|}t|jdd|jdd d S )Nr   rc   )r   r   r   r   r   rY   )r    r   Zfni1r   Zfni2r"   r"   r#   test_custom_distribution{  s
    z4TestNumericalInverseHermite.test_custom_distributionrA   r   rd  r   r   r   rB   rC   r   r   c              	   C   s   t  }t|dd}t L}|td |td |td |td ||}tj|}W 5 Q R X t||ddd	 |j	|j	kst
d S )
Nr   rg  r  r  r  r  g&.>gLa㧝=r   )r   r   r   r   r   r   r   r   r   r   r   ri  r"   r"   r#   rj    s    
z$TestNumericalInverseHermite.test_ppfc              	   C   s   t  }t|dd}| \}}|dk s*t||ks6tt }|t t|dd}W 5 Q R X | \}}|dk svt||kstd S rl  )r   r   rm  r   r   r   r   )r    r,   rd   rn  ro  r   r"   r"   r#   rp    s    
z(TestNumericalInverseHermite.test_u_error))r)   r*   r+   r   r   r   r   r   r!  r"  r%  rN   r   r   r&  r   r)  r	  r  filterwarningsr|  r   ra  r  r   rZ   r\   Zrngsappendr   r   r   r  r  r  r   r>   r<   r   rj  rp  r"   r"   r"   r#   r~    sP   & 



  
r~  c                   @   s  e Zd Zdddh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dddg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+  r,  r-  c              	   C   s<   dddg}t j }tt t||dd W 5 Q R X d S )Nr   333333?333333?r2   rW   Zguide_factorr   rZ   r   rN   r   r   r	   r    r   r   r"   r"   r#   $test_guide_factor_gt3_raises_warning  s    

z;TestDiscreteGuideTable.test_guide_factor_gt3_raises_warningc              	   C   s<   dddg}t j }tt t||dd W 5 Q R X d S )Nr   r  r  r   r  r  r  r"   r"   r#   %test_guide_factor_zero_raises_warning  s    

z<TestDiscreteGuideTable.test_guide_factor_zero_raises_warningc              	   C   s<   dddg}t j }tt t||dd W 5 Q R X d S )Nr   r  r  r   r  r  r  r"   r"   r#   )test_negative_guide_factor_raises_warning  s    

z@TestDiscreteGuideTable.test_negative_guide_factor_raises_warningr.  c           
      C   s   || j krd}t| t|ts(|}n
tt|}|| }| }t	|d |d  sbtd t
|d |d d }||}|d}t|dd}	t|	|| d S )NzYDGT fails on these probably because of large domains and small computation errors in PMF.rF   r   z$DGT only works with a finite domain.r   r   rc   )r/  rN   r0  r1  r2  rL   r   r   r   r   r   r   r	   r   r3  r"   r"   r#   r     s    






z!TestDiscreteGuideTable.test_basicr   rF   rd  r   r   r   rB   rC   r   r3   r   r   c           	   	   C   s   d\}}t ||}t|dd}t P}|td |td |td |td ||}t j|||}W 5 Q R X t|j|j t|| d S )N)r   r   r   rc   r  r  r  r  )	r   r   r	   r   r   r   r   r   r   )	r    r   npr,   rd   r   r  r  r"   r"   r#   rj    s    
zTestDiscreteGuideTable.test_ppfr<  c              	   C   s&   t jt|d t| W 5 Q R X d S r=  )rN   rO   rj   r	   r?  r"   r"   r#   r@    s    z"TestDiscreteGuideTable.test_bad_pvrK   c              	   C   s2   t jtdd ttdd|d W 5 Q R X d S rA  )rN   rO   rj   r	   r   r   rB  r"   r"   r#   rC    s    z&TestDiscreteGuideTable.test_inf_domainN)r)   r*   r+   r/  r  r  r  rN   r   r   r   r   r   r   r>   r<   r   rj  rH  r@  rI  rC  r"   r"   r"   r#   r    s6   	
  

$ 
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                   @   s$   e Zd Zdd Zdd Zdd ZdS )zTestSimpleRatioUniforms.distc                 C   s   || _ || _d S r&   )r   r0   r   r"   r"   r#   ri   "  s    z%TestSimpleRatioUniforms.dist.__init__c                 C   s&   || j 8 }dt|d  }d| | S r   r   r   r"   r"   r#   r$   &  s    
z TestSimpleRatioUniforms.dist.pdfc                 C   s2   || j 8 }|dkrdd|  S ddd|   S d S r   r   r   r"   r"   r#   r'   +  s    
z TestSimpleRatioUniforms.dist.cdfN)r)   r*   r+   ri   r$   r'   r"   r"   r"   r#   r,   !  s   r,   rA   r   r   c                 C   sF   t ||jdd}t||| t ||j||jdd}t||| d S )Nr   )r0   rW   )r0   Zcdf_at_moderW   )r   r0   r   r'   rU  r"   r"   r#   r   9  s    
z"TestSimpleRatioUniforms.test_basicrH   c              	   C   s,   t j||d tt |d W 5 Q R X d S r  )rN   rO   r   r   r  r"   r"   r#   r	  E  s    z,TestSimpleRatioUniforms.test_inf_nan_domainsc              	   C   s.   t jtdd tt ddd W 5 Q R X d S )Nz`pdf_area` must be > 0rI   r   r   )r0   Zpdf_area)rN   rO   rj   r   r   r   r"   r"   r#   rE  J  s    z%TestSimpleRatioUniforms.test_bad_argsN)r)   r*   r+   r,   r   r   r<   r"  r#  r%  rN   r   r   r&  r   r)  r	  rE  r"   r"   r"   r#   r    s   




r  )Jr{   r   rN   copyr   r   r   ry  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_methodsimplementationnameversionZfloaterrrG  rF  r'  r(  r}  r>   r<   rH  rj   Zbad_sized_domainsZbad_domainsr)  Znan_domainsr   r   rU   rb   re   r   r   r   r   r   r   r   r   r   r   r*  rJ  r~  r  r  r"   r"   r"   r#   <module>   s   $		

	
1
 




[ ?n y Wi