U
    ¿|eå  ã                   @   sf   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	 d dlm
Z
 d dlZG dd	„ d	e
jƒZdS )
é    ©Útypeof)Útypes)ÚGUFuncBuilder)Úparse_signature)Úufunc_find_matching_loop)Ú	serializeNc                   @   s  e Zd ZdZdddi dfdd„Zdd„ Zed	d
„ ƒZdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZdS )5ÚGUFunczÊ
    Dynamic generalized universal function (GUFunc)
    intended to act like a normal Numpy gufunc, but capable
    of call-time (just-in-time) compilation of fast loops
    specialized to inputs.
    NF© c                 C   sH   d | _ d| _|| _|| _t||||||ƒ| _| jjj| _t 	| |¡ d S )NF)
ÚufuncÚ_frozenÚ_is_dynamicÚ	_identityr   Úgufunc_builderÚpy_funcÚ__name__Ú	functoolsÚupdate_wrapper)Úselfr   Ú	signatureÚidentityÚcacheÚ
is_dynamicÚtargetoptionsÚwritable_argsr
   r
   úR/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/np/ufunc/gufunc.pyÚ__init__   s         ÿzGUFunc.__init__c                 C   s6   | j }t|j|j| j|j| j|j|j|j	| j
d�	}|S )N)	r   r   r   r   r   r   r   ÚtypesigsÚfrozen)r   Údictr   r   r   r   r   r   r   Ú_sigsr   )r   ÚgbÚdctr
   r
   r   Ú_reduce_states!   s    ÷zGUFunc._reduce_statesc
              	   C   s<   | |||||||d�}
|D ]}|
  |¡ q|
 ¡  |	|
_|
S )N)r   r   r   r   r   r   r   )ÚaddÚbuild_ufuncr   )Úclsr   r   r   r   r   r   r   r   r   r   Úsigr
   r
   r   Ú_rebuild0   s      þzGUFunc._rebuildc                 C   s   d| j › d�S )Nz<numba._GUFunc 'z'>)r   ©r   r
   r
   r   Ú__repr__<   s    zGUFunc.__repr__c                 C   s   | j  |¡ d S ©N)r   r$   )r   Úftyr
   r
   r   r$   ?   s    z
GUFunc.addc                 C   s   | j  ¡ | _| S r+   )r   r%   r   r)   r
   r
   r   r%   B   s    zGUFunc.build_ufuncc                 C   s   t | jjƒdkst‚d| _dS )zI
        Disable the compilation of new signatures at call time.
        r   TN)Úlenr   r    ÚAssertionErrorr   r)   r
   r
   r   Údisable_compileF   s    zGUFunc.disable_compilec                 C   s   | j S r+   )r   r)   r
   r
   r   r   N   s    zGUFunc.is_dynamicc                 C   s   | j jS r+   )r   Úninr)   r
   r
   r   r0   R   s    z
GUFunc.ninc                 C   s   | j jS r+   )r   Únoutr)   r
   r
   r   r1   V   s    zGUFunc.noutc                 C   s   | j jS r+   )r   Únargsr)   r
   r
   r   r2   Z   s    zGUFunc.nargsc                 C   s   | j jS r+   )r   Úntypesr)   r
   r
   r   r3   ^   s    zGUFunc.ntypesc                 C   s   | j jS r+   )r   r   r)   r
   r
   r   r   b   s    zGUFunc.typesc                 C   s   | j jS r+   )r   r   r)   r
   r
   r   r   f   s    zGUFunc.identityc                 C   s   | j jS r+   )r   r   r)   r
   r
   r   r   j   s    zGUFunc.signaturec                 C   s   | j jS r+   )r   Ú
accumulater)   r
   r
   r   r4   n   s    zGUFunc.accumulatec                 C   s   | j jS r+   )r   Úatr)   r
   r
   r   r5   r   s    z	GUFunc.atc                 C   s   | j jS r+   )r   Úouterr)   r
   r
   r   r6   v   s    zGUFunc.outerc                 C   s   | j jS r+   )r   Úreducer)   r
   r
   r   r7   z   s    zGUFunc.reducec                 C   s   | j jS r+   )r   Úreduceatr)   r
   r
   r   r8   ~   s    zGUFunc.reduceatc                 C   sD   t dd„ |ƒ}g }|D ](}t|tjƒr4| |j¡ q| |¡ q|S )Nc                 S   s   t | ƒS r+   r   )Úxr
   r
   r   Ú<lambda>ƒ   ó    z*GUFunc._get_ewise_dtypes.<locals>.<lambda>)ÚmapÚ
isinstancer   ÚArrayÚappendÚdtype)r   ÚargsÚargtysÚtysÚargtyr
   r
   r   Ú_get_ewise_dtypes‚   s    zGUFunc._get_ewise_dtypesc                 G   s$   t | jjƒ}t|ƒt|d ƒd kS )Nr   é   )r   r   r   r-   )r   rA   Ú
parsed_sigr
   r
   r   Ú_num_args_matchŒ   s    zGUFunc._num_args_matchc           
      G   s¢   t | jjƒ}|  |¡}g }t|d ƒD ]@\}}t|ƒ}|dkrN| || ¡ q&| t || |d¡¡ q&|d }t|d d ƒp‚d}	| t ||	d¡¡ tj	|Ž S )Nr   ÚAéÿÿÿÿrF   )
r   r   r   rE   Ú	enumerater-   r?   r   r>   Únone)
r   rA   rG   Úewise_typesÚlÚidxZsig_dimÚndimÚrettyZret_ndimr
   r
   r   Ú_get_signature‘   s    
zGUFunc._get_signaturec                 O   s˜   | j s| js| j||ŽS d|kr0|| d¡f7 }| j|Ž dkrTd| j› d�}t|ƒ‚|  |¡}| jrpt| j|ƒsŒ| j	|Ž }|  
|¡ |  ¡  | j||ŽS )NÚoutFz Too few arguments for function 'z'. Note that the pattern `out = gufunc(Arg1, Arg2, ..., ArgN)` is not allowed. Use `gufunc(Arg1, Arg2, ..., ArgN, out) instead.)r   r   r   ÚpoprH   r   Ú	TypeErrorrE   r   rR   r$   r%   )r   rA   ÚkwargsÚmsgZewiser'   r
   r
   r   Ú__call__§   s    ÿ


zGUFunc.__call__)r   Ú
__module__Ú__qualname__Ú__doc__r   r#   Úclassmethodr(   r*   r$   r%   r/   Úpropertyr   r0   r1   r2   r3   r   r   r   r4   r5   r6   r7   r8   rE   rH   rR   rX   r
   r
   r
   r   r	   
   sV     ÿ















r	   )Únumbar   Ú
numba.corer   Znumba.np.ufunc.ufuncbuilderr   Únumba.np.ufunc.sigparser   Únumba.np.numpy_supportr   r   r   ÚReduceMixinr	   r
   r
   r
   r   Ú<module>   s   