B
     \                 @   s|  d dl m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Zd dlm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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.e-d0Z/e+d1Z0e,d2Z1e-d3Z2e+d4Z3e,d5Z4d6d7 Z5d8d9 Z6d:d; Z7d<d= Z8d>d? Z9G d@dA dAeZ:G dBdC dCe:Z;G dDdE dEe:Z<G dFdG dGe:Z=G dHdI dIe:Z>G dJdK dKe:Z?edLdLdMdNdO Z@dPZAedLdLdMdQdR ZBG dSdT dTeZCG dUdV dVeCZDeEejFdWkdXG dYdZ dZeCZGeHd[krxeI  dS )\    )print_functionN)jit
_helperlibtypes)compile_isolated   )TestCasecompile_functiontagip  c               C   s   t  S )N)r   Zrnd_get_py_state_ptr r   r   6lib/python3.7/site-packages/numba/tests/test_random.pyget_py_state_ptr   s    r   c               C   s   t  S )N)r   Zrnd_get_np_state_ptrr   r   r   r   get_np_state_ptr   s    r   c             C   s   t j| S )N)nprandomrandint)ar   r   r   numpy_randint1    s    r   c             C   s   t j| |S )N)r   r   r   )r   br   r   r   numpy_randint2#   s    r   c             C   s   t | |S )N)r   r   )r   r   r   r   r   random_randint&   s    r   c             C   s
   t | S )N)r   	randrange)r   r   r   r   random_randrange1)   s    r   c             C   s   t | |S )N)r   r   )r   r   r   r   r   random_randrange2,   s    r   c             C   s   t | ||S )N)r   r   )r   r   cr   r   r   random_randrange3/   s    r   c             C   s   t j| S )N)r   r   choice)r   r   r   r   numpy_choice12   s    r   c             C   s   t jj| |dS )N)size)r   r   r   )r   r   r   r   r   numpy_choice25   s    r   c             C   s   t jj| ||dS )N)r   replace)r   r   r   )r   r   r    r   r   r   numpy_choice38   s    r!   c             C   s   t j| |S )N)r   r   multinomial)npvalsr   r   r   numpy_multinomial2;   s    r%   c             C   s   t jj| ||dS )N)r$   r   )r   r   r"   )r#   r$   r   r   r   r   numpy_multinomial3>   s    r&   c             C   s>   t j|  t j||f}t j|  t j||}||fS )N)r   r   seedZrand)r'   r   r   expectedgotr   r   r   numpy_check_randA   s
    r*   c             C   s>   t j|  t j||f}t j|  t j||}||fS )N)r   r   r'   standard_normalZrandn)r'   r   r   r(   r)   r   r   r   numpy_check_randnH   s
    r,   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_argsO   s    
r5   c             C   s
   t | dS )N )r5   )r1   r   r   r   jit_nullaryV   s    r7   c             C   s
   t | dS )Nr   )r5   )r1   r   r   r   	jit_unaryY   s    r8   c             C   s
   t | dS )Nza, b)r5   )r1   r   r   r   
jit_binary\   s    r9   c             C   s
   t | dS )Nza, b, c)r5   )r1   r   r   r   jit_ternary_   s    r:   zrandom.gausszrandom.randomzrandom.seedznp.random.normalznp.random.randomz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*.
    r   N)getstater   rnd_set_statelist)rptrmtintsindexr   r   r   _copy_py_statel   s    rD   c             C   s6   |   dd \}}t||dd |D f ||fS )z>
    Copy state of Numpy random *r* to Numba state *ptr*.
    r      c             S   s   g | ]}t |qS r   )int).0xr   r   r   
<listcomp>z   s    z"_copy_np_state.<locals>.<listcomp>)	get_stater   r=   )r?   r@   rB   rC   r   r   r   _copy_np_stateu   s    rK   c             C   st   |   \}}}|d }|d d }t|dks2tdtj|dd|f}|d krX|d7 }n|d|f7 }tj| d S )Nr;   ip  ZMT19937uint32)dtype)r   g        r   )r<   lenAssertionErrorr   arrayr   Z	set_state)r?   Z_verZmt_stZ_gauss_nextZmt_posZmt_intsZnp_str   r   r   sync_to_numpy}   s    
rQ   c             C   s   d|  |d d S )Ng       @g      ?)gammavariate)r?   Zdfr   r   r   py_chisquare   s    rS   c             C   s   t | || t | ||  S )N)rS   )r?   ZnumZdenomr   r   r   py_f   s    rT   c               @   s    e Zd ZdddZdddZdS )	BaseTest   c             C   s   t |}t|| |S )N)r   RandomrD   )selfr@   r'   r?   r   r   r   _follow_cpython   s    

zBaseTest._follow_cpythonc             C   s   t j|}t|| |S )N)r   r   RandomStaterK   )rX   r@   r'   r?   r   r   r   _follow_numpy   s    
zBaseTest._follow_numpyN)rV   )rV   )__name__
__module____qualname__rY   r[   r   r   r   r   rU      s   
rU   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 )rE   r   )rG   ir   r   r   rI      s    z6TestInternals._check_get_set_state.<locals>.<listcomp>)
r   rnd_get_stateassertIsInstancerF   r>   assertEqualrN   Nranger=   )rX   r@   stater`   rB   jr   r   r   _check_get_set_state   s    
z"TestInternals._check_get_set_statec             C   s   t  }t||\}}x t|td dD ]}|   q(W t| | d }|d d |d  }}| t	|d t
| d S )Nr   rV   r;   )r   rW   rD   re   rd   r   Zrnd_shuffler<   rc   ra   r>   )rX   r@   r?   rB   rC   r`   rA   r   r   r   _check_shuffle   s    
zTestInternals._check_shufflec             C   sv   t j }xfdD ]^}|t | | }t|d }|d }|tksLtt	
|| | t	|||f qW d S )N)r   r   }   l    r   rV   )r   r   rZ   r'   rL   rJ   r>   rd   rO   r   rnd_seedrc   ra   )rX   r@   r?   r`   strB   rC   r   r   r   _check_init   s    

zTestInternals._check_initc             C   sh   g }xFt dD ]:}t|d t|td |tt|d  qW | t	t
|t	| d S )N
   r   i   r   )re   r   rk   osurandomappendtuplera   rc   rN   set)rX   r@   Zstatesr`   r   r   r   _check_perturb   s    zTestInternals._check_perturbc             C   s   |  t  d S )N)rh   r   )rX   r   r   r   test_get_set_state   s    z TestInternals.test_get_set_statec             C   s   |  t  d S )N)ri   r   )rX   r   r   r   test_shuffle   s    zTestInternals.test_shufflec             C   s   |  t  d S )N)rm   r   )rX   r   r   r   	test_init   s    zTestInternals.test_initc             C   s   |  t  d S )N)rt   r   )rX   r   r   r   test_perturb   s    zTestInternals.test_perturbN)r\   r]   r^   __doc__rh   ri   rm   rt   ru   rv   rw   rx   r   r   r   r   r_      s   r_   c               @   s  e Zd Zdd Zeddd Zeddd Zdd	 Zd
d Zeddd Z	dddZ
dd Zeddd Zdd Zeddd Zeddd Zeddd Zd d! Zd"d# Zd$d% Zdd&d'Zedd(d) Zedd*d+ Zd,d- Zedd.d/ Zd0d1 Zedd2d3 Zedd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,dXdY Z-dZd[ Z.d\d] Z/d^d_ Z0d`da Z1dbdc Z2edddde Z3eddfdg Z4dhdi Z5djdk Z6dldm Z7dndo Z8dpdq Z9eddrds Z:dtdu Z;dvdw Z<dxdy Z=eddzd{ Z>d|d} Z?d~d Z@dd ZAdd ZBdd ZCdd ZDeddd ZEeddd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdS )
TestRandomc          	   C   s`   t j }xPdD ]H}|t | || x*ttd D ]}| | |dd q:W qW dS )z<
        Check seed()- and random()-like functions.
        )r   r   rj   l    rn   g        g      ?N)	r   r   rZ   r'   rL   re   rd   assertPreciseEqualuniform)rX   ZseedfuncZ
randomfuncr?   r`   rg   r   r   r   _check_random_seed   s    

zTestRandom._check_random_seed	importantc             C   s   |  tt d S )N)r}   random_seedrandom_random)rX   r   r   r   test_random_random   s    zTestRandom.test_random_randomc             C   sP   |  tt |  ttd |  ttd |  ttd |  ttd d S )Nznp.random.random_sampleznp.random.ranfznp.random.sampleznp.random.rand)r}   
numpy_seednumpy_randomr7   )rX   r   r   r   test_numpy_random   s
    zTestRandom.test_numpy_randomc             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 )
Nrn   r   c             S   s   g | ]
}t  qS r   )r   )rG   r`   r   r   r   rI     s    z:TestRandom.test_independent_generators.<locals>.<listcomp>rV   c             S   s   g | ]
}t  qS r   )r   )rG   r`   r   r   r   rI     s    c             S   s   g | ]}t  t fqS r   )r   r   )rG   r`   r   r   r   rI     s    c             S   s   g | ]}|d  qS )r   r   )rG   pr   r   r   rI     s    c             S   s   g | ]}|d  qS )r   r   )rG   r   r   r   r   rI     s    )r   re   r   r{   )rX   rd   Z
py_numbersZ
np_numbersZpairsr   r   r   test_independent_generators	  s    z&TestRandom.test_independent_generatorsc             C   sj   |  |}x0tddD ]"}||}||}| || qW | t|d | t|d | t|d dS )z6
        Check a getrandbits()-like function.
        r   A   i r;   N)rY   re   getrandbitsr{   assertRaisesOverflowError)rX   r-   r@   r?   Znbitsr(   r)   r   r   r   _check_getrandbits  s    

zTestRandom._check_getrandbitsc             C   s   |  tdt  d S )Nzrandom.getrandbits)r   r8   r   )rX   r   r   r   test_random_getrandbits$  s    z"TestRandom.test_random_getrandbitsrE   double   Nc       
         sj   t |stxX|D ]P  fddt|D } fddt|D }	| j||	||d f d qW d S )Nc                s   g | ]}  qS r   r   )rG   r`   )argsr-   r   r   rI   1  s    z*TestRandom._check_dist.<locals>.<listcomp>c                s&   g | ]}r d in  qS )rM   r   )rG   r`   )r   pydtyper4   r   r   rI   2  s   zfor arguments %s)preculpsmsg)rN   rO   re   r{   )
rX   r-   r4   Zargslistnitersr   r   r   resultsZ	pyresultsr   )r   r-   r   r4   r   _check_dist-  s    
zTestRandom._check_distc             C   sl   |  |}|dk	r4| j||jdddgtd d d |dk	rN| ||jdg |dk	rh| ||jd	g dS )
z0
        Check a gauss()-like function.
        N)g      ?g      ?)g       @g      ?)g       g      ?rV   rn   )r   )g      ?r   )r[   r   normalrd   )rX   func2func1func0r@   r?   r   r   r   _check_gauss7  s    

zTestRandom._check_gaussc             C   s   |  tdd d t  d S )Nzrandom.gauss)r   r9   r   )rX   r   r   r   test_random_gaussF  s    zTestRandom.test_random_gaussc             C   s   |  tdd d t  d S )Nzrandom.normalvariate)r   r9   r   )rX   r   r   r   test_random_normalvariateJ  s    z$TestRandom.test_random_normalvariatec             C   s"   |  tdtdtdt  d S )Nznp.random.normal)r   r9   r8   r7   r   )rX   r   r   r   test_numpy_normalP  s    
zTestRandom.test_numpy_normalc             C   s   |  d d tdt  d S )Nznp.random.standard_normal)r   r7   r   )rX   r   r   r   test_numpy_standard_normalW  s    z%TestRandom.test_numpy_standard_normalc             C   s   |  d d tdt  d S )Nznp.random.randn)r   r7   r   )rX   r   r   r   test_numpy_randn\  s    zTestRandom.test_numpy_randnc             C   sl   |  |}|dk	r4| j||jdddgtd d d |dk	rN| ||jdg |dk	rh| ||jd	g dS )
z9
        Check a lognormvariate()-like function.
        N)g      ?g      ?)g       @g      ?)g       g      ?rV   rn   )r   )g      ?r   )r[   r   	lognormalrd   )rX   r   r   r   r@   r?   r   r   r   _check_lognormvariatea  s    

z TestRandom._check_lognormvariatec             C   s   |  tdd d t  d S )Nzrandom.lognormvariate)r   r9   r   )rX   r   r   r   test_random_lognormvariatep  s    
z%TestRandom.test_random_lognormvariatec             C   s"   |  tdtdtdt  d S )Nznp.random.lognormal)r   r9   r8   r7   r   )rX   r   r   r   test_numpy_lognormalt  s    
zTestRandom.test_numpy_lognormalc                s  g }xHt dD ]<}	||d ||dd |dk	r||ddd qW | t|tt|| tjdkrN|r| |j}
n| 	|j
}
 fddd	D }|rtjd
kr|nd}x|D ]}| j||
|fgd|d | j||
dd| fgd|d |dk	r| |dd| d|
dd| d | |d| dd|
d| dd qW | t|d | t|d | t|dd | t|dd |dk	r| t|ddd | t|ddd dS )z4
        Check a randrange()-like function.
        rn   i e   NrE   )rE   c                s   g | ]}| k r|qS r   r   )rG   w)	max_widthr   r   rI     s    z/TestRandom._check_randrange.<locals>.<listcomp>)r   r      i  l        l            z1.11.0)r   r   rV      r      r;   r   )re   rq   rc   rN   rs   sysversion_infor[   r   rY   r   r   __version__r   r{   r   
ValueError)rX   r   r   func3r@   r   is_numpytprB   r`   ZrrZwidthsr   widthr   )r   r   _check_randrangez  s<    

zTestRandom._check_randrangec          	   C   sl   xft jdft jdfgD ]N\}}tt|f}tt||f}tt|||f}| |j|j|jt	 |d qW d S )Nl            l        F)
r   int64int32r   r   r   r   r   entry_pointr   )rX   r   r   cr1cr2Zcr3r   r   r   test_random_randrange  s    z TestRandom.test_random_randrangec          
   C   sf   x`t jtjdft jtjdfgD ]@\}}}tt|f}tt||f}| |j|jd t	 |d| qW d S )Nl            l        T)
r   r   r   r   r   r   r   r   r   r   )rX   r   Znp_tpr   r   r   r   r   r   test_numpy_randint  s    zTestRandom.test_numpy_randintc             C   s   g }x t dD ]}||dd qW | t|tt|| tjdkr| |}x0dD ](}|d |krlqZ| j||j	|gdd qZW | 
t|dd | 
t|dd	 d
S )z2
        Check a randint()-like function.
        rn   r   i e)rE   ))r   r   )   i  )   l            r   )r      rV   N)re   rq   rc   rN   rs   r   r   rY   r   r   r   r   )rX   r-   r@   r   rB   r`   r?   r   r   r   r   _check_randint  s    


zTestRandom._check_randintc             C   sF   x@t jdft jdfgD ](\}}tt||f}| |jt | qW d S )Nl            l        )r   r   r   r   r   r   r   r   )rX   r   r   Zcrr   r   r   test_random_randint  s    zTestRandom.test_random_randintc             C   s$   |  |}| ||jdddg dS )z2
        Check a uniform()-like function.
        )g      ?g    .A)g      g     @@)g      ?g      N)rY   r   r|   )rX   r-   r@   r?   r   r   r   _check_uniform  s    

zTestRandom._check_uniformc             C   s   |  tdt  d S )Nzrandom.uniform)r   r9   r   )rX   r   r   r   test_random_uniform  s    zTestRandom.test_random_uniformc             C   s   |  tdt  d S )Nznp.random.uniform)r   r9   r   )rX   r   r   r   test_numpy_uniform  s    zTestRandom.test_numpy_uniformc             C   s>   |  |}|dk	r(| ||jdddg | ||jdg dS )z5
        Check a triangular()-like function.
        N)g      ?g      @)g      g      ?)g      ?g      ?)g      ?g      @g@)rY   r   
triangular)rX   r   r   r@   r?   r   r   r   _check_triangular  s
    

zTestRandom._check_triangularc             C   s   |  tdtdt  d S )Nzrandom.triangular)r   r9   r:   r   )rX   r   r   r   test_random_triangular  s    
z!TestRandom.test_random_triangularc                s(   t d  fdd}| d |t  d S )Nznp.random.triangularc                s    | ||S )Nr   )lr?   m)r   r   r   <lambda>  s    z2TestRandom.test_numpy_triangular.<locals>.<lambda>)r:   r   r   )rX   Zfixed_triangularr   )r   r   test_numpy_triangular  s    z TestRandom.test_numpy_triangularc             C   s   |  |}|dk	r(| ||jdddg |dk	rH| |d|dd |dk	r| t|dd | t|dd | t|dd | t|dd |dk	r| t|d | t|d dS )	z7
        Check a gammavariate()-like function.
        N)g      ?g      @)g      ?g      ?)g      ?g      @g      ?g      ?g        g      )rY   r   rR   r{   r   r   )rX   r   r   r@   r?   r   r   r   _check_gammavariate  s    

zTestRandom._check_gammavariatec             C   s   |  tdd t  d S )Nzrandom.gammavariate)r   r9   r   )rX   r   r   r   test_random_gammavariate	  s    z#TestRandom.test_random_gammavariatec             C   s0   |  tdtdt  |  d tdt  d S )Nznp.random.gammaznp.random.standard_gamma)r   r9   r8   r   )rX   r   r   r   test_numpy_gamma  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.
        )g      ?g      @g        g      ?g      N)rY   r   Zbetavariater   r   )rX   r-   r@   r?   r   r   r   _check_betavariate  s    
zTestRandom._check_betavariatec             C   s   |  tdt  d S )Nzrandom.betavariate)r   r9   r   )rX   r   r   r   test_random_betavariate"  s    z"TestRandom.test_random_betavariatec             C   s   |  tdt  d S )Nznp.random.beta)r   r9   r   )rX   r   r   r   test_numpy_beta%  s    zTestRandom.test_numpy_betac             C   s    |  |}| ||jdg dS )z:
        Check a vonmisesvariate()-like function.
        )g      ?g      @N)rY   r   Zvonmisesvariate)rX   r-   r@   r?   r   r   r   _check_vonmisesvariate(  s    
z!TestRandom._check_vonmisesvariatec             C   s   |  tdt  d S )Nzrandom.vonmisesvariate)r   r9   r   )rX   r   r   r   test_random_vonmisesvariate0  s    
z&TestRandom.test_random_vonmisesvariatec             C   s   |  tdt  d S )Nznp.random.vonmises)r   r9   r   )rX   r   r   r   test_numpy_vonmises4  s    
zTestRandom.test_numpy_vonmisesc             C   sL   |  |}x<dD ]4}x.tdD ]"}| j|||d| dd qW qW dS )z
        Check a expovariate()-like function.  Note the second argument
        is inversed compared to np.random.exponential().
        )g?g      ?g      ?rE   r   r   )r   N)r[   re   r{   exponential)rX   r-   r@   r?   Zlambdr`   r   r   r   _check_expovariate8  s
    

zTestRandom._check_expovariatec             C   s   |  tdt  d S )Nzrandom.expovariate)r   r8   r   )rX   r   r   r   test_random_expovariateD  s    z"TestRandom.test_random_expovariatec             C   sF   |  |}|dk	r(| ||jdddg |dk	rB| ||jdg dS )z6
        Check a exponential()-like function.
        N)g      ?)g      ?)g      ?r   )r[   r   r   )rX   r   r   r@   r?   r   r   r   _check_exponentialG  s
    
zTestRandom._check_exponentialc             C   s   |  tdtdt  d S )Nznp.random.exponential)r   r8   r7   r   )rX   r   r   r   test_numpy_exponentialR  s    
z!TestRandom.test_numpy_exponentialc             C   s   |  d tdt  d S )Nznp.random.standard_exponential)r   r7   r   )rX   r   r   r   test_numpy_standard_exponentialW  s    z*TestRandom.test_numpy_standard_exponentialc             C   s"   |  |}| ||jddg dS )z8
        Check a paretovariate()-like function.
        )g      ?)g      @N)rY   r   Zparetovariate)rX   r-   r@   r?   r   r   r   _check_paretovariate\  s    
zTestRandom._check_paretovariatec             C   s   |  tdt  d S )Nzrandom.paretovariate)r   r8   r   )rX   r   r   r   test_random_paretovariated  s    z$TestRandom.test_random_paretovariatec                s&   t d  fdd}| |t  d S )Nznp.random.paretoc                s    | d S )Ng      ?r   )r   )paretor   r   r   i  s    z.TestRandom.test_numpy_pareto.<locals>.<lambda>)r8   r   r   )rX   Zfixed_paretor   )r   r   test_numpy_paretog  s    zTestRandom.test_numpy_paretoc             C   sZ   |  |}|dk	r$| ||jdg |dk	rVx(tdD ]}| |d|dd q6W dS )z9
        Check a weibullvariate()-like function.
        N)g      ?g      @rE   g      @g      ?)rY   r   Zweibullvariatere   r{   )rX   r   r   r@   r?   r`   r   r   r   _check_weibullvariatel  s    

z TestRandom._check_weibullvariatec             C   s   |  tdd t  d S )Nzrandom.weibullvariate)r   r9   r   )rX   r   r   r   test_random_weibullvariatey  s    
z%TestRandom.test_random_weibullvariatec             C   s   |  d tdt  d S )Nznp.random.weibull)r   r8   r   )rX   r   r   r   test_numpy_weibull}  s    zTestRandom.test_numpy_weibullc          	   C   s   t d}| t d}| ||jdg xdD ]}| ||dd | ||d| xdD ]}|||}|dkr|| }d	| }| |d | || || }d
| t	| }| ||| |||f | ||| |||f q\W q.W | 
t|dd | 
t|dd | 
t|dd d S )Nznp.random.binomialr   )   g      ?)d   i  i'  g        g      ?)	g-C6?g?g?g9?g      ?g㈵ ?g?g?gH.?g      ?r   rE   r;   rn   gg?)r9   r[   r   r   binomialrc   assertGreaterEqualassertLessEqualmathsqrtr   r   )rX   r   r?   r#   r   r(   tolr   r   r   test_numpy_binomial  s(    


 zTestRandom.test_numpy_binomialc             C   s2   t d}| t }| |tt|ddg d S )Nznp.random.chisquare)g      ?)g      @)r8   rY   r   r   	functoolspartialrS   )rX   Z	chisquarer?   r   r   r   test_numpy_chisquare  s
    
zTestRandom.test_numpy_chisquarec             C   s2   t d}| t }| |tt|ddg d S )Nznp.random.f)g      ?g      ?)g      ?g?)r9   rY   r   r   r   r   rT   )rX   fr?   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 )Nznp.random.geometricg      g        gjt?   c                s   g | ]} d qS )g      ?r   )rG   r`   )geomr   r   rI     s    z3TestRandom.test_numpy_geometric.<locals>.<listcomp>r   c                s   g | ]} d qS )g?r   )rG   r`   )r   r   r   rI     s    rV   c             S   s   g | ]}|d kr|qS )i  r   )rG   r`   r   r   r   rI     s    c                s   g | ]} d qS )g?r   )rG   r`   )r   r   r   rI     s    c             S   s   g | ]}|d kr|qS )r   r   )rG   r`   r   r   r   rI     s    c                s   g | ]} d qS )g{Gz?r   )rG   r`   )r   r   r   rI     s    c             S   s   g | ]}|d kr|qS )2   r   )rG   r`   r   r   r   rI     s    c                s   g | ]} d qS )gV瞯<r   )rG   r`   )r   r   r   rI     s    c             S   s   g | ]}|d kr|qS )l        r   )rG   r`   r   r   r   rI     s    )
r8   r   r   re   r{   countr   
assertLessassertFalse
assertTrue)rX   rd   r?   r#   r   )r   r   test_numpy_geometric  s$    
zTestRandom.test_numpy_geometricc             C   s,   t d}| t }| ||jddg d S )Nznp.random.gumbel)g        g      ?)g      g      @)r9   r[   r   r   gumbel)rX   r   r?   r   r   r   test_numpy_gumbel  s    zTestRandom.test_numpy_gumbelc                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 )Nznp.random.hypergeometric)i  i  rn   )i  i  rn      )r   c                s   g | ]} d d dqS )i  r   r   )rG   r`   )hgr   r   rI     s    z8TestRandom.test_numpy_hypergeometric.<locals>.<listcomp>r   c             s   s   | ]}|d ko|dkV  qdS )r   r   Nr   )rG   rH   r   r   r   	<genexpr>  s    z7TestRandom.test_numpy_hypergeometric.<locals>.<genexpr>g      D@g      N@c                s   g | ]} d ddqS )i  i r   r   )rG   r`   )r   r   r   rI     s    c             s   s   | ]}|d ko|dkV  qdS )r   r   Nr   )rG   rH   r   r   r   r     s    g      $@c                s   g | ]} d ddqS )i i  r   r   )rG   r`   )r   r   r   rI     s    c             s   s   | ]}|d ko|dkV  qdS )r   r   Nr   )rG   rH   r   r   r   r     s    g     V@)r:   r[   r   r   Zhypergeometricre   r   allr   r   meanr   )rX   r?   r   )r   r   test_numpy_hypergeometric  s    
z$TestRandom.test_numpy_hypergeometricc             C   sV   |  t }| td|jddg | td|jddg | td|jdg d S )Nznp.random.laplace)g        g      ?)g      g      @)g        )g      r   )r[   r   r   r9   laplacer8   r7   )rX   r?   r   r   r   test_numpy_laplace  s    

zTestRandom.test_numpy_laplacec             C   sV   |  t }| td|jddg | td|jddg | td|jdg d S )Nznp.random.logistic)g        g      ?)g      g      @)g        )g      r   )r[   r   r   r9   logisticr8   r7   )rX   r?   r   r   r   test_numpy_logistic  s    

zTestRandom.test_numpy_logisticc                s   |  t }td | j |jdddgdd | j t dd}|  fd	d
tdD ddddddddddg
 | t d | t d | t d d S )Nznp.random.logseries)g?)gGz?)gH.?r   )r   r   )r'   c                s   g | ]} d qS )g{?r   )rG   r`   )	logseriesr   r   rI     s    z3TestRandom.test_numpy_logseries.<locals>.<listcomp>rn   ivxi- r   i  in i)l   &ci܀oirH i  g        gg?)	r[   r   r8   r   r  rc   re   r   r   )rX   r?   r   )r  r   test_numpy_logseries  s    
zTestRandom.test_numpy_logseriesc             C   sD   |  t }td}| j||jdddddgdd | t|d	 d S )
Nznp.random.poisson)g        )g      ?)g       @)g      $@)g     $@r   )r   g)r[   r   r8   r   poissonr   r   )rX   r?   r  r   r   r   test_numpy_poisson  s    
zTestRandom.test_numpy_poissonc                s$  |  t d td |  fddtdD dddd	ddddddg
 |  fd
dtdD ddddddddddg
 |  fddtdD ddddddddddg
 t fddtdD }| |d | |d  | 	t
 dd! | 	t
 d"d! | 	t
 dd# | 	t
 dd$ d S )%Nr   znp.random.negative_binomialc                s   g | ]} d dqS )rn   g?r   )rG   r`   )negbinr   r   rI     s    z;TestRandom.test_numpy_negative_binomial.<locals>.<listcomp>rn   rV   rE   r   r   c                s   g | ]} d dqS )rn   g?r   )rG   r`   )r	  r   r   rI     s    7   G   8   9   "   e   C   c                s   g | ]} d dqS )i  g?r   )rG   r`   )r	  r   r   rI     s    i#  i!  iy#  iL$  i"  i#  i#  iF"  i"  i#  c                s   g | ]} d dqS )i ʚ;g?r   )rG   r`   )r	  r   r   rI     s   r   g   | Bg   $s Bg      ?r;   gg?)r[   r   r9   rc   re   r   r   ZassertGreaterr   r   r   )rX   r   r   )r	  r   test_numpy_negative_binomial  s"    
z'TestRandom.test_numpy_negative_binomialc             C   sL   |  t }td}| ||jddddg | t|d | t|d d S )Nznp.random.power)g?)g      ?)g?)g      @g        g)r[   r   r8   r   powerr   r   )rX   r?   r  r   r   r   test_numpy_power  s    
zTestRandom.test_numpy_powerc             C   sf   |  t }td}td}| ||jddddg | ||jdg | t|d | t|d d S )	Nznp.random.rayleigh)g?)g?)g      9@)g     @@r   g        g)r[   r   r8   r7   r   rayleighr   r   )rX   r?   Z	rayleigh1Z	rayleigh0r   r   r   test_numpy_rayleigh  s    
zTestRandom.test_numpy_rayleighc             C   s*   |  t }td}| ||jdg d S )Nznp.random.standard_cauchyr   )r[   r   r7   r   standard_cauchy)rX   r?   Zcauchyr   r   r   test_numpy_standard_cauchy'  s    z%TestRandom.test_numpy_standard_cauchyc                sD   |  t }td t fddtdD }| t|d d S )Nznp.random.standard_tc                s   g | ]} d qS )r   r   )rG   r`   )
standard_tr   r   rI   2  s    z4TestRandom.test_numpy_standard_t.<locals>.<listcomp>i  g      ?)rY   r   r8   r   r   re   r   abs)rX   r?   Zavgr   )r  r   test_numpy_standard_t,  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 )Nznp.random.wald)g      ?g      ?)g       @g      @g        g      ?g)r[   r   r9   r   waldr   r   )rX   r?   r  r   r   r   test_numpy_wald6  s    zTestRandom.test_numpy_waldc             C   sL   |  t }td}| j||jddgdd xdD ]}| t|| q2W d S )Nznp.random.zipf)g      ?)g      @r   )r   )g      ?g      ?g        g)r[   r   r8   r   zipfr   r   )rX   r?   r  valr   r   r   test_numpy_zipf?  s
    
zTestRandom.test_numpy_zipfc             C   st  t dt ddg}tjdkr|r4| |}n
| |}x|D ]V}xPtdD ]D}| }| }	|| |st	|j
dkrR||	 | ||	 qRW qDW nlxj|D ]b}x\tdD ]P}| }
||
 | t ||
 | t t j|ddt j|
dd |
}qW qW |d }| }
|t|
 | t|t|
 | t|t|
 |   |td	 W d
Q R X d
S )z=
        Check a shuffle()-like function for arrays.
        r       )r   r   )rE   rE   r   r   )axiss   xyzN)r   arangereshaper   r   r[   rY   re   copyrN   shapeZshuffler{   r   array_equalr   sort
memoryviewassertNotEqualr>   rc   sortedZassertTypingError)rX   r-   r@   r   arrsr?   r   r`   r)   r(   r   r   r   r   ri   F  s8    





zTestRandom._check_shufflec             C   s   |  tdt d d S )Nzrandom.shuffleF)ri   r8   r   )rX   r   r   r   test_random_shufflem  s    zTestRandom.test_random_shufflec             C   s   |  tdt d d S )Nznp.random.shuffleT)ri   r8   r   )rX   r   r   r   test_numpy_shuffleq  s    zTestRandom.test_numpy_shufflec       	      C   s   dt   }t }xjtdD ]^}tjtjd|gtjtjd}| \}}|j	dkrft
d|j	| f |t|  qW | 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))
            rE   z-c)stdoutstderrr   z/process failed with code %s: stderr follows
%s
N)r/   rs   re   
subprocessPopenr   
executablePIPEZcommunicate
returncoderO   decodeaddfloatstriprc   rN   )	rX   Z	func_nameZ	func_argsr3   Znumbersr`   popenouterrr   r   r   _check_startup_randomnessu  s    

z$TestRandom._check_startup_randomnessc             C   s   |  dd d S )Nr   r   )r<  )rX   r   r   r   test_random_random_startup  s    z%TestRandom.test_random_random_startupc             C   s   |  dd d S )Nrandom_gauss)g      ?g      ?)r<  )rX   r   r   r   test_random_gauss_startup  s    z$TestRandom.test_random_gauss_startupc             C   s   |  dd d S )Nr   r   )r<  )rX   r   r   r   test_numpy_random_startup  s    z$TestRandom.test_numpy_random_startupc             C   s   |  dd d S )Nnumpy_normal)g      ?g      ?)r<  )rX   r   r   r   test_numpy_gauss_startup  s    z#TestRandom.test_numpy_gauss_startupc          
   C   sv  t d}tjdkr| t }xVdD ]N}t|}| }| |||	| | |||	| | || q$W td
ddtd
dddtd	
ddddg}x|D ].}| }| |||	| | || qW ntd
td

dddg}xh|D ]`}d}xT|dk rj||}t||s| ttj|ddtj|dd |d7 }qW qW d S )Nznp.random.permutation)rE   )r   rn      r   rn   rV   r      rE   $   r   r   )r!  r   )r8   r   r   r[   r   r   r"  r$  r{   Zpermutationr#  r&  r   r'  )rX   r-   r?   sr   r   r+  checkedr   r   r   test_numpy_random_permutation  s2    




z(TestRandom.test_numpy_random_permutation)rE   r   r   N)N)Mr\   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   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  r  ri   r,  r-  r<  r=  r?  r@  rB  rH  r   r   r   r   rz      s   		 
	
'
					

	'rz   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eddd Zdd Zdd Zeddd  Zedd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1S )2TestRandomArrayszA
    Test array-producing variants of np.random.* functions.
    c             C   s&   d|f }d dd | }t||S )Nznp.random.%sz, Zabcd)joinr5   )rX   funcnamenargsqualnamer2   r   r   r   _compile_array_dist  s    
z$TestRandomArrays._compile_array_distc       
      C   s   |  |t|d }| t }t||}xddD ]\}||f }|| }|| }	|jtdkrz|	jtdkrz||	j}| j||	ddd q0W dS )	zM
        Check returning an array according to a given distribution.
        r   )r   )rV   rE   r   r   r   r   )r   r   N)	rN  rN   r[   r   getattrrM   r   Zastyper{   )
rX   rK  Zscalar_argscfuncr?   r4   r   r   r(   r)   r   r   r   _check_array_dist  s    


z"TestRandomArrays._check_array_distc             C   s   |  dd}d\}}d}||||}| |tj | |j| | |jtdtdf | t	||k | t	||k  || d }|| d }| 
| ||  | | ||  d S )	Nr   rE   )i  i'  )r   r   r   r   rV   r   )rN  rb   r   ndarrayrc   r%  assertInrM   r   r   r   r   r   )rX   rP  ZlowZhighr   resr   r   r   r   r   r     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   r   )r   r   float64g        g      ?g?g?g?g?)rN  rb   r   rR  rc   r%  rM   r   r   anyr   r   r   )rX   rP  r   rT  r   r   r   r   test_numpy_random_random  s    z)TestRandomArrays.test_numpy_random_randomc             C   s   |  dd d S )Nr   )r   g      ?)rQ  )rX   r   r   r   r     s    z$TestRandomArrays.test_numpy_binomialc             C   s   |  dd d S )Nr   )g      ?)rQ  )rX   r   r   r   r     s    z'TestRandomArrays.test_numpy_exponentialc             C   s   |  dd d S )Nr   )g      ?g      ?)rQ  )rX   r   r   r   r     s    z"TestRandomArrays.test_numpy_gumbelc             C   s   |  dd d S )Nr  )g      ?g      ?)rQ  )rX   r   r   r   r    s    z#TestRandomArrays.test_numpy_laplacec             C   s   |  dd d S )Nr  )g      ?g      ?)rQ  )rX   r   r   r   r    s    z$TestRandomArrays.test_numpy_logisticc             C   s   |  dd d S )Nr   )g      ?g       @)rQ  )rX   r   r   r   r     s    z%TestRandomArrays.test_numpy_lognormalc             C   s   |  dd d S )Nr  )g?)rQ  )rX   r   r   r   r    s    z%TestRandomArrays.test_numpy_logseriesr~   c             C   s   |  dd d S )Nr   )g      ?g       @)rQ  )rX   r   r   r   r     s    z"TestRandomArrays.test_numpy_normalc             C   s   |  dd d S )Nr  )g?)rQ  )rX   r   r   r   r    s    z#TestRandomArrays.test_numpy_poissonc             C   s   |  dd d S )Nr  )g?)rQ  )rX   r   r   r   r    s    z!TestRandomArrays.test_numpy_powerc             C   s<   t ddt}|ddd\}}| |jd | || d S )NT)r.   *   rV   rE   )rV   rE   )r   r*   rc   r%  r{   )rX   rP  r(   r)   r   r   r   test_numpy_rand  s    z TestRandomArrays.test_numpy_randc             C   s<   t ddt}|ddd\}}| |jd | || d S )NT)r.   rX  rV   rE   )rV   rE   )r   r,   rc   r%  r{   )rX   rP  r(   r)   r   r   r   r     s    z!TestRandomArrays.test_numpy_randnc             C   s   |  dd d S )Nr  )g?)rQ  )rX   r   r   r   r  &  s    z$TestRandomArrays.test_numpy_rayleighc             C   s   |  dd d S )Nr  r   )rQ  )rX   r   r   r   r  )  s    z+TestRandomArrays.test_numpy_standard_cauchyc             C   s   |  dd d S )NZstandard_exponentialr   )rQ  )rX   r   r   r   r   ,  s    z0TestRandomArrays.test_numpy_standard_exponentialc             C   s   |  dd d S )Nr+   r   )rQ  )rX   r   r   r   r   /  s    z+TestRandomArrays.test_numpy_standard_normalc             C   s   |  dd d S )Nr|   )g?g?)rQ  )rX   r   r   r   r   2  s    z#TestRandomArrays.test_numpy_uniformc             C   s   |  dd d S )Nr  )g?g?)rQ  )rX   r   r   r   r  5  s    z TestRandomArrays.test_numpy_waldc             C   s   |  dd d S )Nr  )g      @)rQ  )rX   r   r   r   r  8  s    z TestRandomArrays.test_numpy_zipfN)r\   r]   r^   ry   rN  rQ  r   rW  r   r   r   r  r  r   r  r
   r   r  r  rY  r   r  r  r   r   r   r  r  r   r   r   r   rI    s0   rI  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S ) TestRandomChoicez 
    Test np.random.choice.
    Tc             C   sf   t |}t |}| || | t|t| |rL| t|t|| n| t|t|| dS )zD
        Check basic expectations about a batch of samples.
        N)rs   r   r)  r*  r>   r   rN   rc   )rX   poprT  r    ZspopZsresr   r   r   _check_resultsA  s    zTestRandomChoice._check_resultsc             C   sl   |  t|t|d  t|t| }t|}x4|D ],}|| }|  ||d  | ||d  q8W dS )z5
        Check distribution of some samples.
        r   g      ?g       @N)r   rN   collectionsCounterr   )rX   r[  ZsamplesZexpected_frequencyr   valuer#   r   r   r   r   R  s    

zTestRandomChoice._check_distc             C   s2   g }x t ||k r$|t| j7 }qW |d| S )zk
        Accumulate array results produced by *func* until they reach
        *nresults* elements.
        N)rN   r>   flat)rX   r-   ZnresultsrT  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.
        T)r.   c                s   g | ]} qS r   r   )rG   r`   )r   rP  r   r   rI   p  s    z4TestRandomChoice._check_choice_1.<locals>.<listcomp>c                s   g | ]} qS r   r   )rG   r`   )r   rP  r   r   rI   r  s    r   N)r   r   rN   re   r\  r   )rX   r   r[  r#   rT  distr   )r   rP  r   _check_choice_1j  s    z TestRandomChoice._check_choice_1c             C   s    d}t t|}| || dS )z"
        Test choice(int)
        r   N)r>   re   rc  )rX   r#   r[  r   r   r   test_choice_scalar_1u  s    z%TestRandomChoice.test_choice_scalar_1c             C   s"   t dd d }| || dS )z$
        Test choice(array)
        r   rV   r   N)r   r"  rc  )rX   r[  r   r   r   test_choice_array_1}  s    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)rN   r>   r`  r\  ra  r   )rX   r-   r[  r    r#   rT  rb  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}xP|D ]H }ttrVnf}| |j| |  fdd| q:W dS )	z4
        Check choice(a, size) against pop.
        T)r.   rn   rE   r   c                  s
    S )Nr   r   )r   rP  r   r   r   r     s    z2TestRandomChoice._check_choice_2.<locals>.<lambda>N)r   r   rN   
isinstancerr   rc   r%  rf  )rX   r   r[  r#   sizesrT  expected_shaper   )r   rP  r   r   _check_choice_2  s    

z TestRandomChoice._check_choice_2c             C   s   d}t |}| || dS )z(
        Test choice(int, size)
        r   N)r   r"  rj  )rX   r#   r[  r   r   r   test_choice_scalar_2  s    
z%TestRandomChoice.test_choice_scalar_2c             C   s"   t dd d }| || dS )z*
        Test choice(array, size)
        r   rV   r   N)r   r"  rj  )rX   r[  r   r   r   test_choice_array_2  s    z$TestRandomChoice.test_choice_array_2c       	   
      s  t ddtt|}|d d|d d fg}ddg}xH|D ]@x:dD ]2} |}ttrdnf}| |j| qFW q<W x$|D ]|  fdd	| qW x&|D ]|  fd
d	|d qW xB|d d|d d fgD ]&| t	  d W dQ R X qW dS )z=
        Check choice(a, size, replace) against pop.
        T)r.   rn   rE   r   F)TFc                  s    dS )NTr   r   )r   rP  r   r   r   r     s    z2TestRandomChoice._check_choice_3.<locals>.<lambda>c                  s    dS )NFr   r   )r   rP  r   r   r   r     s    N)
r   r!   rN   rg  rr   rc   r%  rf  r   r   )	rX   r   r[  r#   rh  Zreplacesr    rT  ri  r   )r   rP  r   r   _check_choice_3  s     



z TestRandomChoice._check_choice_3c             C   s   d}t |}| || dS )z1
        Test choice(int, size, replace)
        r   N)r   r"  rm  )rX   r#   r[  r   r   r   test_choice_scalar_3  s    
z%TestRandomChoice.test_choice_scalar_3c             C   s"   t dd d }| || dS )z3
        Test choice(array, size, replace)
        r   rV   r   N)r   r"  rm  )rX   r[  r   r   r   test_choice_array_3  s    z$TestRandomChoice.test_choice_array_3N)T)T)r\   r]   r^   ry   r\  r   ra  rc  rd  re  rf  rj  rk  rl  rm  rn  ro  r   r   r   r   rZ  <  s   



rZ  c               @   sX   e Zd ZdZejddddddg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.
    r   rV   rE   )rM   c             C   s   |  |tj | |jt|f | |jtdtdf | | | xZt	||D ]L\}}| 
|d | || t|| }| 
||d  | ||d  q\W dS )z5
        Check distribution of some samples.
        r   r   r   g      ?g       @N)rb   r   rR  rc   r%  rN   rS  rM   sumzipr   r   r7  )rX   r#   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)
        T)r.   i  i@B r   r   r   )rM   N)	r   r%   r$   rt  r>   r   rP   rU  rq  )rX   rP  r#   r$   rT  r   r   r   test_multinomial_2  s    


z(TestRandomMultinomial.test_multinomial_2c             C   s\   t ddt}d| j }}d}||||}| |jd | x|D ]}| ||| qBW dS )z7
        Test multinomial(n, pvals, size: int)
        T)r.   i  rn   r   N)r   r&   r$   rc   r%  rt  )rX   rP  r#   r$   krT  rs  r   r   r   test_multinomial_3_int  s    
z,TestRandomMultinomial.test_multinomial_3_intc             C   sp   t ddt}d| j }}d}||||}| |jdd | x*|d|jd fD ]}| ||| qVW dS )z9
        Test multinomial(n, pvals, size: tuple)
        T)r.   i  )rE   r   Nr;   )r   r&   r$   rc   r%  r#  rt  )rX   rP  r#   r$   rv  rT  rs  r   r   r   test_multinomial_3_tuple  s    z.TestRandomMultinomial.test_multinomial_3_tupleN)r\   r]   r^   ry   r   rP   rU  r$   rq  rt  ru  rw  rx  r   r   r   r   rp    s   rp  T)r.   Znogilc             C   s8   | dkrt |  x t|jD ]}t d||< qW d S )Nr   r   )r   r'   re   r   r   )r'   r:  r`   r   r   r   py_extract_randomness"  s    
ry  l        c             C   s@   | dkrt j|  d}x"t|jD ]}t jt||< q$W d S )Nr   )r   r   r'   re   r   r   _randint_limit)r'   r:  rF  r`   r   r   r   np_extract_randomness+  s
    r{  c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ConcurrencyBaseTesti c             C   s"   d|  df}t|  t|  d S )NrX  r   )_get_outputry  r{  )rX   r   r   r   r   setUp=  s    zConcurrencyBaseTest.setUpc             C   s   t j|t jdS )N)rM   )r   ZzerosrL   )rX   r   r   r   r   r}  C  s    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.
        l        l        r   g?)rtolN)r   r   ZtestingZassert_allcloser   Zstd)rX   r:  Zexpected_avgZexpected_stdr  r   r   r   check_outputF  s
    z ConcurrencyBaseTest.check_outputc             C   s   x|D ]}|  | qW |r"d}nt|}dd |D }dd |D }dd |D }| t||| | t||| | t||| d S )Nr   c             S   s   h | ]}t |d d qS )Nr   )rr   )rG   r:  r   r   r   	<setcomp>_  s    z<ConcurrencyBaseTest.check_several_outputs.<locals>.<setcomp>c             S   s   h | ]}t |d d qS )r   N)rr   )rG   r:  r   r   r   r  `  s    c             S   s   h | ]}|  qS r   )rq  )rG   r:  r   r   r   r  a  s    )r  rN   rc   )rX   r   same_expectedr:  Zexpected_distinctZheadsZtailsZsumsr   r   r   check_several_outputsQ  s    
z)ConcurrencyBaseTest.check_several_outputsN)r\   r]   r^   _extract_iterationsr~  r}  r  r  r   r   r   r   r|  5  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                sx   fddt |d D  fddfddt |D }x|D ]}|  qFW | x|D ]}|  qdW S )zo
        Run *nthreads* threads extracting randomness with the given *seed*
        (no seeding if 0).
        c                s   g | ]}   jqS r   )r}  r  )rG   r`   )rX   r   r   rI   q  s   z2TestThreads.extract_in_threads.<locals>.<listcomp>r   c                s    |  d d S )N)r'   r:  r   )r`   )extract_randomnessr   r'   r   r   targett  s    z.TestThreads.extract_in_threads.<locals>.targetc                s   g | ]}t j |fd qS ))r  r   )	threadingZThread)rG   r`   )r  r   r   rI   x  s   )re   startrJ  )rX   Znthreadsr  r'   ZthreadsZthr   )r  r   r'   rX   r  r   extract_in_threadsl  s    



zTestThreads.extract_in_threadsc             C   s"   | 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.
        rC  rX  )r'   T)r  N)r  r  )rX   r  r   r   r   r   check_thread_safety  s    	zTestThreads.check_thread_safetyc             C   s"   | j d|dd}| j|dd dS )z
        The PRNG in new threads should be implicitly initialized with
        system entropy, if seed() wasn't called.
        r   r   )r'   F)r  N)r  r  )rX   r  r   r   r   r   check_implicit_initialization  s    z)TestThreads.check_implicit_initializationc             C   s   |  t d S )N)r  ry  )rX   r   r   r   test_py_thread_safety  s    z!TestThreads.test_py_thread_safetyc             C   s   |  t d S )N)r  r{  )rX   r   r   r   test_np_thread_safety  s    z!TestThreads.test_np_thread_safetyc             C   s   |  t d S )N)r  ry  )rX   r   r   r   test_py_implicit_initialization  s    z+TestThreads.test_py_implicit_initializationc             C   s   |  t d S )N)r  r{  )rX   r   r   r   test_np_implicit_initialization  s    z+TestThreads.test_np_implicit_initializationN)r\   r]   r^   ry   r  r  r  r  r  r  r  r   r   r   r   r  g  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fddt|D }x|D ]}|  qDW x"t|D ]}|jdd q^W x|D ]}|  q~W |  x&|D ]}t|tr	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  rX   r   r   target_inner  s    z8TestProcesses.extract_in_processes.<locals>.target_innerc           
      sH   y }   |  W n. tk
rB } z  |  W d d }~X Y nX d S )N)Zput	Exception)r:  e)qr  r   r   r    s    
z2TestProcesses.extract_in_processes.<locals>.targetc                s   g | ]}t j d qS ))r  )multiprocessingZProcess)rG   r`   )r  r   r   rI     s   z6TestProcesses.extract_in_processes.<locals>.<listcomp>r   )ZtimeoutzException in child: %s)
r  ZQueuere   r  rq   getrJ  rg  r  Zfail)rX   Znprocsr  r   Zprocsr   r`   rT  r   )r  r  rX   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.
        rV   F)r  N)r  r  )rX   r  r   r   r   r   r    s    z+TestProcesses.check_implicit_initializationc             C   s   |  t d S )N)r  ry  )rX   r   r   r   r    s    z-TestProcesses.test_py_implicit_initializationc             C   s   |  t d S )N)r  r{  )rX   r   r   r   r    s    z-TestProcesses.test_np_implicit_initializationN)	r\   r]   r^   ry   Z_numba_parallel_test_r  r  r  r  r   r   r   r   r    s   +
r  __main__)JZ
__future__r   r]  r   r   r  ro   r   r0  r   r  Znumpyr   Znumba.unittest_supportZunittest_supportZunittestZnumbar   r   r   Znumba.compilerr   Zsupportr   r	   r
   rd   r   r   r   r   r   r   r   r   r   r   r!   r%   r&   r*   r,   r5   r7   r8   r9   r:   r>  r   r   rA  r   r   rD   rK   rQ   rS   rT   rU   r_   rz   rI  rZ  rp  ry  rz  r{  r|  r  ZskipIfr1   r  r\   mainr   r   r   r   <module>   s   	D     X  "E
2BF
