U
    ,dX                     @   s   d dl Z d dlZd dlZd dl mZ d dlmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZ d dlmZmZ G d	d
 d
eZdd ZG dd deeZG dd deeZdS )    N)types)TestCaseMemoryLeakMixin)_get_proper_func)next_uint32next_uint64next_double)MT19937	Generator)TypingError)run_in_new_process_cachingSerialMixinc                   @   s   e Zd Zdd ZdS )TestHelperFuncsc              	   C   s   dd }dd }|  t||tjd  d |  t||tjd  d |  t||tjd  d |  t||tjd  d | t}t||tj W 5 Q R X | 	dt
|j d S )	Nc                   S   s   dS )N     r   r   r   A/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_np_randomgen.pytest_32bit_func   s    zBTestHelperFuncs.test_proper_func_provider.<locals>.test_32bit_funcc                   S   s   dS )N@   r   r   r   r   r   test_64bit_func   s    zBTestHelperFuncs.test_proper_func_provider.<locals>.test_64bit_funcr   r   r   z2Unsupported dtype int32 for the given distribution)assertEqualr   npfloat64float32r   assertRaisesr   Zint32ZassertInstr	exception)selfr   r   Zraisesr   r   r   test_proper_func_provider   sH    



z)TestHelperFuncs.test_proper_func_providerN)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                  C   sN   t jd} t jd}dd }tjdd|}t |d|| sJtd S )N   c                 S   s
   |  dS N
   randomxr   r   r   <lambda>+       z(test_generator_caching.<locals>.<lambda>Tcacher#   )r   r%   default_rngnumbanjitZallcloseAssertionError)nb_rngnp_rngpy_func
numba_funcr   r   r   test_generator_caching(   s
    r4   c                   @   s@   e Zd ZdddZdddZdd Zd	d
 Zdd Zdd ZdS )TestRandomGeneratorsNc                 C   s   t |}|d krd}|d kr<tjj|d}tjj|d}nt||}t||}||||}||||}	| ||	 | d }
| d }|D ]}| |
| ||  qd S )Nr!   seedstate)	r-   r.   r   r%   r,   r
   r2   assertPreciseEqual__getstate__)r   Zdistribution_funcZbitgen_typer7   	test_size
test_dtypenumba_rng_instancenumpy_rng_instance	numba_res	numpy_resZnumba_gen_stateZnumpy_gen_stateZ
_state_keyr   r   r   check_numpy_parity1   s.    
  
z'TestRandomGenerators.check_numpy_parityr!   c           
         sb   t jj|d}t jj|d}t|jj|}||jjj}t fdd}||}	| 	|	| d S )Nr6   c                    s
    | j S N)bit_generatorr&   bitgen_funcr   r   r(   W   r)   z?TestRandomGenerators._test_bitgen_func_parity.<locals>.<lambda>)
r   r%   r,   getattrrC   ctypesr8   r-   r.   r9   )
r   	func_namerE   r7   r=   r>   Z
numpy_funcr@   r3   r?   r   rD   r   _test_bitgen_func_parityP   s    z-TestRandomGenerators._test_bitgen_func_parityc                 C   sD   t j }tdd }| ||| | t|t|| d S )Nc                 S   s   | S rB   r   r&   r   r   r   r(   ^   r)   zATestRandomGenerators.test_npgen_boxing_unboxing.<locals>.<lambda>)r   r%   r,   r-   r.   r   id)r   rng_instancer3   r   r   r   test_npgen_boxing_unboxing\   s    
z/TestRandomGenerators.test_npgen_boxing_unboxingc                 C   s`   t j }tdd }tdd }||}t|}~|| t|}| ||d  d S )Nc                 S   s   |   S rB   r$   r&   r   r   r   r(   d   r)   zATestRandomGenerators.test_npgen_boxing_refcount.<locals>.<lambda>c                 S   s   | S rB   r   r&   r   r   r   r(   e   r)   r!   )r   r%   r,   r-   r.   sysgetrefcountr   )r   rK   Zno_boxZdo_boxyZref_1Zref_2r   r   r   test_npgen_boxing_refcountb   s    


z/TestRandomGenerators.test_npgen_boxing_refcountc              
   C   sR   dddg}t ttg}t||D ].\}}| j||d | || W 5 Q R X qd S )Nr   r   r   )_func
_func_name)r   r   r   zipsubTestrI   )r   Z
func_namesfuncsrQ   rR   r   r   r   test_bitgen_funcso   s
    

z&TestRandomGenerators.test_bitgen_funcsc                 C   s   d dddg}t jt jg}d tg}dd }|   | j|dt jd W 5 Q R X dd }|D ]F}|D ]<}|D ]2}| j|||d	 | ||d || W 5 Q R X qjqbqZd S )
Nr   )d   )r#         c                 S   s   |   S rB   r$   r'   sizedtyper   r   r   r(   }   r)   z2TestRandomGenerators.test_random.<locals>.<lambda>rW   )r;   r<   c                 S   s   | j ||dS )N)r[   r\   r$   rZ   r   r   r   r(      r)   )_size_dtype_bitgen)r   r   r   r	   rT   rA   )r   Z
test_sizesZtest_dtypesZbitgen_typesZ	dist_funcr]   r^   r_   r   r   r   test_randomw   s(    
  z TestRandomGenerators.test_random)NNNN)r!   )	r   r   r    rA   rI   rL   rP   rV   r`   r   r   r   r   r5   0   s         

r5   c                   @   s   e Zd Zdd ZdS )TestGeneratorCachingc                 C   sr   t jd}t jd}tjdd dd}| |d|| | |d|| tt}| |d d d S )	Nr!   c                 S   s
   |  dS r"   r$   r&   r   r   r   r(      r)   z=TestGeneratorCaching.test_randomgen_caching.<locals>.<lambda>Tr*   r#   exitcoder   )	r   r%   r,   r-   r.   r9   r   r4   r   )r   r0   r1   r3   resr   r   r   test_randomgen_caching   s    z+TestGeneratorCaching.test_randomgen_cachingN)r   r   r    rd   r   r   r   r   ra      s   ra   )r-   Znumpyr   rM   r   Znumba.tests.supportr   r   Z!numba.np.random.generator_methodsr   Znumba.np.random.generator_corer   r   r   Znumpy.randomr	   r
   Znumba.core.errorsr   r   r   r   r4   r5   ra   r   r   r   r   <module>   s   ^