o
    1&i(                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlZd dl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 d dlmZ dZdd	 Zd
d Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'd d! Z(d"d# Z)d$d% Z*d&d' Z+d(d) Z,d*d+ Z-d,d- Z.d.d/ Z/d0d1 Z0d2d3 Z1d4d5 Z2d6d7 Z3d8d9 Z4e3d:Z5e1d;Z6e2d<Z7e3d=Z8e1d>Z9e2d?Z:d@dA Z;dBdC Z<dDdE Z=dFdG Z>dHdI Z?G dJdK dKeZ@G dLdM dMe@ZAG dNdO dOe@ZBG dPdQ dQe@ZCG dRdS dSe@ZDG dTdU dUe@ZEG dVdW dWe@ZFG dXdY dYe@ZGedZdZd[d\d] ZHd^ZIedZdZd[d_d` ZJG dadb dbeZKG dcdd ddeKZLeMejNdekdfG dgdh dheKZOG didj djeZPeQdkkrveR  dS dS )l    N)dedent)jit
_helperlibnjit)types)TestCasecompile_functiontag)TypingErrorp  c                   C      t  S N)r   Zrnd_get_py_state_ptr r   r   BC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_random.pyget_py_state_ptr      r   c                   C   r   r   )r   Zrnd_get_np_state_ptrr   r   r   r   get_np_state_ptr   r   r   c                 C      t j| S r   nprandomrandintar   r   r   numpy_randint1#      r   c                 C      t j| |S r   r   r   br   r   r   numpy_randint2&      r   c                 C      t | |S r   )r   r   r   r   r   r   random_randint)   r   r"   c                 C   s
   t | S r   r   	randranger   r   r   r   random_randrange1,      
r%   c                 C   r!   r   r#   r   r   r   r   random_randrange2/   r   r'   c                 C   s   t | ||S r   r#   )r   r   cr   r   r   random_randrange32   r    r)   c                 C   r   r   r   r   choicer   r   r   r   numpy_choice15   r   r,   c                 C      t jj| |dS Nsizer*   r   r0   r   r   r   numpy_choice28      r2   c                 C      t jj| ||dS )N)r0   replacer*   )r   r0   r5   r   r   r   numpy_choice3;      r6   c                 C   r   r   r   r   Zmultinomial)npvalsr   r   r   numpy_multinomial2>   r    r;   c                 C   r4   )N)r:   r0   r8   r9   r:   r0   r   r   r   numpy_multinomial3A   r7   r=   c                 C   r-   r.   r   r   Z	dirichletalphar0   r   r   r   numpy_dirichletD   r3   rA   c                 C   r   r   r>   )r@   r   r   r   numpy_dirichlet_defaultG   r   rB   c                 C   r4   r.   r   r   Znoncentral_chisquaredfnoncr0   r   r   r   numpy_noncentral_chisquareJ   r7   rG   c                 C   r   r   rC   )rE   rF   r   r   r   "numpy_noncentral_chisquare_defaultM   r    rH   c                 C   s>   t j|  t j||f}t j|  t j||}||fS r   )r   r   seedZrandrI   r   r   expectedgotr   r   r   numpy_check_randP   
   rM   c                 C   s>   t j|  t j||f}t j|  t j||}||fS r   )r   r   rI   standard_normalZrandnrJ   r   r   r   numpy_check_randnW   rN   rP   c                 C   s&   dt   }td|t }tdd|S )Nz@def func(%(argstring)s):
        return %(name)s(%(argstring)s)
funcTnopython)localsr   globalsr   )name	argstringcodepyfuncr   r   r   jit_with_args^   s
   rZ   c                 C   sR   d dd |D }d |}d| d|  d| d}td|t }td	d
|S )N,c                 S   s   g | ]	}| d | qS =r   ).0kwr   r   r   
<listcomp>g       z#jit_with_kwargs.<locals>.<listcomp>z	def func(z):
        return (z)
rQ   TrR   )joinr   rU   r   )rV   Z
kwarg_listZcall_args_with_kwargs	signaturerX   rY   r   r   r   jit_with_kwargse   s   
re   c                 C   
   t | dS )N rZ   rV   r   r   r   jit_nullaryo   r&   rj   c                 C   rf   )Nr   rh   ri   r   r   r   	jit_unaryr   r&   rk   c                 C   rf   )Nza, brh   ri   r   r   r   
jit_binaryu   r&   rl   c                 C   rf   )Nza, b, crh   ri   r   r   r   jit_ternaryx   r&   rm   random.gausszrandom.randomzrandom.seednp.random.normalnp.random.randomnp.random.seedc                 C   s>   |   d }|dd |d }}t||t|f ||fS )z?
    Copy state of Python random *r* to Numba state *ptr*.
       N)getstater   rnd_set_statelist)rptrmtintsindexr   r   r   _copy_py_state   s   r|   c                 C   s6   |   dd \}}t||dd |D f ||fS )z>
    Copy state of Numpy random *r* to Numba state *ptr*.
    rr      c                 S   s   g | ]}t |qS r   )intr^   xr   r   r   r`          z"_copy_np_state.<locals>.<listcomp>)	get_stater   ru   )rw   rx   rz   r{   r   r   r   _copy_np_state   s   r   c                 C   st   |   \}}}|d }|d d }t|dksJ dtj|dd|f}|d u r,|d7 }n|d|f7 }tj| d S )Nrs   r   ZMT19937uint32dtype)r           rr   )rt   lenr   arrayr   Z	set_state)rw   _verZmt_stZ_gauss_nextZmt_posZmt_intsZnp_str   r   r   sync_to_numpy   s   
r   c                 C   s   d|  |d d S )N       @      ?)gammavariate)rw   rE   r   r   r   py_chisquare   s   r   c                 C   s   t | || t | ||  S r   )r   )rw   numdenomr   r   r   py_f   s   r   c                   @   s    e Zd ZdddZdddZdS )BaseTest   c                 C   s   t |}t|| |S r   )r   Randomr|   selfrx   rI   rw   r   r   r   _follow_cpython   s   

zBaseTest._follow_cpythonc                 C   s   t j|}t|| |S r   )r   r   RandomStater   r   r   r   r   _follow_numpy   s   
zBaseTest._follow_numpyNr   )__name__
__module____qualname__r   r   r   r   r   r   r      s    
r   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )TestInternalsz9
    Test low-level internals of the implementation.
    c                 C   s   t |}|\}}| |t | |t | t|t |d t }dd ttD }t 	|||f | t |||f d S )Ni c                 S   s   g | ]}|d  qS )r}   r   r^   ir   r   r   r`      r   z6TestInternals._check_get_set_state.<locals>.<listcomp>)
r   rnd_get_stateassertIsInstancer~   rv   assertEqualr   Nrangeru   )r   rx   stater   rz   jr   r   r   _check_get_set_state   s   
z"TestInternals._check_get_set_statec                 C   s~   t  }t||\}}t|td dD ]}|   qt| | d }|d d |d }}| t	|d t
| d S )Nrr   r   rs   )r   r   r|   r   r   r   Zrnd_shufflert   r   r   rv   )r   rx   rw   rz   r{   r   ry   r   r   r   _check_shuffle   s   

zTestInternals._check_shufflec                 C   sr   t j }dD ]/}|t | | }t|d }|d }|tks%J t	|| | 
t|||f qd S )N)r   rr   }   l    rr   r   )r   r   r   rI   r   r   rv   r   r   rnd_seedr   r   )r   rx   rw   r   strz   r{   r   r   r   _check_init   s   
zTestInternals._check_initc                 C   sd   g }t dD ]}t|d t|td |tt|d  q| t	t
|t	| d S )N
   r   i   rr   )r   r   r   osurandomappendtupler   r   r   set)r   rx   Zstatesr   r   r   r   _check_perturb   s   zTestInternals._check_perturbc                 C      |  t  d S r   )r   r   r   r   r   r   test_get_set_state   r3   z TestInternals.test_get_set_statec                 C   r   r   )r   r   r   r   r   r   test_shuffle   r3   zTestInternals.test_shufflec                 C   r   r   )r   r   r   r   r   r   	test_init   r3   zTestInternals.test_initc                 C   r   r   )r   r   r   r   r   r   test_perturb   r3   zTestInternals.test_perturbN)r   r   r   __doc__r   r   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d Zdd Zd	d
 Zdd Zdd Z	dd Z
		dddZ		dddZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zdd+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ Z dAdB Z!dCdD Z"dEdF Z#dGdH Z$dIdJ Z%dKdL Z&dMdN Z'dOdP Z(dQdR Z)dSdT Z*dUdV Z+dWdX Z,dYdZ Z-d[d\ Z.d]d^ Z/d_d` Z0dadb Z1dcdd Z2dedf Z3dgdh Z4didj Z5dkdl Z6dmdn Z7dodp Z8dqdr Z9dsdt Z:dudv Z;dwdx Z<dydz Z=d{d| Z>d}d~ Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdS )
TestRandomc              	   C   sX   t j }dD ]"}|t | || ttd D ]}| | |dd qqdS )z<
        Check seed()- and random()-like functions.
        r   rr   r   l    r   r   r   N)	r   r   r   rI   r   r   r   assertPreciseEqualuniform)r   seedfunc
randomfuncrw   r   r   r   r   r   _check_random_seed  s   
zTestRandom._check_random_seedc                 C   s   |  tt d S r   )r   random_seedrandom_randomr   r   r   r   test_random_random  r3   zTestRandom.test_random_randomc                 C   sP   |  tt |  ttd |  ttd |  ttd |  ttd d S Nnp.random.random_samplenp.random.ranfnp.random.sampleznp.random.rand)r   
numpy_seednumpy_randomrj   r   r   r   r   test_numpy_random  s
   zTestRandom.test_numpy_randomc              
   C   sX   t j }dD ]"}|t | || tdD ]}| |||dd| qqd S )Nr   r   r   r   )r   r   r   rI   r   r   r   r   )r   r   r   rw   r   r9   r   r   r   _check_random_sized   s   
zTestRandom._check_random_sizedc                 C   sD   |  ttd |  ttd |  ttd |  ttd d S r   )r   r   rk   r   r   r   r   test_numpy_random_sized*  s   z"TestRandom.test_numpy_random_sizedc                 C   s   d}t d dd t|D }td dd t|D }t d td dd t|D }| dd |D | | d	d |D | d S )
Nr   rr   c                 S      g | ]}t  qS r   )r   r   r   r   r   r`   4      z:TestRandom.test_independent_generators.<locals>.<listcomp>r   c                 S   r   r   )r   r   r   r   r   r`   6  r   c                 S   s   g | ]}t  t fqS r   )r   r   r   r   r   r   r`   9      c                 S      g | ]}|d  qS )r   r   r^   pr   r   r   r`   :  r   c                 S   r   rr   r   r   r   r   r   r`   ;  r   )r   r   r   r   )r   r   Z
py_numbersZ
np_numberspairsr   r   r   test_independent_generators0  s   z&TestRandom.test_independent_generatorsc                 C   sf   |  |}tddD ]}||}||}| || q
| t|d | t|d | t|d dS )z6
        Check a getrandbits()-like function.
        rr   A   i rs   N)r   r   getrandbitsr   assertRaisesOverflowError)r   rQ   rx   rw   nbitsrK   rL   r   r   r   _check_getrandbits=  s   

zTestRandom._check_getrandbitsc                 C      |  tdt  d S )Nzrandom.getrandbits)r   rk   r   r   r   r   r   test_random_getrandbitsK     z"TestRandom.test_random_getrandbitsr}   double   Nc           
         sf   t |sJ |D ](  fddt|D } fddt|D }	| j||	||d f d qd S )Nc                    s   g | ]}  qS r   r   r   )argsrQ   r   r   r`   W  r   z*TestRandom._check_dist.<locals>.<listcomp>c                    s&   g | ]}r d in  qS r   r   r   )r   pydtyperY   r   r   r`   X  s    for arguments %spreculpsmsgr   r   r   )
r   rQ   rY   Zargslistnitersr   r   r   results	pyresultsr   )r   rQ   r   rY   r   _check_distS     zTestRandom._check_distc           
         sf   t |sJ |D ]( fddt|D }fddt|D }	| j||	||df d qd S )Nc                    s   g | ]	} d i qS )r   r   r   )rQ   kwargsr   r   r`   a  ra   z1TestRandom._check_dist_kwargs.<locals>.<listcomp>c                    s4   g | ]}rdi  d indi  qS )r   r   r   r   )r   r   rY   r   r   r`   b  s    ,r   r   r   )
r   rQ   rY   Z
kwargslistr   r   r   r   r   r   r   )rQ   r   r   rY   r   _check_dist_kwargs]  r   zTestRandom._check_dist_kwargsc                 C   n   |  |}|dur| j||jg dtd d d |dur&| ||jdg |dur5| ||jdg dS dS )z0
        Check a gauss()-like function.
        Nr   r   )r         ?)g       r   r   r   r   r   r   )r   r   normalr   r   func2func1func0rx   rw   r   r   r   _check_gaussg     


zTestRandom._check_gaussc                 C      |  tdd d t  d S )Nrn   r   rl   r   r   r   r   r   test_random_gaussv  s   zTestRandom.test_random_gaussc                 C   r   )Nzrandom.normalvariater  r   r   r   r   test_random_normalvariatey  s   z$TestRandom.test_random_normalvariatec                 C   "   |  tdtdtdt  d S )Nro   )r   rl   rk   rj   r   r   r   r   r   test_numpy_normal  
   
zTestRandom.test_numpy_normalc                 C      |  d d tdt  d S )Nnp.random.standard_normalr   rj   r   r   r   r   r   test_numpy_standard_normal     z%TestRandom.test_numpy_standard_normalc                 C   r  )Nznp.random.randnr	  r   r   r   r   test_numpy_randn  r  zTestRandom.test_numpy_randnc                 C   r   )z9
        Check a lognormvariate()-like function.
        Nr   r   r   r   r   r   )r   r   	lognormalr   r   r   r   r   _check_lognormvariate  r   z TestRandom._check_lognormvariatec                 C   r   )Nzrandom.lognormvariate)r  rl   r   r   r   r   r   test_random_lognormvariate  s   
z%TestRandom.test_random_lognormvariatec                 C   r  )Nnp.random.lognormal)r  rl   rk   rj   r   r   r   r   r   test_numpy_lognormal  r  zTestRandom.test_numpy_lognormalc                    s  g }t dD ]}	||d ||dd |dur$||ddd q|r.| |j}
n| |j}
 fdddD }|rA|nd}|D ]E}| j||
|fgd|d	 | j||
d
d| fgd|d	 |dur| |d
d| d|
d
d| d | |d| dd|
d| dd qE| t	|d | t	|d | t	|dd | t	|dd |dur| t	|ddd | t	|ddd dS dS )z4
        Check a randrange()-like function.
        r    e   Nr}   c                    s   g | ]}| k r|qS r   r   )r^   w	max_widthr   r   r`     r   z/TestRandom._check_randrange.<locals>.<listcomp>)rr   r       l                    )r   r   r      r      rs   rr   )
r   r   r   r   r   r$   r   r   r   
ValueError)r   r   r   func3rx   r  is_numpytprz   r   rrwidthsr   widthr   r  r   _check_randrange  sF   zTestRandom._check_randrangec              	   C   sh   t jdft jdffD ]'\}}t|ft}t||ft}t|||ft}| |||t |d q
d S )N                    F)	r   int64int32r   r%   r'   r)   r&  r   )r   r"  r  cf1cf2cf3r   r   r   test_random_randrange  s   z TestRandom.test_random_randrangec              
   C   sb   t jtjdft jtjdffD ] \}}}t|ft}t||ft}| ||d t |d| qd S )Nr'  r(  T)	r   r)  r   r*  r   r   r   r&  r   )r   r"  Znp_tpr  r+  r,  r   r   r   test_numpy_randint  s   zTestRandom.test_numpy_randintc                 C   s   g }t dD ]
}||dd q| t|tt|| | |}dD ]}|d |kr.q%| j||j|gdd q%| t	|dd | t	|dd d	S )
z2
        Check a randint()-like function.
        r   r  r  )rr   r  )   r  )   r  rr   r      r   N)
r   r   r   r   r   r   r   r   r   r  )r   rQ   rx   r  rz   r   rw   r   r   r   r   _check_randint  s   
zTestRandom._check_randintc                 C   sB   t jdft jdffD ]\}}t||ft}| |t | q
d S )Nr'  r(  )r   r)  r*  r   r"   r4  r   )r   r"  r  cfr   r   r   test_random_randint  s   zTestRandom.test_random_randintc                 C   s"   |  |}| ||jg d dS )z2
        Check a uniform()-like function.
        ))      ?    .A)           @@)r7  r9  N)r   r   r   r   rQ   rx   rw   r   r   r   _check_uniform  s   

zTestRandom._check_uniformc                 C   s&   |  |}t||}| ||| dS )z
        Check any numpy distribution function. Does Numba use the same keyword
        argument names as Numpy?
        And given a fixed seed, do they both return the same samples?
        N)r   getattrr   )r   rQ   rx   distrib	paramlistrw   Zdistrib_method_of_numpyr   r   r   _check_any_distrib_kwargs  s   

z$TestRandom._check_any_distrib_kwargsc                 C   r   )Nzrandom.uniform)r<  rl   r   r   r   r   r   test_random_uniform  r   zTestRandom.test_random_uniformc                 C   r   )Nnp.random.uniform)r<  rl   r   r   r   r   r   test_numpy_uniform
  r   zTestRandom.test_numpy_uniformc              	   C   s:   | j tdddgt dddddd	ddddgd
 d S )NrB  lowhighr   r7  r8  )rD  rE  r9  r:  r?  r@  re   r   r   r   r   r   test_numpy_uniform_kwargs  s   
z$TestRandom.test_numpy_uniform_kwargsc                 C   s^   | j tdg dt dddddddddddddddd dddd dddd dgd	 d S )
NrB  rD  rE  r0   r   r7  r8  r   r9  r:  rF  rG  r   r   r   r   test_numpy_uniform_empty_size  s   






z(TestRandom.test_numpy_uniform_empty_sizec                 C   s<   |  |}|dur| ||jg d | ||jdg dS )z5
        Check a triangular()-like function.
        N)r7        @)r9  r7  )r7  r7  )r7  rL  皙@)r   r   
triangular)r   r   r   rx   rw   r   r   r   _check_triangular"  s   

zTestRandom._check_triangularc                 C      |  tdtdt  d S )Nzrandom.triangular)rO  rl   rm   r   r   r   r   r   test_random_triangular-     
z!TestRandom.test_random_triangularc                    s(   t d  fdd}| d |t  d S )Nnp.random.triangularc                    s    | ||S r   r   )lrw   mrN  r   r   <lambda>4      z2TestRandom.test_numpy_triangular.<locals>.<lambda>)rm   rO  r   )r   Zfixed_triangularr   rV  r   test_numpy_triangular2  s   z TestRandom.test_numpy_triangularc                 C   s   |  |}|dur| ||jg d |dur#| |d|dd |durG| t|dd | t|dd | t|dd | t|dd |dur[| t|d | t|d dS dS )z7
        Check a gammavariate()-like function.
        N)r         @)r   r7  rK  r7  r   r         )r   r   r   r   r   r  )r   r   r   rx   rw   r   r   r   _check_gammavariate7  s    

zTestRandom._check_gammavariatec                 C      |  tdd t  d S )Nzrandom.gammavariate)r]  rl   r   r   r   r   r   test_random_gammavariateL     z#TestRandom.test_random_gammavariatec                 C   s0   |  tdtdt  |  d tdt  d S )Nnp.random.gammanp.random.standard_gamma)r]  rl   rk   r   r   r   r   r   test_numpy_gammaP  s   
zTestRandom.test_numpy_gammac                 C   s`   |  |}| ||jdg | t|dd | t|dd | t|dd | t|dd dS )z6
        Check a betavariate()-like function.
        rZ  r   r   r\  N)r   r   betavariater   r  r;  r   r   r   _check_betavariateX  s   
zTestRandom._check_betavariatec                 C   r   )Nzrandom.betavariate)re  rl   r   r   r   r   r   test_random_betavariatee  r   z"TestRandom.test_random_betavariatec                 C   r   )Nnp.random.beta)re  rl   r   r   r   r   r   test_numpy_betah  r   zTestRandom.test_numpy_betac                 C   s    |  |}| ||jdg dS )z:
        Check a vonmisesvariate()-like function.
        rZ  N)r   r   vonmisesvariater;  r   r   r   _check_vonmisesvariatek  s   
z!TestRandom._check_vonmisesvariatec                 C   r   )Nzrandom.vonmisesvariate)rj  rl   r   r   r   r   r   test_random_vonmisesvariater     
z&TestRandom.test_random_vonmisesvariatec                 C   r   )Nnp.random.vonmises)rj  rl   r   r   r   r   r   test_numpy_vonmisesv  rl  zTestRandom.test_numpy_vonmisesc                 C   sD   |  |}dD ]}tdD ]}| j|||d| dd qqdS )z
        Check a expovariate()-like function.  Note the second argument
        is inversed compared to np.random.exponential().
        )g?r   r7  r}   rr   r   )r   N)r   r   r   exponential)r   rQ   rx   rw   lambdr   r   r   r   _check_expovariatez  s   
zTestRandom._check_expovariatec                 C   r   )Nzrandom.expovariate)rq  rk   r   r   r   r   r   test_random_expovariate  r   z"TestRandom.test_random_expovariatec                 C   sH   |  |}|dur| ||jg d |dur"| ||jdg dS dS )z6
        Check a exponential()-like function.
        N)r   r   r7  r   )r   r   ro  )r   r   r   rx   rw   r   r   r   _check_exponential  s   
zTestRandom._check_exponentialc                 C   rP  )Nnp.random.exponential)ru  rk   rj   r   r   r   r   r   test_numpy_exponential  rR  z!TestRandom.test_numpy_exponentialc                 C      |  d tdt  d S )Nnp.random.standard_exponential)ru  rj   r   r   r   r   r   test_numpy_standard_exponential  s   z*TestRandom.test_numpy_standard_exponentialc                 C   s"   |  |}| ||jddg dS )z8
        Check a paretovariate()-like function.
        r   )rL  N)r   r   paretovariater;  r   r   r   _check_paretovariate  s   
zTestRandom._check_paretovariatec                 C   r   )Nzrandom.paretovariate)r|  rk   r   r   r   r   r   test_random_paretovariate  r   z$TestRandom.test_random_paretovariatec                    s&   t d  fdd}| |t  d S )Nnp.random.paretoc                    s    | d S )Nr   r   r   paretor   r   rW    rX  z.TestRandom.test_numpy_pareto.<locals>.<lambda>)rk   r|  r   )r   Zfixed_paretor   r  r   test_numpy_pareto  s   zTestRandom.test_numpy_paretoc                 C   sZ   |  |}|dur| ||jdg |dur)tdD ]}| |d|dd qdS dS )z9
        Check a weibullvariate()-like function.
        NrZ  r}   r[  r   )r   r   weibullvariater   r   )r   r   r   rx   rw   r   r   r   r   _check_weibullvariate  s   


z TestRandom._check_weibullvariatec                 C   r^  )Nzrandom.weibullvariate)r  rl   r   r   r   r   r   test_random_weibullvariate  s   
z%TestRandom.test_random_weibullvariatec                 C   rx  )Nnp.random.weibull)r  rk   r   r   r   r   r   test_numpy_weibull  r`  zTestRandom.test_numpy_weibullc              	   C   s  t d}| t d}| ||jdg dD ][}| ||dd | ||d| dD ]D}|||}|dkr?|| }d	| }| |d | || || }d
| t	| }| ||| |||f | ||| |||f q,q| 
t|dd | 
t|dd | 
t|dd d S )Nnp.random.binomialr   )   g      ?)d     '  r   r   )	g-C6?皙?皙?g9?r   g㈵ ?皙??H.?r   rr   r}   rs   r   皙皙?)rl   r   r   r   binomialr   assertGreaterEqualassertLessEqualmathsqrtr   r  )r   r  rw   r9   r   rK   tolr   r   r   test_numpy_binomial  s*   
zTestRandom.test_numpy_binomialc                 C   2   t d}| t }| |tt|ddg d S )Nnp.random.chisquarert  r[  )rk   r   r   r   	functoolspartialr   )r   	chisquarerw   r   r   r   test_numpy_chisquare  s   
zTestRandom.test_numpy_chisquarec                 C   r  )Nnp.random.fr   r7  )r7  r  )rl   r   r   r   r  r  r   )r   frw   r   r   r   test_numpy_f  s
   zTestRandom.test_numpy_fc                    s0  t d | t d | t d | t d d} fddt|D }| |dg|   fd	dt|D }|d}| ||d
  | || | dd |D   fddt|D }| 	dd |D   fddt|D }| 	dd |D   fddt|D }| 	dd |D  d S )Nnp.random.geometricg      r   gjt?   c                       g | ]} d qS rs  r   r   Zgeomr   r   r`     r   z3TestRandom.test_numpy_geometric.<locals>.<listcomp>rr   c                    r  r  r   r   r  r   r   r`     r   r   c                 S      g | ]}|d kr|qS )r  r   r   r   r   r   r`     r   c                    r  )r  r   r   r  r   r   r`     r   c                 S   r  )r3  r   r   r   r   r   r`     r   c                    r  )g{Gz?r   r   r  r   r   r`     r   c                 S   r  )2   r   r   r   r   r   r`     r   c                    r  )gV瞯<r   r   r  r   r   r`     r   c                 S   r  )        r   r   r   r   r   r`     r   )
rk   r   r  r   r   countr  
assertLessZassertFalse
assertTrue)r   r   rw   r9   r   r  r   test_numpy_geometric  s$   
zTestRandom.test_numpy_geometricc                 C   s,   t d}| t }| ||jddg d S )Nnp.random.gumbelr   r         rL  )rl   r   r   r   gumbel)r   r  rw   r   r   r   test_numpy_gumbel  s   zTestRandom.test_numpy_gumbelc                 C   s2   | j tdddgt dddddd	dgd
 d S )Nr  locscaler  r   r   )r  r  r  rL  r>  r?  rG  r   r   r   r   test_numpy_gumbel_kwargs  s   
z#TestRandom.test_numpy_gumbel_kwargsc                    s  t d | t }| j |jddgdd  fddtdD }| td	d
 |D | | t	
|d | t	
|d  fddtdD }| tdd
 |D | | t	
|d  fddtdD }| tdd
 |D | | t	
|d d S )Nnp.random.hypergeometricr  r  r   )r  r  r      r   c                    s   g | ]} d d dqS )r  r  r   r   hgr   r   r`     r   z8TestRandom.test_numpy_hypergeometric.<locals>.<listcomp>r  c                 s        | ]}|d ko|dkV  qdS r   r  Nr   r   r   r   r   	<genexpr>      z7TestRandom.test_numpy_hypergeometric.<locals>.<genexpr>g      D@g      N@c                       g | ]} d ddqS )r  順 r  r   r   r  r   r   r`     r   c                 s   r  r  r   r   r   r   r   r    r        $@c                    r  )r  r  r  r   r   r  r   r   r`     r   c                 s   r  r  r   r   r   r   r   r    r  g     V@)rm   r   r   r   hypergeometricr   r  allr  r   meanr  r   rw   r   r  r   test_numpy_hypergeometric  s    
z$TestRandom.test_numpy_hypergeometricc                 C   V   |  t }| td|jddg | td|jddg | td|jdg d S )Nnp.random.laplacer  r  r   r  r   )r   r   r   rl   laplacerk   rj   r  r   r   r   test_numpy_laplace     zTestRandom.test_numpy_laplacec                 C   r  )Nnp.random.logisticr  r  r  r  r   )r   r   r   rl   logisticrk   rj   r  r   r   r   test_numpy_logistic&  r  zTestRandom.test_numpy_logisticc                    s   |  t }td | j |jg ddd | j t dd}|  fddtd	D g d
 | t d | t d | t d d S )Nnp.random.logseries)r  )gGz?)r  r  r   rr   rI   c                    r  )g{?r   r   	logseriesr   r   r`   7  r   z3TestRandom.test_numpy_logseries.<locals>.<listcomp>r   )
ivxi- r  i  in i)l   &ci܀oirH i  r   r  r  )	r   r   rk   r   r  r   r   r   r  r  r   r  r   test_numpy_logseries.  s   
zTestRandom.test_numpy_logseriesc                 C   s>   |  t }td}| j||jg ddd | t|d d S )Nnp.random.poisson)r  r   r   )r  )g     $@r  r   r  )r   r   rk   r   poissonr   r  )r   rw   r  r   r   r   test_numpy_poisson>  s   
zTestRandom.test_numpy_poissonc                    s  |  t d td |  fddtdD g d |  fddtdD g d |  fd	dtdD g d
 |  fddtdD g d t fddtdD }| |d | |d | 	t
 dd | 	t
 dd | 	t
 dd | 	t
 dd d S )Nr   np.random.negative_binomialc                       g | ]} d dqS )r   r  r   r   Znegbinr   r   r`   J      z;TestRandom.test_numpy_negative_binomial.<locals>.<listcomp>r   )
r   r}   rr   r  r   rr   r   rr   r   r   c                    r  )r   r  r   r   r  r   r   r`   L  r  )
7   G   8   9   r  r  "   r  e   C   c                    r  )r  r  r   r   r  r   r   r`   N  r  )
i#  i!  iy#  iL$  i"  i#  i#  iF"  i"  i#  c                    r  )333333?r  r   r   r  r   r   r`   Q  r  )
r   r      r3  r3  r   r   r   rr   r   c                    r  )i ʚ;r  r   r   r  r   r   r`   S  s    r  g   | Bg   $s Br   rs   r  r  )r   r   rl   r   r   r   r  ZassertGreaterr  r   r  )r   rU  r   r  r   test_numpy_negative_binomialG  s.   z'TestRandom.test_numpy_negative_binomialc                 C   sH   |  t }td}| ||jg d | t|d | t|d d S )Nnp.random.power)r  r   r  )g      @r   r  )r   r   rk   r   powerr   r  )r   rw   r  r   r   r   test_numpy_power\  s   
zTestRandom.test_numpy_powerc                 C   sb   |  t }td}td}| ||jg d | ||jdg | t|d | t|d d S )Nnp.random.rayleigh)r  r  )g      9@)r:  r   r   r  )r   r   rk   rj   r   rayleighr   r  )r   rw   Z	rayleigh1Z	rayleigh0r   r   r   test_numpy_rayleighd  s   
zTestRandom.test_numpy_rayleighc                 C   s*   |  t }td}| ||jdg d S )Nnp.random.standard_cauchyr   )r   r   rj   r   standard_cauchy)r   rw   Zcauchyr   r   r   test_numpy_standard_cauchyn  s   z%TestRandom.test_numpy_standard_cauchyc                    sD   |  t }td t fddtdD }| t|d d S )Nnp.random.standard_tc                    r  )r  r   r   Z
standard_tr   r   r`   y  r   z4TestRandom.test_numpy_standard_t.<locals>.<listcomp>r  r   )r   r   rk   r   r  r   r  abs)r   rw   Zavgr   r  r   test_numpy_standard_ts  s   z TestRandom.test_numpy_standard_tc                 C   sl   |  t }td}| ||jddg | t|dd | t|dd | t|dd | t|dd d S )Nnp.random.waldr   )r         @r   r   r  )r   r   rl   r   waldr   r  )r   rw   r  r   r   r   test_numpy_wald}  s   zTestRandom.test_numpy_waldc                 C   sv   t dddg}| j|t dddddddgd	 | t|d
d | t|dd | t|dd
 | t|dd d S )Nr  r  r  r  r   )r  r  r   r  r  r   r  )re   r@  r   r   r  )r   Znumba_versionr   r   r   test_numpy_wald_kwargs  s   z!TestRandom.test_numpy_wald_kwargsc                 C   sH   |  t }td}| j||jddgdd dD ]	}| t|| qd S )Nnp.random.zipfrt  r  r  r   )r   r   r   r  )r   r   rk   r   zipfr   r  )r   rw   r  valr   r   r   test_numpy_zipf  s   zTestRandom.test_numpy_zipfc                 C   s
  t dt ddg}|r| |}n| |}|D ])}tdD ]"}| }| }	|| |s9t|jdkrD|	|	 | 
||	 q"q|d }| }
|t|
 | t|t|
 | t|t|
 |   |td W d   dS 1 s~w   Y  dS )	z=
        Check a shuffle()-like function for arrays.
        r2      )r  r3  r}   rr   r   s   xyzN)r   arangereshaper   r   r   copyr   shapeshuffler   
memoryviewassertNotEqualrv   r   sortedZassertTypingError)r   rQ   rx   r!  arrsrw   r   r   rL   rK   r   r   r   r   r     s,   


"zTestRandom._check_shufflec                 C      |  tdt d d S )Nzrandom.shuffleF)r   rk   r   r   r   r   r   test_random_shuffle     zTestRandom.test_random_shufflec                 C   r  )Nznp.random.shuffleT)r   rk   r   r   r   r   r   test_numpy_shuffle  r  zTestRandom.test_numpy_shufflec           	      C   s   dt   }t }tdD ]/}tjtjd|gtjtjd}| \}}|j	dkr2t
d|j	| f |t|  q| t|d| dS )zI
        Check that the state is properly randomized at startup.
        zif 1:
            from numba.tests import test_random
            func = getattr(test_random, %(func_name)r)
            print(func(*%(func_args)r))
            r}   z-c)stdoutstderrr   z/process failed with code %s: stderr follows
%s
N)rT   r   r   
subprocessPopensys
executablePIPEcommunicate
returncodeAssertionErrordecodeaddfloatstripr   r   )	r   	func_nameZ	func_argsrX   numbersr   popenouterrr   r   r   _check_startup_randomness  s   
z$TestRandom._check_startup_randomnessc                 C      |  dd d S )Nr   r   r&  r   r   r   r   test_random_random_startup  r3   z%TestRandom.test_random_random_startupc                 C   r'  )Nrandom_gaussr   r(  r   r   r   r   test_random_gauss_startup  r3   z$TestRandom.test_random_gauss_startupc                 C   r'  )Nr   r   r(  r   r   r   r   test_numpy_random_startup  r3   z$TestRandom.test_numpy_random_startupc                 C   r'  )Nnumpy_normalr   r(  r   r   r   r   test_numpy_gauss_startup  r3   z#TestRandom.test_numpy_gauss_startupc                 C   s   t d}| t }dD ]'}t|}| }| |||| | |||| | || qtdddtddddtdddddg}|D ]}| }| |||| | || qSd S )	Nznp.random.permutation)r  r   r  r2  r   r   r     r}   $   )	rk   r   r   r   r  r  r   Zpermutationr  )r   rQ   rw   sr   r   r  r   r   r   test_numpy_random_permutation  s"   
z(TestRandom.test_numpy_random_permutation)r}   r   r   Nr   )Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r&  r.  r/  r4  r6  r<  r@  rA  rC  rH  rJ  rO  rQ  rY  r]  r_  rc  re  rf  rh  rj  rk  rn  rq  rr  ru  rw  rz  r|  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   r  r  r&  r)  r+  r,  r.  r2  r   r   r   r   r      s    





$		
		

	r   c                   @   s(  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHS )ITestRandomArrayszA
    Test array-producing variants of np.random.* functions.
    c                 C   s&   d|f }d dd | }t||S )Nnp.random.%s, abcd)rc   rZ   )r   funcnamenargsqualnamerW   r   r   r   _compile_array_dist  s   

z$TestRandomArrays._compile_array_distc           
      C   s   |  |t|d }| t }t||}dD ].}||f }|| }|| }	|jtdkr<|	jtdkr<||	j}| j||	ddd q|d }|| }|| }	| j||	ddd d	S )
zM
        Check returning an array according to a given distribution.
        rr   r  r   r}   r*  r)  r   r  r   r   r   N)	r:  r   r   r   r=  r   r   astyper   )
r   r7  scalar_argscfuncrw   rY   r0   r   rK   rL   r   r   r   _check_array_dist  s   

z"TestRandomArrays._check_array_distc                    s   |  |t|d }| t }t|d ||  fdd}|d }| }|| }	| j||	ddd d	D ])}
||
f }t|
}|j}t	|j
D ]}| ||< qJ|| }	| j||	ddd q6d
S )z
        Check returning an array according to a given gamma distribution,
        where we use CPython's implementation rather than NumPy's.
        rr   r   c                     s     S r   r   )_argsrY   Zpyfunc_argsr   r   rW    s    z:TestRandomArrays._check_array_dist_gamma.<locals>.<lambda>r   r   r  r=  r;  N)r:  r   r   r   r=  r   r   emptyflatr   r0   )r   r7  r?  Zextra_pyfunc_argsr@  rw   Zpyrandomr   rK   rL   r0   Zexpected_flatidxr   rC  r   _check_array_dist_gamma  s$   


z(TestRandomArrays._check_array_dist_gammac                 C   s   t jdd }| |t|d }d|f }dddt| }t||}dD ]3}||f }	|  ||	 }
|  tj||
jd	}|j	}t
|jD ]}|| ||< qI| j||
d
dd q(|  |d }	|| }|  ||	 }
| j||
d
dd dS )a  
        Check function returning an array against its scalar implementation.
        Because we use the CPython gamma distribution rather than the NumPy one,
        distributions which use the gamma distribution vary in ways that are
        difficult to compare. Instead, we compile both the array and scalar
        versions and check that the array is filled with the same values as
        we would expect from the scalar version.
        c                   S   s   t jd d S )Ni  )r   r   rI   r   r   r   r   reset0  s   z6TestRandomArrays._check_array_dist_self.<locals>.resetrr   r4  r5  r6  Nr;  r   r   r  r=  r   )numbar   r:  r   rc   rZ   r   rD  r   rE  r   r0   r   )r   r7  r?  rH  Z
array_funcr9  rW   Zscalar_funcr0   r   rL   rK   rE  rF  r   r   r   _check_array_dist_self'  s,   	



z'TestRandomArrays._check_array_dist_selfc                 C   s   |  dd}d\}}d}||||}| |tj | |j| | |jtdtdf | t	||k | t	||k  || d }|| d }| 
| ||  | | ||  d S )	Nr   r}   )r  r  r  r  r*  r)  r   r2  )r:  r   r   ndarrayr   r	  assertInr   r  r  r  r  r  )r   r@  rD  rE  r0   resr  r  r   r   r   r/  N  s   z#TestRandomArrays.test_numpy_randintc                 C   s   |  dd}d}||}| |tj | |j| | |jtd | t|dk | t|dk  | t	|dk | t	|dk |
 }| |d	 | |d
 d S )Nr   rr   rK  float64r   r   r  r  g?g?)r:  r   r   rL  r   r	  r   r  r  anyr  r  r  )r   r@  r0   rN  r  r   r   r   test_numpy_random_random^  s   z)TestRandomArrays.test_numpy_random_randomc                 C   r'  )NbetarZ  rJ  r   r   r   r   rh  r  r3   z TestRandomArrays.test_numpy_betac                 C   r'  )Nr  )r2  r   rA  r   r   r   r   r  u  r3   z$TestRandomArrays.test_numpy_binomialc                 C   r'  )Nr  rt  rS  r   r   r   r   r  x  r3   z%TestRandomArrays.test_numpy_chisquarec                 C   r'  )Nro  rt  rT  r   r   r   r   rw  {  r3   z'TestRandomArrays.test_numpy_exponentialc                 C   r'  )Nr  r  rS  r   r   r   r   r  ~  r3   zTestRandomArrays.test_numpy_fc                 C      |  ddd d S )Ngamma)r   r   r   rG  r   r   r   r   rc    r7   z!TestRandomArrays.test_numpy_gammac                 C   r'  )NZ	geometricrs  rT  r   r   r   r   r    r3   z%TestRandomArrays.test_numpy_geometricc                 C   r'  )Nr  r7  r   rT  r   r   r   r   r    r3   z"TestRandomArrays.test_numpy_gumbelc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z*TestRandomArrays.test_numpy_hypergeometricc                 C   r'  )Nr  rX  rT  r   r   r   r   r    r3   z#TestRandomArrays.test_numpy_laplacec                 C   r'  )Nr  rX  rT  r   r   r   r   r    r3   z$TestRandomArrays.test_numpy_logisticc                 C   r'  )Nr  )r7  r   rT  r   r   r   r   r    r3   z%TestRandomArrays.test_numpy_lognormalc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z%TestRandomArrays.test_numpy_logseriesc                 C   r'  )Nr   )r   r   rT  r   r   r   r   r    r3   z"TestRandomArrays.test_numpy_normalc                 C   r'  )Nr  r   rT  r   r   r   r   r    r3   z"TestRandomArrays.test_numpy_paretoc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z#TestRandomArrays.test_numpy_poissonc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z!TestRandomArrays.test_numpy_powerc                 C   <   t ddt}|ddd\}}| |jd | || d S NTrR   *   r   r}   r<  )r   rM   r   r	  r   r   r@  rK   rL   r   r   r   test_numpy_rand     z TestRandomArrays.test_numpy_randc                 C   rY  rZ  )r   rP   r   r	  r   r\  r   r   r   r    r^  z!TestRandomArrays.test_numpy_randnc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z$TestRandomArrays.test_numpy_rayleighc                 C   r'  )Nr  r   rT  r   r   r   r   r    r3   z+TestRandomArrays.test_numpy_standard_cauchyc                 C   r'  )NZstandard_exponentialr   rT  r   r   r   r   rz    r3   z0TestRandomArrays.test_numpy_standard_exponentialc                 C   rU  )NZstandard_gammar  rs  rW  r   r   r   r   test_numpy_standard_gamma  r7   z*TestRandomArrays.test_numpy_standard_gammac                 C   r'  )NrO   r   rT  r   r   r   r   r
    r3   z+TestRandomArrays.test_numpy_standard_normalc                 C   r'  )NrN  )r7  rM  rL  rT  r   r   r   r   rY    r3   z&TestRandomArrays.test_numpy_triangularc                 C   r'  )Nr   r  r  rT  r   r   r   r   rC    r3   z#TestRandomArrays.test_numpy_uniformc                 C   r'  )Nr  r`  rT  r   r   r   r   r    r3   z TestRandomArrays.test_numpy_waldc                 C   r'  )NZvonmisesrZ  rS  r   r   r   r   rn    r3   z$TestRandomArrays.test_numpy_vonmisesc                 C   r'  )Nr  r  rT  r   r   r   r   r    r3   z TestRandomArrays.test_numpy_zipfN)'r   r   r   r   r:  rA  rG  rJ  r/  rQ  rh  r  r  rw  r  rc  r  r  r  r  r  r  r  r  r  r  r  r]  r  r  r  rz  r_  r
  rY  rC  r  rn  r  r   r   r   r   r3    sJ    'r3  c                   @   s   e Zd ZdZd ddZdd Zdd Zd	d
 Zdd Zdd Z	d ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )!TestRandomChoicez 
    Test np.random.choice.
    Tc                 C   sh   t |}t |}| || | t|t| |r'| t|t|| dS | t|t|| dS )zD
        Check basic expectations about a batch of samples.
        N)r   r  r  r  rv   r  r   r   )r   poprN  r5   Zspopsresr   r   r   _check_results  s   zTestRandomChoice._check_resultsc                 C   sh   |  t|t|d  t|t| }t|}|D ]}|| }|  ||d  | ||d  qdS )5
        Check distribution of some samples.
        r  r   r   N)r  r   collectionsCounterr  )r   rb  ZsamplesZexpected_frequencyr(   valuer9   r   r   r   r     s   
zTestRandomChoice._check_distc                 C   s8   g }t ||k r|t| j7 }t ||k s|d| S )zk
        Accumulate array results produced by *func* until they reach
        *nresults* elements.
        N)r   rv   rE  )r   rQ   ZnresultsrN  r   r   r   _accumulate_array_results  s
   z*TestRandomChoice._accumulate_array_resultsc                    sf   t ddtt|} fddt|D }| ||  fddt|d D }| || dS )z.
        Check choice(a) against pop.
        TrR   c                       g | ]} qS r   r   r   r   r@  r   r   r`     r   z4TestRandomChoice._check_choice_1.<locals>.<listcomp>c                    rj  r   r   r   rk  r   r   r`     r   r  N)r   r,   r   r   rd  r   )r   r   rb  r9   rN  distr   rk  r   _check_choice_1  s   z TestRandomChoice._check_choice_1c                 C   s    d}t t|}| || dS )z"
        Test choice(int)
        r  N)rv   r   rm  r   r9   rb  r   r   r   test_choice_scalar_1	  s   z%TestRandomChoice.test_choice_scalar_1c                 C   "   t dd d }| || dS )z$
        Test choice(array)
        r  r   r  N)r   r  rm  r   rb  r   r   r   test_choice_array_1     z$TestRandomChoice.test_choice_array_1c                 C   sB   t |}t| j}| ||| | ||d }| || dS )zP
        Check array results produced by *func* and their distribution.
        r  N)r   rv   rE  rd  ri  r   )r   rQ   rb  r5   r9   rN  rl  r   r   r   _check_array_results  s
   z%TestRandomChoice._check_array_resultsc                    s   t ddtt|}|d d|d d f|d g}|D ]$ }ttr*nf}| |j| |  fdd| qdS )	z4
        Check choice(a, size) against pop.
        TrR   r   r}   rr   c                      s
    S r   r   r   r   r@  r0   r   r   rW  2  s   
 z2TestRandomChoice._check_choice_2.<locals>.<lambda>N)r   r2   r   
isinstancer   r   r	  rt  )r   r   rb  r9   sizesrN  expected_shaper   ru  r   _check_choice_2"  s   
z TestRandomChoice._check_choice_2c                 C      d}t |}| || dS )z(
        Test choice(int, size)
        r  Nr   r  ry  rn  r   r   r   test_choice_scalar_24     
z%TestRandomChoice.test_choice_scalar_2c                 C   rp  )z*
        Test choice(array, size)
        r  r   r  Nr{  rq  r   r   r   test_choice_array_2<  rs  z$TestRandomChoice.test_choice_array_2c           	   	      s  t ddtt|}|d d|d d fg}ddg}|D ]dD ]} |}ttr0nf}| |j| q!q|D ]|  fdd	| q>|D ]|  fd
d	|d qO|d d|d d ffD ]| t	  d W d   n1 sw   Y  qkdS )z=
        Check choice(a, size, replace) against pop.
        TrR   r   r}   rr   F)TFc                          dS )NTr   r   ru  r   r   rW  W  rX  z2TestRandomChoice._check_choice_3.<locals>.<lambda>c                      r  )NFr   r   ru  r   r   rW  Z  rX  N)
r   r6   r   rv  r   r   r	  rt  r   r  )	r   r   rb  r9   rw  Zreplacesr5   rN  rx  r   ru  r   _check_choice_3C  s(   z TestRandomChoice._check_choice_3c                 C   rz  )z1
        Test choice(int, size, replace)
        r  Nr   r  r  rn  r   r   r   test_choice_scalar_3a  r}  z%TestRandomChoice.test_choice_scalar_3c                 C   rp  )z3
        Test choice(array, size, replace)
        r  r   r  Nr  rq  r   r   r   test_choice_array_3i  rs  z$TestRandomChoice.test_choice_array_3c                 C   s~   t dddd }tjjdddtj}| }|d|}| }|d|}tj	|| tj	|| tj	|| d S )	NTrR   c                 S   sD   t jd t | dft j}t| D ]}t j|dd||< q|S )Ni9  r   F)r   r   rI   rD  r*  r   r+   )Zn_to_returnchoice_arrayr$  r   r   r   r   numba_randss  s
   z>TestRandomChoice.test_choice_follows_seed.<locals>.numba_randsi,  r  r/   r  )
r   r   r   r   r>  r*  r  Zpy_functestingassert_allclose)r   r  r  Ztmp_nprK   Ztmp_nbrL   r   r   r   test_choice_follows_seedp  s   

z)TestRandomChoice.test_choice_follows_seedN)T)r   r   r   r   rd  r   ri  rm  ro  rr  rt  ry  r|  r~  r  r  r  r  r   r   r   r   ra    s     



ra  c                   @   sP   e Zd ZdZejg dejdZee  Zdd Z	dd Z
dd	 Zd
d ZdS )TestRandomMultinomialz%
    Test np.random.multinomial.
    )rr   rr   rr   r   r}   rr   r   c                 C   s   |  |tj | |jt|f | |jtdtdf | | | t	||D ]&\}}| 
|d | || t|| }| 
||d  | ||d  q-dS )re  r*  r)  r   r   r   N)r   r   rL  r   r	  r   rM  r   sumzipr  r  r  )r   r9   r:   sampler   ZnexpZpexpr   r   r   _check_sample  s   z#TestRandomMultinomial._check_samplec                 C   s   t ddt}d| j}}|||}| ||| t|}|||}| ||| d}tjdd|d dgtjd}||  }|||}| ||| d	S )
z,
        Test multinomial(n, pvals)
        TrR   r  i@B rr   r   r  r   N)	r   r;   r:   r  rv   r   r   rO  r  )r   r@  r9   r:   rN  r   r   r   test_multinomial_2  s   


z(TestRandomMultinomial.test_multinomial_2c                 C   sX   t ddt}d| j}}d}||||}| |jd | |D ]	}| ||| q dS )z7
        Test multinomial(n, pvals, size: int)
        TrR   r  r   r   N)r   r=   r:   r   r	  r  r   r@  r9   r:   krN  r  r   r   r   test_multinomial_3_int  s   z,TestRandomMultinomial.test_multinomial_3_intc                 C   sl   t ddt}d| j}}d}||||}| |jdd | |d|jd fD ]	}| ||| q*dS )z9
        Test multinomial(n, pvals, size: tuple)
        TrR   r  )r}   r3  Nrs   )r   r=   r:   r   r	  r  r  r  r   r   r   test_multinomial_3_tuple  s   z.TestRandomMultinomial.test_multinomial_3_tupleN)r   r   r   r   r   r   rO  r:   r  r  r  r  r  r   r   r   r   r    s    r  c                   @   s@   e Zd Zejg dejdZdd Zdd Zdd Z	d	d
 Z
dS )TestRandomDirichlet)rr   rr   rr   r   r   c                 C   s   |  |tj | |jtj |du r| |jt| nt|t	u r/| |j
|t|f n| |j
|t|f  	 t|D ]}| |d | |d qA|du r`| j| ddd dS t|jddD ]
}| j|ddd qidS )zCheck output structureNr   rr   r  )Zplacesrs   )Zaxis)r   r   rL  r   r   rO  r0   r   typer~   r	  nditerr  r  ZassertAlmostEqualr  )r   r@   r0   r  r  Ztotalsr   r   r   r    s    z!TestRandomDirichlet._check_samplec                 C   sf   t ddt}| jt| jtjg dtjdtjg dtjdf}|D ]}||}| |d| q#dS )2
        Test dirichlet(alpha, size=None)
        TrR   rr   rr   r  rr   r   rr   rr   r7  rr   N)r   rB   r@   r   r   r   rO  r  )r   r@  alphasr@   rN  r   r   r   test_dirichlet_default  s   z*TestRandomDirichlet.test_dirichlet_defaultc                 C   sx   t ddt}d}| jt| jtjg dtjdtjg dtjdf}t||D ]\}}|||}| 	||| q)dS )r  TrR   )Nr   r   r   r  r   r  N)
r   rA   r@   r   r   r   rO  	itertoolsproductr  )r   r@  rw  r  r@   r0   rN  r   r   r   test_dirichlet  s   
z"TestRandomDirichlet.test_dirichletc              
   C   s   t ddt}td}| t}||d W d    n1 s w   Y  | dt|j | j}ddddd	d
t	
dt	dff}|D ]%}| t}||| W d    n1 s[w   Y  | dt|j qDd S )NTrR   )r   rr   rr   rr   zdirichlet: alpha must be > 0.0              @r7  r7  rr   r  rr   r  r  r}   r  zGnp.random.dirichlet(): size should be int or tuple of ints or None, got)r   rA   r   r   r  rM  str	exceptionr@   r   int8r)  r
   )r   r@  r@   raisesrw  r0   r   r   r   test_dirichlet_exceptions  s"   "z-TestRandomDirichlet.test_dirichlet_exceptionsN)r   r   r   r   r   rO  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d Zd	S )
TestRandomNoncentralChiSquarec                 C   s~   |d ur)|  |tj | |jtj t|tr!| |j|f n| |j| n|  |t	 t
|D ]}| |d q4d S Nr   )r   r   rL  r   r   rO  rv  r~   r	  r  r  r  )r   r0   r  r  r   r   r   r    s   
z+TestRandomNoncentralChiSquare._check_samplec                 C   sV   t ddt}d}|D ]\}}|||}| d| ||tj}| t| qdS )z@
        Test noncentral_chisquare(df, nonc, size=None)
        TrR   )r   rr   r0  )r  rr   )r  rr   )rr   r  N)r   rH   r  r   nanr  isnan)r   r@  inputsrE   rF   rN  r   r   r   !test_noncentral_chisquare_default)  s   
z?TestRandomNoncentralChiSquare.test_noncentral_chisquare_defaultc                 C   sn   t ddt}d}d}t||D ]#\\}}}||||}| || ||tj|}| t|	  qdS )z;
        Test noncentral_chisquare(df, nonc, size)
        TrR   )Nr   r  r  r  N)
r   rG   r  r  r  r   r  r  r  r  )r   r@  rw  r  rE   rF   r0   rN  r   r   r   test_noncentral_chisquare<  s   z7TestRandomNoncentralChiSquare.test_noncentral_chisquarec              
   C   s.  t ddt}d\}}| t}|||d W d    n1 s!w   Y  | dt|j d\}}| t}|||d W d    n1 sIw   Y  | dt|j d\}}dd	d
dddtdt	dff}|D ]&}| t
}|||| W d    n1 sw   Y  | dt|j qnd S )NTrR   )r   rr   rr   zdf <= 0)rr   rs   znonc < 0)rr   rr   r  r7  r  r  r  r}   r  zRnp.random.noncentral_chisquare(): size should be int or tuple of ints or None, got)r   rG   r   r  rM  r  r  r   r  r)  r
   )r   r@  rE   rF   r  rw  r0   r   r   r   $test_noncentral_chisquare_exceptionsP  s,   "zBTestRandomNoncentralChiSquare.test_noncentral_chisquare_exceptionsN)r   r   r   r  r  r  r  r   r   r   r   r    s
    r  T)rS   Znogilc                 C   s4   | dkr	t |  t|jD ]	}t d||< qd S )Nr   r  )r   rI   r   r0   r   )rI   r$  r   r   r   r   py_extract_randomnessg  s
   
r  r  c                 C   s<   | dkr
t j|  d}t|jD ]
}t jt||< qd S r  )r   r   rI   r   r0   r   _randint_limit)rI   r$  r1  r   r   r   r   np_extract_randomnessp  s   r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ConcurrencyBaseTestr  c                 C   s"   d|  df}t|  t|  d S )Nr[  rr   )_get_outputr  r  )r   r   r   r   r   setUp  s   zConcurrencyBaseTest.setUpc                 C   s   t j|t jdS )Nr   )r   Zzerosr   )r   r0   r   r   r   r    r3   zConcurrencyBaseTest._get_outputc                 C   sF   d}dt d }d}t jj| ||d t jj| ||d dS )z9
        Check statistical properties of output.
        r(  r  r   g?)rtolN)r   r  r  r  r  Zstd)r   r$  Zexpected_avgZexpected_stdr  r   r   r   check_output  s
   z ConcurrencyBaseTest.check_outputc                 C   s   |D ]}|  | q|rd}nt|}dd |D }dd |D }dd |D }| t||| | t||| | t||| d S )Nrr   c                 S      h | ]
}t |d d qS )Nr  r   r^   r$  r   r   r   	<setcomp>      z<ConcurrencyBaseTest.check_several_outputs.<locals>.<setcomp>c                 S   r  )r  Nr  r  r   r   r   r    r  c                 S   s   h | ]}|  qS r   )r  r  r   r   r   r    r   )r  r   r   )r   r   same_expectedr$  Zexpected_distinctZheadsZtailsZsumsr   r   r   check_several_outputs  s   z)ConcurrencyBaseTest.check_several_outputsN)r   r   r   _extract_iterationsr  r  r  r  r   r   r   r   r  z  s    r  c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )TestThreadsz3
    Check the PRNG behaves well with threads.
    c                    sp   fddt |d D  fddfddt |D }|D ]}|  q"| |D ]}|  q/S )zo
        Run *nthreads* threads extracting randomness with the given *seed*
        (no seeding if 0).
        c                    s   g | ]}   jqS r   r  r  r   r   r   r   r`         z2TestThreads.extract_in_threads.<locals>.<listcomp>rr   c                    s    |  d d S )NrI   r$  r   )r   )extract_randomnessr   rI   r   r   target  s   z.TestThreads.extract_in_threads.<locals>.targetc                    s   g | ]
}t j |fd qS ))r  r   )	threadingThreadr   r  r   r   r`     s    )r   startrc   )r   Znthreadsr  rI   threadsthr   )r  r   rI   r   r  r   extract_in_threads  s   




zTestThreads.extract_in_threadsc                 C   "   | j d|dd}| j|dd dS )z
        When initializing the PRNG the same way, each thread
        should produce the same sequence of random numbers,
        using independent states, regardless of parallel
        execution.
        r  r[  r  Tr  Nr  r  r   r  r   r   r   r   check_thread_safety  s   	zTestThreads.check_thread_safetyc                 C   r  )z
        The PRNG in new threads should be implicitly initialized with
        system entropy, if seed() wasn't called.
        r3  r   r  Fr  Nr  r  r   r   r   check_implicit_initialization  s   z)TestThreads.check_implicit_initializationc                 C      |  t d S r   )r  r  r   r   r   r   test_py_thread_safety  r    z!TestThreads.test_py_thread_safetyc                 C   r  r   )r  r  r   r   r   r   test_np_thread_safety  r    z!TestThreads.test_np_thread_safetyc                 C   r  r   r  r  r   r   r   r   test_py_implicit_initialization  r    z+TestThreads.test_py_implicit_initializationc                 C   r  r   r  r  r   r   r   r   test_np_implicit_initialization  r    z+TestThreads.test_np_implicit_initializationN)r   r   r   r   r  r  r  r  r  r  r  r   r   r   r   r    s    
r  ntz(Windows is not affected by fork() issuesc                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )TestProcessesz9
    Check the PRNG behaves well in child processes.
    Fc                    s   t  g } fddfddtt drt dnt fddt|D }|D ]}|  q/t|D ]}|jd	d
 q:|D ]}|  qH|  |D ]}t	|t
rfd|f  qW|S )z`
        Run *nprocs* processes extracting randomness
        without explicit seeding.
        c                     s    j}  d| d | S )Nr   r  r  )r$  )r  r   r   r   target_inner  s   z8TestProcesses.extract_in_processes.<locals>.target_innerc               
      s<   z }   |  W d S  ty } z  |  d }~ww r   )put	Exception)r$  e)qr  r   r   r    s   
z2TestProcesses.extract_in_processes.<locals>.targetget_contextforkc                    s   g | ]} j d qS )r  )Processr   )mpcr  r   r   r`     r  z6TestProcesses.extract_in_processes.<locals>.<listcomp>r  )timeoutzException in child: %s)multiprocessingQueuehasattrr  r   r  r   getrc   rv  r  Zfail)r   Znprocsr  r   Zprocsr   r   rN  r   )r  r  r  r   r  r  r   extract_in_processes  s,   




z"TestProcesses.extract_in_processesc                 C   s   |  d|}| j|dd dS )z
        The PRNG in new processes should be implicitly initialized
        with system entropy, to avoid reproducing the same sequences.
        r   Fr  N)r  r  r  r   r   r   r  )  s   z+TestProcesses.check_implicit_initializationc                 C   r  r   r  r   r   r   r   r  3  r    z-TestProcesses.test_py_implicit_initializationc                 C   r  r   r  r   r   r   r   r  6  r    z-TestProcesses.test_np_implicit_initializationN)	r   r   r   r   Z_numba_parallel_test_r  r  r  r  r   r   r   r   r    s    0
r  c                	   @   s  e Zd Zi dddddddddd	d
dddddddddddddddddddddddddddddddddddddddddddddd ddddd!dddd"d#d$ddd%dd&dd'd(dd$d)i d*dddd+d,ddddd-dddd.ddd/d0dddd1dddd2d3d4did5d4did6d4did7dddd8d4did9d:d;id<d4did=d4did>ddd?d@d4didAddddddBddCdddd2ddddDddddEdddddddFZdGdH ZdIdJ ZdKS )LTestNumPyRandomAPIrg  r   r   r}   )r   r   r0   r  rr   r  )r9   r   r0   r  )rE   r0   znp.random.choicer   r1   znp.random.dirichletr   r?   rv  )r  r0   r  )ZdfnumZdfdenr0   ra  )r	  r  r0   r  )r   r0   r  r   )r  r  r0   r  )ZngoodZnbadZnsampler0   r  r  r  )r  sigmar0   r  r   znp.random.multinomialr   r<   r  )r9   r   znp.random.noncentral_chisquarerD   ro   r~  r  )Zlamr0   r  znp.random.randintrI  rp   r0   r   r   r  r   rq   rI   r3  r  ry  rb  )r	  r0   r  r  g      @)leftmoderightr0   )mukappar0   )r  r  r0   )rS  rB  rm  r  r  r  c                 C   sv   | j  D ]3\}}ddd | D }td| d| d}i }t|dti| |d }|  t|d	 qd S )
Nr5  c                 S      g | ]\}}| d | qS r\   r   r^   r  vr   r   r   r`   }      z8TestNumPyRandomAPI.test_call_by_name.<locals>.<listcomp>7
                def foo():
                    return rb   )
                r   foor   )API_CALL_TESTSitemsrc   r   execr   r   compile)r   fnr   argstrtemplaterT  rQ   r   r   r   test_call_by_namer  s   

z$TestNumPyRandomAPI.test_call_by_namec           
      C   s   | j  D ]U\}}d|vrqd|d< ddd | D }td| d| d}i }t|d	ti| |d
 }| }t|d}| }	t|	tj	rS| 
|	j|j q| |	|j qd S )Nr0   r   r5  c                 S   r  r\   r   r  r   r   r   r`     r  zNTestNumPyRandomAPI.test_call_distributions_with_empty_size.<locals>.<listcomp>r  rb   r  r   r  )r  r  rc   r   r  r   r   r  rv  rL  r   r	  r   	__class__)
r   r  r   r   r  rT  rQ   Znp_valZnb_funcZnb_valr   r   r   'test_call_distributions_with_empty_size  s(   
z:TestNumPyRandomAPI.test_call_distributions_with_empty_sizeN)r   r   r   r  r  r  r   r   r   r   r  :  s    




	





"#$
%&'*+
,-
./


7r  __main__)Srf  r  r  r  r   r   r  r  r  r  textwrapr   numpyr   ZunittestrI  r   r   r   Z
numba.corer   Znumba.tests.supportr   r   r	   Znumba.core.errorsr
   r   r   r   r   r   r"   r%   r'   r)   r,   r2   r6   r;   r=   rA   rB   rG   rH   rM   rP   rZ   re   rj   rk   rl   rm   r*  r   r   r-  r   r   r|   r   r   r   r   r   r   r   r3  ra  r  r  r  r  r  r  r  r  ZskipIfrV   r  r  r   mainr   r   r   r   <module>   s    
	D     u a 7DK
R


	2BK
t