U
    ì¾|e4j  ã                
   @   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   úR/var/www/website-v5/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   )Úfpextr   Ú
DoubleType)ÚcgctxÚbuilderÚ	signatureÚargsr,   r   r   r   r!   š   s    z_fpext.<locals>.impl)r
   Úfloat64Úfloat32)Útyctxr,   r!   Úsigr   r   r   Ú_fpext˜   s    rN   c                 C   s   dd„ }t ƒ }||fS )Nc                 S   s>   t | |dƒ}ttƒ}tdkr*t| ||ƒ}nt| |||dƒ}|S )NÚinternalr   F)r   r   Ú_hash_widthr   r   )rF   rG   rH   rI   Z	state_ptrÚbitsÚvaluer   r   r   r!   ¤   s    	z_prng_random_hash.<locals>.impl)r*   )rL   r!   rM   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(   )rW   r
   Úuint32r4   Úranger3   r*   )
r,   Z
_tmp_shiftZ
mask_shiftÚir.   rU   ÚidxrS   rT   rV   r   r   r   Ú
_long_implÁ   s    
r]   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*   r]   r-   )r,   ZmagÚretZneeds_negate©Z_BIGZ_HASH_I64_MINZ_SIGNED_MINr   r   r!   ò   s     


zint_hash.<locals>.impl)ÚsysÚmaxsizer
   Úint64r%   Úuint64©r,   r!   r   rb   r   Úint_hashæ   s
    
rh   c                 C   s    | j dkrdd„ }ndd„ }|S )NrX   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   rJ   rN   rC   )r,   Z
fpextendedri   r   r   r   r!     s    )Úbitwidthrg   r   r   r   Ú
float_hash  s    

rk   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   rg   r   r   r   Úcomplex_hash&  s    
rq   é   é   l   ‡J×Æf»q	 l   Ok©Oô8• l   Åg¬,¼,§> r.   c                 C   s   | t  d¡> | t  d¡? B S )Nr   é!   ©r
   rf   ©r.   r   r   r   Ú_PyHASH_XXROTATE@  s    rw   l   ±yn< l   wJ× i±gVc                 C   s   | t  d¡> | t  d¡? B S )Né   é   ru   rv   r   r   r   rw   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*\)	Úlenr|   r   rl   Ú_Py_uhash_tÚ_PyHASH_XXPRIME_2rw   r}   r-   )Útupr~   rz   r.   r{   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   rg   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_tÚucé   ÚfnvÚsiphashÚdjbx33aZexpatN)	rŽ   r�   r�   r†   r‹   r’   r•   r™   r‘   r   r   r   r   rš   ¡  s   
÷rš   Ú_hashsecret_entryÚsymbolrR   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¡   rR   )ÚformatÚctypesr‡   Ú	addressofÚllÚ
add_symbolr    )Únamer,   Zsymbol_nameÚaddr©Úinfor   r   ÚinjectÁ  s
    


z!_build_hashsecret.<locals>.injectÚdjbx33a_suffixÚ
siphash_k0Ú
siphash_k1)rš   Ú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 )NrX   ru   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 )Nrx   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   Ú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   rr   r7   éÿ   é   é0   é   é(   é   r   rs   l       üÿ r   r—   é   )r
   rf   r   r   rZ   )r“   r”   ÚsrcZsrc_szr´   r¾   r¿   rÀ   rÁ   r\   rÇ   r»   ZboffsetrÊ   rÉ   rÈ   r[   ©Z_EXTRA_ROUNDZ_ROUNDERr   r   Ú_siphash@  sˆ    



ÿ
ÿ
ÿ
ÿ

ÿ
ÿ
z_gen_siphash.<locals>._siphash)rÄ   rÅ   ÚAssertionErrorr   r
   rf   )Ú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 )NrX   ©r§   )ÚmoduleÚ
get_globalÚKeyErrorr   ÚGlobalVariableÚIntTypeÚload)rF   rG   rM   rI   ÚmodÚgvrB   ©Úsymr   r   r!   ¦  s    
z%_inject_hashsecret_read.<locals>.impl)	Ú
isinstancer
   ÚStringLiteralr	   ÚTypingErrorÚ_hashsecretÚliteral_valuer¡   rf   )rL   r§   ÚrestyrM   r!   r   râ   r   Ú_inject_hashsecret_read›  s    
rê   c                 C   s
   t |  jS r   )rç   rR   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€   rZ   r9   Úuint8r   rë   Ú
_siphasherr
   rf   )r,   Ú_lenrî   r\   Ú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(   )Ú_kindr   rî   rô   Ú_data)r,   Z	kindwidthrò   Zcurrent_hashrõ   r   r   r!   à  s    
zunicode_hash.<locals>.impl)Znumba.cpython.unicoderö   rg   r   rõ   r   Úunicode_hashÜ  s    rù   )uÚ__doc__r@   Únumpyr9   rc   r£   ÚwarningsÚcollectionsr   Úllvmlite.bindingÚbindingr¥   Úllvmliter   Únumbar   Únumba.core.extendingr   r   r   r   Ú
numba.corer	   r
   r   Únumba.core.unsafe.bytesr   r   Znumba.cpython.randomimplr   r   r   r   Ú	PYVERSIONr=   Ú	hash_infoÚwidthrP   r%   r*   r€   Úinfr<   Únanr?   Úmodulusr3   Úintprj   r4   Z_PyHASH_MULTIPLIERro   Úint_infoÚbits_per_digitrW   Úcutoffrï   Ú	algorithmZ_Py_hashfunc_namer   r"   rl   r'   r-   ÚdoubleÚintcrC   rN   r>   Úint32r]   ÚIntegerÚBooleanrh   ÚFloatrk   ÚComplexrq   r}   r�   r|   rf   rw   rƒ   Ú	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ô   ÚUnicodeTyperù   r   r   r   r   Ú<module>   s  



ú
1

ù


,




ý


 



/ÿ
û
ý
ý
[




