§
    2@Äj?3  ã                   óÖ   — 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	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Zd„ Z G d„ de
¦  «        Z G d„ dej        e	¦  «        Zd„ Zd
S )é    )Útypeof)Útypes)ÚGUFuncBuilder)Úparse_signature)Ú	UfuncBaseÚUfuncLowererBase)Úufunc_find_matching_loop)Ú	serializeÚerrors)Únpydecl)Ú	signatureÚAbstractTemplateNc                 óh   ‡ — ddl m}  G ˆ fd„d|j        ¦  «        }|xj        ‰ j        z  c_        |S )Nr   ©Únpyimplc                   ó<   •‡ — e Zd ZdZ”Zˆ fd„Zˆ fd„Zˆ fd„Zˆ xZS )ú(make_gufunc_kernel.<locals>.GUFuncKernelzÊ
        npyimpl._Kernel subclass responsible for lowering a gufunc kernel
        (element-wise function) inside a broadcast loop (which is
        generated by npyimpl.numpy_gufunc_kernel()).
        c                 óÚ   •— t          ¦   «                              |||¦  «         | j                             |j        ¦  «        }| j                             |¦  «        \  | _        | _        d S ©N)ÚsuperÚ__init__ÚdufuncÚ_get_ewise_dtypesÚargsÚfind_ewise_functionÚ	inner_sigÚcres)ÚselfÚcontextÚbuilderÚ	outer_sigÚewise_typesÚ	__class__s        €úFC:\Projects\Historical\venv\Lib\site-packages\numba/np/ufunc/gufunc.pyr   z1make_gufunc_kernel.<locals>.GUFuncKernel.__init__   s]   ø€ Ý‰GŒG×Ò˜W g¨yÑ9Ô9Ð9Øœ+×7Ò7¸	¼ÑGÔGˆKØ(,¬×(GÒ(GØñ)ô )Ñ%ˆDŒN˜DœI˜I˜Ió    c                 ó  •— t          |t          j        ¦  «        rBt          |t          j        ¦  «        s(t          ¦   «                              ||j        |¦  «        S t          ¦   «                              |||¦  «        S r   )Ú
isinstancer   ÚArrayr   ÚcastÚdtype)r   ÚvalÚfromtyÚtotyr#   s       €r$   r)   z-make_gufunc_kernel.<locals>.GUFuncKernel.cast   sa   ø€ å˜&¥%¤+Ñ.Ô.ð =Ý˜t¥U¤[Ñ1Ô1ð=å‘w”w—|’| C¨¬°tÑ<Ô<Ð<Ý‘7”7—<’<  V¨TÑ2Ô2Ð2r%   c                 ó¾   •— | j         j        rd}t          j        |¦  «        ‚| j                             | j         j        f¦  «          t          ¦   «         j        |Ž S )NzCCalling a guvectorize function in object mode is not supported yet.)	r   Ú
objectmoder   ÚNumbaRuntimeErrorr   Úadd_linking_libsÚlibraryr   Úgenerate)r   r   Úmsgr#   s      €r$   r3   z1make_gufunc_kernel.<locals>.GUFuncKernel.generate%   sZ   ø€ ØŒyÔ#ð 4ð(�åÔ.¨sÑ3Ô3Ð3ØŒL×)Ò)¨4¬9Ô+<Ð*>Ñ?Ô?Ð?Ø#•5‘7”7Ô# TÐ*Ð*r%   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r)   r3   Ú__classcell__)r#   Ú_dufuncs   @€r$   ÚGUFuncKernelr      s|   øø€ € € € € ð	ð 	ð
 ˆð	ð 	ð 	ð 	ð 	ð	3ð 	3ð 	3ð 	3ð 	3ð	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+r%   r;   )Únumba.npr   Ú_Kernelr5   )r:   r   r;   s   `  r$   Úmake_gufunc_kernelr>      sj   ø€ Ø Ð Ð Ð Ð Ð ð+ð +ð +ð +ð +ð +ð +�w”ñ +ô +ð +ð: ÐÔ˜WÔ-Ñ-ÐÔØÐr%   c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚGUFuncLowererzHCallable class responsible for lowering calls to a specific gufunc.
    c                 ón   •— ddl m} t          ¦   «                              |t          |j        ¦  «         d S )Nr   r   )r<   r   r   r   r>   Únumpy_gufunc_kernel)r   Úgufuncr   r#   s      €r$   r   zGUFuncLowerer.__init__4   sF   ø€ Ø$Ð$Ð$Ð$Ð$Ð$Ý‰Œ×Ò˜Ý+Ø Ô4ñ	6ô 	6ð 	6ð 	6ð 	6r%   )r5   r6   r7   r8   r   r9   )r#   s   @r$   r@   r@   1   sB   ø€ € € € € ðð ð6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6r%   r@   c                   ó¢   — e Zd ZdZ	 	 dd„Zd„ Zd„ Zed„ ¦   «         Zd	„ Z	dd
„Z
d„ Zd„ Zd„ Zd„ Zdd„Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ ZdS )Ú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                 óP  — |€i }d | _         d| _        || _        || _        t	          ||||||¦  «        | _        | j        j        j        | _        | j        j        j        | _        | j        j	        | _
        |                      | j
        ¦  «         t          j        | |¦  «         d S )NF)ÚufuncÚ_frozenÚ_is_dynamicÚ	_identityr   Úgufunc_builderÚpy_funcr5   r8   Únb_funcÚ_dispatcherÚ_initializeÚ	functoolsÚupdate_wrapper)r   rM   r   ÚidentityÚcacheÚ
is_dynamicÚtargetoptionsÚwritable_argss           r$   r   zGUFunc.__init__C   s­   € àÐ ØˆMØˆŒ
ØˆŒØ%ˆÔØ!ˆŒõ
 ,Ø�Y ¨%°ÀñOô OˆÔð Ô+Ô3Ô<ˆŒØÔ*Ô2Ô:ˆŒØÔ.Ô6ˆÔØ×Ò˜Ô)Ñ*Ô*Ð*ÝÔ   wÑ/Ô/Ð/Ð/Ð/r%   c                 ó¦   — |                       ¦   «          |                      ¦   «          t          | ¦  «        | _        |                      ¦   «          d S r   )Úbuild_ufuncÚ_install_typer@   Ú	_lower_meÚ_install_cg)r   Ú
dispatchers     r$   rP   zGUFunc._initializeX   sM   € Ø×ÒÑÔÐØ×ÒÑÔÐÝ& tÑ,Ô,ˆŒØ×ÒÑÔÐÐÐr%   c                 óž   — | j         }t          |j        |j        | j        |j        | j        |j        |j        |j	        | j
        ¬¦	  «	        }|S )N)	rM   r   rS   rT   rU   rV   rW   ÚtypesigsÚfrozen)rL   ÚdictrM   r   rK   rT   rJ   rV   rW   Ú_sigsrI   )r   ÚgbÚdcts      r$   Ú_reduce_stateszGUFunc._reduce_states^   sU   € ØÔ ˆÝØ”JØ”lØ”^Ø”(ØÔ'ØÔ*ØÔ*Ø”XØ”<ð

ñ 

ô 

ˆð ˆ
r%   c
           	      ó”   —  | |||||||¬¦  «        }
|D ]}|
                      |¦  «         Œ|
                     ¦   «          |	|
_        |
S )N)rM   r   rS   rT   rU   rV   rW   )ÚaddrY   rI   )ÚclsrM   r   rS   rT   rU   rV   rW   r_   r`   r   Úsigs               r$   Ú_rebuildzGUFunc._rebuildm   sm   € ð ˆs˜7¨iÀ(Ø¨:Ø!.¸mðMñ Mô Mˆð ð 	ð 	ˆCØ�HŠH�S‰MŒMˆMˆMØ×ÒÑÔÐØˆŒØˆr%   c                 ó   — d| j         › d�S )Nz<numba._GUFunc 'z'>)r5   ©r   s    r$   Ú__repr__zGUFunc.__repr__y   s   € Ø3 $¤-Ð3Ð3Ð3Ð3r%   c                 ó¾   — |€| j         j        j        }t          d| j        z   t
          ft          | | j        ¬¦  «        ¦  «        }|                     | |¦  «         dS )a*  Constructs and installs a typing class for a gufunc object in the
        input typing context.  If no typing context is given, then
        _install_type() installs into the typing context of the
        dispatcher object (should be same default context used by
        jit() and njit()).
        NÚGUFuncTyping_)ÚkeyÚgeneric)	rO   ÚtargetdescrÚtyping_contextÚtyper5   r   ra   Ú_type_meÚinsert_user_function)r   Ú	typingctxÚ_ty_clss      r$   rZ   zGUFunc._install_type|   sf   € ð ÐØÔ(Ô4ÔCˆIÝ�¨¬Ñ6Ý(Ð*Ý ¨d¬mÐ<Ñ<Ô<ñ>ô >ˆð 	×&Ò& t¨WÑ5Ô5Ð5Ð5Ð5r%   c                 ó:   — | j                              |¦  «         d S r   )rL   rg   )r   Úftys     r$   rg   z
GUFunc.addŠ   s   € ØÔ×Ò Ñ$Ô$Ð$Ð$Ð$r%   c                 óB   — | j                              ¦   «         | _        | S r   )rL   rY   rH   rl   s    r$   rY   zGUFunc.build_ufunc�   s   € ØÔ(×4Ò4Ñ6Ô6ˆŒ
Øˆr%   c                 óÔ   — t          | j        j        ¦  «        }t          t	          t
          |d         ¦  «        ¦  «        t          t	          t
          |d         ¦  «        ¦  «        fS ©Nr   é   )r   rL   r   ÚtupleÚmapÚlen)r   Ú
parsed_sigs     r$   Úexpected_ndimszGUFunc.expected_ndims‘   sL   € Ý$ TÔ%8Ô%BÑCÔCˆ
Ý•c�#˜z¨!œ}Ñ-Ô-Ñ.Ô.µµc½#¸zÈ!¼}Ñ6MÔ6MÑ0NÔ0NÐOÐOr%   c                 óÈ  — |rJ ‚| j         }| j        j        }|                      ¦   «         \  }}||z   }t	          |¦  «        sJ t	          |¦  «        ¦   «         ‚t          |¦  «        D ]¦\  }}	t          |	t          j        ¦  «        r‡|	j	        ||         k     rv|t	          |¦  «        k     rdnd}
|t	          |¦  «        k     r|n|t	          |¦  «        z
  }| j
        › d|
› d|› d|	j	        › d|› d||         › d�}t          j        |¦  «        ‚Œ§t          j                             |||¦  «        }|\  }}}}|                      |¦  «        \  }}|€{| j        rd
| › d|› �}t          j        |¦  «        ‚|                      |¦  «         |                      |¦  «        \  }}|dk    r!d| j
        › d|› �}t          j        |¦  «        ‚|€J ‚t          t          j        g|¢R Ž S )zì
        Implement AbstractTemplate.generic() for the typing class
        built by gufunc._install_type().

        Return the call-site signature after either validating the
        element-wise signature or compiling for it.
        ÚInputÚOutputz: z	 operand z& does not have enough dimensions (has z, gufunc core with signature z
 requires ú)Nzcannot call z with types ©NNzFail to compile )rH   rL   r   rƒ   r�   Ú	enumerater'   r   r(   Úndimr5   r   ÚTypingErrorr   ÚNumpy_rules_ufuncÚ_handle_inputsr   rI   Ú_compile_for_argtysÚnone)r   ÚargtysÚkwsrH   ri   Ú	inp_ndimsÚ	out_ndimsÚndimsÚidxÚargÚkindÚir4   Ú_handle_inputs_resultr"   Ú_s                   r$   ru   zGUFunc._type_me•   sG  € ð ˆˆˆwØ”
ˆØÔ!Ô+ˆØ#×2Ò2Ñ4Ô4Ñˆ	�9Ø˜IÑ%ˆå�6‰{Œ{Ð&Ð&�C ™JœJÑ&Ô&ˆ{Ý! &Ñ)Ô)ð 	.ð 	.‰HˆC�Ý˜#�uœ{Ñ+Ô+ð .°´¸5À¼:Ò0EÐ0EØ"%­¨I©¬Ò"6Ð"6�w�w¸H�Ø¥ Y¡¤Ò/Ð/�C�C°S½3¸y¹>¼>Ñ5I�à”}ð >ð >¨ð >ð >°qð >ð >Ø.1¬hð>ð >à!$ð>ð >à05°c´
ð>ð >ð >ð õ Ô(¨Ñ-Ô-Ð-øå 'Ô 9× HÒ HØ�6˜3ñ! ô ! Ðà4Ñˆ�Q˜˜1Ø×)Ò)¨+Ñ6Ô6‰ˆˆQàˆ;ð Œ|ð .Ø? TÐ?Ð?°vÐ?Ð?�ÝÔ(¨Ñ-Ô-Ð-Ø×$Ò$ [Ñ1Ô1Ð1à×-Ò-¨kÑ:Ô:‰FˆC�Ø�lÒ"Ð"ØL¨¬ÐLÐLÀFÐLÐL�ÝÔ(¨Ñ-Ô-Ð-à�?�?�?å�œÐ- fÐ-Ð-Ð-Ð-r%   c                 óN   —  | j         |Ž }| j                             |¦  «         d S r   )Ú_get_function_typerL   rg   )r   r�   Úreturn_typeÚfntys       r$   rŽ   zGUFunc._compile_for_argtysÄ   s0   € ð 'ˆtÔ&¨Ð/ˆØÔ×Ò Ñ%Ô%Ð%Ð%Ð%r%   c                 óv   — |                       |j        ¦  «        }t          |¦  «        t          |¦  «        k    S r   )r   r   r   )r   r"   ri   Údtypess       r$   Úmatch_signaturezGUFunc.match_signatureË   s0   € Ø×'Ò'¨¬Ñ1Ô1ˆÝ�V‰}Œ}¥ kÑ 2Ô 2Ò2Ð2r%   c                 ó   — | j         S r   )rJ   rl   s    r$   rU   zGUFunc.is_dynamicÏ   s   € àÔÐr%   c                 óÊ   — t          d„ |¦  «        }g }|D ]L}t          |t          j        ¦  «        r|                     |j        ¦  «         Œ7|                     |¦  «         ŒM|S )Nc                 óX   — t          | t          j        ¦  «        r| nt          | ¦  «        S r   )r'   r   ÚTyper   )r–   s    r$   ú<lambda>z*GUFunc._get_ewise_dtypes.<locals>.<lambda>Ô   s'   € ­
°3½¼
Ñ(CÔ(Cð "!  Ý˜C‘[”[ð r%   )r€   r'   r   r(   Úappendr*   )r   r   r�   ÚtysÚargtys        r$   r   zGUFunc._get_ewise_dtypesÓ   sw   € Ýð !ð !Ø"&ñ(ô (ˆàˆØð 	"ð 	"ˆEÝ˜%¥¤Ñ-Ô-ð "Ø—
’
˜5œ;Ñ'Ô'Ð'Ð'à—
’
˜5Ñ!Ô!Ð!Ð!Øˆ
r%   c                 ó¬   — t          | j        j        ¦  «        }t          |¦  «        t          |d         ¦  «        t          |d         ¦  «        z   k    S r}   )r   rL   r   r�   )r   r   r‚   s      r$   Ú_num_args_matchzGUFunc._num_args_matchÞ   sC   € Ý$ TÔ%8Ô%BÑCÔCˆ
Ý�4‰yŒy�C 
¨1¤Ñ.Ô.µ°ZÀ´]Ñ1CÔ1CÑCÒCÐCr%   c                 ó^  — t          | j        j        ¦  «        }|                      |¦  «        }g }t	          |d         ¦  «        D ]e\  }}t          |¦  «        }|dk    r|                     ||         ¦  «         Œ6|                     t          j        ||         |d¦  «        ¦  «         Œft          |d         ¦  «        }t	          |d         ¦  «        D ]J\  }}|||z            }	t          |¦  «        pd}
|                     t          j        |	|
d¦  «        ¦  «         ŒKt          j	        |Ž S )Nr   ÚAr~   )
r   rL   r   r   r‰   r�   r§   r   r(   r�   )r   r   r‚   r"   Úlr•   Úsig_dimrŠ   ÚoffsetÚrettyÚret_ndims              r$   rœ   zGUFunc._get_function_typeâ   s#  € Ý$ TÔ%8Ô%BÑCÔCˆ
à×,Ò,¨TÑ2Ô2ˆð ˆÝ% j°¤mÑ4Ô4ð 	Cð 	C‰LˆC�Ý�w‘<”<ˆDØ�qŠyˆyØ—’˜ SÔ)Ñ*Ô*Ð*Ð*à—’�œ [°Ô%5°t¸SÑAÔAÑBÔBÐBÐBå�Z ”]Ñ#Ô#ˆå% j°¤mÑ4Ô4ð 	8ð 	8‰LˆC�Ø  f¡Ô-ˆEÝ˜7‘|”|Ð( qˆHØ�HŠH•U”[ ¨°#Ñ6Ô6Ñ7Ô7Ð7Ð7åŒz˜1ˆ~Ðr%   c                 ó0  — | j         s| j        s<|r-t          |d         ¦  «        r |d         j        | dg|¢R i |¤ŽS  | j        |i |¤ŽS d|v r||                     d¦  «        fz  } | j        |Ž du rd| j        › d�}t          |¦  «        ‚|  	                    |¦  «        }| j        rt          | j        |¦  «        sL|                      |¦  «        dk    s | j        |Ž }|                      |¦  «         |                      ¦   «           | j        |i |¤ŽS )Nr   Ú__call__Ú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ˆ   )rI   rU   Ú_is_array_wrapperÚ__array_ufunc__rH   Úpopr«   r5   Ú	TypeErrorr   r	   r   rœ   rg   rY   )r   r   Úkwargsr4   Úewiseri   s         r$   r´   zGUFunc.__call__ú   s  € ð Œ<ð 	)˜tœð 	)ð
 ð 3Õ)¨$¨q¬'Ñ2Ô2ð 3Ø.�t˜A”wÔ.Ø˜*ðØ'+ðð ð Ø/5ðð ð ð "�t”z 4Ð2¨6Ð2Ð2Ð2Ø�fˆ_ˆ_à�V—Z’Z Ñ&Ô&Ð(Ñ(ˆDàˆ4Ô Ð&¨%Ð/Ð/ð
°4´=ð ð ð ð õ
 ˜C‘.”.Ð ð ×&Ò& tÑ,Ô,ˆØ”
ð 	Õ7¸¼
ÀEÑJÔJð 	ð ×+Ò+¨EÑ2Ô2°lÒBÐBØ-�dÔ-¨tÐ4�Ø—’˜‘”�Ø×ÒÑÔÐàˆtŒz˜4Ð* 6Ð*Ð*Ð*r%   )NNFNrF   r   )r5   r6   r7   r8   r   rP   re   Úclassmethodrj   rm   rZ   rg   rY   rƒ   ru   rŽ   r¡   ÚpropertyrU   r   r«   rœ   r´   rF   r%   r$   rE   rE   ;   sU  € € € € € ðð ð AEØEGð0ð 0ð 0ð 0ð*ð ð ðð ð ð ð	ð 	ñ „[ð	ð4ð 4ð 4ð6ð 6ð 6ð 6ð%ð %ð %ðð ð ðPð Pð Pð-.ð -.ð -.ð^&ð &ð &ð &ð3ð 3ð 3ð ð ð  ñ „Xð ð	ð 	ð 	ðDð Dð Dðð ð ð0(+ð (+ð (+ð (+ð (+r%   rE   c                 ón   — t          | t          ¦  «         ot          | d¦  «        ot          | d¦  «        S )ad  Return True if obj wraps around numpy or another numpy-like library
    and is likely going to apply the ufunc to the wrapped array; False
    otherwise.

    At the moment, this returns True for

    - dask.array.Array
    - dask.dataframe.DataFrame
    - dask.dataframe.Series
    - xarray.DataArray
    - xarray.Dataset
    - xarray.Variable
    - pint.Quantity
    - other potential wrappers around dask array or dask dataframe

    We may need to add other libraries that pickle ufuncs from their
    __array_ufunc__ method in the future.

    Note that the below test is a lot more naive than
    `dask.base.is_dask_collection`
    (https://github.com/dask/dask/blob/5949e54bc04158d215814586a44d51e0eb4a964d/dask/base.py#L209-L249),  # noqa: E501
    because it doesn't need to find out if we're actually dealing with
    a dask collection, only that we're dealing with a wrapper.
    Namely, it will return True for a pint.Quantity wrapping around a plain float, a
    numpy.ndarray, or a dask.array.Array, and it's OK because in all cases
    Quantity.__array_ufunc__ is going to forward the ufunc call inwards.
    Ú__dask_graph__r·   )r'   rt   Úhasattr)Úobjs    r$   r¶   r¶   %  s?   € õ: �s�DÑ!Ô!Ð!ð 	,Ý�CÐ)Ñ*Ô*ð	,å�CÐ*Ñ+Ô+ðr%   )Únumbar   Ú
numba.corer   Únumba.np.ufunc.ufuncbuilderr   Únumba.np.ufunc.sigparser   Únumba.np.ufunc.ufunc_baser   r   Únumba.np.numpy_supportr	   r
   r   Únumba.core.typingr   Únumba.core.typing.templatesr   r   rQ   r>   r@   ÚReduceMixinrE   r¶   rF   r%   r$   ú<module>rË      sQ  ðØ Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ Ð Ð Ð ð!ð !ð !ðH6ð 6ð 6ð 6ð 6Ð$ñ 6ô 6ð 6ðg+ð g+ð g+ð g+ð g+ˆYÔ" Iñ g+ô g+ð g+ðT ð  ð  ð  ð  r%   