
    xKg*                         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y
)    )typeof)types)GUFuncBuilder)parse_signature)	UfuncBaseUfuncLowererBase)ufunc_find_matching_loop)	serializeerrors)npydecl)	signatureAbstractTemplateNc                      ddl m}  G  fdd|j                        }|xj                   j                  z  c_        |S )Nr   npyimplc                   >     e Zd ZdZW 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                        }| j                  j                  |      \  | _        | _        y N)super__init__dufunc_get_ewise_dtypesargsfind_ewise_function	inner_sigcres)selfcontextbuilder	outer_sigewise_types	__class__s        Y/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/np/ufunc/gufunc.pyr   z1make_gufunc_kernel.<locals>.GUFuncKernel.__init__   sL    GWgy9++77	GK(,(G(G)%DNDI    c                     t        |t        j                        r5t        |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   sI    &%++.tU[[1w|Ct<<7<VT22r%   c                     | j                   j                  rd}t        j                  |      | j                  j                  | j                   j                  f       t        |    | 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%   sW    yy##(..s33LL))499+<+<*>?7#T**r%   )	__name__
__module____qualname____doc__r   r   r)   r3   __classcell__)r#   _dufuncs   @r$   GUFuncKernelr      s#    	
 		3	+ 	+r%   r;   )numba.npr   _Kernelr5   )r:   r   r;   s   `  r$   make_gufunc_kernelr>      s5     +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                 P    ddl m} t        |   |t        |j
                         y )Nr   r   )r<   r   r   r   r>   numpy_gufunc_kernel)r   gufuncr   r#   s      r$   r   zGUFuncLowerer.__init__4   s!    $+ 44	6r%   )r5   r6   r7   r8   r   r9   )r#   s   @r$   r@   r@   1   s    6 6r%   r@   c                       e Zd ZdZdddi df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y)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                    d | _         d| _        || _        || _        t	        ||||||      | _        | j
                  j                  j                  | _        | j
                  j                  j                  | _        | j
                  j                  | _
        | j                  | j                         t        j                  | |       y )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    
%!
 ,Y%O ++33<<**22::..66))*  w/r%   c                     | j                          | j                          t        |       | _        | j	                          y r   )build_ufunc_install_typer@   	_lower_me_install_cg)r   
dispatchers     r$   rP   zGUFunc._initializeV   s2    &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\   sc      JJll^^((''****XX<<

 
r%   c
           	           | |||||||      }
|D ]  }|
j                  |        |
j                          |	|
_        |
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._rebuildk   sN     7i(:!.mM CHHSM r%   c                 "    d| j                    dS )Nz<numba._GUFunc 'z'>)r5   r   s    r$   __repr__zGUFunc.__repr__w   s    !$--33r%   c                     | | j                   j                  j                  }t        d| j                  z   t
        ft        | | j                              }|j                  | |       y)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_typez   s\     ((44CCI6(*dmm<> 	&&tW5r%   c                 :    | j                   j                  |       y r   )rL   rg   )r   ftys     r$   rg   z
GUFunc.add   s    $r%   c                 D    | j                   j                         | _        | S r   )rL   rY   rH   rl   s    r$   rY   zGUFunc.build_ufunc   s    ((44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   sC    $T%8%8%B%BC
c#z!}-.c#z!}6M0NOOr%   c                    |rJ | j                   }| j                  j                  }| j                         \  }}||z   }t	        |      sJ t	        |             t        |      D ]  \  }}	t        |	t        j                        s!|	j                  ||   k  s4|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                  |||      }|\  }}}}| j!                  |      \  }}|~| j"                  rd	|  d
| }t        j                  |      | j%                  |       | j!                  |      \  }}|dk(  r'd| j                   d
| }t        j                  |      |J t        t        j&                  g| 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 )z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   s    w

!!++#224	9I%6{&CJ&{!&)HC#u{{+5:0E"%I"6wHY/CS3y>5I}}oRvYqc :..1hhZ 8!!$Zc
|1>  ((-- * !( 9 9 H H63! 4Q1))+6Q; ||$TF,vh?((--$$[1--k:FCl"(|F8L((--?"?-f--r%   c                 X     | j                   | }| j                  j                  |       y r   )_get_function_typerL   rg   )r   r   return_typefntys       r$   r   zGUFunc._compile_for_argtys   s*     't&&/%r%   c                 f    | j                  |j                        }t        |      t        |      k(  S r   )r   r   r   )r   r"   ri   dtypess       r$   match_signaturezGUFunc.match_signature   s*    ''1V}k 222r%   c                     | j                   S r   )rJ   rl   s    r$   rU   zGUFunc.is_dynamic   s    r%   c                     t        d |      }g }|D ]I  }t        |t        j                        r|j	                  |j
                         9|j	                  |       K |S )Nc                 P    t        | t        j                        r| S t        |       S r   )r'   r   Typer   )r   s    r$   <lambda>z*GUFunc._get_ewise_dtypes.<locals>.<lambda>   s"    
3

(C "!C["!r%   )r   r'   r   r(   appendr*   )r   r   r   tysargtys        r$   r   zGUFunc._get_ewise_dtypes   sT     !"&(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   s>    $T%8%8%B%BC
4yC
1.Z]1CCCCr%   c                    t        | j                  j                        }| j                  |      }g }t	        |d         D ]S  \  }}t        |      }|dk(  r|j                  ||          +|j                  t        j                  ||   |d             U t        |d         }t	        |d         D ]B  \  }}|||z      }	t        |      xs d}
|j                  t        j                  |	|
d             D t        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%8%B%BC
,,T2 %jm4LCw<DqyS)*[%5tSAB 5 Z]#%jm4LCf-E7|(qHHHU[[#67 5
 zz1~r%   c                    | j                   s| j                  s | j                  |i |S d|v r||j                  d      fz  } | j                  | du rd| j
                   d}t        |      | j                  |      }| j                  rt        | j                  |      sD| j                  |      dk7  s  | j                  | }| j                  |       | j                           | j                  |i |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   )rI   rU   rH   popr   r5   	TypeErrorr   r	   r   r   rg   rY   )r   r   kwargsr4   ewiseri   s         r$   __call__zGUFunc.__call__   s     <<t4::t.v..f_VZZ&((D4&%/
 34==/ B  
 C.  &&t,

7

EJ ++E2lB-d--t4tzz4*6**r%   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   ;   s     59!20& 	 	46%P-.^&3    	D0+r%   rE   )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   rF   r%   r$   <module>r      sL      5 3 A ; ( % C !H6$ 6\+Y""I \+r%   