U
    ,d1                     @   s  d dl Z d dlmZ d dl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 d d	lmZmZ d d
lmZ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& edddddZ'G dd de'eZ(G dd de	Z)e) Z*G dd dej+Z,e,eed < dd Z-dd  Z.d!d" Z/ej0ej1ej2ej3d#Z4d$d% Z5G d&d' d'e6Z7G d(d) d)e7Z8G d*d+ d+e7Z9dS ),    N)contextmanager)configtargetconfig)jit)TargetDescriptor)	is_jitted)TargetOptionsinclude_default_options)
cpu_target)dispatcher_registrytarget_registry)utilstypes	serializecompilersigutils)as_dtype)	_internal)parse_signature)build_ufunc_wrapperbuild_gufunc_wrapper)FunctionCache	NullCache)global_compiler_lockZnopythonZforceobjboundscheckfastmathZtarget_backendc                   @   s   e Zd Zdd ZdS )UFuncTargetOptionsc                 C   sf   | dsd|_| ds d|_|jddd | ds@tj|_| dsR|j|_d|_|d d S )	Nenable_pyobjectTenable_loopliftZnrt)default	debuginfor   r   )	is_setr   r   Zinherit_if_not_setr   ZDEBUGINFO_DEFAULTr    r   Zenable_pyobject_looplift)selfflagsoptions r%   ?/tmp/pip-unpacked-wheel-eu7e0c37/numba/np/ufunc/ufuncbuilder.pyfinalize!   s    



zUFuncTargetOptions.finalizeN)__name__
__module____qualname__r'   r%   r%   r%   r&   r      s   r   c                       s8   e Zd ZeZ fddZedd Zedd Z  Z	S )UFuncTargetc                    s   t  d d S )Nufunc)super__init__r"   	__class__r%   r&   r.   8   s    zUFuncTarget.__init__c                 C   s   t jS N)r
   typing_contextr/   r%   r%   r&   r3   ;   s    zUFuncTarget.typing_contextc                 C   s   t jS r2   )r
   target_contextr/   r%   r%   r&   r4   ?   s    zUFuncTarget.target_context)
r(   r)   r*   r   r$   r.   propertyr3   r4   __classcell__r%   r%   r0   r&   r+   5   s   
r+   c                   @   sR   e Zd ZdZeZi i fddZdd Ze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 r2   )py_funcr   Z
UniqueDict	overloadstargetoptionslocalsr   cache)r"   r8   r;   r:   r%   r%   r&   r.   M   s
    
zUFuncDispatcher.__init__c                 C   s   t | j| j| jdS )4
        NOTE: part of ReduceMixin protocol
        )pyfuncr;   r:   )dictr8   r;   r:   r/   r%   r%   r&   _reduce_statesT   s
    zUFuncDispatcher._reduce_statesc                 C   s   | |||dS )r=   )r8   r;   r:   r%   )clsr>   r;   r:   r%   r%   r&   _rebuild^   s    zUFuncDispatcher._rebuildc                 C   s   t | j| _d S r2   )r   r8   r<   r/   r%   r%   r&   enable_cachinge   s    zUFuncDispatcher.enable_cachingc                 K   s`   | j  }|| | j }|| t }| jj|| d|_	d|_
d|_| |||S )NTZnumpyF)r;   copyupdater:   r   ZFlagstargetdescrr$   Zparse_as_flagsZno_cpython_wrapperZerror_modelr   _compile_core)r"   sigr;   r:   ZlocsZtoptr#   r%   r%   r&   compileh   s    



zUFuncDispatcher.compilec           	         s   j j}j j}t fdd}t t |  |  j	
||  dk	r W  5 Q R  W  5 Q R  W  5 Q R  S t|\}}tj||j||||d j	|   W  5 Q R  W  5 Q R  W  5 Q R  S Q R X W 5 Q R X W 5 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   sH   z
d V  W n t k
r     Y n$X j j} | d krD j j< d S r2   )	Exceptionr9   get	signature)existscresr"   r%   r&   store_overloads_on_success   s    
zAUFuncDispatcher._compile_core.<locals>.store_overloads_on_successN)argsreturn_typer#   r;   )rF   r3   r4   r   r   r   ZConfigStackZenterrD   r<   Zload_overloadr   normalize_signaturer   Zcompile_extrar8   Zsave_overload)	r"   rH   r#   r;   Z	typingctxZ	targetctxrP   rQ   rR   r%   rN   r&   rG   {   s(    (  zUFuncDispatcher._compile_coreN)r(   r)   r*   __doc__ufunc_targetrF   r.   r@   classmethodrB   rC   rI   rG   r%   r%   r%   r&   r7   G   s   

r7   npyufuncc                 C   s&   | j |f|}t|\}}|||fS r2   )rI   r   rS   )nb_funcr:   rH   rO   rQ   rR   r%   r%   r&   _compile_element_wise_function   s    rY   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	TypeErrorrL   rR   r   ZpyobjectAssertionError)rO   rQ   rR   r%   r%   r&   _finalize_ufunc_signature   s    
r]   c              	   C   st   | j }| j}| jj}t( t||||| j| }|j|j}W 5 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.
    c                 S   s   g | ]}t |jqS r%   )r   num).0ar%   r%   r&   
<listcomp>   s     z5_build_element_wise_ufunc_wrapper.<locals>.<listcomp>)r4   libraryZfndescZllvm_func_namer   r   rZ   get_pointer_to_functionnamerQ   appendr   rR   r^   environment)rO   rL   ctxrb   fnameinfoptr	dtypenumsr%   r%   r&   !_build_element_wise_ufunc_wrapper   s    
 rl   )r      NZreorderablec                 C   s4   z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
    rr   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:   rX   rY   _finalize_signature_sigsre   _cres)r"   rH   r:   rO   rQ   rR   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*   rx   ry   r%   r%   r%   r&   rs      s   
rs   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   sH   t |r|j}|| _t|| _tf d|d||| _g | _i | _d S NrW   )_targetr<   )r   r8   rr   rq   r   rX   rv   rw   )r"   r8   rq   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.
        )r]   r"   rO   rQ   rR   r%   r%   r&   ru     s    z UFuncBuilder._finalize_signaturec                 C   s   t  g }g }| jstdg }d }| jD ]H}| j| }| ||\}}}|| |t| ||j|f q*d gt	| }	|d krt
| j}
t	|
j}nt	|jj}d}t| jj| jj|||||	|| j	}|W  5 Q R  S Q R X d S )NNo definitionrm   )r   rX   r[   rv   rw   buildre   intrb   leninspectgetfullargspecr8   rQ   rL   r   fromfuncr(   rT   rq   )r"   Z	dtypelistZptrlist	keepaliverO   rH   rk   rj   envZdatlistZargspecZinctZoutctr,   r%   r%   r&   build_ufunc  s>    


      zUFuncBuilder.build_ufuncc                 C   s
   t ||S )z^Slated for deprecation, use
        ufuncbuilder._build_element_wise_ufunc_wrapper().
        )rl   )r"   rO   rL   r%   r%   r&   r   9  s    zUFuncBuilder.build)r(   r)   r*   r.   ru   r   r   r%   r%   r%   r&   rz      s   'rz   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 r{   )r8   rr   rq   r   rX   rL   r   sinsoutr:   r<   rv   rw   )r"   r8   rL   rq   r<   r:   r%   r%   r&   r.   C  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)rZ   rL   rR   r   voidr[   r}   r%   r%   r&   ru   O  s
    z!GUFuncBuilder._finalize_signaturec                 C   s   g }g }| j stdg }| jD ]F}| j| }| |\}}}|| |t| ||j|f q d gt| }	t| j	}
t| j
}t| jj| jj|||
||	|| j| j
}|S )Nr~   )rX   r[   rv   rw   r   re   r   rb   r   r   r   r   r   r8   r(   rT   rq   rL   )r"   Z	type_listZ	func_listr   rH   rO   rk   rj   r   ZdatalistZninZnoutr,   r%   r%   r&   r   X  s6    




       zGUFuncBuilder.build_ufuncc           	      C   sx   |j }t| j|| j| j| jdd}|j}|j|j	}g }|j
D ],}t|tjrX|j}n|}|t|j q@|||fS )zJ
        Returns (dtype numbers, function ptr, EnvironmentObject)
        F)r<   Z
is_parfors)rL   r   r8   r   r   r<   r   rb   rc   rd   rQ   
isinstancer   ArrayZdtypere   r   r^   )	r"   rO   rL   ri   r   rj   rk   r`   tyr%   r%   r&   r   u  s$        
zGUFuncBuilder.build)r(   r)   r*   r.   ru   r   r   r   r%   r%   r%   r&   r   @  s   
	
r   ):r   
contextlibr   Z
numba.corer   r   Znumba.core.decoratorsr   Znumba.core.descriptorsr   Znumba.core.extendingr   Znumba.core.optionsr   r	   Znumba.core.registryr
   Znumba.core.target_extensionr   r   r   r   r   r   r   Znumba.np.numpy_supportr   Znumba.np.ufuncr   Znumba.np.ufunc.sigparser   Znumba.np.ufunc.wrappersr   r   Znumba.core.cachingr   r   Znumba.core.compiler_lockr   Z_options_mixinr   r+   rU   ZReduceMixinr7   rY   r]   rl   ZPyUFunc_ZeroZPyUFunc_OneZPyUFunc_NoneZPyUFunc_ReorderableNonern   rr   objectrs   rz   r   r%   r%   r%   r&   <module>   sN   	^A