o
    8ήc0n                     @   s   d Z ddlmZ ddlZddlZddlmZ ddlZddl	m
Z
mZ ddlmZmZ ddlmZ ddlmZ d	d
 Zdd Zdd ZG dd deZdd ZG dd de
ZG dd de
Zdd Zdd Zdd Zdd ZG dd  d eZG d!d" d"eZ G d#d$ d$eZ!G d%d& d&eZ"dS )'zA
Implements custom ufunc dispatch mechanism for non-CPU devices.
    )OrderedDictN)reduce)_BaseUFuncBuilderparse_identity)typessigutils)	signatureparse_signaturec                 C   s4   | |kr| S | dkr|S |dkr| S t d| |)=
    Raises
    ------
    ValueError if broadcast fails
       zfailed to broadcast {0} and {1})
ValueErrorformat)ab r   A/tmp/pip-target-vg8gfxp4/lib/python/numba/np/ufunc/deviceufunc.py_broadcast_axis   s   r   c                 C   sz   t t| |g\} }t| t|k rd|  } t| t|k st| t|kr1d| }t| t|ks%tdd t| |D S )r   r   c                 s   s    | ]
\}}t ||V  qd S N)r   ).0r   r   r   r   r   	<genexpr>0   s    z&_pairwise_broadcast.<locals>.<genexpr>)maptuplelenzip)shape1shape2r   r   r   _pairwise_broadcast"   s   r   c                  G   s`   | sJ | d }| dd }zt |ddD ]	\}}t||}qW |S  ty/   td|w )r   r   r   N)startz!failed to broadcast argument #{0})	enumerater   r   r   )	shapelistresultothersieachr   r   r   _multi_broadcast3   s   r&   c                   @   s   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zedd Zdd Zd d! Zd"d# Zd$d% ZdS )&UFuncMechanismz0
    Prepare ufunc arguments for vectorize.
    NFc                 C   s>   || _ || _t| j}dg| | _g | _d| _dg| | _dS )zFNever used directly by user. Invoke by UFuncMechanism.call().
        N)typemapargsr   argtypes	scalarposr   arrays)selfr(   r)   nargsr   r   r   __init__M   s   
zUFuncMechanism.__init__c                 C   sf   t | jD ]+\}}| |r| || j|< qt|tttt	j
fr(| j| qt	|| j|< qdS )z1
        Get all arguments in array form
        N)r    r)   is_device_arrayas_device_arrayr,   
isinstanceintfloatcomplexnpnumberr+   appendasarray)r-   r$   argr   r   r   _fill_arraysX   s   
zUFuncMechanism._fill_arraysc                 C   s2   t | jD ]\}}|durt|j| j|< qdS )z
        Get dtypes
        N)r    r,   r6   r9   dtyper*   )r-   r$   aryr   r   r   _fill_argtypese   s
   zUFuncMechanism._fill_argtypesc                 C   s   g }| j r9| jD ]0}g }tt|| jD ]\}\}}|du r't| j| j}|	||k qt
|r8|	| q|sWg }| jD ]}t
dd t|| jD }|rV|	| q@|s]tdt|dkrgtd|d | _dS )z<Resolve signature.
        May have ambiguous case.
        Nc                 s   s$    | ]\}}|d u p||kV  qd S r   r   )r   formalactualr   r   r   r      s    z4UFuncMechanism._resolve_signature.<locals>.<genexpr>zNo matching version.  GPU ufunc requires array arguments to have the exact types.  This behaves like regular ufunc with casting='no'.r   zqFailed to resolve ufunc due to ambiguous signature. Too many untyped scalars. Use numpy dtype object to type tag.r   )r+   r(   r    r   r*   r6   r9   r)   r<   r8   all	TypeErrorr   )r-   matches	formaltys	match_mapr$   r?   r@   all_matchesr   r   r   _resolve_signaturem   s6   




z!UFuncMechanism._resolve_signaturec                 C   s4   | j D ]}tj| j| g| j| d| j|< q| jS )zPReturn the actual arguments
        Casts scalar arguments to np.array.
        r<   )r+   r6   arrayr)   r*   r,   )r-   r$   r   r   r   _get_actual_args   s   
$zUFuncMechanism._get_actual_argsc           	         s   dd |D }t | t|D ]S\}  jkrq|  r'|  ||< q fddttD }tt j }dg| t j }|D ]}d||< qJt	j
jj |d}| |||< q|S )z)Perform numpy ufunc broadcasting
        c                 S      g | ]}|j qS r   shaper   r   r   r   r   
<listcomp>       z-UFuncMechanism._broadcast.<locals>.<listcomp>c                    s,   g | ]}| j ks j| | kr|qS r   )ndimrM   )r   axr=   rM   r   r   rO      s
    
r   )rM   strides)r&   r    rM   r0   broadcast_deviceranger   listrT   r6   libstride_tricks
as_stridedforce_array_layout)	r-   arysr!   r$   
ax_differs
missingdimrT   rR   stridedr   rS   r   
_broadcast   s$   



zUFuncMechanism._broadcastc                 C   s*   |    |   |   |  }| |S )z[Prepare and return the arguments for the ufunc.
        Does not call to_device().
        )r;   r>   rG   rJ   r`   )r-   r\   r   r   r   get_arguments   s
   
zUFuncMechanism.get_argumentsc                 C   s   | j | j S )z)Returns (result_dtype, function)
        )r(   r*   r-   r   r   r   get_function   s   zUFuncMechanism.get_functionc                 C   s   dS )zBIs the `obj` a device array?
        Override in subclass
        Fr   r-   objr   r   r   r0         zUFuncMechanism.is_device_arrayc                 C      |S )zConvert the `obj` to a device array
        Override in subclass

        Default implementation is an identity function
        r   rd   r   r   r   r1      s   zUFuncMechanism.as_device_arrayc                 C      t d)zTHandles ondevice broadcasting

        Override in subclass to add support.
        z'broadcasting on device is not supportedNotImplementedErrorr-   r=   rM   r   r   r   rU      s   zUFuncMechanism.broadcast_devicec                 C   rg   )zSEnsures array layout met device requirement.

        Override in sublcass
        r   )r-   r=   r   r   r   r[      s   z!UFuncMechanism.force_array_layoutc                    s  | d| j| dd}|rtdd|  | || } \}}|d j}|dur;|r;	|}fdd |d j
d	krR fd
d|D }g }d}	|D ]}
|
rg||
 d}	qXj|
d}|| qX|d j}|du rj||d}||g ||d | |	r||S | |S |r|j
d	kr |}|}||g ||d | ||S |j|ksJ |j|ksJ j||d}||g ||d | |j|d|S )z1Perform the entire ufunc call mechanism.
        streamoutNzunrecognized keywords: %s, r   c                    sP    j rtz|  W S  ty'    | s  |  } | Y S w r   )SUPPORT_DEVICE_SLICINGrj   ravelr0   to_host	to_device)r   hostary)crrl   r   r   attempt_ravel  s   

z*UFuncMechanism.call.<locals>.attempt_ravelr   c                    s   g | ]} |qS r   r   rN   )ru   r   r   rO         z'UFuncMechanism.call.<locals>.<listcomp>FT)rl   )popDEFAULT_STREAMwarningswarnjoinra   rc   rM   r0   r1   rQ   r8   rr   device_arrayextendlaunchreshapecopy_to_hostr<   )clsr(   r)   kwsrm   restyfuncoutshapedevarys
any_devicer   dev_arM   devoutr   )ru   rt   rl   r   call   sT   









zUFuncMechanism.callc                 C      t )zBImplement to device transfer
        Override in subclass
        ri   )r-   rs   rl   r   r   r   rr   G  rf   zUFuncMechanism.to_devicec                 C   r   )z@Implement to host transfer
        Override in subclass
        ri   )r-   devaryrl   r   r   r   rq   M  rf   zUFuncMechanism.to_hostc                 C   r   )zBImplements device allocation
        Override in subclass
        ri   )r-   rM   r<   rl   r   r   r   r|   S  rf   zUFuncMechanism.device_arrayc                 C   r   )zKImplements device function invocation
        Override in subclass
        ri   )r-   r   countrl   r)   r   r   r   r~   Y  rf   zUFuncMechanism.launch)__name__
__module____qualname____doc__rx   ro   r/   r;   r>   rG   rJ   r`   ra   rc   r0   r1   rU   r[   classmethodr   rr   rq   r|   r~   r   r   r   r   r'   F   s,    +	!

Yr'   c                 C   s    t | tjr	| j} tt| S r   )r2   r   
EnumMemberr<   r6   str)tyr   r   r   to_dtype`  s   r   c                   @   sZ   e Zd Zddi fddZedd ZdddZd	d
 Zdd Zdd Z	dd Z
dd ZdS )DeviceVectorizeNFc                 C   s^   |rt d|D ]}|dkrtdt qd}|d7 }t|| || _t|| _t | _	d S )Ncaching is not supportednopythonz+nopython kwarg for cuda target is redundantzUnrecognized options. z3cuda vectorize target does not support option: '%s')
rB   ry   rz   RuntimeWarningKeyErrorpy_funcr   identityr   	kernelmap)r-   r   r   cachetargetoptionsoptfmtr   r   r   r/   g  s   
zDeviceVectorize.__init__c                 C      | j S r   r   rb   r   r   r   pyfuncw     zDeviceVectorize.pyfuncc                 C   s
  |d urt dt |d u sJ |d u rt|}n|| }~~t|\}}t|g|R  }| jj}| 	| j
||}| |\}	}| |	}
ttjgdd |D |d d  g R  }t||
 |
d|  }| ||}tdd |jD }t|}||f| jt|< d S )N'Keyword argument argtypes is deprecatedc                 S   s   g | ]}|d d  qS r   r   rN   r   r   r   rO     s    z'DeviceVectorize.add.<locals>.<listcomp>z__vectorized_%sc                 s   s    | ]}t |V  qd S r   )r   r   tr   r   r   r         z&DeviceVectorize.add.<locals>.<genexpr>)ry   rz   DeprecationWarningr   r   normalize_signaturer   r   r   _get_kernel_source_kernel_template_compile_core_get_globalsr   voidexec_compile_kernelr)   r   r   )r-   sigr*   restyper)   return_typedevfnsigfuncnamekernelsourcecorefnglblstagerkernel	argdtypesresdtyper   r   r   add{  s2   

*
zDeviceVectorize.addc                 C   r   r   ri   rb   r   r   r   build_ufunc     zDeviceVectorize.build_ufuncc                 C   sL   dd t t|jD }t|d|ddd |D d}|jdi |S )Nc                 S   s   g | ]}d | qS )za%dr   r   r$   r   r   r   rO     rv   z6DeviceVectorize._get_kernel_source.<locals>.<listcomp>rn   c                 s   s    | ]}d | V  qdS )z%s[__tid__]Nr   r   r   r   r   r     r   z5DeviceVectorize._get_kernel_source.<locals>.<genexpr>)namer)   argitemsr   )rV   r   r)   dictr{   r   )r-   templater   r   r)   fmtsr   r   r   r     s   z"DeviceVectorize._get_kernel_sourcec                 C   r   r   ri   r-   r   r   r   r   r     r   zDeviceVectorize._compile_corec                 C   r   r   ri   )r-   r   r   r   r   r     r   zDeviceVectorize._get_globalsc                 C   r   r   ri   r-   fnobjr   r   r   r   r     r   zDeviceVectorize._compile_kernelNNN)r   r   r   r/   propertyr   r   r   r   r   r   r   r   r   r   r   r   f  s    

 r   c                   @   sB   e Zd Zddi fddZedd ZdddZd	d
 Zdd ZdS )DeviceGUFuncVectorizeNFc                 C   s   |rt d|ddst d|r'ddd | D }d}t |||| _t|| _|| _t	| j\| _
| _t| jd	ksFJ d
t | _d S )Nr   r   Tznopython flag must be Truern   c                 S      g | ]}t |qS r   )reprr   kr   r   r   rO     rv   z2DeviceGUFuncVectorize.__init__.<locals>.<listcomp>z3The following target options are not supported: {0}r   zonly support 1 output)rB   rw   r{   keysr   r   r   r   r   r
   inputsig	outputsigr   r   r   )r-   r   r   r   r   r   optsr   r   r   r   r/     s   
zDeviceGUFuncVectorize.__init__c                 C   r   r   r   rb   r   r   r   r     r   zDeviceGUFuncVectorize.pyfuncc                 C   s  |d urt dt |d u sJ |d u rt|}n|| }~~dd | jD }dd | jD }t|\}}| jj	}t
| j||||}	| |}
t|	|
 |
dj|d }tt||| }| j|t|d}tdd	 |D }|d
 |f| jt|d d
 < d S )Nr   c                 S   r   r   r   r   xr   r   r   rO     rv   z-DeviceGUFuncVectorize.add.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   rO     rv   z__gufunc_{name})r   )r   c                 s   s     | ]}t t|jV  qd S r   )r6   r<   r   r   r   r   r   r     s    z,DeviceGUFuncVectorize.add.<locals>.<genexpr>)ry   rz   r   r   r   r   r   r   r   r   expand_gufunc_templater   r   r   r   rW   _determine_gufunc_outer_typesr   r   )r-   r   r*   r   indimsoutdimsr)   r   r   srcglblsr   outertysr   dtypesr   r   r   r     s0   


"zDeviceGUFuncVectorize.addc                 C   r   r   ri   r   r   r   r   r     r   z%DeviceGUFuncVectorize._compile_kernelc                 C   r   r   ri   r   r   r   r   r     r   z"DeviceGUFuncVectorize._get_globalsr   )	r   r   r   r/   r   r   r   r   r   r   r   r   r   r     s    

 r   c                 c   s\    t | |D ]%\}}t|tjr|j|d dV  q|dkr"tdtj|dddV  qd S )Nr   )rQ   r   z,gufunc signature mismatch: ndim>0 for scalarA)r<   rQ   layout)r   r2   r   Arraycopyr   )argtysdimsatndr   r   r   r     s   r   c                 C   s   || }dd t t|D }dddd |D }dd t|||D }dd t|t|d ||t|d D }	||	 }
| j|d||d|
d	}|S )
z"Expand gufunc source template
    c                 S      g | ]}d  |qS )zarg{0}r   r   r   r   r   rO         z*expand_gufunc_template.<locals>.<listcomp>zmin({0})rn   c                 S   r   )z{0}.shape[0]r   rN   r   r   r   rO     s    c                 S      g | ]\}}}t |||qS r   _gen_src_for_indexingr   arefadimsatyper   r   r   rO          c                 S   r   r   r   r   r   r   r   rO     r   N)r   r)   
checkedargr   )rV   r   r   r{   r   )r   r   r   r   r*   argdimsargnamesr   inputsoutputsr   r   r   r   r   r     s&   

r   c                 C   s   dj | t||dS )Nz{aref}[{sliced}])r   sliced)r   _gen_src_index)r   r   r   r   r   r   r     s   r   c                 C   s@   | dkrd dgdg|   S t|tjr|jd | krdS dS )Nr   ,__tid__:r   z__tid__:(__tid__ + 1))r{   r2   r   r   rQ   )r   r   r   r   r   r     s
   r   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	GUFuncEnginezZDetermine how to broadcast and execute a gufunc
    base on input shape and signature
    c                 C   s   | t | S r   r	   )r   r   r   r   r   from_signature"  s   zGUFuncEngine.from_signaturec                 C   s(   || _ || _t| j | _t| j| _d S r   )sinsoutr   ninnout)r-   r   r   r   r   r   r/   &  s   zGUFuncEngine.__init__c                 C   s  t || jkrtdi }g }g }tt|| jD ]h\}\}}|d7 }t |}t ||k r6d}	t|	|f |rG|| d  }
|d |  }nd}
|}tt|
|D ]$\}\}}|t |7 }||v rr|| |krrd}	t|	||f |||< qR|| ||
 qg }| jD ]}g }|D ]	}|||  q|t	| qdd |D }t
|}|| }dg| j }t|D ] \}}||kr|d	ks|dkrd
||< qd}	t|	|d f qt| ||||S )Nz invalid number of input argumentr   z%arg #%d: insufficient inner dimensionr   z$arg #%d: shape[%d] mismatch argumentc                 S   s   g | ]	}t tj|d qS r   )r   operatormulr   sr   r   r   rO   X      z)GUFuncEngine.schedule.<locals>.<listcomp>Fr   Tz!arg #%d: outer dimension mismatch)r   r  rB   r    r   r  r   r8   r  r   r6   argmaxGUFuncSchedule)r-   ishapes	symbolmapouter_shapesinner_shapesargnrM   symbols
inner_ndimr   inner_shapeouter_shapeaxisdimsymoshapesoutsigoshapesizes	largest_iloopdimspinnedr$   dr   r   r   schedule.  sV   




zGUFuncEngine.scheduleN)r   r   r   r   r   r  r/   r!  r   r   r   r   r     s    
r   c                   @   s   e Zd Zdd Zdd ZdS )r  c                    sF   || _ || _|| _ | _ttj d| _|| _ fdd|D | _	d S )Nr   c                    s   g | ]} | qS r   r   r  r  r   r   rO   t  rv   z+GUFuncSchedule.__init__.<locals>.<listcomp>)
parentr  r  r  r   r  r  loopnr  output_shapes)r-   r#  r  r  r  r  r   r"  r   r/   i  s   zGUFuncSchedule.__init__c                    s,   dd l }d} fdd|D }|t|S )Nr   )r  r  r  r$  r  c                    s   g | ]	}|t  |fqS r   )getattrr   rb   r   r   rO   z  r
  z*GUFuncSchedule.__str__.<locals>.<listcomp>)pprintpformatr   )r-   r'  attrsvaluesr   rb   r   __str__v  s   zGUFuncSchedule.__str__N)r   r   r   r/   r+  r   r   r   r   r  h  s    r  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )GenerializedUFuncc                 C   s*   || _ || _d| _| jjdksJ dd S )Ni   @r   zonly support single output)r   enginemax_blocksizer  )r-   r   r-  r   r   r   r/     s   zGenerializedUFunc.__init__c           
      O   s   |  | jj| jj||}|  | |j|j\}}}}|| |	|| |
  | ||j|j\}}	|||j||	g  | S r   )_call_stepsr-  r  r  prepare_inputs	_schedulenorm_inputsoutputadjust_input_typesallocate_outputsprepare_kernel_parametersr`   kernel_parameterskernel_returnvaluelaunch_kernelr$  post_process_result)
r-   r)   r   	callstepsindtypesr!  outdtyper   	newparams	newretvalr   r   r   __call__  s    
zGenerializedUFunc.__call__c                 C   s   dd |D }| j |}tdd |D }z	| j| \}}W n ty4   | |}| j| \}}Y nw |d urE|jd |jkrEtd||||fS )Nc                 S   rK   r   rL   rN   r   r   r   rO     rP   z/GenerializedUFunc._schedule.<locals>.<listcomp>c                 s   s    | ]}|j V  qd S r   rH   r   r   r   r   r     s    z.GenerializedUFunc._schedule.<locals>.<genexpr>r   zoutput shape mismatch)	r-  r!  r   r   r   _search_matching_signaturer%  rM   r   )r-   r   rm   input_shapesr!  idtypesr=  r   r   r   r   r1    s   
	zGenerializedUFunc._schedulec                 C   s8   | j  D ]}tdd t||D r|  S qtd)z
        Given the input types in `idtypes`, return a compatible sequence of
        types that is defined in `kernelmap`.

        Note: Ordering is guaranteed by `kernelmap` being a OrderedDict
        c                 s   s     | ]\}}t ||V  qd S r   )r6   can_cast)r   r@   desiredr   r   r   r     s    z?GenerializedUFunc._search_matching_signature.<locals>.<genexpr>zno matching signature)r   r   rA   r   rB   )r-   rC  r   r   r   r   rA    s   z,GenerializedUFunc._search_matching_signaturec           
      C   s   |j dks	J d|jsdn|j }g }t||jD ]!\}}|s0|jdkr0| ||}|| q|| ||| q|j|g|j	d R  }	||	fS )Nr   zzero looping dimensionr   )
r$  r  r   r  size_broadcast_scalar_inputr8   _broadcast_arrayr   r  )
r-   r!  paramsretvalodimr>  pcsr   r?  r   r   r   r`     s   zGenerializedUFunc._broadcastc                 C   sb   |f| }|j |kr|S t|j t|k r,|t|j  d  |j ks&J d| ||S |j| S )Nz+cannot add dim and reshape at the same time)rM   r   _broadcast_add_axisr   )r-   r=   newdiminnerdimnewshaper   r   r   rH    s   


z"GenerializedUFunc._broadcast_arrayc                 C   rh   )Nzcannot add new axisri   )r-   r=   rQ  r   r   r   rN    s   z%GenerializedUFunc._broadcast_add_axisc                 C   r   r   ri   rk   r   r   r   rG    r   z)GenerializedUFunc._broadcast_scalar_inputN)r   r   r   r/   r@  r1  rA  r`   rH  rN  rG  r   r   r   r   r,  ~  s    r,  c                   @   sl   e Zd Zg dZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )GUFuncCallSteps)r)   kwargsr3  r2  r8  r7  _is_device_array_need_device_conversionc           
         s  |dkrt d| _| _d} jd _ jd ur+  j}|r+  j _ fdd jD  _t j o>|  _	g }t
 j jD ]\}}|rX| | qI|t| qI|d |  _||d  }	|	r jd uryt d|	\ _d S d S )Nr   z multiple output is not supportedFrm   c                    s   g | ]}  |qS r   r0   rN   rb   r   r   rO     r   z,GUFuncCallSteps.__init__.<locals>.<listcomp>z>cannot specify 'out' as both a positional and keyword argument)r   r)   rS  getr3  r0   r1   rT  anyrU  r   r8   r6   r9   r2  )
r-   r  r  r)   rS  user_output_is_devicer   r   isdevunused_inputsr   rb   r   r/     s4   

zGUFuncCallSteps.__init__c                 C   s\   t t|| jD ]#\}\}}||jkr+t|ds#dt|}t|||| j|< qdS )z
        Attempt to cast the inputs to the required types if necessary
        and if they are not device array.

        Side effect: Only affects the element of `norm_inputs` that requires
        a type cast.
        astypezNcompatible signature is possible by casting but {0} does not support .astype()N)	r    r   r2  r<   hasattrr   typerB   r\  )r-   r<  r$   ityvalmsgr   r   r   r4    s   


z"GUFuncCallSteps.adjust_input_typesc                 C   s6   | j s| jd u r| j|jd |d}n| j}|| _d S )Nr   )rM   r<   )rU  r3  r|   r%  r8  )r-   r!  r=  rJ  r   r   r   r5    s   
z GUFuncCallSteps.allocate_outputsc                    s`   g }t  j jD ]\}}|r|| q	| | q	t fdd|D s+J | _d S )Nc                 3   s    | ]}  |V  qd S r   rV  rN   rb   r   r   r   -  s    z<GUFuncCallSteps.prepare_kernel_parameters.<locals>.<genexpr>)r   r2  rT  r8   rr   rA   r7  )r-   rI  inprZ  r   rb   r   r6  &  s   
z)GUFuncCallSteps.prepare_kernel_parametersc                 C   s8   | j r| | j| j}|S | jd u r| j}|S | j}|S r   )rU  rq   r8  r3  )r-   rm   r   r   r   r:  0  s   
z#GUFuncCallSteps.post_process_resultc                 C   s   d S r   r   rb   r   r   r   r0  9  r   zGUFuncCallSteps.prepare_inputsc                 C   r   r   ri   )r-   r   nelemr)   r   r   r   r9  <  r   zGUFuncCallSteps.launch_kernelc                 C   r   r   ri   rd   r   r   r   r0   ?  r   zGUFuncCallSteps.is_device_arrayc                 C   rg   r   r   rd   r   r   r   r1   B  r   zGUFuncCallSteps.as_device_arrayc                 C   r   r   ri   )r-   rs   r   r   r   rr   E  r   zGUFuncCallSteps.to_devicec                 C   r   r   ri   )r-   rM   r<   r   r   r   r|   H  r   zGUFuncCallSteps.device_arrayN)r   r   r   	__slots__r/   r4  r5  r6  r:  r0  r9  r0   r1   rr   r|   r   r   r   r   rR    s    !	
	rR  )#r   collectionsr   r  ry   	functoolsr   numpyr6   numba.np.ufunc.ufuncbuilderr   r   
numba.corer   r   numba.core.typingr   numba.np.ufunc.sigparser
   r   r   r&   objectr'   r   r   r   r   r   r   r   r   r  r,  rR  r   r   r   r   <module>   s6      I@
Ka