
    J/PhI                        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 Z G d de          Z G d de          Z G d de          Z  G d de           Z! G d de           Z" G d de           Z# G d de          Z$e%dk    r ej&                     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                      t          |           S Nhashxs    X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/tests/test_hashing.pyhash_usecaser      s    77N    c                       e Zd Zd ZdS )TestHashingSetupc                 f    d}t          j        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works     r   test_warn_on_fnvz!TestHashingSetup.test_warn_on_fnv!   s2    %L 	s~tVD\\BCCCCCr   N)__name__
__module____qualname__r#    r   r   r   r      s(        (D (D (D (D (Dr   r   c                   |    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 Zd ZddZ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/   r0   )i=վlBT='8 i\el   \e+=" )i[l$E,; iwmHloa_gv )pG   nYD~ r1   r2   )SjxY_oWs r3   r4   )     /l r5   r6   )iJkl   J:8`~ il)wJ )iQ	l .GUJG iO{l]D] )djba33x	siphash13	siphash24c                     |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 )Nr7   little   r   big      )r   	hash_infocutoff	algorithmr   	IS_32BITS	byteorderknown_hashes)r!   positionlengthrB   IS_64BITplatforms         r   get_expected_hashzTestHashAlgs.get_expected_hashx   s    CM(((!II/I''=H$$$+qq!HH=E))))$+qq!H +H5h??r   c                     d|z  S )Nzprint(hash(eval(%a)))r'   )r!   repr_s     r   get_hash_commandzTestHashAlgs.get_hash_command   s    &..r   Nc                 L   t           j                                        }|t          |          |d<   n|                    dd            t          |                     |          |          \  }}|                                                                }t          |          S )NPYTHONHASHSEED)codeenv)
osenvironcopystrpopr   rM   decodestripint)r!   rL   seedrQ   out_stdouts          r   get_hashzTestHashAlgs.get_hash   s    joo$'IIC !!GG$d+++"(=(=e(D(D'*, , ,Q##%%6{{r   c                 4   d}|D ]\  }}}|                      ||          5  |                     t          |          |          }|                     |t	          |                    }|                     ||           d d d            n# 1 swxY w Y   d S )N))abcr   r   )r`   *   r<   )abcdefghijkra   r?   )
   äú∑ℇr   r>   )rc   ra      )	input_strrZ   )rZ   )subTestr^   reprrJ   lenassertEqual)r!   argsre   rZ   rF   gotexpecteds          r   test_against_cpython_goldz&TestHashAlgs.test_against_cpython_gold   s    > *. 	0 	0%ItX	== 0 0mmDOO$m??11(C	NNKK  h///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	0 	0s   ABB	B	r   )r$   r%   r&   rE   rJ   rM   r^   rm   r'   r   r   r)   r)   L   s         :99NNN	 MLLNNNNNNQQQPPP
  ONNNNNPPPOOORRR
)! !LF@ @ @/ / /	 	 	 		0 	0 	0 	0 	0r   r)   c                   :    e Zd Zd Zd Zej        fdZd Zd Z	dS )BaseTestc                 L     t          d          t                    | _        d S )NTnopython)r   r   cfuncr!   s    r   setUpzBaseTest.setUp   s"    'S$'''55


r   c           	         | j         }t          |          D ]} ||          }|                     |t                     	 |                     |t          |                     M# t          $ rm}t          d           t          ||t          |                     t          d           t          t          |          t          j
        dz
             |d }~ww xY wd S )Nzval, nb_hash, hash(val)z%abs(val), hashing._PyHASH_MODULUS - 1r<   )rs   listassertIsInstancerY   ri   r   AssertionErrorprintabsr   _PyHASH_MODULUS)r!   valuesrs   valnb_hashes         r   check_hash_valueszBaseTest.check_hash_values   s    
<< 
	 
	CeCjjG!!'3///  $s))4444!   /000c7DII...=>>>c#hh 7! ;<<<
	 
	s    #A$$
C.A(CCc              #     K   dD ]~}t          j        |          }|j        |cxk    r|j        k    sn 0d}t	          |||z             V  t	          ||d|z  z   d          V  t	          ||d|z  z   d          V  dgV  d S )N)r   ii`  l        d      )npiinfominmaxrange)r!   typstartinfons        r   int_sampleszBaseTest.int_samples   s      - 	 	E8C==D8u00000000Auqy)))))usQw44444usQw44444$JJJJ	 	r   c              #     K   t          j        |          }dd|j        dz  |j        dz  fD ]}d}t          |j        ||j        z            }d|dz  |fD ]\}||k     r	t          j        ||||z  z   |          }|                    |          }|V  | V  ||                                z   V  ]dddd	t          d
          t          d
           g} ||          V  d S )Nr   
         ?g     @@r   g333333?g        g       g      inf)	r   finfor   tiny
resolutionlinspaceastypemeanfloat)r!   r   r   r   r   min_stepstepas           r   float_sampleszBaseTest.float_samples   s     x}}TX_dh.?@ 
	# 
	#EA49edo&=>>Hh#ox8 # #(??Kuq4x'7;;HHSMMb!&&((l""""# #tT5<<%,,@
 c!ffr   c              #   <  K   |                      |          D ]}|                      |          D ]k}|d t          |                   }|d t          |                   }| |d          |z  z   }t          j        t          j        |                    s|V  ld S )Ny              ?)r   rh   r   anyisnan)r!   r   float_tyrealimagr   s         r   complex_sampleszBaseTest.complex_samples   s      &&x00 		 		D**844  JSYYJ'JSYYJ'33r77T>) vbhqkk** GGG		 		r   N)
r$   r%   r&   ru   r   r   int64r   r   r   r'   r   r   ro   ro      sk        6 6 6   !h 	 	 	 	  .
 
 
 
 
r   ro   c                   h     e Zd ZdZ fdZd fdZd Zd Zd Zd	 Z	d
 Z
d Zed             Z xZS )TestNumberHashingz'
    Test hashing of number types.
    c                     t           dk    r,t          j                    | _        t          j        d           t                                                      S Nr?   r   legacyr   r   _get_promotion_stateinitial_state_set_promotion_statesuperru   r!   	__class__s    r   ru   zTestNumberHashing.setUp   D    F"" "$!8!:!:D#H---ww}}r   returnNc                     t           dk    rt          j        | j                   t	                                                      S Nr   r   r   r   r   r   tearDownr   s    r   r   zTestNumberHashing.tearDown   :    F"" #D$6777ww!!!r   c                     |                      |          D ]D}|                     |j        t          j        |                     |                     |           Ed S r   )r   ri   dtyper   r   )r!   r   r   s      r   check_floatszTestNumberHashing.check_floats   s`    ##C(( 	& 	&AQWbhsmm444""1%%%%	& 	&r   c                     |                      ||          D ]D}|                     |j        t          j        |                     |                     |           Ed S r   )r   ri   r   r   r   )r!   r   r   r   s       r   check_complexzTestNumberHashing.check_complex   sb    %%c844 	& 	&AQWbhsmm444""1%%%%	& 	&r   c                     |                      t          j                   |                      t          j                   d S r   )r   r   float32float64rt   s    r   test_floatszTestNumberHashing.test_floats  s4    "*%%%"*%%%%%r   c                     |                      t          j        t          j                   |                      t          j        t          j                   d S r   )r   r   	complex64r   
complex128r   rt   s    r   test_complexzTestNumberHashing.test_complex  s<    2<4442="*55555r   c                 4    |                      ddg           d S )NFTr   rt   s    r   	test_boolzTestNumberHashing.test_bool	  s     t}-----r   c           	         g }t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        fD ]n}| 	                    |          D ]}| 
                    |           t          j        |          }| 
                     |d          g           | 
                     |d          g           dt          |          v} |            j        }|j        |j        fD ]}d|z  }|}	t!          |          D ]}
d}d}|	g}||fD ],}|	|z  }|t"          j        k     r|                    |           -|D ]!}| 
                     ||          g           "|r0|D ]-}||j        k    r | 
                     ||           g           .|dk    r	|	dz  dz  }	|	dz	  }	p| 
                    t          j        d          g           | 
                    t          j        d	          g           | 
                    t          j        d          g           | 
                    t          j        d	          g           | 
                    t          j        d
          g           | 
                    t          j        d          g           | 
                    t          j        d          g           | 
                    t          j        d          g           | 
                    t          j        d          g           | 
                    t          j        d          g           d S )Nr   r   uint      *UU*UU
    UU*UU* r<   l    l    l l l i  i
  id  )r   int8uint8int16uint16int32uint32r   uint64r   r   r   rU   itemsizer   r   r   r   maxsizeappend)r!   minmaxtyr   r   signedszr   shiftsyitwiddle1twiddle2valstwr~   vs                    r   	test_intszTestNumberHashing.test_ints  s_   7BHbh	8RY")= #	# #	#B%%b)) * *&&q))))8B<<D ""BBrFF8,,,""BBqEE7+++3r77*FBh) # #R v # #A1H1H3D'2 - -(l,, KK,,,! 8 8..1w7777 A!% A AA DH}} $ 6 6A2x @ @ @AvvUqLF%##6 	); < <=>>>); < <=>>>	*< = =>???	*< = =>??? 	)< = =>???)< = =>???)< = =>??? 5 56777 5 56777 5 5677777r   c                      d t          d          D             }t           fd|D                       }                     t          |          d           d S )Nc                 ,    g | ]}t          d           S )nan)r   ).0r   s     r   
<listcomp>z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>L  s    ---aU5\\---r   r   c                 :    g | ]}                     |          S r'   )rs   )r   zr!   s     r   r   z9TestNumberHashing.test_py310_nan_hash.<locals>.<listcomp>M  s#    ,,,Q4::a==,,,r   r<   )r   setassertGreaterrh   )r!   r   r[   s   `  r   test_py310_nan_hashz%TestNumberHashing.test_py310_nan_hashC  sb     .-599---,,,,!,,,--3s88Q'''''r   r   N)r$   r%   r&   __doc__ru   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r      s             " " " " " "& & &
& & &
& & &6 6 6. . .58 58 58n 
( 
( 
( 
( 
( 
( 
(r   r   c                   @     e Zd ZdZ fdZd	 fdZd Zd Zd Z xZ	S )
TestTupleHashingz!
    Test hashing of tuples.
    c                     t           dk    r,t          j                    | _        t          j        d           t                                                      S r   r   r   s    r   ru   zTestTupleHashing.setUpV  r   r   r   Nc                     t           dk    rt          j        | j                   t	                                                      S r   r   r   s    r   r   zTestTupleHashing.tearDown_  r   r   c                 X    |D ]%}fd|D             }|                      |           &d S )Nc                 &    g | ]} |          S r'   r'   )r   r   splits     r   r   z1TestTupleHashing.check_tuples.<locals>.<listcomp>i  s!    ///1eeAhh///r   r   )r!   value_generatorr   r}   tupless     `  r   check_tupleszTestTupleHashing.check_tuplesg  sL    % 	+ 	+F///////F""6****	+ 	+r   c                    t           j        fd}fd}|                     |                                 |           |                     |                                 |           |                     g d           d S )Nc                 R     |           } |  d          z  |  d          z  fS )z9
            Split i's bits into 2 integers.
            r   r   r'   r   r   s    r   split2z8TestTupleHashing.test_homogeneous_tuples.<locals>.split2o  sB     AA.///./// r   c                 l     |           } |  d          z  |  d          z  |  d          z  fS )z9
            Split i's bits into 3 integers.
            l   $$$$ l   $I$I$I$I l   IIII	 r'   r  s    r   split3z8TestTupleHashing.test_homogeneous_tuples.<locals>.split3x  sU     AA.///.///./// r   )   )r   )r   r   )r   )r   r  )r>   )rd      )r   r   r   r   r   )r!   r  r  r   s      @r   test_homogeneous_tuplesz(TestTupleHashing.test_homogeneous_tuplesl  s    i	 	 	 	 		 	 	 	 	 	$**,,f555$**,,f555
 	  >  >  > 	? 	? 	? 	? 	?r   c                 `    d}d }|                      |                                 |           d S )Nl            c                 ~    | dz  }| dz  | dz	  dz  z  }t          j        |          t          j        |dz            fS )Nr   l   *UU     g-C6?)r   r   r   )r   r   bs      r   r   z9TestTupleHashing.test_heterogeneous_tuples.<locals>.split  sE    &&AZQ"W
$:;A8A;;
1v: 6 666r   )r   r   )r!   modulor   s      r   test_heterogeneous_tuplesz*TestTupleHashing.test_heterogeneous_tuples  s@    	7 	7 	7
 	$**,,e44444r   r   )
r$   r%   r&   r   ru   r   r   r	  r  r   r   s   @r   r   r   Q  s             " " " " " "+ + +
? ? ?>5 5 5 5 5 5 5r   r   c                   X    e Zd Zd Zd Zd Z ej        d          d             Zd Z	dS )TestUnicodeHashingc                 6   d}t          t          |                    D ] }|                     |d |         g           !d}|                    t	          |                    }t          t          |                    D ] }|                     |d |         g           !d}|                    t	          |                    }t          t          |                    D ] }|                     |d |         g           !d}|                     |           d S )Nabcdefghijklmnopqrstuvwxyzu   眼u   🐍⚡ )r   rh   r   joinrw   )r!   kind1_stringr   sepkind2_stringkind4_stringempty_strings          r   test_basic_unicodez%TestUnicodeHashing.test_basic_unicode  s(   3s<(()) 	7 	7A""L!$4#56666xx\ 2 233s<(()) 	7 	7A""L!$4#56666xx\ 2 233s<(()) 	7 	7A""L!$4#56666|,,,,,r   c                     d}t          d          d             }t          |          d         }|                     |dk               |                      ||          |           d S )Nr  Trq   c                     | j         S r   )_hashr   s    r   fnz4TestUnicodeHashing.test_hash_passthrough.<locals>.fn  s	    7Nr   r   r   r   
assertTrueri   r!   r  r  
hash_values       r   test_hash_passthroughz(TestUnicodeHashing.test_hash_passthrough  s     4	d				 	 
		 2,??C

b()))L)):66666r   c                     d}t          d          d             }t          |          d         }|                     |dk               |                      ||          ||f           d S )Nr  Trq   c                 .    | j         t          |           fS r   )r  r   r   s    r   r  z9TestUnicodeHashing.test_hash_passthrough_call.<locals>.fn  s    7DGG##r   r   r   r"  s       r   test_hash_passthrough_callz-TestUnicodeHashing.test_hash_passthrough_call  s    3	d				$ 	$ 
		$ 2,??C

b()))L))J
+CDDDDDr   z/Needs hash computation at const unpickling timec                     t          d          d             } |            }t          d          }|                     |t          |          d                    d S )NTrq   c                  
    d} | S )Nr  r'   r   s    r   r  z0TestUnicodeHashing.test_hash_literal.<locals>.fn  s    ,AHr   r  r   )r   r   ri   r   )r!   r  r~   tmps       r   test_hash_literalz$TestUnicodeHashing.test_hash_literal  sn     
d				 	 
		 bdd/00;C@@DFFFFFr   c                    d } t          d          |          }d} ||          } ||          }t          |          }t          |          }|                     |d d         |d d                    |                     |d         |d         k               d} ||          } ||          }t          |          }t          |          }|                     ||           d S )Nc                 :    d}d}||z   }| rt          |           |S )Naaaau   眼眼眼眼r   )do_hashconst1const2news       r   implz:TestUnicodeHashing.test_hash_on_str_creation.<locals>.impl  s-    F#F6/C S			Jr   Trq   Fr   )r   r   ri   r!  )r!   r3  jittedcompute_hashrl   rk   r   r  s           r   test_hash_on_str_creationz,TestUnicodeHashing.test_hash_on_str_creation  s   	 	 	 $d###D)) 4%%f\"")(33)#..3B33B3((("2''' 4%%f\"")(33)#..Ar   N)
r$   r%   r&   r  r$  r'  unittestskipr+  r6  r'   r   r   r  r    s        - - -$7 7 7
E 
E 
E X]DEE	G 	G FE	G    r   r  c                       e Zd Zd Zd ZdS )TestUnhashablec                 R   t          j                                        t          j        t          j                  t          j                                        t          j                  t          j        d          f} t          d          t                    }|D ]}|                     t                    5 } ||           d d d            n# 1 swxY w Y   dt          t          |                     d}|                     |t          |j                             d S )Nrd   Trq   zunhashable type: '')r   Dictemptyr	   r   List
empty_listr   onesr   r   assertRaises	TypeErrorrU   r   assertIn	exception)r!   unhashablesrs   r   raisesrl   s         r   test_hash_unhashablez#TestUnhashable.test_hash_unhashable  s0   z||))%+u{CCz||..u{;;wqzz# #T"""<00 	; 	;B""9-- b			              >Cr

OO>>>HMM(C(8$9$9::::		; 	;s   ;CC	C	c                    t          d          d             }|                     t                    5 } |             d d d            n# 1 swxY w Y   d}|                     |t	          |j                             d S )NTrq   c                  8    t          t          j                   d S r   )r   r   cosr'   r   r   fooz0TestUnhashable.test_no_generic_hash.<locals>.foo  s    LLLLLr   z"No __hash__ is defined for object )r   rB  rC  rD  rU   rE  )r!   rL  rG  rl   s       r   test_no_generic_hashz#TestUnhashable.test_no_generic_hash  s     
d				 	 
		 y)) 	VCEEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 9hF$4 5 566666s   AAAN)r$   r%   r&   rH  rM  r'   r   r   r:  r:    s2        	; 	; 	;7 7 7 7 7r   r:  __main__)'r   r7  rR   r   r   collectionsr   textwrapr   numpyr   numbar   r   r   r   
numba.corer	   r
   numba.tests.supportr   r   r   numba.cpython.unicoder   numba.cpythonr   numba.np.numpy_supportr   r   r   r)   ro   r   r   r  r:  r$   mainr'   r   r   <module>rY     s     				 



     # # # # # #           , , , , , , , , , , , , # # # # # # # # 4 4 4 4 4 4 4 4 4 4 ? > > > > > ! ! ! ! ! ! 0 0 0 0 0 0  *D *D *D *D *Dx *D *D *DZP0 P0 P0 P0 P08 P0 P0 P0f? ? ? ? ?x ? ? ?Dm( m( m( m( m( m( m( m(`B5 B5 B5 B5 B5x B5 B5 B5JW W W W W W W Wt7 7 7 7 7X 7 7 7@ zHMOOOOO r   