U
    ,do                     @   s  d dl Z d dlmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZmZ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 d dlm Z m!Z!m"Z" d d	l#m$Z$ d d
l%m&Z& d dlm'Z' eej(dd Z)e
ej*ej+ej+dd Z,e
ej-ej+ej+dd Z.e
ej-ej/ej/dd Z0e
ej-ej1ej1dd Z2e
ej3ej4ej4e
ej3ej5ej5dd Z6e
ej7ej4ej4e
ej7ej5ej5dd Z8dd Z9eej3e9d eej7e9d eej:dd Z;eej+ej:eej<ej:eej1ej:d d! Z=eej:ej+eej:ej1eej:ej<d"d# Z>e
ej?ej@ejAd$d% ZBe
ejCej@ejAej+d&d' ZDd(d) ZEe
eFejGd*d+ ZHe
eFeIej+d,d- ZJe
eKejGd.d/ ZLe
eKeIej+d0d1 ZMd2d3 ZNe
eOejPd4d5 ZQe
eOejPejAd6d7 ZRe
eSej+e
eTej+d8d9 ZUe
eVeIej+d:d; ZWe
ejXej+d<d= ZYeejZd>d? Z[eej\d@dA Z]eej<dBdC Z^e
e_ej+dDdE Z`e
eaejbdFdG Zce
edejedHdI Zfe
dJej+ej+dKdL Zge
ehejidMdN Zje
ekejldOdP Zme
endQdR Zoe
enejGdSdT ZpeekdUdV ZqeekdWdXdYdZ Zrd[d\ Zsd]d^ Zte
etejXe
etejud_d` Zve
esejXe
esejudadb Zwd dclxmyZymzZz d ddl{mZm|Z| e
eyej}ej~e
eyejej~dedf ZeeKdgdh ZeeFdidj Ze|dkdl Ze|dmdl Ze|dndo ZeeKdpdq ZeeFdrds Ze
ejeIej+dtdu Zeed~dvdwZeedxdy Zeedzd{ Zeed|d} ZdS )    N)reduce)ir)lower_builtinlower_getattrlower_getattr_generic
lower_castlower_constantiternext_implcall_getitercall_iternextimpl_ret_borrowedimpl_ret_untrackednumba_typeref_ctor)typingtypesutilscgutils)overload	intrinsic)
Conversion)TypingErrorLoweringErrorNumbaExperimentalFeatureWarning)literal_unroll)as_numba_type)NumbaTypeErrorc                 C   s   t | tjrdd }|S d S )Nc                 S   s   | S N valr   r   :/tmp/pip-unpacked-wheel-eu7e0c37/numba/cpython/builtins.pyimpl   s    zol_truth.<locals>.impl)
isinstancer   Boolean)r   r!   r   r   r    ol_truth   s    r$   c                 C   s   |  tj|}||||S )z3
    Implement `x is not y` as `not (x is y)`.
    )get_functionoperatoris_not_)contextbuildersigargsZis_implr   r   r    generic_is_not!   s    r-   c                 C   sj   |j \}}||kr`|jr&d}t|qfz| tj|}W n tk
rR   tj Y S X |||S ntjS dS )z-
    Default implementation for `x is y`
    zno default `is` implementationN)	r,   Zmutabler   r%   r&   eqNotImplementedErrorr   	false_bit)r)   r*   r+   r,   lhs_typerhs_typemsgeq_implr   r   r    
generic_is*   s    

r5   c                 C   sN   |j \}}||krD||d tj}||d tj}|d||S tjS dS )z7
    Implementation for `x is y` for Opaque types.
    r      z==N)r,   Zptrtointr   Zintp_tZicmp_unsignedr0   )r)   r*   r+   r,   r1   r2   Zlhs_ptrZrhs_ptrr   r   r    	opaque_isD   s    
r7   c                 C   sb   |\}}|j \}}| |||tj}| |||tj}	| tjttjtjtj}
|
|||	fS )z
    Implementation for `x is y` for types derived from types.Boolean
    (e.g. BooleanLiteral), and cross-checks between literal and non-literal
    booleans, to satisfy Python's behavior preserving identity for bools.
    )	r,   castr   booleanr%   r&   r.   r   	signature)r)   r*   r+   r,   arg1arg2Z	arg1_typeZ	arg2_typeZ_arg1Z_arg2r4   r   r   r    bool_is_implT   s    
r=   c                 C   s@   |j \}}d}|j|jkrd}ttd|}t| ||j|S Nr   r6   r,   Zliteral_valuer   ConstantIntTyper   return_typer)   r*   r+   r,   r;   r<   r   resr   r   r    const_eq_implg   s    
rE   c                 C   s@   |j \}}d}|j|jkrd}ttd|}t| ||j|S r>   r?   rC   r   r   r    const_ne_impls   s    
rF   c                    s    fdd}|S )Nc                    sL   t | tj}t |tj}|r0|r0 fdd}|S ||A rH fdd}|S d S )Nc                    s    S r   r   abr   r   r    r!      s    z/gen_non_eq.<locals>.none_equality.<locals>.implc                    s     S r   r   rG   r   r   r    r!      s    r"   r   NoneType)rH   rI   Za_noneZb_noner!   r   r   r    none_equality   s    z!gen_non_eq.<locals>.none_equalityr   )r   rL   r   r   r    
gen_non_eq~   s    rM   TFc                 C   s4   |  }| ||||}| ||}|| ||||S )z>
    Deferred.__getattr__ => redirect to the actual type.
    )getr8   Zget_getattr)r)   r*   typvalueattrZ
inner_typer   impr   r   r    deferred_getattr   s    rS   c                 C   s0   |  |||| }| j| }||| |S r   )r8   rN   data_model_managersetZmake_uninitialized)r)   r*   fromtytotyr   actualmodelr   r   r    any_to_deferred   s    
rZ   c                 C   s*   | j | }|||}| ||| |S r   )rT   rN   r8   )r)   r*   rV   rW   r   rY   r   r   r    deferred_to_any   s    
r[   c                 C   s0   |\}}| ||g}||}t| ||j|S r   )geploadr   rB   )r)   r*   r+   r,   base_ptridxelem_ptrrD   r   r   r    getitem_cpointer   s    
ra   c                 C   s(   |\}}}| ||g}||| d S r   )r\   store)r)   r*   r+   r,   r^   r_   r   r`   r   r   r    setitem_cpointer   s    
rc   c           	         sX   t |t |kst||ft |dks,t fdd}t||}t||\}}|S )Nr   c                    s   | \}}|\}}j ||}|d k	s*t |||} |||}ttj||}|}| ||f}	 	|	||}
||
fS r   )
Ztyping_contextZunify_typesAssertionErrorr8   r   r:   r   r9   r%   select)ZaccumulatorrP   ZacctyaccZvtyvtyZcmpsiggepredrD   r*   cmpopr)   r   r    binary_minmax   s    z do_minmax.<locals>.binary_minmax)lenrd   zipr   )	r)   r*   argtysr,   rl   rm   ZtypvalsZrestyZresvalr   rk   r    	do_minmax   s    
rq   c                 C   s0   t |jd }t||d }t| |||tjS Nr   )listr,   r   unpack_tuplerq   r&   gtr)   r*   r+   r,   rp   r   r   r    max_iterable   s    rw   c                 C   s   t | ||j|tjS r   )rq   r,   r&   ru   r)   r*   r+   r,   r   r   r    
max_vararg   s    ry   c                 C   s0   t |jd }t||d }t| |||tjS rr   )rs   r,   r   rt   rq   r&   ltrv   r   r   r    min_iterable   s    r{   c                 C   s   t | ||j|tjS r   )rq   r,   r&   rz   rx   r   r   r    
min_vararg   s    r|   c                 C   s   d| j f S )Nzllvm.rint.f%d)bitwidth)tpr   r   r    _round_intrinsic   s    r   c           
      C   sj   |j d }| |}|j}t||g}t||t|}|||}	|	|	| |j
}	t| ||j
|	S rr   )r,   Zget_value_typemoduler   FunctionTyper   Zget_or_insert_functionr   callZfptosirB   r   )
r)   r*   r+   r,   flttyZlltyr   ZfntyfnrD   r   r   r    round_impl_unary   s    

r   c                    sN   |j d }tt|t||  fdd}| ||||}t| ||j|S )Nr   c                    s   t | st | r| S |dkrp|dkr:d|d  }d}nd| }d}| | | }t |r`| S  || | S d|  }| | } || S d S )Nr      g      $@gMDg      ?)mathisinfisnan)xndigitsZpow1Zpow2yZ_roundr   r    round_ndigits  s    

z(round_impl_binary.<locals>.round_ndigits)	r,   r   ZExternalFunctionr   r   r:   compile_internalr   rB   )r)   r*   r+   r,   r   r   rD   r   r   r    round_impl_binary   s    
 
r   c                 C   s0   |j \}|\}| ||||j}t| ||j|S r   )r,   r8   rB   r   )r)   r*   r+   r,   rh   r   rD   r   r   r    int_impl"  s    r   c                 C   s   |j }|j}t|jdkrr|j\}|\}t|tjrT| ||||}t| ||j |S | ||||}	| 	|d}
n@t|jdkr|j\}}|\}	}
| ||	||}	| ||
||}
| 
||}|	|_|
|_| }t| ||j |S )Nr6   r      )rB   Zunderlying_floatrn   r,   r"   r   Complexr8   r   get_constantZmake_complexrealimag	_getvalue)r)   r*   r+   r,   Zcomplex_typeZ
float_typeZargtyargrD   r   r   ZrealtyZimagtyZcmplxr   r   r    complex_impl+  s(    
r   c                    sf   t |jtjrB|jj  fdd}| ||||}t| ||j|S |\}|j\}| ||||jS dS )z1
    Call a number class, e.g. np.int32(...)
    c                     s   t j|  dS )N)dtype)nparray)Zarg_hackdtr   r    fooO  s    znumber_constructor.<locals>.fooN)	r"   rB   r   Arrayr   r   r   r,   r8   )r)   r*   r+   r,   r   rD   r   Zvaltyr   r   r    number_constructorG  s    r   c                 C   s   |   S r   get_dummy_valuer)   r*   rh   pyvalr   r   r    constant_dummy]  s    r   c                 C   s0   |  |}| j|||t|d}|||S )N)info)Zget_function_pointer_typeZadd_dynamic_addrZget_pointerstrZbitcast)r)   r*   rh   r   ZptrtyZptrvalr   r   r    constant_function_pointerb  s
    
r   c                 C   s*   |d kr|  ||jS | ||j|S d S r   )Zmake_optional_nonetypeZmake_optional_valuer   r   r   r    constant_optionalj  s    r   c                 C   s   |   S )z&
    One-argument type() builtin.
    r   rx   r   r   r    	type_implt  s    r   c                 C   s    |j \}|\}t| |||}|S r   )r,   r
   )r)   r*   r+   r,   rh   r   itervalr   r   r    	iter_impl|  s    r   c              	   C   sX   |j \}|\}t| |||}|j|| dd | j|td W 5 Q R X | S )NF)Zlikelyr   )	r,   r   Zif_thenr(   Zis_validZ	call_convZreturn_user_excStopIterationZyielded_value)r)   r*   r+   r,   Zitertyr   rD   r   r   r    	next_impl  s    r   znot inc                 C   s"   dd }|  ||||}||S )Nc                 S   s   t || S r   )r&   containsrG   r   r   r    in_impl  s    znot_in.<locals>.in_impl)r   r(   )r)   r*   r+   r,   r   rD   r   r   r    not_in  s    r   c                 C   s0   |j \}|j}| |t|j}t| ||j|S r   )r,   rB   r   rn   r   r   )r)   r*   r+   r,   rh   rettyrD   r   r   r    constsized_len  s    r   c                 C   s    |j \}t|rtjS tjS d S r   )r,   rn   r   Ztrue_bitr0   )r)   r*   r+   r,   rh   r   r   r    
sized_bool  s    r   c                 C   s    |j }| |}t| ||j |S r   )rB   Zget_constant_undefr   )r)   r*   r+   r,   r   rD   r   r   r    lower_empty_tuple  s    
r   c                 C   s   |\}t | ||j|S r   )r   rB   )r)   r*   r+   r,   r   r   r   r    lower_tuple  s    r   c                 C   s6   t jt jt jt jt jt jf}t| |r2dd }|S d S )Nc                 S   s   t | dkS rr   )rn   r   r   r   r    	bool_impl  s    z bool_sequence.<locals>.bool_impl)r   ZCharSeqZUnicodeCharSeqDictTypeListTypeUnicodeTypeSetr"   )r   Zvalid_typesr   r   r   r    bool_sequence  s    	
r   always)inlinec                 C   s    t | tjs| d krdd S d S )Nc                 S   s   dS NFr   r   r   r   r    <lambda>      zbool_none.<locals>.<lambda>rJ   r   r   r   r    	bool_none  s    r   c                 C   s0   t | tjrtjS t | tjr$| jS tdd S NzUnsupported type)r"   r   Floatr   infIntegermaxvalr/   rO   r   r   r    get_type_max_value  s
    r   c                 C   s2   t | tjrtj S t | tjr&| jS tdd S r   )r"   r   r   r   r   r   minvalr/   r   r   r   r    get_type_min_value  s
    r   c           
      C   s   |j d j}t|tjr<|j}t|}|j}t	||}nt|tj
r|j}|dkr`t }n|dkrrt }ntdttd|}	t	|tj }n8t|tjtjfrd}t|}tjjd }t	||}t| |||S )Nr       @   +llvmlite only supports 32 and 64 bit floatsfloat{}r6   )r,   r   r"   r   r   r}   r   rA   r   r@   r   	FloatType
DoubleTyper/   getattrr   formatr   
NPDatetimeNPTimedeltaint64r   
r)   r*   r+   r,   rO   ZbwZltyr   rD   Znptyr   r   r    lower_get_type_min_value  s*    



r   c           
      C   s   |j d j}t|tjr<|j}t|}|j}t	||}nt|tj
r|j}|dkr`t }n|dkrrt }ntdttd|}	t	|tj}n4t|tjtjfrd}t|}tjj}t	||}t| |||S )Nr   r   r   r   r   )r,   r   r"   r   r   r}   r   rA   r   r@   r   r   r   r/   r   r   r   r   r   r   r   r   r   r   r   r    lower_get_type_max_value  s*    



r   )
IndexValueIndexValueType)r   register_jitablec                 C   s2   |j }|\}}t|| |}||_||_| S r   )rB   r   Zcreate_struct_proxyindexrP   r   )r)   r*   r+   r,   rO   r   rP   Zindex_valuer   r   r    impl_index_value  s    r   c                 C   s$   t | tr t |tr dd }|S d S )Nc                 S   sx   t | jr4t |jr.| j|jk r(| S |S qt| S n@t |jrD|S | j|jkrT|S | j|jkrt| j|jk rp| S |S | S r   r   r   rP   r   indval1indval2r   r   r    min_impl(  s    zindval_min.<locals>.min_implr"   r   )r   r   r   r   r   r    
indval_min$  s
    
r   c                 C   s$   t | tr t |tr dd }|S d S )Nc                 S   sx   t | jr4t |jr.| j|jk r(| S |S qt| S n@t |jrD|S |j| jkrT|S | j|jkrt| j|jk rp| S |S | S r   r   r   r   r   r    max_implE  s    zindval_max.<locals>.max_implr   )r   r   r   r   r   r    
indval_maxA  s
    
r   c                 C   s   | |kS r   r   rG   r   r   r    r   ^  r   r   c                 C   s   | |k S r   r   rG   r   r   r    r   _  r   c                    s    t | tjr fdd}|S d S )Nc                    s,   t | }t|}|D ]} ||r|}q|S r   )iternext)iterableit
return_valr   opr   r    r!   e  s    
zmin_max_impl.<locals>.impl)r"   r   IterableType)r   r   r!   r   r   r    min_max_implb  s    r   c                 C   s
   t | tS r   )r   	less_thanr   r   r   r    iterable_mino  s    r   c                 C   s
   t | tS r   )r   greater_thanr   r   r   r    iterable_maxt  s    r   c                 C   sz   |j }dd }tj|j}t|t||}t|dkrT| 	 | 
|||f}n| 	 | 
||df}| ||||S )ae  Redirect constructor implementation to `numba_typeref_ctor(cls, *args)`,
    which should be overloaded by the type's implementation.

    For example:

        d = Dict()

    `d` will be typed as `TypeRef[DictType]()`.  Thus, it will call into this
    implementation.  We need to redirect the lowering to a function
    named ``numba_typeref_ctor``.
    c                 W   s   t | f| S r   )r   )clsr,   r   r   r    	call_ctor  s    z%redirect_type_ctor.<locals>.call_ctorr   r   )rB   r   TupleZ
from_typesr,   r   r:   TypeRefrn   r   Z
make_tupler   )r)   r*   r+   r,   r   r   Z	ctor_argsr   r   r    redirect_type_ctory  s    r   c                    s   d }t |tjrd}n"t |tjr(d}nt |tjr8d}|d k	rRdj| }t|t | tjjtj	tj
tjtjfrxt nt | tjjrt nd S d fdd	}|S )	N)strings )bytesrI   )	bytearrayrI   z/sum() can't sum {} [use {}''.join(seq) instead]r   c                    s   |} | D ]}|| }q|S r   r   )r   startrf   r   iteratorr   r    r!     s    
zol_sum.<locals>.impl)r   )r"   r   r   BytesZ	ByteArrayr   r   Z
containersZ_HomogeneousTupleListr   r   	RangeTyper   Z_HeterogeneousTupler   )r   r  errorr3   r!   r   r  r    ol_sum  s*    
  r	  c                 G   s   dd }|S )Nc                 w   s"   t |f| D ]}| | V  qd S r   )ro   )funcr   r,   r   r   r   r    r!     s    zol_map.<locals>.implr   )r
  r   r,   r!   r   r   r    ol_map  s    r  c                 C   s*   | d kst | tjrdd }ndd }|S )Nc                 s   s   |D ]}|r|V  qd S r   r   r
  r   r   r   r   r    r!     s    zol_filter.<locals>.implc                 s   s   |D ]}| |r|V  qd S r   r   r  r   r   r    r!     s    rJ   )r
  r   r!   r   r   r    	ol_filter  s    
r  c                 C   sH  dd }dd }t | }t|tjr8d| d}t|tjtjtjtjtj	tj
tjtjtjtjtjtjtjtjtjtjf}t||sd| d}t|d	}tj|td
 |}t|tjr|jd }t|tjs|f}|D ]d}t|tjr|jd }	nt|tjr|}	n|j}	ttjttjttjtj	fttj
ttjttji}
|	|
krdt||
|	 r|  S qt|tj r|	tjtjfkrd}t|t!||	kr|n|  S t |	}||kr|  S t|tjrt|tjr|j|j"jkr|  S t|tj#r|jd tj$krt||j%s:t|tjrt|tjr|  S q|S )Nc                 S   s   dS )NTr   vartypsr   r   r    	true_impl  s    z ol_isinstance.<locals>.true_implc                 S   s   dS r   r   r  r   r   r    
false_impl  s    z!ol_isinstance.<locals>.false_implz1isinstance cannot handle optional types. Found: ""z1isinstance() does not support variables of type "z".z>Use of isinstance() detected. This is an experimental feature.)categoryr   zLNumba type classes (except numba.typed.* container types) are not supported.)&r   r"   r   Optionalr   Numberr  r  r   ZLiteralStrKeyDictr  r   r   ZUniTupler   ZFunctionZ	ClassTyper   ZClassInstanceTyperK   r   warningswarnr   keyr   rangedictrs   tuple	BaseTuplerU   r   r   Zinstance_type	ContainerZ	undefined	__class__)r  r  r  r  Zvar_tyr3   Zsupported_var_tyZt_typsrO   r  Ztypes_not_registeredZ	numba_typr   r   r    ol_isinstance  s             


   
   





r   )r   )r   	functoolsr   Znumpyr   r&   r  Zllvmliter   Znumba.core.imputilsr   r   r   r   r   r	   r
   r   r   r   r   Z
numba.corer   r   r   r   Znumba.core.extendingr   r   Znumba.core.typeconvr   Znumba.core.errorsr   r   r   Znumba.misc.specialr   Znumba.core.typing.asnumbatyper   r   truthr$   is_notAnyr-   r'   r5   ZOpaquer7   r#   r=   r.   LiteralZIntegerLiteralrE   nerF   rM   ZDeferredTyperS   r  rZ   r[   getitemZCPointerr   ra   setitemrc   rq   maxr  rw   ZVarArgry   minr{   r|   r   roundr   r   r   intfloatr   complexr   ZNumberClassr   ZDummyr   ZExternalFunctionPointerr   r   r   r   r   r   r   r   ZIteratorTyper   r   rn   Z
ConstSizedr   boolSizedr   r  r   r   r   r   r   r   ZDTyper   r   Znumba.core.typing.builtinsr   r   Znumba.extendingr   ZintpTypeZuintpr   r   r   r   r   r   r   r   r   r   sumr	  mapr  filterr  r"   r   r   r   r   r    <module>   s   4





	
	










%






	





















	





'

