U
    ôQ”i-@  ã                   @   sÄ  d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	m
Z
 d dlZd dlmZmZmZmZmZmZmZmZmZ d dlmZ zd dlZdZW n ek
r¤   dZY nX zd dlZdZW n ek
rÎ   dZY nX ejjdkràdZe j  e j !e"¡¡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/G d!d"„ d"ƒZ0G d#d$„ d$e0ƒZ1G d%d&„ d&e0ƒZ2G d'd(„ d(e0ƒZ3G d)d*„ d*e0ƒZ4G d+d,„ d,e0ƒZ5G d-d.„ d.ƒZ6dS )/é    N)Újoin)Úassert_equalÚassert_allcloseÚassert_array_equalÚassert_raises)	Ú	GeneratorÚMT19937ÚPCG64Ú	PCG64DXSMÚPhiloxÚRandomStateÚSeedSequenceÚSFC64Údefault_rng)Ú	interfaceFTé   c                 C   sh   | D ]^}t | | tƒr*t| | || ƒ qt | | tjƒrNt| | || ƒ q| | || kst‚qd S ©N)Ú
isinstanceÚdictÚassert_state_equalÚnpZndarrayr   ÚAssertionError)ÚactualÚtargetÚkey© r   úB/tmp/pip-unpacked-wheel-vgsdxuwo/numpy/random/tests/test_direct.pyr   '   s    r   c                 C   s   | t  d¡? d  t j¡S )Né   g      p>)r   Úuint32ZastypeÚfloat32)Úur   r   r   Úuint32_to_float321   s    r!   c                 C   s\   t  | ¡} t j| t  d¡? t jd�}t  d¡}t j| |@ t jd�}t  ||g¡ ¡ }t|ƒS )Né    ©Údtypeì   ÿÿ )r   Úuint64Úarrayr   Zcolumn_stackZravelr!   )ÚxÚupperÚlowerZjoinedr   r   r   Úuniform32_from_uint645   s    

r+   c                 C   s0   t  | ¡t  d¡? } t  | t  d¡@ ¡} t| ƒS )Né   r%   )r   r&   r   r!   ©r(   r   r   r   Úuniform32_from_uint53>   s    r.   c                 C   s   t | ƒS r   )r!   r-   r   r   r   Úuniform32_from_uint32D   s    r/   c                 C   s8   |dkrt | ƒS |dkr t| ƒS |dkr0t| ƒS t‚d S )Né@   é5   r"   )r+   r.   r/   ÚNotImplementedError©r(   Úbitsr   r   r   Úuniform32_from_uintH   s    r5   c                 C   s$   |dkrt | ƒS |dkr t| ƒS d S )N)r0   é?   r1   r"   )Úuniform_from_uint64Úuniform_from_uint32r3   r   r   r   Úuniform_from_uintS   s    r9   c                 C   s   | t  d¡? d S )Né   g       <)r   r&   r-   r   r   r   r7   Z   s    r7   c                 C   s`   t  t| ƒd ¡}tdt| ƒdƒD ]8}| | d? }| |d  d? }|d | d ||d < q"|S )Né   r   é   r   é   g      �Ag      @C)r   ÚemptyÚlenÚrange)r(   ÚoutÚiÚaÚbr   r   r   r8   ^   s    r8   c                 C   s   |   tj¡d S )Nç      ð?)Úviewr   Údoubler-   r   r   r   Úuniform_from_dsfmtg   s    rH   c           
      C   sÜ   |dkrt | ƒ}n|dkr$t| ƒ}nt| ƒ}g }d}d }}t|ƒ|k rÐd}|dks\|dkršd||  d }d||d   d }|| ||  }|d7 }qLt d	t |¡ | ¡}	| |	| ¡ | |	| ¡ q<|d |… S )
N)r0   r6   r"   r   ç        r;   rE   g       @r   g       À)r7   r8   rH   r?   r   ÚsqrtÚlogÚappend)
r(   Únr4   ZdoublesÚgaussÚlocÚx1Zx2Zr2Úfr   r   r   Úgauss_from_uintk   s&    


rR   c                  C   sš   ddl m} m}m} ttdƒddd�}| d¡ tf |jŽ}t|j|jƒ t|j	|j	ƒ t
t| ƒ t
t|ƒ |ƒ }t
t|jdƒ t| d¡ƒdks–t‚d S )Nr   )ÚISeedSequenceÚISpawnableSeedSequenceÚSeedlessSeedSequenceé
   )r   r;   r=   )Z	spawn_keyZ	pool_size)Znumpy.random.bit_generatorrS   rT   rU   r   r@   ÚspawnÚstater   Zn_children_spawnedr   Ú	TypeErrorr2   Zgenerate_stater?   r   )rS   rT   rU   Ús1Ús2Údummyr   r   r   Útest_seedsequence„   s    


r]   c                   @   sÒ   e Zd ZejZi  ZZedd„ ƒZ	e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jjedd �d!d"„ ƒZejjed#d �d$d%„ ƒZd&d'„ Zd(S ))ÚBasec                 C   s*   t | _d| _tj| _t| _g | _g | _	d S )Nr0   )
r	   Úbit_generatorr4   r   r&   r$   rY   Úseed_error_typeÚinvalid_init_typesÚinvalid_init_values©Úclsr   r   r   Úsetup_class›   s    zBase.setup_classc              
   C   sŠ   t |ƒ�x}| ¡ }| d¡}dd„ |dd … D ƒ}g }|D ]"}| t| d¡d  ¡ dƒ¡ q:|tj|| jd�dœW  5 Q R £ S Q R X d S )	Nú,c                 S   s   g | ]}t | ¡ d ƒ‘qS )r   )ÚintÚstrip)Ú.0Úsr   r   r   Ú
<listcomp>©   s     z"Base._read_csv.<locals>.<listcomp>r   éÿÿÿÿr   r#   )ÚseedÚdata)	ÚopenÚreadlineÚsplitrL   rg   rh   r   r'   r$   )rd   ÚfilenameÚcsvrm   rn   Úliner   r   r   Ú	_read_csv¤   s    

 zBase._read_csvc                 C   s„   | j | jd Ž }| d¡}t|| jd ƒ | j | jd Ž }| ¡ }t|| jd d ƒ | j | jd Ž }| d¡}t|| jd ƒ d S )Nrm   éè  rn   r   )r_   Údata1Ú
random_rawr   Údata2©Úselfr_   Zuintsr   r   r   Útest_raw¯   s    

zBase.test_rawc                 C   sF   | j | jd Ž }|jdd�}|d ks(t‚|jddd�}|d ksBt‚d S )Nrm   F)Úoutputrv   )r_   rw   rx   r   rz   r   r   r   Útest_random_raw¼   s
    zBase.test_random_rawc                 C   sx   d}t | j| jd Ž ƒ}| |¡}t|t| jd || jƒƒ t | j| jd Ž ƒ}| d¡}t|t| jd || jƒƒ d S )Né   rm   rn   )r   r_   rw   Ústandard_normalr   rR   r4   ry   )r{   rM   ÚrsrN   r   r   r   Útest_gauss_invÃ   s    
ÿ
ÿzBase.test_gauss_invc                 C   sœ   t | j| jd Ž ƒ}t| jd | jƒ}| t|ƒ¡}t||ƒ t|j	t
jƒ t | j| jd Ž ƒ}t| jd | jƒ}| t|ƒ¡}t||ƒ t|j	t
jƒ d S )Nrm   rn   )r   r_   rw   r9   r4   Úrandomr?   r   r   r$   r   Zfloat64ry   ©r{   r�   ÚvalsZuniformsr   r   r   Útest_uniform_doubleÏ   s    

zBase.test_uniform_doublec                 C   s¨   t | j| jd Ž ƒ}t| jd | jƒ}|jt|ƒtjd�}t	||ƒ t
|jtjƒ t | j| jd Ž ƒ}t| jd | jƒ}|jt|ƒtjd�}t	||ƒ t
|jtjƒ d S )Nrm   rn   r#   )r   r_   rw   r5   r4   rƒ   r?   r   r   r   r   r$   ry   r„   r   r   r   Útest_uniform_floatÜ   s    

zBase.test_uniform_floatc                 C   sL   t | j| jd Ž ƒ}dt|ƒks$t‚t|ƒd› ¡  dd¡t|ƒksHt‚d S ©Nrm   r   z#xÚXr(   )r   r_   rw   Úreprr   Úidr)   Úreplace©r{   r�   r   r   r   Ú	test_repré   s    zBase.test_reprc                 C   sd   t | j| jd Ž ƒ}dt|ƒks$t‚t| jjƒt|ƒks<t‚t|ƒd› ¡  dd¡t|ƒks`t‚d S rˆ   )	r   r_   rw   Ústrr   Ú__name__r‹   r)   rŒ   r�   r   r   r   Útest_strî   s    zBase.test_strc           	      C   s–   dd l }| j| jd Ž }|j}| |¡}| |¡}|j}tt|ƒ d¡t|ƒ d¡ƒ ||k	sbt	‚t
||ƒ tdƒ}| | |¡¡}t|j|jƒ d S )Nr   rm   rv   éd   )Úpickler_   rw   rX   ÚdumpsÚloadsr   r   r€   r   r   r   r   )	r{   r“   r_   rX   Z
bitgen_pklZreloadedZreloaded_stateÚssZaar   r   r   Útest_pickleô   s    

ÿ
zBase.test_picklec              	   C   s2   | j | jd Ž }t t¡� dh|_W 5 Q R X d S )Nrm   Ú1)r_   rw   ÚpytestÚraisesrY   rX   ©r{   r_   r   r   r   Útest_invalid_state_type  s    zBase.test_invalid_state_typec              	   C   s>   | j | jd Ž }|j}d|d< t t¡� ||_W 5 Q R X d S )Nrm   ZotherBitGeneratorr_   )r_   rw   rX   r™   rš   Ú
ValueError)r{   r_   rX   r   r   r   Útest_invalid_state_value
  s
    zBase.test_invalid_state_valuec              
   C   s4   | j }| jD ]"}t t¡� ||Ž  W 5 Q R X qd S r   )r_   ra   r™   rš   rY   ©r{   r_   Ústr   r   r   Útest_invalid_init_type  s    
zBase.test_invalid_init_typec              
   C   s8   | j }| jD ]&}t ttf¡� ||Ž  W 5 Q R X qd S r   )r_   rb   r™   rš   r�   ÚOverflowErrorrŸ   r   r   r   Útest_invalid_init_values  s    
zBase.test_invalid_init_valuesc              	   C   sL   | j | jd Ž }| d¡ | dd¡ t t¡� | dd¡ W 5 Q R X d S )Nrm   r   rG   Zint32)r_   rw   Z
_benchmarkr™   rš   r�   r›   r   r   r   Útest_benchmark  s
    
zBase.test_benchmarkzcffi not available)Úreasonc                 C   s:   | j | jd Ž }|j}t|tƒs$t‚|j}||ks6t‚d S ©Nrm   )r_   rw   Úcffir   r   r   )r{   r_   Zcffi_interfaceZother_cffi_interfacer   r   r   Ú	test_cffi$  s
    zBase.test_cffizctypes not availablec                 C   s:   | j | jd Ž }|j}t|tƒs$t‚|j}||ks6t‚d S r¦   )r_   rw   Úctypesr   r   r   )r{   r_   Zctypes_interfaceZother_ctypes_interfacer   r   r   Útest_ctypes,  s
    zBase.test_ctypesc                 C   s,   | j | jd Ž }|j}| ¡ }t||ƒ d S r¦   )r_   rw   rX   Ú__getstate__r   )r{   r_   rX   Z	alt_stater   r   r   Útest_getstate4  s    zBase.test_getstateN) r�   Ú
__module__Ú__qualname__r   r&   r$   ry   rw   Úclassmethodre   ru   r|   r~   r‚   r†   r‡   rŽ   r‘   r—   rœ   rž   r¡   r£   r¤   r™   ÚmarkZskipifÚMISSING_CFFIr¨   ÚMISSING_CTYPESrª   r¬   r   r   r   r   r^   —   s0   




r^   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )Ú
TestPhiloxc                 C   sb   t | _d| _tj| _|  ttdƒ¡| _	|  ttdƒ¡| _
t| _g | _ddd d dd d fg| _d S )	Nr0   z./data/philox-testset-1.csvz./data/philox-testset-2.csv)r   Nr   ©rl   r;   i  r   )r   r_   r4   r   r&   r$   ru   r   Úpwdrw   ry   rY   r`   ra   rb   rc   r   r   r   re   <  s    ÿÿzTestPhilox.setup_classc                 C   sF   | j | jd Ž }|j}| j |d d |d d d�}t|j|jƒ d S )Nrm   rX   Úcounterr   )r¶   r   )r_   rw   rX   r   )r{   r_   rX   Zkeyedr   r   r   Útest_set_keyI  s    
ÿzTestPhilox.test_set_keyN)r�   r­   r®   r¯   re   r·   r   r   r   r   r³   ;  s   
r³   c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )Ú	TestPCG64c                 C   s^   t | _d| _tj| _|  ttdƒ¡| _	|  ttdƒ¡| _
ttf| _dd gfdg| _dg| _d S )Nr0   z./data/pcg64-testset-1.csvz./data/pcg64-testset-2.csv©gš™™™™™	@©r   Nr´   )r	   r_   r4   r   r&   r$   ru   r   rµ   rw   ry   r�   rY   r`   ra   rb   rc   r   r   r   re   R  s    
zTestPCG64.setup_classc                 C   s¢   t | j| jd Ž ƒ}|jj}d}|j |¡ | d¡}||j_|j dd | ¡ | d¡}||j_|j ddd  | ¡ | d¡}||ks’t‚||ksžt‚d S ©Nrm   l÷ÿÿÿ        PAOi_n¼ž rV   r;   é€   ©r   r_   rw   rX   ÚadvanceÚintegersr   ©r{   r�   rX   ÚstepZval_negZval_posZval_bigr   r   r   Útest_advance_symmetry]  s    


zTestPCG64.test_advance_symmetryc                 C   sl   t |  d¡ƒ}|j}|jd }d}|d |ks2t‚| tdd„ dD ƒƒ¡ |jd }d}|d |ksht‚d S )Nì   ï%”@
 rX   ì	   Ír%4=KÆv±uÅ1¹/Ø c                 s   s   | ]}d | V  qdS ©r;   Nr   ©ri   rB   r   r   r   Ú	<genexpr>r  s     z/TestPCG64.test_advange_large.<locals>.<genexpr>©é`   r0   r"   r,   r   é   r;   r   l	   ÿ@H}.|z³KLf�be ©r   r_   rX   r   r¾   Úsum©r{   r�   ZpcgrX   Zinitial_stateZadvanced_stater   r   r   Útest_advange_largel  s    

zTestPCG64.test_advange_largeN©r�   r­   r®   r¯   re   rÂ   rÎ   r   r   r   r   r¸   Q  s   

r¸   c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )ÚTestPCG64DXSMc                 C   s^   t | _d| _tj| _|  ttdƒ¡| _	|  ttdƒ¡| _
ttf| _dd gfdg| _dg| _d S )Nr0   z./data/pcg64dxsm-testset-1.csvz./data/pcg64dxsm-testset-2.csvr¹   rº   r´   )r
   r_   r4   r   r&   r$   ru   r   rµ   rw   ry   r�   rY   r`   ra   rb   rc   r   r   r   re   y  s    
zTestPCG64DXSM.setup_classc                 C   s¢   t | j| jd Ž ƒ}|jj}d}|j |¡ | d¡}||j_|j dd | ¡ | d¡}||j_|j ddd  | ¡ | d¡}||ks’t‚||ksžt‚d S r»   r½   rÀ   r   r   r   rÂ   „  s    


z#TestPCG64DXSM.test_advance_symmetryc                 C   sl   t |  d¡ƒ}|j}|j}d}|d d |ks2t‚| tdd„ dD ƒƒ¡ |jd }d}|d |ksht‚d S )NrÃ   rÄ   rX   c                 s   s   | ]}d | V  qdS rÅ   r   rÆ   r   r   r   rÇ   ™  s     z3TestPCG64DXSM.test_advange_large.<locals>.<genexpr>rÈ   l	   oF‚	œ[UmO1X·9}Ð rË   rÍ   r   r   r   rÎ   “  s    
z TestPCG64DXSM.test_advange_largeNrÏ   r   r   r   r   rÐ   x  s   

rÐ   c                   @   s(   e Zd Zedd„ ƒZdd„ Zdd„ ZdS )ÚTestMT19937c                 C   sP   t | _d| _tj| _|  ttdƒ¡| _	|  ttdƒ¡| _
t| _g | _dg| _d S )Nr"   z./data/mt19937-testset-1.csvz./data/mt19937-testset-2.csvr´   )r   r_   r4   r   r   r$   ru   r   rµ   rw   ry   r�   r`   ra   rb   rc   r   r   r   re      s    zTestMT19937.setup_classc                 C   s”   t t| jt tjg¡ƒ t t| jt tj g¡ƒ t t| jt tjtj g¡ƒ t t| jt dtjg¡ƒ t t| jtjgƒ t t| jdtjgƒ d S )Nr   )r   rY   r_   r   r'   Úpi)r{   r   r   r   Útest_seed_float_array«  s    z!TestMT19937.test_seed_float_arrayc                 C   sˆ   t | j| jd Ž ƒ}|j}|j}| d¡}|d |d d |d d f}||_| d¡}t||ƒ |d }||_| d¡}t||ƒ d S )Nrm   i   r_   rX   r   Úpos)r   rI   )r   r_   rw   rX   r¿   r   )r{   r�   r_   rX   ZdesiredÚtupr   r   r   r   Útest_state_tuple³  s    

ÿ


zTestMT19937.test_state_tupleN)r�   r­   r®   r¯   re   rÓ   rÖ   r   r   r   r   rÑ   Ÿ  s   

rÑ   c                   @   s   e Zd Zedd„ ƒZdS )Ú	TestSFC64c                 C   s^   t | _d| _tj| _|  ttdƒ¡| _	|  ttdƒ¡| _
ttf| _dd gfdg| _dg| _d S )Nr0   z./data/sfc64-testset-1.csvz./data/sfc64-testset-2.csvr¹   rº   r´   )r   r_   r4   r   r&   r$   ru   r   rµ   rw   ry   r�   rY   r`   ra   rb   rc   r   r   r   re   Ä  s    ÿÿ
zTestSFC64.setup_classN)r�   r­   r®   r¯   re   r   r   r   r   r×   Ã  s   r×   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestDefaultRNGc                 C   s4   dddddgffD ]}t |Ž }t|jtƒst‚qd S )Nr   r   )éÒ  rÙ   i.  )r   r   r_   r	   r   )r{   ÚargsÚrgr   r   r   Ú	test_seedÓ  s    zTestDefaultRNG.test_seedc                 C   sB   t ƒ }t|ƒ}|j|kst‚t|ƒ}||ks0t‚|j|ks>t‚d S r   )r   r   r_   r   )r{   ÚbgrÛ   Zrg2r   r   r   Útest_passthroughØ  s    zTestDefaultRNG.test_passthroughN)r�   r­   r®   rÜ   rÞ   r   r   r   r   rØ   Ò  s   rØ   )7ÚosÚos.pathr   ÚsysZnumpyr   Znumpy.testingr   r   r   r   r™   Znumpy.randomr   r   r	   r
   r   r   r   r   r   Znumpy.random._commonr   r§   r±   ÚImportErrorr©   r²   ÚflagsÚoptimizeÚpathÚdirnameÚabspathÚ__file__rµ   r   r!   r+   r.   r/   r5   r9   r7   r8   rH   rR   r]   r^   r³   r¸   rÐ   rÑ   r×   rØ   r   r   r   r   Ú<module>   sP   ,


		 %''$