o
    Z۷iK                     @   s<  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 ddl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re&  dS dS )z*
Test hashing of various supported types.
    N)defaultdict)dedent)jitconfigtypedtypeof)typesutils)TestCaseskip_unless_py10_or_laterrun_in_subprocess)compile_time_get_string_data)hashing)numpy_versionc                 C   s   t | S Nhashx r   N/home/ubuntu/vllm_env/lib/python3.10/site-packages/numba/tests/test_hashing.pyhash_usecase      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   )self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 r0   r1   )iJkl   J:8`~ il)wJ )iQ	l .GUJG iO{l]D] )djba33x	siphash13	siphash24c                 C   sf   |t jjk r	d}nt jj}tj }t jdkr|rdnd}nt jdks$J |r(dnd}| j| | | S )Nr2   little   r   big      )r   	hash_infocutoff	algorithmr   	IS_32BITS	byteorderknown_hashes)r   positionlengthr<   IS_64BITplatformr   r   r   get_expected_hashx   s   
zTestHashAlgs.get_expected_hashc                 C   s   d| S )Nzprint(hash(eval(%a)))r   )r   repr_r   r   r   get_hash_command   r   zTestHashAlgs.get_hash_commandNc                 C   sV   t j }|d urt||d< n|dd  t| ||d\}}|  }t	|S )NPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   rF   decodestripint)r   rE   seedrI   out_stdoutr   r   r   get_hash   s   


zTestHashAlgs.get_hashc              	   C   st   d}|D ]3\}}}| j ||d | jt||d}| |t|}| || W d    n1 s2w   Y  qd S )N))abcr   r   )rW   *   r6   )abcdefghijkrX   r9   )
   äú∑ℇr   r8   )rZ   rX      )	input_strrR   )rR   )subTestrV   reprrD   lenassertEqual)r   argsr\   rR   r@   gotexpectedr   r   r   test_against_cpython_gold   s   z&TestHashAlgs.test_against_cpython_goldr   )r!   r"   r#   r?   rD   rF   rV   rd   r   r   r   r   r$   L   s*    	#
r$   c                   @   sB   e Zd Zdd Zdd ZejfddZdd Zd	d
 Z	dd Z
dS )BaseTestc                 C   s   t ddt| _d S )NTnopython)r   r   cfuncr   r   r   r   setUp   s   zBaseTest.setUpc                 C   s   | j }t|D ]>}||}| |t z
| |t| W q tyE } ztd t||t| td tt|t	j
d  |d }~ww d S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1r6   )rh   listassertIsInstancerQ   r`   r   AssertionErrorprintabsr   _PyHASH_MODULUS)r   valuesrh   valnb_hasher   r   r   check_hash_values   s   zBaseTest.check_hash_valuesc                 c   s~    dD ]9}t |}|j|  kr|jksn 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 tdtt|j ||S )NrQ   )getattrry   rM   rz   bitsview)r   r~   valuer   r   r   safe_construct   s   $zBaseTest.safe_constructc                 c   s    t |}dd|jd |jd fD ]:}d}t|j||j }d|d |fD ]%}||k r-q&t ||||  |}||}|V  | V  ||  V  q&qdddd	td
td
 g}||V  d S )Nr   
         ?g     @@rv   g333333?g        g       g      inf)	ry   finfor|   tiny
resolutionlinspaceastypemeanfloat)r   r~   r   r   r   min_stepstepar   r   r   float_samples   s    


zBaseTest.float_samplesc                 c   sl    |  |D ]-}|  |D ]%}|d t| }|d t| }||d|  }tt|s2|V  qqd S )Ny              ?)r   r_   ry   anyisnan)r   r~   float_tyrealimagr   r   r   r   complex_samples   s   zBaseTest.complex_samplesN)r!   r"   r#   rj   ru   ry   int64r   r   r   r   r   r   r   r   re      s    re   c                       sj   e Zd ZdZ fddZd fddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zedd Z  ZS )TestNumberHashingz'
    Test hashing of number types.
    c                    .   t dkrt dkrt | _td t  S Nr9   r   r9   r6   legacyr   ry   _get_promotion_stateinitial_state_set_promotion_statesuperrj   ri   	__class__r   r   rj         


zTestNumberHashing.setUpreturnNc                    &   t dkrt dkrt| j t  S Nr   r   r   ry   r   r   r   tearDownri   r   r   r   r         
zTestNumberHashing.tearDownc                 C   s2   |  |D ]}| |jt| | | qd S r   )r   r`   dtypery   ru   )r   r~   r   r   r   r   check_floats   s   zTestNumberHashing.check_floatsc                 C   s4   |  ||D ]}| |jt| | | qd S r   )r   r`   r   ry   ru   )r   r~   r   r   r   r   r   check_complex   s   zTestNumberHashing.check_complexc                 C   s   |  tj |  tj d S r   )r   ry   float32float64ri   r   r   r   test_floats  s   zTestNumberHashing.test_floatsc                 C   s$   |  tjtj |  tjtj d S r   )r   ry   	complex64r   
complex128r   ri   r   r   r   test_complex  s   zTestNumberHashing.test_complexc                 C   s   |  ddg d S )NFTru   ri   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 ]}| 
| qt |}| 
| |dg | 
|dg dt|v}| j}|j|jfD ]\}d| }|}	t|D ]O}
d}d}|	g}||fD ]}|	|@ }|tjk rs|| qc|D ]
}| 
||g qv|r|D ]}||jkr| 
|| g q|dkr|	dB d> }	qV|	d? }	qVqJq| 
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 )Nrx   r   uint      *UU*UU
    UU*UU* r6   l    l    l l l i  i
  id  )ry   int8uint8int16uint16int32uint32r   uint64r   ru   rz   r   rM   itemsizer{   r|   r}   r   maxsizeappend)r   minmaxtyr   r   signedszr   shiftsyitwiddle1twiddle2valstwrr   vr   r   r   	test_ints  sZ   




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 )nan)r   ).0r   r   r   r   
<listcomp>O      z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>r   c                    s   g | ]}  |qS r   )rh   )r   zri   r   r   r   P  s    r6   )r}   setassertGreaterr_   )r   r   rS   r   ri   r   test_py310_nan_hashF  s   	z%TestNumberHashing.test_py310_nan_hashr   N)r!   r"   r#   __doc__rj   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s    	7r   c                       sF   e Zd ZdZ fddZd fddZdd	 Zd
d Zdd Z  Z	S )TestTupleHashingz!
    Test hashing of tuples.
    c                    r   r   r   ri   r   r   r   rj   Y  r   zTestTupleHashing.setUpr   Nc                    r   r   r   ri   r   r   r   r   b  r   zTestTupleHashing.tearDownc                    s*   |D ]} fdd|D }|  | qd S )Nc                    s   g | ]} |qS r   r   )r   r   splitr   r   r   l  r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>r   )r   value_generatorr   rq   tuplesr   r   r   check_tuplesj  s   zTestTupleHashing.check_tuplesc                    sT   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   r   r~   r   r   split2r  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   split3{  s
   


z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3)   )r   )r   r   )r   )r   r   )r8   )r[      )ry   r   r   r   ru   )r   r   r   r   r   r   test_homogeneous_tupleso  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?)ry   r   r   )r   r   br   r   r   r     s   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split)r   r   )r   modulor   r   r   r   test_heterogeneous_tuples  s   z*TestTupleHashing.test_heterogeneous_tuplesr   )
r!   r"   r#   r   rj   r   r   r   r   r   r   r   r   r   r   T  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 q$d}|t|}t t|D ]}| |d | g q@d}| | d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )r}   r_   ru   joinrk   )r   kind1_stringr   sepkind2_stringkind4_stringempty_stringr   r   r   test_basic_unicode  s   z%TestUnicodeHashing.test_basic_unicodec                 C   sD   d}t dddd }t|d }| |dk | ||| d S )Nr   Trf   c                 S   s   | j S r   )_hashr   r   r   r   fn  s   z4TestUnicodeHashing.test_hash_passthrough.<locals>.fnrx   r   r   
assertTruer`   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   Trf   c                 S   s   | j t| fS r   )r   r   r   r   r   r   r       z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fnrx   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 )NTrf   c                  S   s   d} | S )Nr   r   r   r   r   r   r    s   z0TestUnicodeHashing.test_hash_literal.<locals>.fnr   rx   )r   r   r`   r   )r   r  rr   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 )Naaaau   眼眼眼眼r   )do_hashconst1const2newr   r   r   impl  s   z:TestUnicodeHashing.test_hash_on_str_creation.<locals>.implTrf   Frx   )r   r   r`   r  )r   r  jittedcompute_hashrc   rb   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     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 s5w   Y  dtt| d}| |t|j qd S )Nr[   Trf   zunhashable type: '')r   Dictemptyr   r   List
empty_listry   onesr   r   assertRaises	TypeErrorrM   r   assertIn	exception)r   unhashablesrh   r   raisesrc   r   r   r   test_hash_unhashable  s   
z#TestUnhashable.test_hash_unhashablec                 C   s\   t dddd }| t}|  W d    n1 sw   Y  d}| |t|j d S )NTrf   c                   S   s   t tj d S r   )r   ry   cosr   r   r   r   foo  r  z0TestUnhashable.test_no_generic_hash.<locals>.fooz"No __hash__ is defined for object )r   r  r  r  rM   r   )r   r%  r"  rc   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  rJ   r   r   collectionsr   textwrapr   numpyry   numbar   r   r   r   
numba.corer   r	   numba.tests.supportr
   r   r   numba.cpython.unicoder   numba.cpythonr   numba.np.numpy_supportr   r   r   r$   re   r   r   r   r  r!   mainr   r   r   r   <module>   s4   -SEpEZ 