B
     \+                 @   s|  d dl mZmZmZ d dlZd dlZd dlm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mZ d dlmZmZmZmZ d d	lmZ d
dl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% G dd deZ&G dd deZ'e' Z(G dd de)Z*e*ed< dd Z+dd Z,dd Z-ej.ej/ej0ej1dZ2dd Z3G d d! d!e)Z4G d"d# d#e4Z5G d$d% d%e4Z6dS )&    )print_functiondivisionabsolute_importN)contextmanager)jit)TargetDescriptor)TargetOptions)dispatcher_registry
cpu_target)utilscompilertypessigutils)as_dtype   )	_internal)parse_signature)build_ufunc_wrapperbuild_gufunc_wrapper)FunctionCache	NullCache)global_compiler_lockc               @   s   e Zd ZeeedZdS )UFuncTargetOptions)ZnopythonZforceobjZfastmathN)__name__
__module____qualname__boolZOPTIONS r   r   :lib/python3.7/site-packages/numba/npyufunc/ufuncbuilder.pyr      s   r   c               @   s(   e Zd ZeZedd Zedd ZdS )UFuncTargetc             C   s   t jS )N)r
   typing_context)selfr   r   r   r    "   s    zUFuncTarget.typing_contextc             C   s   t jS )N)r
   target_context)r!   r   r   r   r"   &   s    zUFuncTarget.target_contextN)r   r   r   r   optionspropertyr    r"   r   r   r   r   r      s   r   c               @   s>   e Zd ZdZeZi i fddZdd Zi fddZdd	 Z	d
S )UFuncDispatcherzK
    An object handling compilation of various signatures for a ufunc.
    c             C   s(   || _ t | _|| _|| _t | _d S )N)py_funcr   Z
UniqueDict	overloadstargetoptionslocalsr   cache)r!   r&   r)   r(   r   r   r   __init__3   s
    
zUFuncDispatcher.__init__c             C   s   t | j| _d S )N)r   r&   r*   )r!   r   r   r   enable_caching:   s    zUFuncDispatcher.enable_cachingc             K   sn   | j  }|| | j }|| t }| jj|| |	d |	dd |
d | |||S )NZno_cpython_wrapperZerror_modelnumpyZenable_looplift)r)   copyupdater(   r   ZFlagstargetdescrr#   Zparse_as_flagssetZunset_compile_core)r!   sigr)   r(   ZlocsZtoptflagsr   r   r   compile=   s    





zUFuncDispatcher.compilec       	         s   j j}j j}t fdd}th | V j||  dk	rJ S t|\}}t	j
||j||||d j|   S Q R X W dQ R X dS )z
        Trigger the compiler on the core function or load a previously
        compiled version from the cache.  Returns the CompileResult.
        c              3   s@   y
d V  W n    Y n$X j  j} | d kr< j  j< d S )N)r'   get	signature)exists)cresr!   r   r   store_overloads_on_successW   s    
zAUFuncDispatcher._compile_core.<locals>.store_overloads_on_successN)argsreturn_typer4   r)   )r0   r    r"   r   r   r*   Zload_overloadr   normalize_signaturer   Zcompile_extrar&   Zsave_overload)	r!   r3   r4   r)   Z	typingctxZ	targetctxr:   r;   r<   r   )r9   r!   r   r2   O   s    
zUFuncDispatcher._compile_coreN)
r   r   r   __doc__ufunc_targetr0   r+   r,   r5   r2   r   r   r   r   r%   -   s   r%   npyufuncc             C   s&   | j |f|}t|\}}|||fS )N)r5   r   r=   )nb_funcr(   r3   r9   r;   r<   r   r   r   _compile_element_wise_function}   s    rB   c             C   s6   |dkr | j rtdn| jj}|tjks.t|| S )zGiven a compilation result, argument types, and a return type,
    build a valid Numba signature after validating that it doesn't
    violate the constraints for the compilation mode.
    Nz-return type must be specified for object mode)
objectmode	TypeErrorr7   r<   r   ZpyobjectAssertionError)r9   r;   r<   r   r   r   _finalize_ufunc_signature   s    
rF   c          	   C   sf   | j }| j}| jj}t t||||| j| }W dQ R X dd |jD }|t	|j
j ||| jfS )zBuild a wrapper for the ufunc loop entry point given by the
    compilation result object, using the element-wise signature.
    Nc             S   s   g | ]}t |jqS r   )r   num).0ar   r   r   
<listcomp>   s    z5_build_element_wise_ufunc_wrapper.<locals>.<listcomp>)r"   libraryZfndescZllvm_func_namer   r   rC   r;   appendr   r<   rG   Zenvironment)r9   r7   ZctxrK   fnameptr	dtypenumsr   r   r   !_build_element_wise_ufunc_wrapper   s    
rP   )r   r   NZreorderablec             C   s4   yt |  } W n" tk
r.   td| f Y nX | S )z]
    Parse an identity value and return the corresponding low-level value
    for Numpy.
    zInvalid identity value %r)_identitiesKeyError
ValueError)identityr   r   r   parse_identity   s
    rU   c               @   s   e Zd ZdddZdd ZdS )_BaseUFuncBuilderNc             C   sV   t | dr| j}n| jj}t| j||\}}}| |||}| j| || j|< |S )Nr(   )hasattrr(   rA   rB   _finalize_signature_sigsrL   _cres)r!   r3   r(   r9   r;   r<   r   r   r   add   s    

z_BaseUFuncBuilder.addc             C   s   dS )zI
        Disable the compilation of new signatures at call time.
        Nr   )r!   r   r   r   disable_compile   s    z!_BaseUFuncBuilder.disable_compile)N)r   r   r   r[   r\   r   r   r   r   rV      s   
rV   c               @   s4   e Zd Zddi fddZdd Zdd Zd	d
 ZdS )UFuncBuilderNFc             C   s:   || _ t|| _tf d|d||| _g | _i | _d S )Nr@   )targetr*   )r&   rU   rT   r   rA   rY   rZ   )r!   r&   rT   r*   r(   r   r   r   r+      s
    
zUFuncBuilder.__init__c             C   s   t |||S )z^Slated for deprecation, use ufuncbuilder._finalize_ufunc_signature()
        instead.
        )rF   )r!   r9   r;   r<   r   r   r   rX      s    z UFuncBuilder._finalize_signaturec             C   s   t  g }g }| jstdg }d }xT| jD ]J}| j| }| ||\}}}|| |t| ||j	|f q,W d gt
| }	|d krt| j}
t
|
j}nt
|jj}d}t| jj| jj|||||	|| j	}|S Q R X d S )NzNo definitionr   )r   rA   rD   rY   rZ   buildrL   r   longintrK   leninspectZ
getargspecr&   r;   r7   r   fromfuncr   r>   rT   )r!   	dtypelistptrlist	keepaliver9   r3   rO   rN   envdatlistZargspecinctoutctufuncr   r   r   build_ufunc   s.    



zUFuncBuilder.build_ufuncc             C   s
   t ||S )z^Slated for deprecation, use
        ufuncbuilder._build_element_wise_ufunc_wrapper().
        )rP   )r!   r9   r7   r   r   r   r_     s    zUFuncBuilder.build)r   r   r   r+   rX   rl   r_   r   r   r   r   r]      s   %r]   c               @   s8   e Zd Zddi fddZdd Zedd Zd	d
 ZdS )GUFuncBuilderNFc             C   sT   || _ t|| _td|d|| _|| _t|\| _| _|| _	|| _
g | _i | _d S )Nr@   )r^   r*   )r&   rU   rT   r   rA   r7   r   sinsoutr(   r*   rY   rZ   )r!   r&   r7   rT   r*   r(   r   r   r   r+     s    
zGUFuncBuilder.__init__c             C   s2   |j s|jjtjkrtd|d kr*tj}|| S )Nz(gufunc kernel must have void return type)rC   r7   r<   r   ZvoidrD   )r!   r9   r;   r<   r   r   r   rX     s
    z!GUFuncBuilder._finalize_signaturec             C   s   g }g }| j stdg }xR| jD ]H}| j| }| |\}}}|| |t| ||j|f q"W d gt	| }	t	| j
}
t	| j}t| jj| jj|||
||	|| j| j
}|S )NzNo definition)rA   rD   rY   rZ   r_   rL   r   r`   rK   ra   rn   ro   r   rc   r&   r   r>   rT   r7   )r!   rd   re   rf   r3   r9   rO   rN   rg   rh   ri   rj   rk   r   r   r   rl   "  s$    




zGUFuncBuilder.build_ufuncc       	      C   sl   |j }t| j|| j| j| jd\}}}g }x6|jD ],}t|tj	rJ|j
}n|}|t|j q2W |||fS )zJ
        Returns (dtype numbers, function ptr, EnvironmentObject)
        )r*   )r7   r   r&   rn   ro   r*   r;   
isinstancer   ZArrayZdtyperL   r   rG   )	r!   r9   r7   rN   rg   Zwrapper_namerO   rI   Ztyr   r   r   r_   =  s    zGUFuncBuilder.build)r   r   r   r+   rX   r   rl   r_   r   r   r   r   rm   
  s
   	rm   )7Z
__future__r   r   r   warningsrb   
contextlibr   r-   ZnpZnumba.decoratorsr   Znumba.targets.descriptorsr   Znumba.targets.optionsr   Znumba.targets.registryr	   r
   Znumbar   r   r   r   Znumba.numpy_supportr    r   Zsigparser   Zwrappersr   r   Znumba.cachingr   r   Znumba.compiler_lockr   r   r   r?   objectr%   rB   rF   rP   ZPyUFunc_ZeroZPyUFunc_OneZPyUFunc_NoneZPyUFunc_ReorderableNonerQ   rU   rV   r]   rm   r   r   r   r   <module>   s>   K
;