
\K]c           @` s  d  Z  d d l m Z m Z m 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 j Z d d l j j Z d d l m Z d d l m Z m Z m Z m Z d d l m Z m Z d d l m Z m Z e j  d	  d` k Z! e! r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. j/ d k rnd n d Z0 d Z1 e1 Z2 e j3 j4 Z5 e j" j6 Z7 e j" j8 Z9 n e j. j/ Z$ e% e d e$  Z& e% e d e$  Z' d Z) d Z+ e j. j/ d k rd n d Z0 e' d e0 >d  Z- d Z1 e1 Z2 e j. j/ d k r;d n d Z5 d Z7 d Z9 e e:  d    Z; e d    Z< e d i e' d 6e' d 6e j= d 6e j> d 6e j> d 6e' d  6e j> d! 6 d"    Z? e d#    Z@ e d i	 e' d 6e' d$ 6e' d% 6e' d& 6e' d' 6e' d  6e jA d! 6e jA d( 6e' d) 6 d*    ZB e e jC d+  e e jD d+  d,     ZE e e jF d+  d-    ZG e e jH d+  d.    ZI e d i e' d 6e& d 6e' d/ 6e& d0 6 d1    ZJ e d2    ZK e e jL d+  d3    ZM d d4 l	 mN ZN mO ZO mP ZP mQ ZQ mR ZR mS ZS d5 eR f d6     YZT d7 eR f d8     YZU d9 eR f d:     YZV d; eR f d<     YZW d= eS f d>     YZX e d? d@ dA g  ZY dB   ZZ eZ   Z[ e9 d k re d i e j\ d 6e j\ dC 6 dD    Z] e d i e j\ dE 6e j\ dC 6e j\ dF 6e j\ dG 6e j\ dH 6e j\ dI 6 dJ    Z^ e d i e j\ dK 6e j\ dL 6e j\ dM 6e j\ dN 6 dO    Z_ e d i e j\ dK 6e j\ dL 6e j\ dM 6e j\ dN 6e j\ dC 6e j\ dP 6e j` e j\ d dQ  dR 6e j\ dI 6e j\ dS 6e j\ dT 6e j\ dU 6 dV    Za n1 e9 dW k r5eb dX   n dY e9 Zc ed ec   e dZ    Ze d[   Zf e ef  d\    Zg e d i e' d] 6 d^    Zh e e ji d+  d_    Zj d S(a   s&   
Hash implementations for Numba types
i    (   t   print_functiont   absolute_importt   divisionN(   t
   namedtuple(   t   ir(   t   overloadt   overload_methodt	   intrinsict   register_jitable(   t   typest   errors(   t	   grab_bytet   grab_uint64_ti   i   i   s   int%ss   uint%si    i   i=   iCB i/ i   i@   i   i   t	   siphash24c         C` s   d   } | S(   Nc         S` s
   |  j    S(   N(   t   __hash__(   t   obj(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   impl?   s    (    (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   hash_overload=   s    	c         C` s1   t  |   } | t d  k r- t d  } n  | S(   Nii(   t
   _Py_hash_tt   int(   t   valt   asint(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   process_returnD   s    t   localst   xt   yt   mt   et   signt   _PyHASH_MODULUSt   _PyHASH_BITSc         C` sK  t  j |   s= t  j |   r6 |  d k r. t St Sq= t Sn  t j |   \ } } d } | d k  rt d } | } n  d } xq | r | d >t @| t d ?B} | d 9} | d 8} t	 |  } | | 8} | | 7} | t k r} | t 8} q} q} W| d k r| t } n t d d | t } | | >t @| t | ?B} | | } t
 |  S(   Ni    i   ii   g      A(   t   npt   isfinitet   isinft   _PyHASH_INFt   _PyHASH_NANt   matht   frexpR   R   R   R   (   t   vR   R   R   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _Py_HashDoubleO   s6    
	




c         C` s%   d   } t  j t  j  } | | f S(   Nc         S` s#   | d } | j  | t j j    S(   Ni    (   t   fpextt   lct   Typet   double(   t   cgctxt   buildert	   signaturet   argsR   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR      s    
(   R	   t   float64t   float32(   t   tyctxR   R   t   sig(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _fpext   s    	t   p1t   p2t   p3t   p4t   _PyLong_SHIFTs   x.1c   
      C` s   d t  } t j d  | ?} d t  d } d } t t  } x~ t | d d d  D]f } | t  >} | t @} | | ?}	 | |	 B} | t j |  | t  ?| @ 7} | t k rS | t 8} qS qS Wt |  S(   Ni    i    i@   i   i(   R9   R	   t   uint32R   t   rangeR   R   (
   R   t
   _tmp_shiftt
   mask_shiftt   iR   R7   t   idxR5   R6   R8   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt
   _long_impl   s    





R   c         ` s.   t  j d k r d n d     f d   } | S(   Ni   i    iic         ` s   t  |   } | t k  rX |  |  k rI |  d k r: d } qU t    } q t |   } n> t } |  d k  rz |  }  t } n  t |   } | r | } n  t |  S(   Ni    (   t   absR   R   t   Falset   TrueR@   R   (   R   t   magt   rett   needs_negate(   t   _HASH_I64_MIN(    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR      s    
		
I       (   t   syst   maxsize(   R   R   (    (   RG   s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   int_hash   s    c         C` s(   |  j  d k r d   } n	 d   } | S(   Ni@   c         S` s   t  |   } | S(   N(   R'   (   R   t   hashed(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR      s    c         S` s%   t  j t |    } t |  } | S(   N(   R   R0   R4   R'   (   R   t
   fpextendedRK   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR      s    (   t   bitwidth(   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt
   float_hash   s    	c         C` s   d   } | S(   Nc         S` s6   t  |  j  } t  |  j  } | t | } t |  S(   N(   t   hasht   realt   imagt   _PyHASH_IMAGR   (   R   t   hashrealt   hashimagt   combined(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR      s    (    (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   complex_hash   s    	
t   multt   lc         C` s   t  |   } t } t d  } xl t t | d d d   D]N \ } } t |  |  } | | A} | | } | t t d  | |  7} q; W| t d  7} t |  S(   NixV4 i   iiXB i| (   t   lent   _PyHASH_MULTIPLIERt   _Py_uhash_tt	   enumerateR;   RO   R   R   (   t   tupt   tlRW   R   R>   RX   R   t   xxory(    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _tuple_hash   s    )

"c         ` s%     f d   } t  |  } | | f S(   Nc         ` s  |  j  } | j t  } | j \ } | \ } |  j | j  } t j | d  }	 t j | t  }
 t j | d  } t	 |  } x t
 t | j t | d d d    D] \ } } | \ } } | j   | f i   } |  j | |  } | j | |  } | | | f  } | j |	 |  } | j | |
  }	 t j | |  } | j |
 |  }
 | j |
 |  }
 | j |
 |  }
 q W| j |	 t j | d   }	 |	 S(   NixV4 iXB i   ii| (   t   typing_contextt   resolve_value_typeRO   R/   t   get_value_typet   return_typeR   t   ConstantRZ   RY   R\   t   zipR	   R;   t   get_call_typet   get_functiont   extract_valuet   xort   mult   add(   R,   R-   R.   R/   t	   typingctxt   fntyt   tuptyR]   t   ltyR   RW   t   shiftR^   R>   t   packedt   tyRX   R3   R   t	   tuple_valR   R_   t   lconst(   R2   (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR     s.    		5(   R   (   R2   R   R   R3   (    (   R2   s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _tuple_hash_resolve  s    c         C` s0   t  |  t j  r d   } | Sd   } | Sd  S(   Nc         S` s
   t  |   S(   N(   R`   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   <  s    c         S` s   t  t |    } t |  S(   N(   R   Rv   R   (   R   RK   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   @  s    (   t
   isinstanceR	   t   Sequence(   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt
   tuple_hash9  s
    		(   t   c_size_tt   c_ubytet   c_uint64t	   pythonapit	   Structuret   Uniont   FNVc           B` s    e  Z d  e f d e f g Z RS(   t   prefixt   suffix(   t   __name__t
   __module__Rz   t   _fields_(    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   ^  s   	t   SIPHASHc           B` s    e  Z d  e f d e f g Z RS(   t   k0t   k1(   R   R   R|   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   e  s   	t   DJBX33Ac           B` s$   e  Z d  e d f d e f g Z RS(   t   paddingi   R   (   R   R   R{   Rz   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   l  s   t   EXPATc           B` s$   e  Z d  e d f d e f g Z RS(   R   i   t   hashsalt(   R   R   R{   Rz   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   s  s   t   _Py_HashSecret_tc           B` s?   e  Z d  e d f d e f d e f d e f d e f g Z RS(   t   uci   t   fnvt   siphasht   djbx33at   expat(   R   R   R{   R   R   R   R   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   z  s
   			t   _hashsecret_entryt   symbolt   valuec          ` sd   t  j t d  }  i      f d   } | d |  j j  | d |  j j  | d |  j j    S(   s   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]
    t   _Py_HashSecretc         ` sZ   d j  |   } t j |  } t j |  } t j | |  t d | d |    |  <d  S(   Ns   _numba_hashsecret_{}R   R   (   t   formatt   ctypesR|   t	   addressoft   llt
   add_symbolR   (   t   nameR   t   symbol_namet   addr(   t   info(    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   inject  s
    t   djbx33a_suffixt
   siphash_k0t
   siphash_k1(   R   t   in_dllR}   R   R   R   R   R   (   t   pyhashsecretR   (    (   R   s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _build_hashsecret  s    t   bc         C` s&   t  j |  | >|  t  j d  | ?B S(   Ni@   (   R	   t   uint64(   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _ROTATE  s    t   at   ct   dt   st   tc         C` sY   |  | 7}  | | 7} t  | |  |  A} t  | |  | A} t  |  d  }  |  | | | f S(   Ni    (   R   (   R   R   R   R   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _HALF_ROUND  s    

t   v0t   v1t   v2t   v3c         C` s   t  |  | | | d d  \ }  } } } t  | | |  | d d  \ } } }  } t  |  | | | d d  \ }  } } } t  | | |  | d d  \ } } }  } |  | | | f S(   Ni   i   i   i   (   R   (   R   R   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _DOUBLE_ROUND  s
    ''''t   mit   Ct   tmpt   maskt   jmpt   ohexefefc         C` s  t  j |  d >} |  t  j d  A} | t  j d  A} |  t  j d  A} | t  j d  A} d }	 xh | d k r t | |	  }
 |	 d 7}	 | d 8} | |
 N} t | | | |  \ } } } } | |
 N} qh Wt  j d  } |	 d } t  j d	  } | d
 k rId } t  j | | > } | | @t  j t | | d   | >B} n  | d k rd } t  j | | > } | | @t  j t | | d   | >B} n  | d k rd } t  j | | > } | | @t  j t | | d   | >B} n  | d k rj| t  j d  M} x] t d  D]L } | d } t  j | | > } | | @t  j t | | |   | >B} qWn  | d k rd } t  j | | > } | | @t  j t | | d   | >B} n  | d k rd } t  j | | > } | | @t  j t | | d   | >B} n  | d k rF| } | | @t  j t | | d   B} n  | | O} | | N} t | | | |  \ } } } } | | N} | | N} t | | | |  \ } } } } t | | | |  \ } } } } | | A| | AA} | S(   Ni8   IuespemosImodnarodIarenegylIsetybdeti    i   i   i   i   i   i   i   l        i   i   i0   i(   i    i   i   (   R	   R   R   R   R   R;   (   R   R   t   srct   src_szR   R   R   R   R   R?   R   R   t   boffsetR   R   R   R>   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt
   _siphash24  sl    


!
+++
/++'

!

!!R   s   FNV hashing is not implementeds'   Unsupported hashing algorithm in use %sc         ` sb   t  | t j  s$ t j d   n  t | j j   t j } | |  }   f d   } | | f S(   s&   Emit code to load the hashsecret.
    s   requires literal stringc         ` sd   | j  } y | j    } Wn2 t k
 rP t j | t j d  d   } n X| j |  } | S(   Ni@   R   (   t   modulet
   get_globalt   KeyErrorR   t   GlobalVariablet   IntTypet   load(   R,   R-   R3   R/   t   modt   gvR&   (   t   sym(    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR   O  s    	%(	   Rw   R	   t   StringLiteralR
   t   TypingErrort   _hashsecrett   literal_valueR   R   (   R2   R   t   restyR3   R   (    (   R   s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _inject_hashsecret_readD  s    	c         C` s   t  |  j S(   N(   R   R   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _load_hashsecret]  s    c         C` s   d   } | S(   Nc         S` s
   t  |   S(   N(   R   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   impc  s    (    (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _impl_load_hashsecreta  s    	t   _hashc         C` s   | d k r t  d  S| t k  r t d  } x8 t |  D]* } | d >| t j t |  |   } q; W| | N} | t d  N} n? t t	 j
 t d   t	 j
 t d   |  |  } t  |  } t  |  S(   Ni    i  i   R   R   R   (   R   t   _Py_HASH_CUTOFFR[   R;   R   t   uint8R   R   R   R	   R   (   R   t   _lenR   R?   R   (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   _Py_HashBytesl  s    
(
c         ` s#   d d l  m     f d   } | S(   Ni    (   t   _kind_to_byte_widthc         ` sL     |  j   } t |   } |  j } | d k r4 | St |  j | |  Sd  S(   Ni(   t   _kindRY   R   R   t   _data(   R   t	   kindwidthR   t   current_hash(   R   (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyR     s    	(   t   numba.unicodeR   (   R   R   (    (   R   s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   unicode_hash  s    (   i   i   (k   t   __doc__t
   __future__R    R   R   R$   t   numpyR   RH   R   t   collectionsR   t   llvmlite.bindingt   bindingR   t   llvmlite.llvmpy.coret   llvmpyt   coreR)   t   llvmliteR   t   numba.extendingR   R   R   R   t   numbaR	   R
   t   numba.unsafe.bytesR   R   t   version_infot   _py34_or_latert	   hash_infot   widtht   _hash_widtht   getattrR   R[   t   infR"   t   nanR#   t   modulusR   t   intpRM   R   RZ   RR   t   int_infot   bits_per_digitR9   t   cutoffR   t	   algorithmt   _Py_hashfunc_nameRO   R   R   R+   t   intcR'   R4   t   int32R@   t   Integert   BooleanRJ   t   FloatRN   t   ComplexRV   R`   Rv   t	   BaseTupleRy   Rz   R{   R|   R}   R~   R   R   R   R   R   R   R   R   R   R   R   R   R   t   ArrayR   t   NotImplementedErrort   msgt
   ValueErrorR   R   R   R   t   UnicodeTypeR   (    (    (    s4   lib/python2.7/site-packages/numba/targets/hashing.pyt   <module>   s   "


*

(.
		)



	









>
	