o
    8ήc                     @   s  d dl Z d dlZd dlZd dlmZ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mZmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZ e Z e j!Z"e j#Z$e j%Z&G dd	 d	e
Z'G d
d de'Z(e(j)Z*G dd de(Z+G dd de(Z,g dZ-g dZ.g dZ/g dZ0g dZ1dgZ2e3ddgZ4e3g dZ5ej6ej7kre58d dd Z9e:e-e.e/e0e1e2gg Z;dd e;D Z<e<D ]Z=e9e= qdd e;D Z;dd e<D Z<e,>  e(>  e+>  e3e,j)? @e(j)? @e+j)? ZA[-[.[/[0[1[4[5[9G d d! d!e
ZBd"d# ZCd$D ]Z=eCe= qe3d%d& ejDD ZEeE8ejF eE8ejG eE8ejH eE8ejI eE8ejJ d'd( ZKeKe$ d)d* ZLd+d, ZMd-d. ZNeejOG d/d0 d0eZPeejQG d1d2 d2eZReejSG d3d4 d4eZTeejUG d5d6 d6e
ZVd7d8 ZWeejXG d9d: d:e
ZYeejZG d;d< d<eZ[eej\G d=d> d>eZ]eej^G d?d@ d@eZ_eej`G dAdB dBeZaeejbG dCdD dDeZceejdG dEdF dFeZeG dGdH dHe
ZfeejgG dIdJ dJefZheejiG dKdL dLefZjeejkG dMdN dNefZldOdP ZmemfdQdRZndSdT ZoeejpG dUdV dVeZqeejrG dWdX dXeZsG dYdZ dZeZteejuG d[dX dXetZseejvG d\dX dXetZseejwG d]dX dXetZsd^d_ ZxeejyG d`da daeZzG dbdc dce{Z|eej}G ddde dee|eZ~eejG dfdg dgeZe$ejG dhdi die|e
Zdjdk Ze$ejG dldm dme
Ze$ejG dndo doe
Ze$ee$ejG dpdq dqe
ZeejeejG drds dse
ZeejG dtdu due
ZeejG dvdw dwe
ZeejG dxdy dyeZeejG dzd{ d{eZeejG d|d} d}e
ZeeG d~d deZeeG dd deZdS )    N)typesutilsconfig)AttributeTemplateAbstractTemplateCallableTemplateRegistry	signature)	ufunc_find_matching_loopsupported_ufunc_loopas_dtype
from_dtyper   resolve_output_typecarrayfarray_ufunc_loop_sig)TypingErrorNumbaPerformanceWarningNumbaTypeErrorNumbaAssertionError)pndindex)glue_typingc                   @   s,   e Zd Zedd Zedd Zdd ZdS )Numpy_rules_ufuncc                    s  |j }|j}|j}||| ksJ t||k r&d}t||jt||dt||kr;d}t||jt||ddd |D }dd |D }t| ||d }	t fdd	||d D smd
}t||jdtdd	 |	D sd}t||jdtdd	 |	D sd}t||jddd |D }
d} dkrt|	|jk rd}dd |D }d|vrd|v rd}|
|	 |fS )a  
        Process argument types to a given *ufunc*.
        Returns a (base types, explicit outputs, ndims, layout) tuple where:
        - `base types` is a tuple of scalar types for each input
        - `explicit outputs` is a tuple of explicit output types (arrays)
        - `ndims` is the number of dimensions of the loop and also of
          any outputs, explicit or implicit
        - `layout` is the layout for any implicit output to be allocated
        z;ufunc '{0}': not enough arguments ({1} found, {2} required)msgz8ufunc '{0}': too many arguments ({1} found, {2} maximum)c                 S   "   g | ]}t |tjr|jn|qS  )
isinstancer   ArrayCompatibleas_array.0ar   r   @/tmp/pip-target-vg8gfxp4/lib/python/numba/core/typing/npydecl.py
<listcomp>4       z4Numpy_rules_ufunc._handle_inputs.<locals>.<listcomp>c                 S   "   g | ]}t |tjr|jnd qS r   )r   r   r   ndimr    r   r   r#   r$   6   r%   Nc                 3   s    | ]}| kV  qd S Nr   )r!   dndimsr   r#   	<genexpr>>   s    z3Numpy_rules_ufunc._handle_inputs.<locals>.<genexpr>z:ufunc '{0}' called with unsuitable explicit output arrays.c                 s       | ]	}t |tjV  qd S r)   r   r   r   r!   outputr   r   r#   r-   B       z?ufunc '{0}' called with an explicit output that is not an arrayc                 s       | ]}|j V  qd S r)   )mutabler0   r   r   r#   r-   G       z<ufunc '{0}' called with an explicit output that is read-onlyc                 S   r   r   )r   r   r   dtyper!   xr   r   r#   r$   L   r%   r   Cc                 S   r&   ) )r   r   r   layoutr7   r   r   r#   r$   S   r%   F)	ninnoutnargslenr   format__name__maxall)clsufuncargskwsr=   r>   r?   r   	arg_ndimsexplicit_outputs
base_typesr;   layoutsr   r+   r#   _handle_inputs   sR   z Numpy_rules_ufunc._handle_inputsc                 C   s   | j S r)   keyselfr   r   r#   rF   ^   s   zNumpy_rules_ufunc.ufuncc                    s  dd  D  j }| |\}}t||}|d u r'td|j t||s9d}t||j|jddd |D }tdd t	|j
|D sXd	}t||jdt|}	|jt| }
|
d
kr|j|
 d  }d
kr׈d usyJ d } D ]}t|dr|} nq}tj|d ur|j|dg R i |tu rd| d| }t|ttjsd| d| d }t|fdd|D } fdd|D }|	| t|	 S )Nc                 S   r   r   )r   r   Optionaltyper7   r   r   r#   r$   d   s   " z-Numpy_rules_ufunc.generic.<locals>.<listcomp>z%can't resolve ufunc {0} for types {1}z;ufunc '{0}' using the loop '{1}' not supported in this moder   c                 S   s   g | ]}t |jqS r   )r   r6   )r!   tpr   r   r#   r$   s       c                 s   s"    | ]\}}t ||d V  qdS )unsafeN)npcan_cast)r!   fromtytotyr   r   r#   r-   v   s     z,Numpy_rules_ufunc.generic.<locals>.<genexpr>z5ufunc '{0}' can't cast result to explicit result typer   __array_ufunc____call__zunsupported use of ufunc z on zufunc zcannot return non-array c                    s   g | ]	}| d qS )r6   r(   r;   r   r!   ret_ty)r;   r,   output_typer   r#   r$          c                    s   g | ]	}t j |qS r   )r   contextr^   )rG   rQ   r   r#   r$      ra   )rF   rM   r
   r   rA   rB   r   	ufunc_sigrD   zipnumpy_outputslistr>   r@   outputshasattrr   Arrayr[   NotImplementedr   
issubclass	TypeErrorextendr   )rQ   rG   rH   rF   rK   rJ   
ufunc_loopr   explicit_outputs_npoutimplicit_output_countret_tysarray_ufunc_typer"   r   )rG   r;   r,   r`   rQ   r#   genericb   sd   





zNumpy_rules_ufunc.genericN)rB   
__module____qualname__classmethodrM   propertyrF   rt   r   r   r   r#   r      s    
C
r   c                       s   e Zd Zi ejdejdejdejdejdej	dej
dejdejd	ejd
ejdejdejdejdejdejdejdejdiZedd Zedd Z fddZ  ZS )NumpyRulesArrayOperatoraddsubtractmultiplytrue_dividefloor_divide	remainderpower
left_shiftright_shiftbitwise_and
bitwise_orbitwise_xorequalgreatergreater_equalless
less_equal	not_equalc                 C   s   t t| j| j S r)   )getattrrW   _op_maprO   rP   r   r   r#   rF      s   zNumpyRulesArrayOperator.ufuncc                 C   s8   | j  D ]\}}t|td| | ft|d qd S )NNumpyRulesArrayOperator_rN   )r   itemsinfer_globalrS   dict)rE   op
ufunc_namer   r   r#   install_operations   s
   z*NumpyRulesArrayOperator.install_operationsc                    sX   zt t| ||}W n
 ty   Y dS w |du rdS |j}tdd |D s*dS |S )ak  Overloads and calls base class generic() method, returning
        None if a TypingError occurred.

        Returning None for operators is important since operators are
        heavily overloaded, and by suppressing type errors, we allow
        type inference to check other possibilities before giving up
        (particularly user-defined operators).
        Nc                 s   r.   r)   r/   r!   argr   r   r#   r-      r2   z2NumpyRulesArrayOperator.generic.<locals>.<genexpr>)superry   rt   r   rG   any)rQ   rG   rH   sig	__class__r   r#   rt      s   	zNumpyRulesArrayOperator.generic)rB   ru   rv   operatorrz   submultruedivfloordivmodpowlshiftrshiftand_or_xoreqgtgeltlener   rx   rF   rw   r   rt   __classcell__r   r   r   r#   ry      sV    	


ry   c                       sh   e Zd Zejdejdejdejdejdej	dej
dejdejd	ejd
ejdejdiZ fddZ  ZS )NumpyRulesInplaceArrayOperatorrz   r{   r|   r}   r~   r   r   r   r   r   r   r   c                    sf   |\}}t |tjsd S ||f }tt| ||}t|jdks#J t|j	g|jd d R  }|S )N      )
r   r   r   r   r   rt   r@   rG   r	   return_type)rQ   rG   rH   lhsrhsr   real_sigr   r   r#   rt      s   
z&NumpyRulesInplaceArrayOperator.generic)rB   ru   rv   r   iaddisubimulitruediv	ifloordivimodipowilshiftirshiftiandiorixorr   rt   r   r   r   r   r#   r      s    r   c                       s2   e Zd ZejdejdejdiZ fddZ  Z	S )NumpyRulesUnaryArrayOperatorpositivenegativeinvertc                    s>   |rJ t |dkrt|d tjrtt| ||S d S d S N   r   )r@   r   r   r   r   r   rt   )rQ   rG   rH   r   r   r#   rt     s   z$NumpyRulesUnaryArrayOperator.generic)
rB   ru   rv   r   posnegr   r   rt   r   r   r   r   r#   r     s    r   )#rz   r{   r|   	logaddexp
logaddexp2r}   r~   r   r   r   float_powerr   fmodabsoluterintsign	conjugateexpexp2loglog2log10expm1log1psqrtsquarecbrt
reciprocaldivider   divmodabsfabsgcdlcm)sincostanarcsinarccosarctanarctan2hypotsinhcoshtanharcsinharccosharctanhdeg2radrad2degdegreesradians)r   r   r   r   r   r   bitwise_not)r   r   r   r   r   r   logical_and
logical_orlogical_xorlogical_notmaximumminimumfmaxfmin)isfiniteisinfisnansignbitcopysign	nextaftermodfldexpfrexpfloorceiltruncspacingisnatr  r  )r   r   r   r   c                    sJ   t t|  G  fdddt}d| |_| tvr#t t| d S d S )Nc                       s   e Zd Z ZdS )z"_numpy_ufunc.<locals>.typing_classN)rB   ru   rv   rO   r   funcr   r#   typing_classI  s    r  zresolve_{0})	r   rW   r   rA   rB   _aliasesr   r   Function)namer  r   r  r#   _numpy_ufuncG  s   
r  c                 C   s   g | ]}|t vr|qS r   )_unsupportedr7   r   r   r#   r$   U  s    r$   c                 C      g | ]}t t|qS r   r   rW   r!   r  r   r   r#   r$   Z  rU   c                 C   r  r   r  r  r   r   r#   r$   [  rU   c                   @   s   e Zd ZdZdZdd ZdS )Numpy_method_redirectionz
    A template redirecting a Numpy global function (e.g. np.sum) to an
    array method of the same name (e.g. ndarray.sum).
    Tc           
      C   s   d }|rY| j dkr?d|v rd|vrdd }t|}n>d|v r-d|vr-dd }t|}n,d|v r>d|v r>dd }t|}n| j dkrOdd
d}t|}n
d}t|| j |d }| j|| j }| j||dd  |}	|	d ur}|	 j	|dS d S )Nsumaxisr6   c                 S      d S r)   r   )arrr  r   r   r#   sum_stub     z2Numpy_method_redirection.generic.<locals>.sum_stubc                 S   r  r)   r   )r  r6   r   r   r#   r    r  c                 S   r  r)   r   )r  r  r6   r   r   r#   r    r  argsort	quicksortc                 S   r  r)   r   )r  kindr   r   r#   argsort_stub  r  z6Numpy_method_redirection.generic.<locals>.argsort_stubz"numba doesn't support kwarg for {}r   r   )pysig)r  )
method_namer   pysignaturer   rA   rb   resolve_getattrresolve_function_typeas_functionreplace)
rQ   rG   rH   r"  r  r!  fmtr  meth_tymeth_sigr   r   r#   rt   {  s0   



z Numpy_method_redirection.genericN)rB   ru   rv   __doc__prefer_literalrt   r   r   r   r#   r  q  s    r  c                 C   s:   t t| }td| tft|| d}t|t| d S )NzNumpy_redirect_{0})rO   r#  )	r   rW   rS   rA   r  r   r   r   r  )fnamenumpy_functionrE   r   r   r#   _numpy_redirect  s
   

r0  )minrC   r  prodmeanvarstdcumsumcumprodr  nonzeroravelc                 c   s    | ]
}t tt|V  qd S r)   )r   rW   str)r!   nb_typer   r   r#   r-     s    r-   c                 C   s*   t D ]}tt|j}| |t| qd S r)   )np_typesr   r   rB   NumberClass)register_globalnp_typer;  r   r   r#   register_number_classes  s   r@  c                    sX   d}t | tjrd}|S t | tjtjfr*tjtjf t fdd| D r*t| }|S )z9
    Given a shape, return the number of dimensions.
    Nr   c                 3   s    | ]}t | V  qd S r)   )r   )r!   sint_tysr   r#   r-         zparse_shape.<locals>.<genexpr>)r   r   IntegerTupleUniTupleIntEnumMemberrD   r@   )shaper(   r   rB  r#   parse_shape  s   rJ  c                 C   sr   t | tjr	| jS t | tjr| jS t | tjr7| j}z
t|}W t|S  t	y6   d| d}t
|w dS )z
    Return the dtype of a type, if it is either a DtypeSpec (used for most
    dtypes) or a TypeRef (used for record types).
    z Invalid NumPy dtype specified: ''N)r   r   	DTypeSpecr6   TypeRefinstance_typeStringLiteralliteral_valuerW   rl   r   r   )r6   dtstrdtr   r   r   r#   parse_dtype  s   rS  c                 C   s   t |tjfrtd| t |tjfr"t| |j\}}|d |fS t |tjfrv|jdkr3dtj	fS t| |d \}}|g}t
d|jD ]}t| || \}}||kr[td|f || qE| j| }|du rptd| |d |fS t| d|fS )z
    Parse a (possibly 0d) nested sequence type.
    A (ndim, dtype) tuple is returned.  Note the sequence may still be
    heterogeneous, as long as it converts to the given dtype.
    z(%r not allowed in a homogeneous sequencer   r   z%type %r does not have a regular shapeNz'cannot convert %r to a homogeneous type)r   r   Bufferr   Sequence_parse_nested_sequencer6   	BaseTuplecountfloat64rangeappendunify_typesr   )rb   typnr6   dtypesi_nr   r   r#   rV    s.   


rV  c                   @      e Zd ZdZdd ZdS )NpArrayz)
    Typing template for np.array().
    c                       d fdd	}|S )Nc                    s@   t  j| \}}|d u r|}n
t|}|d u rd S t||dS )Nr9   )rV  rb   rS  r   ri   )objectr6   r(   	seq_dtyperP   r   r#   typer	  s   zNpArray.generic.<locals>.typerr)   r   rQ   rg  r   rP   r#   rt     s   
zNpArray.genericNrB   ru   rv   r,  rt   r   r   r   r#   rc    s    rc  c                   @      e Zd Zdd ZdS )NdFullc                 C      ddd}|S )Nc                 S   sF   |d u r|}nt |}t| }|d ur|d ur!tj||ddS d S d S )Nr9   r]   )rS  rJ  r   ri   )rI  
fill_valuer6   nb_dtyper(   r   r   r#   rg    s   zNdFull.generic.<locals>.typerr)   r   rh  r   r   r#   rt        

zNdFull.genericNrB   ru   rv   rt   r   r   r   r#   rk        rk  c                   @   rj  )
NdFullLikec                 C      ddd}|S )z
        np.full_like(array, val) -> array of the same shape and layout
        np.full_like(scalar, val) -> 0-d array of the scalar type
        Nc                 S   s`   |d ur	t |}nt| tjr| j}n| }|d ur.t| tjr&| j|ddS tj|dddS d S )NF)r6   readonlyr   r9   r]   )rS  r   r   ri   r6   copy)r   rm  r6   rn  r   r   r#   rg  -  s   
z!NdFullLike.generic.<locals>.typerr)   r   rh  r   r   r#   rt   (  s   
zNdFullLike.genericNrp  r   r   r   r#   rr  %  rq  rr  c                   @   rj  )
NdIdentityc                 C   sl   |rJ |d }t |tjsd S t|dkrt|d }ntj}|d ur4tjd|dd}t|g|R  S d S )Nr   r   r   r9   r(   r6   r;   )r   r   rE  r@   rS  rY  ri   r	   )rQ   rG   rH   r^  rn  r   r   r   r#   rt   @  s   zNdIdentity.genericNrp  r   r   r   r#   rv  =  rq  rv  c                 C   s   t S r)   r6   )inputsr   r   r#   _infer_dtype_from_inputsO  r  rz  c                   @   rj  )
NdLinspacec                 C   s   |rJ |d d }t dd |D sd S t|dkr'|d }t|tjs'd S t|dkr/d S tdd |D r<tj}ntj}tjd|dd	}t	|g|R  S )
Nr   c                 s   r.   r)   )r   r   Numberr   r   r   r#   r-   Y      z%NdLinspace.generic.<locals>.<genexpr>r      c                 s   r.   r)   )r   r   Complexr   r   r   r#   r-   c  r}  r   r9   rw  )
rD   r@   r   r   rE  r   
complex128rY  ri   r	   )rQ   rG   rH   boundsnumr6   r   r   r   r#   rt   V  s   zNdLinspace.genericNrp  r   r   r   r#   r{  S  rq  r{  c                   @   rj  )NdFromBufferc                 C   rl  )Nc                 S   sT   t | tjr| jdkrd S |d u rtj}nt|}|d ur(tj|dd| j dS d S )Nr9   r   )r6   r(   r;   rt  )r   r   rT  r;   rY  rS  ri   r4   )bufferr6   rn  r   r   r#   rg  o  s   
z#NdFromBuffer.generic.<locals>.typerr)   r   rh  r   r   r#   rt   n  s   
zNdFromBuffer.genericNrp  r   r   r   r#   r  k  rq  r  c                   @   rj  )NdSortc                 C      dd }|S )Nc                 S   s   t | tjr| S d S r)   r   r   ri   r"   r   r   r#   rg    s   zNdSort.generic.<locals>.typerr   rh  r   r   r#   rt        zNdSort.genericNrp  r   r   r   r#   r  ~  rq  r  c                   @   rj  )AsFortranArrayc                 C   r  )Nc                 S   &   t | tjr| jdt| jddS d S )Nr<   r   r;   r(   r   r   ri   ru  rC   r(   r  r   r   r#   rg       z%AsFortranArray.generic.<locals>.typerr   rh  r   r   r#   rt     r  zAsFortranArray.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )AsContiguousArrayc                 C   r  )Nc                 S   r  )Nr9   r   r  r  r  r   r   r#   rg    r  z(AsContiguousArray.generic.<locals>.typerr   rh  r   r   r#   rt     r  zAsContiguousArray.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )NdCopyc                 C   r  )Nc                 S   s0   t | tjr| jdkrdnd}| j|ddS d S )Nr<   r9   F)r;   rt  )r   r   ri   r;   ru  )r"   r;   r   r   r#   rg    s   zNdCopy.generic.<locals>.typerr   rh  r   r   r#   rt     s   zNdCopy.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )NdExpandDimsc                 C   r  )Nc                 S   sD   t | tjrt |tjsd S | jdkr| jnd}| j| jd |dS )Nr   A)r(   r;   )r   r   ri   rE  r(   r;   ru  )r"   r  r;   r   r   r#   rg    s   
z#NdExpandDims.generic.<locals>.typerr   rh  r   r   r#   rt     s   zNdExpandDims.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )BaseAtLeastNdTemplatec                    sf   |rJ |rt dd |D sd S  fdd|D }t|dkr'tj|}n|d }t|g|R  S )Nc                 s   r.   r)   r  r    r   r   r#   r-     r}  z0BaseAtLeastNdTemplate.generic.<locals>.<genexpr>c                    s   g | ]}  |qS r   )convert_arrayr    rP   r   r#   r$     rU   z1BaseAtLeastNdTemplate.generic.<locals>.<listcomp>r   r   )rD   r@   r   rW  
from_typesr	   )rQ   rG   rH   retsrettyr   rP   r#   rt     s   zBaseAtLeastNdTemplate.genericNrp  r   r   r   r#   r        r  c                   @   rj  )NdAtLeast1dc                 C      |j t|jddS )Nr   r(   ru  rC   r(   rQ   r"   r   r   r#   r       zNdAtLeast1d.convert_arrayNrB   ru   rv   r  r   r   r   r#   r    rq  r  c                   @   rj  )NdAtLeast2dc                 C   r  )Nr   r  r  r  r   r   r#   r    r  zNdAtLeast2d.convert_arrayNr  r   r   r   r#   r    rq  r  c                   @   rj  )NdAtLeast3dc                 C   r  )Nr   r  r  r  r   r   r#   r    r  zNdAtLeast3d.convert_arrayNr  r   r   r   r#   r    rq  r  c                 C   s4   |d j }|D ]}|j |kr| d}t|q|S )Nr   z<(): all the input arrays must have same number of dimensions)r(   r   )rb   	func_namearraysr(   r"   r   r   r   r#   _homogeneous_dims  s   


r  c                 C   sr   t |tjrt|rtdd |D std||f || ||}| jdd |D  }|d u r5td| ||fS )Nc                 s   r.   r)   r  r    r   r   r#   r-     r}  z&_sequence_of_arrays.<locals>.<genexpr>z3%s(): expecting a non-empty tuple of arrays, got %sc                 s   r3   r)   rx  r    r   r   r#   r-     r5   z.%s(): input arrays must have compatible dtypes)r   r   rW  r@   rD   rl   r\  )rb   r  r  dim_chooserr(   r6   r   r   r#   _sequence_of_arrays  s   r  c                 C   s   t dd | D rdS dS )Nc                 s       | ]}|j d kV  qdS r<   Nr;   r    r   r   r#   r-     rD  z/_choose_concatenation_layout.<locals>.<genexpr>r<   r9   )rD   )r  r   r   r#   _choose_concatenation_layout  s   r  c                   @   rj  )NdConcatenatec                    rd  )Nc                    sP   |d urt |tjsd S t jd| \}}|dkrtdt| }t|||S )Nznp.concatenater   z.zero-dimensional arrays cannot be concatenated)r   r   rE  r  rb   rl   r  ri   r  r  r6   r(   r;   rP   r   r#   rg    s   z$NdConcatenate.generic.<locals>.typerr)   r   rh  r   rP   r#   rt     s   zNdConcatenate.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )NdStackc                    rd  )Nc                    sV   |d urt |tjsd S t jd| \}}tdd | D r dnd}t||d |S )Nznp.stackc                 s   r  r  r  r    r   r   r#   r-   '  rD  z1NdStack.generic.<locals>.typer.<locals>.<genexpr>r<   r9   r   )r   r   rE  r  rb   rD   ri   r  rP   r   r#   rg    s   zNdStack.generic.<locals>.typerr)   r   rh  r   rP   r#   rt     s   zNdStack.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )BaseStackTemplatec                        fdd}|S )Nc                    s6   t  j j| \}}t| j}t| }t|||S r)   )r  rb   r  rC   ndim_minr  r   ri   r  r6   r(   r;   rP   r   r#   rg  1  s   z(BaseStackTemplate.generic.<locals>.typerr   rh  r   rP   r#   rt   0     	zBaseStackTemplate.genericNrp  r   r   r   r#   r  .  r  r  c                   @      e Zd ZdZdZdS )r  z	np.hstackr   NrB   ru   rv   r  r  r   r   r   r#   r  =      c                   @   r  )r  z	np.vstackr   Nr  r   r   r   r#   r  B  r  c                   @   r  )r  z	np.dstackr   Nr  r   r   r   r#   r  G  r  c                 C   s*   |D ]}|j dk s|j dkrtdqdS )Nr   r   z7np.column_stack() is only defined on 1-d and 2-d arrays)r(   rl   )rb   r  r  r"   r   r   r#   _column_stack_dimsN  s
   r  c                   @   rj  )NdColumnStackc                    r  )Nc                    s,   t  jd| td\}}t| }t|||S )Nznp.column_stack)r  )r  rb   r  r  r   ri   r  rP   r   r#   rg  [  s   
z$NdColumnStack.generic.<locals>.typerr   rh  r   rP   r#   rt   Z  r  zNdColumnStack.genericNrp  r   r   r   r#   r  W  rq  r  c                   @   s   e Zd ZdddZdS )MatMulTyperMixinNc                    s  t  tjrt |tjsdS tdd  |fD s!td| jf t j|jg}|tdgkr3d}n|tddgkr>d}n	|tdgkrGd}|durq|dkrStd|j|kr\td	t |tjrg|j	d
krktd ||f}n |f}t
jstdd  |fD sd| j |ff }tt| t fdd|D std| jf t  jtjtjfstd| jf |r|S |dkrt j|d
S  jS )zA
        Typer function for Numpy matrix multiplication.
        Nc                 s       | ]}|j d v V  qdS ))r   r   Nr  r7   r   r   r#   r-   s  rD  z0MatMulTyperMixin.matmul_typer.<locals>.<genexpr>z'%s only supported on 1-D and 2-D arraysr   r   r   z/explicit output unsupported for vector * vectorz,explicit output has incorrect dimensionalityr9   z#output must be a C-contiguous arrayc                 s   r  CFNr  r7   r   r   r#   r-     rD  z/%s is faster on contiguous arrays, called on %sc                 3       | ]	}|j  j kV  qd S r)   rx  r7   r  r   r#   r-     r}  z)%s arguments must all have the same dtypez-%s only supported on float and complex arrays)r   r   ri   rD   r   r  setr(   rl   r;   r   DISABLE_PERFORMANCE_WARNINGSwarningswarnr   r6   Floatr  )rQ   r"   brp   r,   out_ndimall_argsr   r   r  r#   matmul_typerm  sT   
zMatMulTyperMixin.matmul_typerr)   )rB   ru   rv   r  r   r   r   r#   r  k  s    r  c                   @   rb  )Dotznp.dot()c                    rd  )Nc                    s     | ||S r)   )r  )r"   r  rp   rP   r   r#   rg    s   zDot.generic.<locals>.typerr)   r   rh  r   rP   r#   rt     s   zDot.genericN)rB   ru   rv   r  rt   r   r   r   r#   r        r  c                   @   rj  )VDotc                 C   r  )Nc                    s   t  tjrt |tjsd S tdd  |fD stdtdd  |fD s3td |ff t t fdd |fD sDtdt  jtj	tj
fsRtd jS )	Nc                 s   r  )r   Nr  r7   r   r   r#   r-     rD  z.VDot.generic.<locals>.typer.<locals>.<genexpr>z&np.vdot() only supported on 1-D arraysc                 s   r  r  r  r7   r   r   r#   r-     rD  z6np.vdot() is faster on contiguous arrays, called on %sc                 3   r  r)   rx  r7   r  r   r#   r-     r}  z0np.vdot() arguments must all have the same dtypez4np.vdot() only supported on float and complex arrays)r   r   ri   rD   r   r  r  r   r6   r  r  )r"   r  r   r  r#   rg    s   zVDot.generic.<locals>.typerr   rh  r   r   r#   rt     s   zVDot.genericNrp  r   r   r   r#   r    rq  r  c                   @   s   e Zd ZejZdZdd ZdS )MatMulz'@'c                 C   s.   |rJ | j | }|d urt|g|R  S d S r)   )r  r	   )rQ   rG   rH   restyper   r   r#   rt     s
   
zMatMul.genericN)rB   ru   rv   r   matmulrO   r  rt   r   r   r   r#   r    s    r  c                 C   sJ   t | tjsd S | jdkstd| t | jtjtjfs#td| d S )Nr   z+np.linalg.%s() only supported on 2-D arraysz9np.linalg.%s() only supported on float and complex arrays)r   r   ri   r(   r   r6   r  r  )r"   r  r   r   r#   _check_linalg_matrix  s   
r  c                   @   rj  )NdEnumeratec                 C   s8   |rJ |\}t |tjrt|}t|g|R  S d S r)   )r   r   ri   NumpyNdEnumerateTyper	   )rQ   rG   rH   r  enumerate_typer   r   r#   rt     s   
zNdEnumerate.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )NdIterc                 C   s\   |rJ t |dkrd S |\}t|tjr|sd S t|}n|g}t|}t|g|R  S )Nr   )r@   r   r   rW  rf   NumpyNdIterTyper	   )rQ   rG   rH   r  nditertyr   r   r#   rt     s   

zNdIter.genericNrp  r   r   r   r#   r    rq  r  c                   @   rj  )NdIndexc                 C   s   |rJ t |dkr(t|d tjr(|d }|jdkr#t|tjs#d S t|}n|}tdd |D rBtt |}t	|g|R  S d S )Nr   r   c                 s   r.   r)   )r   r   rE  r7   r   r   r#   r-     r}  z"NdIndex.generic.<locals>.<genexpr>)
r@   r   r   rW  rX  rG  rf   rD   NumpyNdIndexTyper	   )rQ   rG   rH   tuprI  iterator_typer   r   r#   rt     s   
zNdIndex.genericNrp  r   r   r   r#   r        r  c                   @   rj  )Roundc                 C   s   |rJ dt |  krdksJ  J |d }t |dkr$tj}d }n|d }t |dkr1d }n|d }tjtjtjf}t||rP|d u sHJ t|g|R  S t|tjrt|j	|rt|tjrt|j	|r|j
|j
krt|j	tjr|t|j	tjrt|g|R  S d S d S d S d S d S d S )Nr   r   r   r   )r@   r   intprE  r  r  r   r	   ri   r6   r(   )rQ   rG   rH   r   decimalsrp   supported_scalarsr   r   r#   rt     s6    



zRound.genericNrp  r   r   r   r#   r    r  r  c                   @   rj  )Wherec           
   
   C   s  |rJ t |dkr%|d }t|jd}tttjdd|}t||S t |dkr|\}}}tt	
tt|d d|d tt|d d|d }	t|tjrt|tjrt|tjr|j|j  krk|jkrn d S |j|j  kr{|jkrn n
t|	|j|j}nt|	|jd}t|g|R  S d S t|	|j|j}t|g|R  S t|tjst|	dd}t|g|R  S d S d S )Nr   r   r9   r   r6   r   )r@   rC   r(   r   rG  ri   r  r	   r   rW   promote_typesr   r   r   r;   )
rQ   rG   rH   aryr(   r  condr8   yretdtyr   r   r#   rt   8  s6   

 zWhere.genericNrp  r   r   r   r#   r  5  rq  r  c                   @   rj  )Sincc                 C   s`   |rJ t |dksJ |d }tjtjf}t||s't|tjr,t|j|r.t||S d S d S r   )r@   r   r  r  r   ri   r6   r	   )rQ   rG   rH   r   r  r   r   r#   rt   ^  s   



zSinc.genericNrp  r   r   r   r#   r  [  rq  r  c                   @   rb  )Anglez(
    Typing template for np.angle()
    c                 C   rs  )NFc                 S   s^   t | tjr
| j}n| }t |tjr|j}nt |tjr|}nd S t | tjr-| j|dS |S )Nrx  )r   r   ri   r6   r  underlying_floatr  ru  )zdegr6   	ret_dtyper   r   r#   rg  o  s   zAngle.generic.<locals>.typer)Fr   rh  r   r   r#   rt   n  s   
zAngle.genericNri  r   r   r   r#   r  i      r  c                   @   rb  )DiagCtorz'
    Typing template for np.diag()
    c                 C   rs  )Nr   c                 S   sZ   t | tjr)| jdkrd}n
| jdkrd}nd S t |ttjfr+tj|| jddS d S d S )Nr   r   r9   rw  )r   r   ri   r(   intrE  r6   )refkrdimr   r   r#   rg    s   

zDiagCtor.generic.<locals>.typerr'   r   rh  r   r   r#   rt     ro  zDiagCtor.genericNri  r   r   r   r#   r    r  r  c                   @   rj  )Takec                 C   s   |rt dt|dkrt d|\}}t|tjr|j}n6t|tjr/tj|j|jdd}n%t|tjr?tjd|jdd}nt|tj	rRtjt
||jdd}nd S t|g|R  S )Nzkws not supportedr   ztwo arguments are requiredr9   rw  r   )r   r@   r   r   r|  r6   ri   r(   ListrW  rW   r	   )rQ   rG   rH   r  indr  r   r   r#   rt     s   zTake.genericNrp  r   r   r   r#   r    rq  r  c                   @   rb  )NumbaCArrayr9   c                    s   j j d fdd	}|S )Nc                    s   | t ju rd }nt| t jr| j}ntd | f |d u r,|d u r)td f |}n#t|t jrG|j}|d urF||krFtd || f ntd |f t|}|d u r_td |f t ||j	S )Nz)%s(): pointer argument expected, got '%s'z0%s(): explicit dtype required for void* argumentz2%s(): mismatching dtype '%s' for pointer type '%s'z%s(): invalid dtype spec '%s'z%s(): invalid shape '%s')
r   voidptrr   CPointerr6   r   rL  rJ  ri   r;   )ptrrI  r6   	ptr_dtyper(   r  rQ   r   r#   rg    s:   
z"NumbaCArray.generic.<locals>.typerr)   )rO   rB   rh  r   r  r#   rt     s   zNumbaCArray.genericN)rB   ru   rv   r;   rt   r   r   r   r#   r    r  r  c                   @   s   e Zd ZdZdS )NumbaFArrayr<   N)rB   ru   rv   r;   r   r   r   r#   r    s    r  )r  numpyrW   r   
numba.corer   r   r   numba.core.typing.templatesr   r   r   r   r	   numba.np.numpy_supportr
   r   r   r   r   r   r   r   numba.core.errorsr   r   r   r   numbar   numba.core.overload_gluer   registryregisterinferr>  r   register_attrinfer_getattrr   ry   r   
_binop_mapr   r   _math_operations_trigonometric_functions_bit_twiddling_functions_comparison_functions_floating_functions_logic_functionsr  r  r  r   r}   rz   r  r  
all_ufuncssupported_ufuncsr  r   keysunionsupported_array_operatorsr  r0  number_domainr<  bool_intcr  uintcuintpr@  rJ  rS  rV  arrayrc  fullrk  	full_likerr  identityrv  rz  linspacer{  
frombufferr  sortr  asfortranarrayr  ascontiguousarrayr  ru  r  expand_dimsr  r  
atleast_1dr  
atleast_2dr  
atleast_3dr  r  r  r  concatenater  stackr  r  hstackvstackdstackr  column_stackr  re  r  dotr  vdotr  r  r  r  ndenumerater  nditerr  ndindexr  roundaroundr  wherer  sincr  angler  diagr  taker  r  r  r   r   r   r#   <module>   s4   , 9 	


,!




		6%'