U
    iâËd-F  ã                   @   s6  d 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 ddl	Z
ddlmZmZmZmZ ddlmZmZ ddlZddlmZmZmZmZmZ ddlmZ dd	lmZ d
d„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ de ƒZ!G dd„ de ƒZ"G dd„ de ƒZ#G dd„ deƒZ$e%dk�r2e &¡  dS )z*
Test hashing of various supported types.
é    N)Údefaultdict)Údedent)ÚjitÚconfigÚtypedÚtypeof)ÚtypesÚutils)ÚTestCaseÚtagÚCompilationCacheÚskip_unless_py10_or_laterÚrun_in_subprocess)Úcompile_time_get_string_data)Úhashingc                 C   s   t | ƒS ©N©Úhash©Úx© r   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_hashing.pyÚhash_usecase   s    r   c                   @   s   e Zd Zdd„ ZdS )ÚTestHashingSetupc                 C   s   d}t  tjdt|ƒg¡ d S )Na±  
        import sys
        import warnings
        from collections import namedtuple

        # hash_info is a StructSequence, mock as a named tuple
        fields = ["width", "modulus", "inf", "nan", "imag", "algorithm",
                  "hash_bits", "seed_bits", "cutoff"]

        hinfo = sys.hash_info
        FAKE_HASHINFO = namedtuple('FAKE_HASHINFO', fields)

        fd = dict()
        for f in fields:
            fd[f] = getattr(hinfo, f)

        fd['algorithm'] = 'fnv'

        fake_hashinfo = FAKE_HASHINFO(**fd)

        # replace the hashinfo with the fnv version
        sys.hash_info = fake_hashinfo
        with warnings.catch_warnings(record=True) as warns:
            # Cause all warnings to always be triggered.
            warnings.simplefilter("always")
            from numba import njit
            @njit
            def foo():
                hash(1)
            foo()
            assert len(warns) > 0
            expect = "FNV hashing is not implemented in Numba. See PEP 456"
            for w in warns:
                if expect in str(w.message):
                    break
            else:
                raise RuntimeError("Expected warning not found")
        z-c)Ú
subprocessÚ
check_callÚsysÚ
executabler   )ÚselfZworkr   r   r   Útest_warn_on_fnv    s    &z!TestHashingSetup.test_warn_on_fnvN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                
   @   s²   e Zd Zddddgddddggddddgdd	dd	gd
dd
dgddddgddddggddddgddddgddddgddddgddd d!ggd"œZd#d$„ Zd%d&„ Zd,d(d)„Zd*d+„ Zd'S )-ÚTestHashAlgsiˆ\ˆiLÌ‡×l   LL//+³?iTSÏlûÿÿÿqU:~Œ@[ iò0&lûÿÿÿO³wq!~ iéuÖÅl   éu¬Cœ- i|#|Ül   |#ø8ÿ
^ i=½Õ¾lûÿÿÿÃBT='8 i\eîÁl   \eÜ+=Ë" i[Ýlûÿÿÿò$ÛEü,ß; iwmHÏlûÿÿÿ‰oað_gv iÞîpGl   ÞnáYD~ i–SlûÿÿÿjxY_oWÇs i¯ ú—l   ¯ ô/Ö“l iöJkl   öJÖ:ø8`~ iÖÄlûÿÿÿü)øwJµ iàQ	œlûÿÿÿ .íG¥UJG iO{‘lûÿÿÿ±Á]±D] )Údjba33xZ	siphash13Z	siphash24c                 C   sf   |t jjk rd}nt jj}tj }t jdkr:|r4dnd}nt jdksHt‚|rPdnd}| j| | | S )Nr$   Úlittleé   r   Úbigé   é   )	r   Ú	hash_infoÚcutoffÚ	algorithmr   Z	IS_32BITSÚ	byteorderÚAssertionErrorÚknown_hashes)r   ÚpositionÚlengthr,   ZIS_64BITÚplatformr   r   r   Úget_expected_hashw   s    
zTestHashAlgs.get_expected_hashc                 C   s   d| S )Nzprint(hash(eval(%a)))r   )r   Úrepr_r   r   r   Úget_hash_command„   s    zTestHashAlgs.get_hash_commandNc                 C   sV   t j ¡ }|d k	r t|ƒ|d< n| dd ¡ t|  |¡|d�\}}| ¡  ¡ }t	|ƒS )NZPYTHONHASHSEED)ÚcodeÚenv)
ÚosÚenvironÚcopyÚstrÚpopr   r5   ÚdecodeÚstripÚint)r   r4   Úseedr7   ÚoutÚ_Ústdoutr   r   r   Úget_hash‡   s    

ÿ
zTestHashAlgs.get_hashc              
   C   s`   d}|D ]R\}}}| j ||d��4 | jt|ƒ|d�}|  |t|ƒ¡}|  ||¡ W 5 Q R X qd S )N))Úabcr   r   )rE   é*   r&   )ZabcdefghijkrF   r)   )õ
   Ã¤Ãºâˆ‘â„‡r   r(   )rG   rF   é   )Ú	input_strr@   )r@   )ZsubTestrD   Úreprr3   ÚlenÚassertEqual)r   ÚargsrI   r@   r0   ÚgotÚexpectedr   r   r   Útest_against_cpython_gold’   s    z&TestHashAlgs.test_against_cpython_gold)N)r    r!   r"   r/   r3   r5   rD   rP   r   r   r   r   r#   K   s(   

ü	




õ




õì#
r#   c                   @   s:   e Zd Zdd„ Zdd„ Zejfdd„Zdd„ Zd	d
„ Z	dS )ÚBaseTestc                 C   s   t dd�tƒ| _d S )NT©Znopython)r   r   Úcfunc©r   r   r   r   ÚsetUp    s    zBaseTest.setUpc                 C   sœ   | j }t|ƒD ]ˆ}||ƒ}|  |t¡ z|  |t|ƒ¡ W q tk
r” } z<tdƒ t||t|ƒƒ tdƒ tt|ƒt	j
d ƒ |‚W 5 d }~X Y qX qd S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1r&   )rS   ÚlistZassertIsInstancer?   rL   r   r.   ÚprintÚabsr   Ú_PyHASH_MODULUS)r   ÚvaluesrS   ÚvalZnb_hashÚer   r   r   Úcheck_hash_values£   s    zBaseTest.check_hash_valuesc                 c   s|   dD ]r}t  |¡}|j|  kr*|jks.q qd}t||| ƒV  t||d|  dƒV  t||d|  dƒV  dgV  qd S )N)r   iÎÿÿÿi`ê  l        éd   é€   éÿÿÿÿ)ÚnpÚiinfoÚminÚmaxÚrange)r   ÚtypÚstartÚinfoÚnr   r   r   Úint_samples±   s    
zBaseTest.int_samplesc                 c   sØ   t  |¡}dd|jd |jd fD ]t}d}t|j||j ƒ}d|d |fD ]J}||k rXqJt  ||||  |¡}| |¡}|V  | V  || ¡  V  qJq"dddd	td
ƒtd
ƒ g}t	j
dk rÊ| tdƒ¡ ||ƒV  d S )Nr   é
   ç      à?g     @�@r^   g333333ó?g        g       €g      ð¿Úinf©r(   rk   Únan)ra   Zfinford   ZtinyÚ
resolutionZlinspaceZastypeZmeanÚfloatr	   Ú	PYVERSIONÚappend)r   rf   rh   rg   ri   Zmin_stepÚstepÚar   r   r   Úfloat_samples¼   s     


zBaseTest.float_samplesc                 c   s|   |   |¡D ]l}|   |¡D ]\}|d t|ƒ… }|d t|ƒ… }||dƒ|  }tjdkrnt t |¡¡st|V  q|V  qq
d S )Ny              ð?rn   )rv   rK   r	   rr   ra   ÚanyÚisnan)r   rf   Úfloat_tyÚrealÚimagru   r   r   r   Úcomplex_samplesÕ   s    
zBaseTest.complex_samplesN)
r    r!   r"   rU   r]   ra   Úint64rj   rv   r|   r   r   r   r   rQ   ž   s
   rQ   c                   @   sL   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZdS )ÚTestNumberHashingz'
    Test hashing of number types.
    c                 C   s2   |   |¡D ]"}|  |jt |¡¡ |  |¡ q
d S r   )rv   rL   Údtypera   r]   )r   rf   ru   r   r   r   Úcheck_floatsê   s    zTestNumberHashing.check_floatsc                 C   s4   |   ||¡D ]"}|  |jt |¡¡ |  |¡ qd S r   )r|   rL   r   ra   r]   )r   rf   ry   ru   r   r   r   Úcheck_complexï   s    zTestNumberHashing.check_complexc                 C   s   |   tj¡ |   tj¡ d S r   )r€   ra   Úfloat32Úfloat64rT   r   r   r   Útest_floatsô   s    zTestNumberHashing.test_floatsc                 C   s$   |   tjtj¡ |   tjtj¡ d S r   )r�   ra   Z	complex64r‚   Z
complex128rƒ   rT   r   r   r   Útest_complexø   s    zTestNumberHashing.test_complexc                 C   s   |   ddg¡ d S )NFT©r]   rT   r   r   r   Ú	test_boolü   s    zTestNumberHashing.test_boolc                 C   s  g }t jt jt jt jt jt jt jt jfD �]*}|  	|¡D ]}|  
|¡ q8t  |¡}|  
|dƒg¡ |  
|dƒg¡ dt|ƒk}|ƒ j}|j|jfD ]À}d| }|}	t|ƒD ]¦}
d}d}|	g}||fD ] }|	|@ }|tjk rÄ| |¡ qÄ|D ]}|  
||ƒg¡ qê|�r0|D ]$}||jk�r
|  
|| ƒg¡ �q
|dk�rH|	dB d> }	qª|	d? }	qªq’q(|  
t  d¡g¡ |  
t  d	¡g¡ |  
t  d¡g¡ |  
t  d	¡g¡ |  
t  d
¡g¡ |  
t  d¡g¡ |  
t  d¡g¡ |  
t  d¡g¡ |  
t  d¡g¡ |  
t  d¡g¡ d S )Nr`   r   Zuinté   ì   ª*UUª*UU
 ì   UUª*UUª* r&   l   þÿÿÿ l   ÿÿÿÿ lûÿÿÿÿÿÿÿ lûÿÿÿöÿÿÿ lûÿÿÿœÿÿÿ i  €i
  €id  €)ra   Zint8Zuint8Zint16Zuint16Zint32Zuint32r}   Úuint64rj   r]   rb   r;   Úitemsizerc   rd   re   r   Úmaxsizers   )r   ZminmaxÚtyru   rh   ÚsignedÚszr   ZshiftsÚyÚiZtwiddle1Ztwiddle2ÚvalsZtwr[   Úvr   r   r   Ú	test_intsÿ   sX       ÿ



zTestNumberHashing.test_intsc                    s<   dd„ t dƒD ƒ}t‡ fdd„|D ƒƒ}ˆ  t|ƒd¡ d S )Nc                 S   s   g | ]}t d ƒ‘qS )ro   )rq   )Ú.0r’   r   r   r   Ú
<listcomp>?  s     z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>rk   c                    s   g | ]}ˆ   |¡‘qS r   )rS   )r–   ÚzrT   r   r   r—   @  s     r&   )re   ÚsetZassertGreaterrK   )r   r   rA   r   rT   r   Útest_py310_nan_hash6  s    	z%TestNumberHashing.test_py310_nan_hashN)r    r!   r"   Ú__doc__r€   r�   r„   r…   r‡   r•   r   rš   r   r   r   r   r~   å   s   7r~   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestTupleHashingz!
    Test hashing of tuples.
    c                    s*   |D ] }‡ fdd„|D ƒ}|   |¡ qd S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   )r–   ru   ©Úsplitr   r   r—   K  s     z1TestTupleHashing.check_tuples.<locals>.<listcomp>r†   )r   Zvalue_generatorrž   rZ   Ztuplesr   r�   r   Úcheck_tuplesI  s    zTestTupleHashing.check_tuplesc                    sV   t j‰ ‡ fdd„}‡ fdd„}|  |  ¡ |¡ |  |  ¡ |¡ |  ddddd	g¡ d S )
Nc                    s    ˆ | ƒ} | ˆ dƒ@ | ˆ dƒ@ fS )z9
            Split i's bits into 2 integers.
            rŠ   r‰   r   ©r’   ©rf   r   r   Úsplit2Q  s    

ÿz8TestTupleHashing.test_homogeneous_tuples.<locals>.split2c                    s*   ˆ | ƒ} | ˆ dƒ@ | ˆ dƒ@ | ˆ dƒ@ fS )z9
            Split i's bits into 3 integers.
            l   ’$’$’$’$ l   $I$I$I$I l   IIII	 r   r    r¡   r   r   Úsplit3Z  s
    


þz8TestTupleHashing.test_homogeneous_tuples.<locals>.split3©é   )r   )r   r   )rl   )rl   r¤   )éþÿÿÿr(   )rH   é   )ra   r‹   rŸ   rj   r]   )r   r¢   r£   r   r¡   r   Útest_homogeneous_tuplesN  s    	
ÿz(TestTupleHashing.test_homogeneous_tuplesc                 C   s    d}dd„ }|   |  ¡ |¡ d S )Nl            c                 S   s4   | d@ }| d@ | d? d@ A }t  |¡t  |d ¡fS )NrŠ   l   ª*UU é    g-Cëâ6?)ra   r}   rƒ   )r’   ru   Úbr   r   r   rž   p  s    z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)rŸ   rj   )r   Zmodulorž   r   r   r   Útest_heterogeneous_tuplesm  s    z*TestTupleHashing.test_heterogeneous_tuplesN)r    r!   r"   r›   rŸ   r¨   r«   r   r   r   r   rœ   D  s   rœ   c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Ze d¡dd	„ ƒZd
d„ Z	dS )ÚTestUnicodeHashingc                 C   s¬   d}t t|ƒƒD ]}|  |d |… g¡ qd}| t|ƒ¡}t t|ƒƒD ]}|  |d |… g¡ qHd}| t|ƒ¡}t t|ƒƒD ]}|  |d |… g¡ q€d}|  |¡ d S )NÚabcdefghijklmnopqrstuvwxyzu   çœ¼u   ðŸ��âš¡Ú )re   rK   r]   ÚjoinrV   )r   Úkind1_stringr’   ÚsepZkind2_stringZkind4_stringZempty_stringr   r   r   Útest_basic_unicodez  s    z%TestUnicodeHashing.test_basic_unicodec                 C   sD   d}t dd�dd„ ƒ}t|ƒd }|  |dk¡ |  ||ƒ|¡ d S )Nr­   TrR   c                 S   s   | j S r   )Ú_hashr   r   r   r   Úfn‘  s    z4TestUnicodeHashing.test_hash_passthrough.<locals>.fnr`   ©r   r   Ú
assertTruerL   ©r   r°   r´   Ú
hash_valuer   r   r   Útest_hash_passthroughŒ  s    
z(TestUnicodeHashing.test_hash_passthroughc                 C   sH   d}t dd�dd„ ƒ}t|ƒd }|  |dk¡ |  ||ƒ||f¡ d S )Nr­   TrR   c                 S   s   | j t| ƒfS r   )r³   r   r   r   r   r   r´   �  s    z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnr`   rµ   r·   r   r   r   Útest_hash_passthrough_call™  s    
z-TestUnicodeHashing.test_hash_passthrough_callz/Needs hash computation at const unpickling timec                 C   s8   t dd�dd„ ƒ}|ƒ }tdƒ}|  |t|ƒd ¡ d S )NTrR   c                  S   s   d} | S )Nr­   r   r   r   r   r   r´   ©  s    z0TestUnicodeHashing.test_hash_literal.<locals>.fnr­   r`   )r   r   rL   r   )r   r´   r[   Útmpr   r   r   Útest_hash_literal¥  s
    
z$TestUnicodeHashing.test_hash_literalc                 C   s    dd„ }t dd�|ƒ}d}||ƒ}||ƒ}t|ƒ}t|ƒ}|  |d d… |d d… ¡ |  |d |d k¡ d}||ƒ}||ƒ}t|ƒ}t|ƒ}|  ||¡ d S )Nc                 S   s    d}d}|| }| rt |ƒ |S )NZaaaau   çœ¼çœ¼çœ¼çœ¼r   )Zdo_hashZconst1Zconst2Únewr   r   r   Úimpl´  s    z:TestUnicodeHashing.test_hash_on_str_creation.<locals>.implTrR   Fr`   )r   r   rL   r¶   )r   r¾   ZjittedZcompute_hashrO   rN   ru   rª   r   r   r   Útest_hash_on_str_creation±  s    z,TestUnicodeHashing.test_hash_on_str_creationN)
r    r!   r"   r²   r¹   rº   ÚunittestÚskipr¼   r¿   r   r   r   r   r¬   x  s   
r¬   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestUnhashablec              
   C   sŒ   t  ¡  tjtj¡t  ¡  tj¡t d¡f}t	dd�t
ƒ}|D ]H}|  t¡�}||ƒ W 5 Q R X dtt|ƒƒ› d�}|  |t|jƒ¡ q>d S )NrH   TrR   zunhashable type: 'ú')r   ÚDictÚemptyr   r}   ÚListZ
empty_listra   Zonesr   r   ÚassertRaisesÚ	TypeErrorr;   r   ÚassertInÚ	exception)r   ZunhashablesrS   rŽ   ÚraisesrO   r   r   r   Útest_hash_unhashableÖ  s    þz#TestUnhashable.test_hash_unhashablec              	   C   sH   t dd�dd„ ƒ}|  t¡�}|ƒ  W 5 Q R X d}|  |t|jƒ¡ d S )NTrR   c                   S   s   t tjƒ d S r   )r   ra   Úcosr   r   r   r   Úfooç  s    z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   rÇ   rÈ   rÉ   r;   rÊ   )r   rÎ   rË   rO   r   r   r   Útest_no_generic_hashá  s    
z#TestUnhashable.test_no_generic_hashN)r    r!   r"   rÌ   rÏ   r   r   r   r   rÂ   Ò  s   rÂ   Ú__main__)'r›   rÀ   r8   r   r   Úcollectionsr   Útextwrapr   Únumpyra   Znumbar   r   r   r   Z
numba.corer   r	   Znumba.tests.supportr
   r   r   r   r   Znumba.cpython.unicoder   Znumba.cpythonr   r   r   r#   rQ   r~   rœ   r¬   rÂ   r    Úmainr   r   r   r   Ú<module>   s.   -SG_4Z 
