
    
fg                     ^   d dl Z d dlZd dl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mZmZ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 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 Z% G d de&          Z' G d de
j(        ej)                  Z*ej+        ,                    e*           dS )    N)jittypeof)cgutilstypes	serializesigutilserrors)	is_jittedoverload_attributeoverload_methodregister_jitable	intrinsic)npydecl)AbstractTemplate	signature)tuple_setitem)	_internal)array_analysis)ufuncbuilder)numpy_support)Callable)irc                 v     ddl m}  G  fdd|j                  xj         j        j        z  c_        S )Nr   npyimplc                   0     e Zd ZdZZ fdZd Z xZS )(make_dufunc_kernel.<locals>.DUFuncKernelz
        npyimpl._Kernel subclass responsible for lowering a DUFunc kernel
        (element-wise function) inside a broadcast loop (which is
        generated by npyimpl.numpy_ufunc_kernel()).
        c                     t          |                               |||           | j                            |j                  \  | _        | _        d S N)super__init__dufuncfind_ewise_functionargs	inner_sigcres)selfcontextbuilder	outer_sigDUFuncKernel	__class__s       5lib/python3.11/site-packages/numba/np/ufunc/dufunc.pyr!   z1make_dufunc_kernel.<locals>.DUFuncKernel.__init__!   sN    ,%%..wKKK(,(G(G)  ) %DNDIII    c                      j         } j        } fdt          ||j        |j                  D             } j        j        rK j        j                            t          j
        t          j
        gt          |j                  z            }n* j        j                            |j        |j                  } j        j        j        j        }t#          j        || j        j        j                  }|j                            d            j        j                             j        ||j        |j        |          \  }}	                     |	|j        |j                  S )Nc                 F    g | ]\  }}}                     |||          S  )cast).0valintyouttyr'   s       r-   
<listcomp>zEmake_dufunc_kernel.<locals>.DUFuncKernel.generate.<locals>.<listcomp>)   s?     : : :-S$ 3e44 : : :r.   alwaysinline)r%   r*   zipr$   r&   
objectmoder(   	call_convget_function_typer   pyobjectlenreturn_typer)   blockfunctionmoduler   get_or_insert_functionfndescllvm_func_name
attributesaddcall_functionr2   )
r'   r$   isigosig	cast_args	func_typerB   entry_point_ress
   `         r-   generatez1make_dufunc_kernel.<locals>.DUFuncKernel.generate&   sO   >D>D: : : :T49di88: : :I y# 1 L2DDNU^$4s49~~$EG G		 !L2DD$di1 1	\'07F!8		 /1 1K "&&~666\+99k4+;TY FAs 99S$"2D4DEEEr.   )__name__
__module____qualname____doc__r"   r!   rP   __classcell__)r,   r+   _dufuncs   @r-   r+   r      se        	 	
 	  	  	  	  	  	 
	F 	F 	F 	F 	F 	F 	Fr.   r+   )numba.npr   _KernelrQ   ufunc)rV   r   r+   s   ` @r-   make_dufunc_kernelrZ      s~          "F "F "F "F "F "F "F "Fw "F "F "FH W]33r.   c                       e Zd ZdZd Zd ZdS )DUFuncLowererzHCallable class responsible for lowering calls to a specific DUFunc.
    c                 <    t          |          | _        g | _        d S r   )rZ   kernellibs)r'   r"   s     r-   r!   zDUFuncLowerer.__init__D   s    (00			r.   c                 j    ddl m} |                    ||||| j        j        j        | j                  S )Nr   r   )rW   r   numpy_ufunc_kernelr^   r"   rY   )r'   r(   r)   sigr$   r   s         r-   __call__zDUFuncLowerer.__call__H   sD    $$$$$$))'7C*.+*<*B*.+7 7 	7r.   N)rQ   rR   rS   rT   r!   rc   r1   r.   r-   r\   r\   A   s<           7 7 7 7 7r.   r\   c                   p    e Zd ZdZ ed          Zddi fdZ fdZd Ze	d             Z
d	 Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zd Zd Z fdZd ZddZd dZd dZd dZddZd Zd ZddZ  xZ!S )!DUFuncz
    Dynamic universal function (DUFunc) intended to act like a normal
    Numpy ufunc, but capable of call-time (just-in-time) compilation
    of fast loops specialized to inputs.
    )identity
_keepaliveninnoutNFc                    t          |          r|j        }t          j                    5   t	          dd|d||          }d d d            n# 1 swxY w Y   |                     ||           t          j        | |           d S )Nnpyufunc)_targetcacher1   )r
   py_funcr   3_suppress_deprecation_warning_nopython_not_suppliedr   _initialize	functoolsupdate_wrapper)r'   rn   rf   rm   targetoptions
dispatchers         r-   r!   zDUFunc.__init__Y   s    W 	&oGMOO 	7 	7. .Z#(. .,. ..57 7J	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	X... w/////s   AAAc                 @   t          j        |          }t          t          |                               ||           |                                  t          |           | _        |                                  |j	        j
        | _
        |j	        j        | _        d S )N)rf   )r   parse_identityr    re   r!   _install_typer\   	_lower_me_install_cgrn   rQ   rT   )r'   rt   rf   r,   s      r-   rp   zDUFunc._initializec   s    .x88fd$$Z($CCC 	&t,,"*3!)1r.   c                     t          | j        j                                                  }t	          | j        | j        | j        |          S )4
        NOTE: part of ReduceMixin protocol
        )rt   rf   frozensiglist)list_dispatcher	overloadskeysdictrf   _frozen)r'   r}   s     r-   _reduce_stateszDUFunc._reduce_statesn   sM     t'1668899']<	
 
 
 	
r.   c                     t           j                            |           }|                    ||           |D ]}|                    |           |r|                                 |S )r{   )r   _DUFunc__new__rp   rG   disable_compile)clsrt   rf   r|   r}   r'   rb   s          r-   _rebuildzDUFunc._rebuildz   so    
  ((--X... 	 	CHHSMMMM 	#  """r.   c                     | S )zK
        For compatibility with the various *UFuncBuilder classes.
        r1   r'   s    r-   build_ufunczDUFunc.build_ufunc   s	     r.   c                     | j         j        S r   )r   rs   r   s    r-   rs   zDUFunc.targetoptions   s    --r.   c                     | j         j        S r   )rY   rh   r   s    r-   rh   z
DUFunc.nin   s    z~r.   c                     | j         j        S r   )rY   ri   r   s    r-   ri   zDUFunc.nout   s    zr.   c                     | j         j        S r   )rY   nargsr   s    r-   r   zDUFunc.nargs       zr.   c                     | j         j        S r   )rY   ntypesr   s    r-   r   zDUFunc.ntypes   s    z  r.   c                     | j         j        S r   )rY   r   r   s    r-   r   zDUFunc.types   r   r.   c                     | j         j        S r   )rY   rf   r   s    r-   rf   zDUFunc.identity   s    z""r.   c                     | j         j        S r   )rY   r   r   s    r-   r   zDUFunc.signature   s    z##r.   c                 R    t          | j        j                  dk    sJ d| _        dS )zI
        Disable the compilation of new signatures at call time.
        r   TN)r>   r   r   r   r   s    r-   r   zDUFunc.disable_compile   s.    
 4#-..2222r.   c                 \    t          j        |          \  }}|                     ||          S )z=
        Compile the DUFunc for the given signature.
        )r   normalize_signature_compile_for_argtys)r'   rb   r$   r?   s       r-   rG   z
DUFunc.add   s/     %8==k''k:::r.   c                 .   t           j        j        j        }|t	          |                                          z   D ]A}t          t          |          d|          |ur |j        | dg|R i |}|t          ur|c S B t                      j
        |i |S )z}
        Allow any argument that has overridden __array_ufunc__ (NEP-18)
        to take control of DUFunc.__call__.
        __array_ufunc__rc   )r   npndarrayr   tuplevaluesgetattrtypeNotImplementedr    rc   )r'   r$   kwsdefaultargoutputr,   s         r-   rc   zDUFunc.__call__   s    
  "*:%

--- 	2 	2CtCyy"3W==WLL,,T:LLLLLL//!MMM#577#T1S111r.   c           	      J   | j         j        }|r]d|v r|                    d          }||fz  }|r<t          dd                    d t          |          D                       z            t          |          }||k    s||| j         j        z   k    sJ |rJ g }|d |         D ]\}t          |          }t          |t          j                  r|j        }nt          j        |          }|                    |           ]|                     t#          |                    S )Noutz)unexpected keyword arguments to ufunc: %sz, c              3   4   K   | ]}t          |          V  d S r   )repr)r3   ks     r-   	<genexpr>z+DUFunc._compile_for_args.<locals>.<genexpr>   s(      +I+IDGG+I+I+I+I+I+Ir.   )rY   rh   pop	TypeErrorjoinsortedr>   ri   r   
isinstancer   Arraydtyper   map_arrayscalar_typeappendr   r   )	r'   r$   r   rh   r   args_lenargtysr   argtys	            r-   _compile_for_argszDUFunc._compile_for_args   s@   jn 	K||ggenn K K"&))+I+IVC[[+I+I+I"I"I!J K K K t99CXtz1F%F%F%F%F: 	! 	!C3KKE%-- @ &:3??MM%    ''f666r.   c                    | j         rt          d|           t          |t                    sJ ||}n || }t	          j        | j        | j        |          \  }}}t	          j        |||          }t	          j	        ||          \  }}}| 
                    t          |          |           | j                            ||j        |f           | j        j                            |j                   |S )a/  
        Given a tuple of argument types (these should be the array
        dtypes, and not the array types themselves), compile the
        element-wise function for those inputs, generate a UFunc loop
        wrapper, and register the loop with the Numpy ufunc object for
        this DUFunc.
        zcompilation disabled for )r   RuntimeErrorr   r   r   _compile_element_wise_functionr   rs   _finalize_ufunc_signature!_build_element_wise_ufunc_wrapper	_add_loopintrg   r   libraryrx   r_   )	r'   r   r?   rb   r&   
actual_sig	dtypenumsptrenvs	            r-   r   zDUFunc._compile_for_argtys   s	    < 	H,FGGG&%(((((CC+v&C$0$Od0#%7 %7!fk!;&+' '
*L* 	3s3xx+++T\37888""4<000r.   returnc                     dt           dt          fd}t          j        |          }d}|D ]&} ||          } t	          ||          |           'd S )Nattrr   c                       fd}|S )Nc                 F    t          | j        d                   fdS )Nr   c                     S r   r1   )rY   r4   s    r-   <lambda>zUDUFunc._install_ufunc_attributes.<locals>.get_attr_fn.<locals>.impl.<locals>.<lambda>  s    S r.   )r   key)rY   r4   r   s    @r-   implzCDUFunc._install_ufunc_attributes.<locals>.get_attr_fn.<locals>.impl	  s(    eilD11(((((r.   r1   )r   r   s   ` r-   get_attr_fnz5DUFunc._install_ufunc_attributes.<locals>.get_attr_fn  s#    ) ) ) ) ) Kr.   )rh   ri   r   rf   r   )strr   r   Functionr   )r'   templater   atrF   r   attr_fns          r-   _install_ufunc_attributesz DUFunc._install_ufunc_attributes  s    	c 	h 	 	 	 	 ^H%%/
 	2 	2D!k$''G(r4((1111	2 	2r.   c                 0    |                      |           d S r   )_install_ufunc_reduce)r'   r   s     r-   _install_ufunc_methodszDUFunc._install_ufunc_methods  s    ""8,,,,,r.   c                 h     t          j        |          }t          |d          d fd	            }d S )Nreducer   c                 l   t          j        dt          j                   t	          |t
          j                  sd}t          j        |          t	          |t
          j                  }t	          |t
          j	                  ot	          |j
        t
          j                  }t	          |t
          j                  ot          |          dk    }t          j        |          }	|rt          |          nd}
j        j        2|r|
dk    s*|s(|s&|	s$dj        j         d}t          j        |          d|j        z  d|j        dz
  z  t          j        |          r|j
        n|j        t          j                  t          j        |          t&          fd	            t&          fd
            t(          d             t&          d             t&          d             dfd	}	 	 	 dfd	}	 	 	 dfd	}	 	 	 dd}	 	 	 dfd	}|j        dk    r|s|S |r|S |	r#t+          t-          |j                            |S |rdt          |          dz
  z  |S |dk    s1t	          |t
          j        t
          j        t
          j        f          r|S d S )Nz$ufunc.reduce feature is experimental)categoryz-The first argument "array" must be array-liker      zreduction operation 'z:' is not reorderable, so at most one axis may be specified)r   c                 t    }d}t          |           D ]"\  }}||k    rt          |||          }|dz  }#|S Nr   r   )	enumerater   )tuppossijetup_init_m1s         r-   tuple_slicezDDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.tuple_slice@  sU      %cNN  DAqCxx %aA..AFAAr.   c                     }ddt          |          }}}||k     rA||k    rt          |||          }n| |         }t          |||          }|dz  }|dz  }||k     A|S r   )r>   r   )	r   r   r4   r   r   r   szr   tup_inits	           r-   tuple_slice_appendzKDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.tuple_slice_appendM  s     aQb1"ffCxx)!Q44F)!Q22QFA "ff r.   c                 p    t          j        ||||          }t          |          fdfd}||fS )Nc                    |\  }}}}|                      |          }|                     |          5   t          j        d          d          }	|	}
|dk    rpt	          d          D ]]}|                     ||dz
            }|                     ||          }|                     ||          }|                     |
|          }
^n^d|cxk     r	dz
  k     rn nt	          d|          D ]Z}|                     ||          }|                     ||          }|                     ||          }|                     |
|          }
[t	          |dz             D ]]}|                     ||dz
            }|                     ||          }|                     ||          }|                     |
|          }
^nnt	          ddz
            D ]Z}|                     ||          }|                     ||          }|                     ||          }|                     |
|          }
[|                     |           d d d            n# 1 swxY w Y   ||
fS )Nname@   r   r   )	append_basic_block
goto_blockr   IntTyperangeextract_valuemulrG   branch)r)   	block_pos
block_namebb_endr$   stridesrN   idxbbzeroflat_idxr   strideidx_imlen_idxs                  r-   	gen_blockz\DUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.compute_flat_idx.<locals>.gen_blockb  s   )-&GQQ 333DDB ++B// / /-rz"~~a00#'$>>%*1g%6%6 D D)0)>)>wA)N)N(/(=(=c1(E(E$+KK$>$>+2;;x+C+C	D
 8888Wq[88888%*1i%8%8 D D)0)>)>w)J)J(/(=(=c1(E(E$+KK$>$>+2;;x+C+C%*9q='%B%B D D)0)>)>wA)N)N(/(=(=c1(E(E$+KK$>$>+2;;x+C+C	D &+1gk%:%: D D)0)>)>w)J)J(/(=(=c1(E(E$+KK$>$>+2;;x+C+Cv...;/ / / / / / / / / / / / / / /> x<'s   H	I		IIc                    |\  }}}}|j         }|                    d          }	g }
t                    D ].} ||d| |	|          \  }}|
                    ||f           /|                    |          5  |                    ||
d         d                   }t                    D ]$}|                    ||
|         d                    %	 d d d            n# 1 swxY w Y   |                    |	           |                    |
d         d         j	                  }|
D ]\  }}|
                    ||           |                    ||          S )Naxis_endr   axis_r   r   )basic_blockr   r   r   r   switchadd_caseposition_at_endphir   add_incomingsdiv)r(   r)   rb   r$   r   itemsizer   axisr  
switch_endlr   r@   r  r  r  valuer  r  s                    r-   codegenzZDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.compute_flat_idx.<locals>.codegen  s   370GXsD ,B!(!;!;!;!L!LJA"7^^ 4 4*3)GQ4>+F +Fx%!23333 ++B// 8 8!(aeAh!?!?!&w 8 8A"OOAqtAw777788 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 ++J777!++ad1gl33C() 7 7u((6666"<<X666s   ;ACC#&C#)r   intpr>   )		typingctxr   r  r   r  rb   r  r  r  s	          @@r-   compute_flat_idxzIDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.compute_flat_idx]  sh    j(C>>c((#( #( #( #( #(J7 7 7 7 7 7, G|#r.   c                     | }t          t          |                     D ]2}| |         dk     r| |         |z   n| |         }t          |||          }3|S Nr   )r   r>   r   )r  ndimaxr   r4   s        r-   
fixup_axiszCDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.fixup_axis  s]    s4yy)) 3 3A,0GaKK$q'D..T!WC&r1c22BB	r.   c                     d| d         }}t          t          |                     D ]}| |         |k     r
|| |         }}||fS r  )r   r>   )r   r   r   r   s       r-   find_minzADUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.find_min  sN    CFQs3xx + +A1vzz!"CFQAvr.   c                     d}r	rd}|d         }nr
}n|}|j         d         }t          ||          D ]} | |||                   }|S r   )shaper   )rY   arrayr  r   initialstartrr   r   id_nonerf   	init_nones            r-   impl_1dz@DUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.impl_1d  s{        EaAA   AAA[^ub)) + +Aaq**AAr.   c                 F   |t          d          |dk     r
||j        z  }|dk     s||j        k    rt          d           |j        |          }|KIt          j        |          }t          j        |          D ]\  }} ||d          }	||	         ||<   n3|t          j        |          }nt          j        ||          }|                                }
|[Yt          j        |          D ]C\  }}||         dk    r |j        |j	        ||          }|
|         |}} | ||          |
|<   Dn\t          j        |          D ]G\  }}|||         dk    r |j        |j	        ||          }|
|         |}} | ||          |
|<   H|S )Nz'axis' must be specifiedr   Invalid axis)r   )
fill_valuer   )

ValueErrorr  r%  r   emptyndenumeratefullravelr   r  )rY   r&  r  r   r'  r%  r)  r   rN   
result_idxviewr4   flat_poslhsrhsr  rf   nb_dtyper   r   s                  r-   impl_nd_axis_intzIDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.impl_nd_axis_int  s   
 <$%?@@@!88EJ&D!88tuz11$^444 $EK66?x'7h777A"$."3"3 3 3Q%7%7T1%E%E
!&z!2#3 _)= ((KKKAA'JJJA wwyy?x'7$&N5$9$9 = =St9>>$'7'7	1:8;T(C (CH'+H~sC-2U3__DNN= %'N5$9$9 9 9S"?x/? #D	Q$#3#3AIqz47$? $?#'>3S).sCXr.   c                     ||j                   }t          dt          |                    D ]r}||         dk     s||         |j         k    rt          d          t          |dz   t          |                    D ]#}||         ||         k    rt          d          $s |          \  }}	|                     ||	||          }
t          |          dk    r|
S t          |          dk    r&|                     |
||dz   dz           dz
            S }t          t          |                    D ]}||k    rt          ||||                   } |                     |
|          S )Nr   r.  r   zduplicate value in 'axis')r  r   r'     )r  )r  r   r>   r0  r   r   )rY   r&  r  r   r'  r  r   r   min_idxmin_elemr)  r   axis_tupr#  r!  s               r-   impl_nd_axis_tuplezKDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.impl_nd_axis_tuple  s   
 #
444q#e**-- J JAQx!||uQx5:'='=(888"1q5#e**55 J J 8uQx//",-H"I"II 0J %-HUOO!LL&.',)0 ! 2 2 t99>>HYY!^^ <<w{a6G0H10L<MMM!B"3r77^^ @ @<<!.r1eAh!?!?B <<<333r.   c                     |S r   r1   )rY   r&  r  r   r'  s        r-   impl_axis_empty_tuplezNDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.impl_axis_empty_tuple  s	    
 r.   c                 4    |                      |||          S r   )r   )rY   r&  r  r   r'  r@  s        r-   impl_axis_nonezGDUFunc._install_ufunc_reduce.<locals>.ol_reduce.<locals>.impl_axis_none  s    
 ||E8UGDDDr.   r   NN)warningswarnr	   NumbaExperimentalFeatureWarningr   r   r   NumbaTypeErrorIntegerUniTupler   Tupler>   r   is_nonelikerY   rf   rQ   r  r   r   r   r   OmittedIntegerLiteral)rY   r&  r  r   r'  msgaxis_intaxis_int_tupleaxis_empty_tuple	axis_noneaxis_tuple_sizer,  r;  rA  rC  rE  r@  r  r#  r!  r*  rf   r+  r:  r   r   r   r   r'   s                   @@@@@@@@@@@@r-   	ol_reducez/DUFunc._install_ufunc_reduce.<locals>.ol_reduce   s    M@#)#IK K K K eU[11 1E+C000!$66H'en== 64:u}55 )$<<OTa+D11I+9@c$iiiqOz"*# +(71(<(<$ )=(0 )=4= )=Ktz/B K K K+C000uz*H%*q.1K&-&9%&@&@Ku{{eH}H)(33G+G44I
 
 
 
 
      ?$ ?$ Y?$B             " '('+)-	7 7 7 7 7 7 7 7 7 7v )*)-+/	4 4 4 4 4 4 4 4@ ,-,0.2	    %&%)'+	E E E E E E zQ'7! (,, ( uz!2!233%% 
(  3t99q=1))j05050D0F G G
 (' r.   rF  )r   r   r   )r'   r   r   rW  s   `   r-   r   zDUFunc._install_ufunc_reduce  sW    ^H%%	X	&	&U	( U	( U	( U	( U	( 
'	&U	( U	( U	(r.   c                    || j         j        j        }t          d| j        j        z   t          ft          | | j                            }|	                    | |           | 
                    |           |                     |           dS )a*  Constructs and installs a typing class for a DUFunc 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DUFuncTyping_)r   generic)r   targetdescrtyping_contextr   rY   rQ   r   r   _type_meinsert_user_functionr   r   )r'   r  _ty_clss      r-   rw   zDUFunc._install_type:  s     (4CI)<<(*dm<<<> > 	&&tW555&&w///##G,,,,,r.   c                    | j         rJt          j        | |          }|dS t          |j        |j        z             dt          |                   }| j        j        	                                D ]\  }}|j
        |k    r||fc S dS )a  
        Given a tuple of element-wise argument types, find a matching
        signature in the dispatcher.

        Return a 2-tuple containing the matching signature, and
        compilation result.  Will return two None's if no matching
        signature was found.
        N)NN)r   r   ufunc_find_matching_loopr   inputsoutputsr>   r   r   itemsr$   )r'   ewise_typeslooprb   r&   s        r-   r#   zDUFunc.find_ewise_functionJ  s     < 	O 9$LLD|!zdl :;;<MS=M=M<MNK)399;; 	! 	!ICx;&&Dy    'zr.   c                    |rJ | j         }t          j                            |||          }|\  }}}}t	          |          }	|	dk    r&t          |dt	          |                              }
nt          |          }
|                     |
          \  }}|M| j        rt          d| d|          | 	                    |
           |                     |
          \  }}|J |	dk    rt          |          }nF|j        dk    r,|dk    rt          j        |j        ||          g}n|j        g}nt          d          |                    |           t#          | S )z
        Implement AbstractTemplate.generic() for the typing class
        built by DUFunc._install_type().

        Return the call-site signature after either validating the
        element-wise signature or compiling for it.
        r   Nzcannot call z with types r   ztyping gufuncs (nout > 1))rY   r   Numpy_rules_ufunc_handle_inputsr>   r   r#   r   r   r   r~   ri   r   r   r?   NotImplementedErrorextendr   )r'   r   kwtysrY   _handle_inputs_result
base_typesexplicit_outputsndimslayoutexplicit_output_countre  rb   r&   outtyss                 r-   r]  zDUFunc._type_me^  s    
 ' 9 H H65!" !"6K3
$eV #$4 5 5 1$$
+BS1A-B-B,B+B CDDKK
++K,,[99	T; | 2i#'44!1 2 2 2$$[11100==IC??? 1$$*++FFZ1__qyy+coufEEF/*%&ABBBf&!!r.   c                     | j         j        j        }t          j        }t          j        }|f j        j        z  |f j        j        z  z   }|f j        j        z  }|	                     fd||fD                        dS )a-  
        Install an implementation function for a DUFunc object in the
        given target context.  If no target context is given, then
        _install_cg() installs into the target context of the
        dispatcher object (should be same default context used by
        jit() and njit()).
        Nc                 $    g | ]}j         |fS r1   )rx   )r3   rb   r'   s     r-   r7   z&DUFunc._install_cg.<locals>.<listcomp>  s"    AAASdndC(AAAr.   )
r   r[  target_contextr   Anyr   rY   rh   ri   insert_func_defn)r'   	targetctx_any_arrsig0sig1s   `     r-   ry   zDUFunc._install_cg  s     (4CIy{w'4'DJO*CCw'""AAAAT4LAAA	C 	C 	C 	C 	Cr.   r   )r   N)"rQ   rR   rS   rT   set_DUFunc__base_kwargsr!   rp   r   classmethodr   r   propertyrs   rh   ri   r   r   r   rf   r   r   rG   rc   r   r   r   r   r   rw   r#   r]  ry   rU   )r,   s   @r-   re   re   O   sj         CABBM)-U" 0 0 0 0	2 	2 	2 	2 	2

 

 

   [   . . X.   X   X     X  ! ! X!     X  # # X# $ $ X$  ; ; ;2 2 2 2 27 7 7>   42 2 2 2*- - - -Y( Y( Y( Y(z- - - -   (&" &" &"PC C C C C C C Cr.   re   )-rq   rG  numpyr   numbar   r   
numba.corer   r   r   r   r	   numba.core.extendingr
   r   r   r   r   numba.core.typingr   numba.core.typing.templatesr   r   numba.cpython.unsafe.tupler   numba.np.ufuncr   numba.parforsr   r   rW   r   typingr   llvmliter   rZ   objectr\   ReduceMixinr   re   	MAP_TYPESr   r1   r.   r-   <module>r     s                    B B B B B B B B B B B B B B- - - - - - - - - - - - - - & % % % % % C C C C C C C C 4 4 4 4 4 4 $ $ $ $ $ $ ( ( ( ( ( ( ' ' ' ' ' ' " " " " " "            ( ( (V7 7 7 7 7F 7 7 7G	C G	C G	C G	C G	CY"I$5 G	C G	C G	CT     ' ' ' ' 'r.   