U
    hâËd4j  ã                
   @   sŽ  d Z ddl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mZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZmZm Z  ej!dkZ"ej#j$Z%e&ede% ƒZ'e&ede% ƒZ(ej#j)Z*ej#j+Z,e(ej#j-ƒZ.ej/j0dk�rdndZ1dZ2e2Z3ej4j5Z6ej#j7Z8ej#j9Z:dd„ Z;ee;ƒdd„ ƒZ<ee=ƒdd„ ƒZ>edd„ ƒZ?ee(e(ej@ejAejAe(ejAdœd�dd„ ƒZBedd„ ƒZCed d!„ ƒZDee(e(e(e(e(e(ejEejEd"œd�d#d$„ ƒZFeejGd%ƒeejHd%ƒd&d'„ ƒƒZIeejJd%ƒd(d)„ ƒZKeejLd%ƒd*d+„ ƒZMe(j0d, d-k�r`e(d.ƒZNe(d/ƒZOe(d0ƒZPed1ejQid�d2d3„ ƒZRn0e(d4ƒZNe(d5ƒZOe(d6ƒZPed1ejQid�d7d3„ ƒZRee(e(e(e(e(d8œd�d9d:„ ƒZSeejTd%ƒd;d<„ ƒZUdd=lmVZVmWZWmXZXmYZYmZZZm[Z[ G d>d?„ d?eZƒZ\G d@dA„ dAeZƒZ]G dBdC„ dCeZƒZ^G dDdE„ dEeZƒZ_G dFdG„ dGe[ƒZ`edHdIdJgƒZadKdL„ Zbebƒ Zce:dMk�r,e:dNk�rpdOZde eed¡ eejQejQdPœd�dQdR„ ƒZfeejQejQejQejQejQejQdSœd�dTdU„ ƒZgeejQejQejQejQdVœd�dWdX„ ƒZheejQejQejQejQdVœd�dYdZ„ ƒZid[d\„ Zjejd]ƒZkejd^ƒZle:d]k�r&eknelZmnd_e: Zdenedƒ‚ed`da„ ƒZodbdc„ Zpeepƒddde„ ƒZqedfe(id�dgdh„ ƒZreejsd%ƒdidj„ ƒZtdS )kz&
Hash implementations for Numba types
é    N)Ú
namedtuple)Úir)Úliteral_unroll)ÚoverloadÚoverload_methodÚ	intrinsicÚregister_jitable)Úerrors)ÚtypesÚutils)Ú	grab_byteÚgrab_uint64_t)Ú	const_intÚget_next_intÚget_next_int32Úget_state_ptr)é   é
   zint%szuint%sé    é   é=   iCB c                 C   s   d S ©N© )Ú	hash_funcr   r   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cpython/hashing.pyÚ_defer_hash1   s    r   c                    s   d| › d�‰ ‡ fdd„}|S )Nzunhashable type: 'ú'c                    s   |d krt ˆ ƒ‚n|ƒ S d S r   )Ú	TypeError)Úobjr   ©Úerr_msgr   r   Úimpl9   s    
zol_defer_hash.<locals>.implr   )r   r   r!   r   r   r   Úol_defer_hash5   s    r"   c                    s   d| › d�‰ ‡ fdd„}|S )Nz+No __hash__ is defined for object of type 'zn' and a generic hash() cannot be performed as there is no suitable object represention in Numba compiled code!c                    s&   t | dƒrt| t| dƒƒS tˆ ƒ‚d S )NÚ__hash__)Úhasattrr   Úgetattrr   )r   ©Zattempt_generic_msgr   r   r!   I   s    
zhash_overload.<locals>.implr   )r   r!   r   r&   r   Úhash_overloadB   s    r'   c                 C   s    t | ƒ}|tdƒkrtdƒ}|S )Néÿÿÿÿéþÿÿÿ)Ú
_Py_hash_tÚint)ÚvalZasintr   r   r   Úprocess_returnQ   s    r-   )ÚxÚyÚmÚeÚsignÚ_PyHASH_MODULUSÚ_PyHASH_BITS©Úlocalsc                 C   s
  t  | ¡s>t  | ¡r(| dkr tS t S ntr:tƒ }t|ƒS tS t 	| ¡\}}d}|dk rbd}| }d}|r¼|d> t
@ |td ? B }|d9 }|d8 }t|ƒ}||8 }||7 }|t
krf|t
8 }qf|dkrÎ|t }ntd d| t  }||> t
@ |t| ? B }|| }t|ƒS )Nr   é   r(   é   g      °A)ÚnpÚisfiniteÚisinfÚ_PyHASH_INFÚ_py310_or_laterÚ_prng_random_hashr-   Ú_PyHASH_NANÚmathÚfrexpr3   r4   r+   )Úvr.   r0   r1   r2   r/   r   r   r   Ú_Py_HashDouble`   s<    



rC   c                 C   s   dd„ }t  t j¡}||fS )Nc                 S   s   |d }|  |t ¡ ¡S )Nr   )Zfpextr   Z
DoubleType)ÚcgctxÚbuilderÚ	signatureÚargsr,   r   r   r   r!   š   s    z_fpext.<locals>.impl)r
   Úfloat64Zfloat32)Útyctxr,   r!   Úsigr   r   r   Ú_fpext˜   s    rK   c                 C   s   dd„ }t ƒ }||fS )Nc                 S   s>   t | |dƒ}ttƒ}tdkr*t| ||ƒ}nt| |||dƒ}|S )NZinternalr   F)r   r   Ú_hash_widthr   r   )rD   rE   rF   rG   Z	state_ptrÚbitsÚvaluer   r   r   r!   ¤   s    	z_prng_random_hash.<locals>.impl)r*   )rI   r!   rJ   r   r   r   r>   ¡   s    r>   )r.   Úp1Úp2Úp3Úp4r3   r4   Ú_PyLong_SHIFTc           
      C   s˜   dt  }t d¡ |? }dt  d }d}tt  }t|d ddƒD ]N}|t > }|t@ }||? }	||	B }|t | |t  ? |@ ¡7 }|tkr@|t8 }q@t|ƒS )Nr   r   é@   r7   r(   )rS   r
   Zuint32r4   Úranger3   r*   )
r,   Z
_tmp_shiftZ
mask_shiftÚir.   rQ   ÚidxrO   rP   rR   r   r   r   Ú
_long_implÁ   s    
rX   r#   c                    sH   t jdkrdnd‰t d¡‰t| ddƒr.tjntj‰ ‡ ‡‡fdd„}|S )	Nl        r)   éüÿÿÿlûÿÿÿ         ÚsignedFc                    sr   ˆ | ƒ} t | ƒ}|tk rB| dkr&d}qj| ˆkr8tˆƒ}qjt| ƒ}n(d}| dk rX|  } d}t| ƒ}|rj| }t|ƒS )Nr   FT)Úabsr3   r*   rX   r-   )r,   ÚmagÚretZneeds_negate©Z_BIGZ_HASH_I64_MINZ_SIGNED_MINr   r   r!   ò   s     


zint_hash.<locals>.impl)ÚsysÚmaxsizer
   Zint64r%   Úuint64©r,   r!   r   r^   r   Úint_hashæ   s
    
rc   c                 C   s    | j dkrdd„ }ndd„ }|S )NrT   c                 S   s   t | ƒ}|S r   )rC   )r,   Úhashedr   r   r   r!     s    zfloat_hash.<locals>.implc                 S   s   t  t| ƒ¡}t|ƒ}|S r   )r9   rH   rK   rC   )r,   Z
fpextendedrd   r   r   r   r!     s    )Úbitwidthrb   r   r   r   Ú
float_hash  s    

rf   c                 C   s   dd„ }|S )Nc                 S   s(   t | jƒ}t | jƒ}|t|  }t|ƒS r   )ÚhashÚrealÚimagÚ_PyHASH_IMAGr-   )r,   ZhashrealZhashimagÚcombinedr   r   r   r!   (  s    

zcomplex_hash.<locals>.implr   rb   r   r   r   Úcomplex_hash&  s    
rl   é   é   l   ‡J×Æf»q	 l   Ok©Oô8• l   Åg¬,¼,§> r.   c                 C   s   | t  d¡> | t  d¡? B S )Nr   é!   ©r
   ra   ©r.   r   r   r   Ú_PyHASH_XXROTATE@  s    rr   l   ±yn< l   wJ× i±gVc                 C   s   | t  d¡> | t  d¡? B S )Né   é   rp   rq   r   r   r   rr   I  s    )ÚaccÚlaneÚ_PyHASH_XXPRIME_5Ú_PyHASH_XXPRIME_1Útlc                 C   s€   t | ƒ}t}t| ƒD ]:}t|ƒ}|tdƒkr2 dS ||t 7 }t|ƒ}|t9 }q||ttdƒA A 7 }|tdƒkrxtdƒS t|ƒS )Nr(   isÓ5 iÔK*\)	Úlenrw   r   rg   Ú_Py_uhash_tÚ_PyHASH_XXPRIME_2rr   rx   r-   )Útupry   ru   r.   rv   r   r   r   Ú_tuple_hashO  s    
r~   c                 C   s   dd„ }|S )Nc                 S   s   t | ƒS r   )r~   )r,   r   r   r   r!   h  s    ztuple_hash.<locals>.implr   rb   r   r   r   Ú
tuple_hashf  s    r   )Úc_size_tÚc_ubyteÚc_uint64Ú	pythonapiÚ	StructureÚUnionc                   @   s   e Zd ZdefdefgZdS )ÚFNVÚprefixÚsuffixN)Ú__name__Ú
__module__Ú__qualname__r€   Ú_fields_r   r   r   r   r†   …  s   þr†   c                   @   s   e Zd ZdefdefgZdS )ÚSIPHASHÚk0Úk1N)r‰   rŠ   r‹   r‚   rŒ   r   r   r   r   r�   Œ  s   þr�   c                   @   s    e Zd Zded fdefgZdS )ÚDJBX33AÚpaddingé   rˆ   N©r‰   rŠ   r‹   r�   r€   rŒ   r   r   r   r   r�   “  s   
þr�   c                   @   s    e Zd Zded fdefgZdS )ÚEXPATr‘   r’   ZhashsaltNr“   r   r   r   r   r”   š  s   
þr”   c                   @   s2   e Zd Zded fdefdefdefdefgZdS )Ú_Py_HashSecret_tZucé   ÚfnvÚsiphashÚdjbx33aÚexpatN)	r‰   rŠ   r‹   r�   r†   r�   r�   r”   rŒ   r   r   r   r   r•   ¡  s   
÷r•   Ú_hashsecret_entryÚsymbolrN   c                     sJ   t  td¡} i ‰ ‡ fdd„}|d| jjƒ |d| jjƒ |d| jjƒ ˆ S )zÑRead hash secret from the Python process

    Returns
    -------
    info : dict
        - keys are "djbx33a_suffix", "siphash_k0", siphash_k1".
        - values are the namedtuple[symbol:str, value:int]
    Z_Py_HashSecretc                    s>   d  | ¡}t |¡}t |¡}t ||¡ t||d�ˆ | < d S )Nz_numba_hashsecret_{})rœ   rN   )ÚformatÚctypesr‚   Z	addressofÚllZ
add_symbolr›   )Únamer,   Zsymbol_nameÚaddr©Úinfor   r   ÚinjectÁ  s
    


z!_build_hashsecret.<locals>.injectÚdjbx33a_suffixÚ
siphash_k0Ú
siphash_k1)r•   Zin_dllrƒ   r™   rˆ   r˜   rŽ   r�   )Zpyhashsecretr¤   r   r¢   r   Ú_build_hashsecret³  s    r¨   )Ú	siphash13Ú	siphash24r—   r—   až  FNV hashing is not implemented in Numba. See PEP 456 https://www.python.org/dev/peps/pep-0456/ for rationale over not using FNV. Numba will continue to work, but hashes for built in types will be computed using siphash24. This will permit e.g. dictionaries to continue to behave as expected, however anything relying on the value of the hash opposed to hash as a derived property is likely to not work as expected.©r.   Úbc                 C   s    t  | |> | t  d¡| ? B ¡S )NrT   rp   r«   r   r   r   Ú_ROTATE  s    r­   ©Úar¬   ÚcÚdÚsÚtc                 C   sB   | |7 } ||7 }t ||ƒ| A }t ||ƒ|A }t | dƒ} | |||fS )Nr   )r­   r®   r   r   r   Ú_HALF_ROUND  s    
r´   ©Úv0Úv1Úv2Úv3c                 C   s@   t | |||ddƒ\} }}}t ||| |ddƒ\}}} }| |||fS )Nrs   r’   é   é   )r´   rµ   r   r   r   Ú_SINGLE_ROUND$  s    r¼   c                 C   s8   t | |||ƒ\} }}}t | |||ƒ\} }}}| |||fS r   )r¼   rµ   r   r   r   Ú_DOUBLE_ROUND-  s    r½   c                    sv   | dkrt ‰d‰ n| dkr$t‰d‰ nds0tdƒ‚ttjtjtjtjtjtjtjtjtjtjdœ
d�‡ ‡fd	d
„ƒ}|S )Nr©   Trª   Fr   Zunreachable)
r¶   r·   r¸   r¹   r¬   Úmir³   ÚmaskÚjmpÚohexefefr5   c                    s  t  |¡d> }| t  d¡A }|t  d¡A }| t  d¡A }|t  d¡A }d}	|dkr”t||	ƒ}
|	d7 }	|d8 }||
N }ˆ||||ƒ\}}}}||
N }qJt  d¡}|	d }t  d	¡}|d
krìd}t  ||> ¡ }||@ t  t||d ƒ¡|> B }|dk�r*d}t  ||> ¡ }||@ t  t||d ƒ¡|> B }|dk�rhd}t  ||> ¡ }||@ t  t||d ƒ¡|> B }|dk�rÈ|t  d¡M }tdƒD ]>}|d }t  ||> ¡ }||@ t  t||| ƒ¡|> B }�qˆ|dk�rd}t  ||> ¡ }||@ t  t||d ƒ¡|> B }|dk�rDd}t  ||> ¡ }||@ t  t||d ƒ¡|> B }|dk�rp| }||@ t  t||d ƒ¡B }||O }||N }ˆ||||ƒ\}}}}||N }||N }ˆ||||ƒ\}}}}ˆ||||ƒ\}}}}ˆ �rîˆ||||ƒ\}}}}||A ||A A }|S )Né8   l   ueæ`•5{ l   moÈ\…I{# l   arÊ\•Ëc l   seèr‰+# r   rm   r7   éÿ   é   é0   é   é(   é   r   rn   l       üÿ r   r’   é   )r
   ra   r   r   rU   )rŽ   r�   ÚsrcZsrc_szr¬   r¶   r·   r¸   r¹   rW   r¾   r³   ZboffsetrÁ   rÀ   r¿   rV   ©Z_EXTRA_ROUNDZ_ROUNDERr   r   Ú_siphash@  sˆ    



ÿ
ÿ
ÿ
ÿ

ÿ
ÿ
z_gen_siphash.<locals>._siphash)r¼   r½   ÚAssertionErrorr   r
   ra   )ÚalgrÌ   r   rË   r   Ú_gen_siphash6  s(    ÷
ErÏ   r©   rª   z'Unsupported hashing algorithm in use %sc                    sD   t |tjƒst d¡‚t|j j‰ tj}||ƒ}‡ fdd„}||fS )z&Emit code to load the hashsecret.
    zrequires literal stringc                    sN   |j }z| ˆ ¡}W n* tk
r>   tj|t d¡ˆ d�}Y nX | |¡}|S )NrT   ©r    )ÚmoduleZ
get_globalÚKeyErrorr   ZGlobalVariableZIntTypeÚload)rD   rE   rJ   rG   ÚmodÚgvrB   ©Úsymr   r   r!   ¦  s    
z%_inject_hashsecret_read.<locals>.impl)	Ú
isinstancer
   ZStringLiteralr	   ZTypingErrorÚ_hashsecretZliteral_valuerœ   ra   )rI   r    ZrestyrJ   r!   r   rÖ   r   Ú_inject_hashsecret_read›  s    
rÚ   c                 C   s
   t |  jS r   )rÙ   rN   rÐ   r   r   r   Ú_load_hashsecret´  s    rÛ   c                 C   s   dd„ }|S )Nc                 S   s   t | ƒS r   )rÚ   rÐ   r   r   r   Úimpº  s    z"_impl_load_hashsecret.<locals>.impr   )r    rÜ   r   r   r   Ú_impl_load_hashsecret¸  s    rÝ   Ú_hashc                 C   s’   |dkrt dƒS |tk r`tdƒ}t|ƒD ] }|d> | t t| |ƒ¡ }q(||N }|tdƒN }n*tt	 
tdƒ¡t	 
tdƒ¡| |ƒ}t |ƒ}t |ƒS )Nr   i  rÈ   r¥   r¦   r§   )r-   Ú_Py_HASH_CUTOFFr{   rU   r9   Zuint8r   rÛ   Ú
_siphasherr
   ra   )r,   Ú_lenrÞ   rW   Útmpr   r   r   Ú_Py_HashBytesÃ  s     þrã   c                    s   ddl m‰  ‡ fdd„}|S )Nr   ©Ú_kind_to_byte_widthc                    s8   ˆ | j ƒ}t| ƒ}| j}|dkr$|S t| j|| ƒS d S )Nr(   )Ú_kindrz   rÞ   rã   Ú_data)r,   Z	kindwidthrá   Zcurrent_hashrä   r   r   r!   à  s    
zunicode_hash.<locals>.impl)Znumba.cpython.unicoderå   rb   r   rä   r   Úunicode_hashÜ  s    rè   )uÚ__doc__r@   Únumpyr9   r_   rž   ÚwarningsÚcollectionsr   Zllvmlite.bindingZbindingrŸ   Zllvmliter   Znumbar   Znumba.core.extendingr   r   r   r   Z
numba.corer	   r
   r   Znumba.core.unsafe.bytesr   r   Znumba.cpython.randomimplr   r   r   r   Z	PYVERSIONr=   Ú	hash_infoÚwidthrL   r%   r*   r{   Úinfr<   Únanr?   Úmodulusr3   Zintpre   r4   Z_PyHASH_MULTIPLIERrj   Úint_infoÚbits_per_digitrS   Úcutoffrß   Ú	algorithmZ_Py_hashfunc_namer   r"   rg   r'   r-   ÚdoubleZintcrC   rK   r>   Zint32rX   ÚIntegerÚBooleanrc   ÚFloatrf   ÚComplexrl   rx   r|   rw   ra   rr   r~   Z	BaseTupler   r€   r�   r‚   rƒ   r„   r…   r†   r�   r�   r”   r•   r›   r¨   rÙ   ÚmsgÚwarnr­   r´   r¼   r½   rÏ   Z
_siphash13Z
_siphash24rà   Ú
ValueErrorrÚ   rÛ   rÝ   rã   ZUnicodeTyperè   r   r   r   r   Ú<module>   s  



ú
1

ù


,




ý


 



/ÿ
û
ý
ý
[




