a
    
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   a/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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g dg dgg dg dg dg dg dgg dg d	g d
g dg dgdZdd Zdd ZdddZdd ZdS )TestHashAlgs)\r$   r$   r$   )iL̇l   LL//+?iTSlqU:~@[ )0&Owq!~ r%   r&   )u   uC- r'   r(   )|#|   |#8
^ r)   r*   )i=վlBT='8 i\el   \e+=" )i[l$E,; iwmHloa_gv )pG   nYD~ r+   r,   )SjxY_oWs r-   r.   )     /l r/   r0   )iJkl   J:8`~ il)wJ )iQ	l .GUJG 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sHJ |rPdnd}| j| | | S )Nr1   little   r   big      )r   	hash_infocutoff	algorithmr   Z	IS_32BITS	byteorderknown_hashes)r   positionlengthr9   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 ur t||d< n|dd  t| ||d\}}|  }t	|S )NZPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   rA   decodestripint)r   r@   seedrC   out_stdoutr   r   r   get_hash   s    


zTestHashAlgs.get_hashc              	   C   st   d}|D ]f\}}}| j ||d> | jt||d}| |t|}| || W d    q1 sd0    Y  qd S )N))abcr   r   )rQ   *   r3   )ZabcdefghijkrR   r6   )
   äú∑ℇr   r5   )rS   rR      )	input_strrL   )rL   )ZsubTestrP   reprr?   lenassertEqual)r   argsrU   rL   r<   gotexpectedr   r   r   test_against_cpython_gold   s    z&TestHashAlgs.test_against_cpython_gold)N)r    r!   r"   r;   r?   rA   rP   r\   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y } zDtd t||t| td tt|t	j
d  |W Y d }~qd }~0 0 qd S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1r3   )r_   listZassertIsInstancerK   rX   r   AssertionErrorprintabsr   Z_PyHASH_MODULUS)r   valuesr_   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   ii`  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     @@rj   g333333?g        g       g      infr5   rw   nan)rm   Zfinforp   Ztiny
resolutionZlinspaceZastypemeanfloatr	   	PYVERSIONappend)r   rr   rt   rs   ru   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              ?rz   )r   rW   r	   r   rm   anyisnan)r   rr   float_tyrealimagr   r   r   r   complex_samples   s    
zBaseTest.complex_samplesN)
r    r!   r"   ra   ri   rm   int64rv   r   r   r   r   r   r   r]      s
   r]   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   )r   rX   dtyperm   ri   )r   rr   r   r   r   r   check_floats   s    zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]"}| |jt| | | qd S r   )r   rX   r   rm   ri   )r   rr   r   r   r   r   r   check_complex   s    zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r   rm   float32float64r`   r   r   r   test_floats   s    zTestNumberHashing.test_floatsc                 C   s$   |  tjtj |  tjtj d S r   )r   rm   Z	complex64r   Z
complex128r   r`   r   r   r   test_complex   s    zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTri   r`   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|v}| 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? }	qqq(| 
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 )Nrl   r   Zuint      *UU*UU
    UU*UU* r3   l    l    l l l i  i
  id  )rm   Zint8Zuint8int16Zuint16int32Zuint32r   uint64rv   ri   rn   rG   itemsizero   rp   rq   r   maxsizer   )r   Zminmaxtyr   rt   signedszr   ZshiftsyiZtwiddle1Ztwiddle2valsZtwrg   vr   r   r   	test_ints   sR    



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 )r{   )r~   ).0r   r   r   r   
<listcomp>?      z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>rw   c                    s   g | ]}  |qS r   )r_   )r   zr`   r   r   r   @  r   r3   )rq   setZassertGreaterrW   )r   r   rM   r   r`   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   r   splitr   r   r   K  r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>r   )r   Zvalue_generatorr   rf   Ztuplesr   r   r   check_tuplesI  s    zTestTupleHashing.check_tuplesc                    sP   t j  fdd} fdd}| |  | | |  | | g d d S )Nc                    s     | } |  d@ |  d@ fS )z9
            Split i's bits into 2 integers.
            r   r   r   r   rr   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   )rx   )rx   r   )r5   )rT      )rm   r   r   rv   ri   )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?)rm   r   r   )r   r   br   r   r   r   p  s    z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   rv   )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 qd}| | d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )rq   rW   ri   joinrb   )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   Tr^   c                 S   s   | j S r   )_hashr   r   r   r   fn  s    z4TestUnicodeHashing.test_hash_passthrough.<locals>.fnrl   r   r   
assertTruerX   r   r   r   Z
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   Tr^   c                 S   s   | j t| fS r   )r   r   r   r   r   r   r     s    z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnrl   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 )NTr^   c                  S   s   d} | S )Nr   r   r   r   r   r   r     s    z0TestUnicodeHashing.test_hash_literal.<locals>.fnr   rl   )r   r   rX   r   )r   r   rg   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>.implTr^   Frl   )r   r   rX   r   )r   r   ZjittedZcompute_hashr[   rZ   r   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 ]\}| t}|| W d    n1 sj0    Y  dtt| d}| |t|j q>d S )NrT   Tr^   zunhashable type: '')r   Dictemptyr   r   ListZ
empty_listrm   Zonesr   r   assertRaises	TypeErrorrG   r   assertIn	exception)r   Zunhashablesr_   r   raisesr[   r   r   r   test_hash_unhashable  s    &z#TestUnhashable.test_hash_unhashablec                 C   s\   t dddd }| t}|  W d    n1 s80    Y  d}| |t|j d S )NTr^   c                   S   s   t tj d S r   )r   rm   cosr   r   r   r   foo  s    z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   r   r   r   rG   r   )r   r   r   r[   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   rD   r   r   collectionsr   textwrapr   numpyrm   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#   r]   r   r   r   r   r    mainr   r   r   r   <module>   s.   -SG_4Z 
