o
    8ήcAv                     @   s  d dl Zd dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZ eddZd	d
 ZeejG dd de
ZeejG dd de
Zdd ZeG dd de	Z eG dd de	Z!eG dd de
Z"eG dd de	Z#eG dd de
Z$eejG dd de
Z%eG dd de
Z&eejG dd  d e
Z'eG d!d" d"e	Z(eG d#d$ d$e	Z)eG d%d& d&e Z*d'd( Z+d)d* Z,d+d, Z-d-d. Z.d/d0 Z/d1d2 Z0d3d4 Z1d5d6 Z2dCd8d9Z3d:D ]Z4e3e4e, qe3d;e- e3d<e.d7d= d>D ]Z4e3e4e/ qd?D ]Z5e3e5e0 q$d@D ]Z5e3e5e1 q/eej6G dAdB dBe
Z7dS )D    N)
namedtuple)typesutils)AttributeTemplateAbstractTemplateinferinfer_globalinfer_getattr	signaturebound_function)collections)TypingErrorRequireLiteralValueNumbaTypeErrorNumbaNotImplementedErrorNumbaAssertionErrorNumbaKeyErrorNumbaIndexErrorIndexing)indexresultadvancedc                    s  t | tjsdS | j}g }g }d}d}d}t |tjs|g}|D ]|}|tju r3|r0td|f d}n`t |tjr:nYt |tjrP|j	rFtj
ntj}|d8 }d}nCt |tjri|jdkrit |jtjri|d8 }d}n*t |tjr|jdkrt |jtjtjfr|s|rd}	t|	d}ntd||f |r|n|| q |rt | tjsdS || }
|r|d tju sJ |d= t|
| }|| jkrtd	| ||f || jkr|dkr|s| j}no|r| j|d
dd}nd| jrdS | j}dd   fdd}|d
kr|| jkr
|| }g }|rd}n+||sd}n#|dkr;|| jkr)|| }g }|r/d}n||ddd s;d}|dkrD| j}n| j||d}t |tjrYtj|
}n|
\}t|||S )z
    Returns None or a tuple-3 for the types of the input array, index, and
    resulting type of ``array[index]``.

    Note: This is shared logic for ndarray getitem and setitem.
    NFz1only one ellipsis allowed in array index (got %s)T   r   z!only one advanced index supportedz%unsupported array index type %s in %sz#cannot index %s with %d indices: %sC)ndimlayoutreadonlyc                 S   s.   | t ju pt| t jp|ot| t jo| j S N)r   ellipsis
isinstanceInteger	SliceTypehas_step)tyis_innermost r%   B/tmp/pip-target-vg8gfxp4/lib/python/numba/core/typing/arraydecl.pykeeps_contiguitym   s   z.get_array_index_type.<locals>.keeps_contiguityc                    s<   | dd D ]
} |ds dS q| r | d dsdS dS )z
            Whether indexing with the given indices (from outer to inner in
            physical layout order) can keep an array contiguous.
            NFTr%   )outer_indicesr#   r'   r%   r&   check_contiguityt   s   
z.get_array_index_type.<locals>.check_contiguityAFr(   r   r   )r   r   Bufferr   	BaseTupler   r   r!   r    signedintpuintpArraydtypeBooleanr   appendlencopyslice_is_copyr   
from_typesr   )aryidxr   left_indicesright_indicesellipsis_metr   has_integerr#   msgall_indices	n_indicesresr   r+   r%   r*   r&   get_array_index_type   s   





rF   c                   @      e Zd Zdd ZdS )GetItemBufferc                 C   s6   |rJ |\}}t ||}|d urt|j||jS d S r   )rF   r
   r   r   )selfargskwsr<   r=   outr%   r%   r&   generic   s   
zGetItemBuffer.genericN__name__
__module____qualname__rM   r%   r%   r%   r&   rH          rH   c                   @   rG   )SetItemBufferc           
      C   sf  |rJ |\}}}t |tjsd S |jsd| }t|t||}|d u r(d S |j}|j}t |tjrot |tjrH| j	
|j|jsEd S |}nct |tjra|jdkr_| j	
|j|jr_|}nLd S | j	
||jrm|j}n>d S t |tjs| j	
||s| s|j|d}	ttj|	||S d S |}nt |tjr|jdkr| j	
|j|r|}nd S ttj|||S )Nz&Cannot modify readonly array of type: r   r5   r   )r   r   r/   mutabler   rF   r   r   r4   contextcan_convertr5   Sequencer   
is_preciser9   r
   none)
rI   rJ   rK   r<   r=   valrB   rL   rE   newaryr%   r%   r&   rM      sN   



zSetItemBuffer.genericNrN   r%   r%   r%   r&   rS      rR   rS   c                 C   sn   t | tjr!t | jtjr| jjrtjntj}t|t| S d S t | tj	r3| j
dkr5ttjdS d S d S )Nr   )r   r   UniTupler5   r    r1   r2   r3   r8   Tuplecount)shapedimtyper%   r%   r&   normalize_shape   s   rb   c                   @   sR  e Zd Zej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dd Zeddd Zeddd  Zed!d"d# Zed$d%d& Zed'd(d) Zed*d+d, Zed-d.d/ Zed0d1d2 Zed3d4d5 Zed6d7d8 Zed9d:d; Zed<d=d> Zed?d@dA Z dBdC Z!dDS )EArrayAttributec                 C      t |jS r   )r   DTyper5   rI   r<   r%   r%   r&   resolve_dtype      zArrayAttribute.resolve_dtypec                 C      t jS r   r   r2   rf   r%   r%   r&   resolve_itemsize      zArrayAttribute.resolve_itemsizec                 C      t t j|jS r   r   r]   r2   r   rf   r%   r%   r&   resolve_shape      zArrayAttribute.resolve_shapec                 C   rm   r   rn   rf   r%   r%   r&   resolve_strides  rp   zArrayAttribute.resolve_stridesc                 C   ri   r   rj   rf   r%   r%   r&   resolve_ndim  rl   zArrayAttribute.resolve_ndimc                 C   ri   r   rj   rf   r%   r%   r&   resolve_size  rl   zArrayAttribute.resolve_sizec                 C   
   t |S r   )r   NumpyFlatTyperf   r%   r%   r&   resolve_flat
     
zArrayAttribute.resolve_flatc                 C   rt   r   )r   ArrayCTypesrf   r%   r%   r&   resolve_ctypes  rw   zArrayAttribute.resolve_ctypesc                 C   rt   r   )r   
ArrayFlagsrf   r%   r%   r&   resolve_flags  rw   zArrayAttribute.resolve_flagsc                 C   s6   |j dkr	|}|S ddd|jd}|j|d}|S )Nr   r-   r   )r   r-   r,   r   )r   getr   r9   )rI   r<   rettyr   r%   r%   r&   	resolve_T  s   
zArrayAttribute.resolve_Tc                 C      | j |ddS )Nrealattr_resolve_real_imagrf   r%   r%   r&   resolve_real     zArrayAttribute.resolve_realc                 C   r   )Nimagr   r   rf   r%   r%   r&   resolve_imag  r   zArrayAttribute.resolve_imagc                 C   sf   |j tjv r|j|j jddS |j tjv r(|j|j d}|dkr&|jdd}|S d}t|||j )Nr,   r5   r   rT   r   T)r   z cannot access .{} of array of {})r5   r   complex_domainr9   underlying_floatnumber_domainr   format)rI   r<   r   rE   rB   r%   r%   r&   r   !  s   z!ArrayAttribute._resolve_real_imagzarray.transposec                    s  dd  |rJ t |dkrt| |S t |dkr\|\} |r1|jdks)J t|g|R  S t|tjr>t| |S t|}|d u rHd S |j|jksPJ t| |j	dd|S t
 fdd|D rqtd	d
||jt |kszJ t| |j	ddg|R  S )Nc                 S   ,   | t jv rt| t jstd| dS dS )Nztranspose() arg cannot be {0}TFr   r   r   r    	TypeErrorr   r#   r%   r%   r&   sentry_shape_scalar/  
   
z=ArrayAttribute.resolve_transpose.<locals>.sentry_shape_scalarr   r   r,   r|   c                 3       | ]} | V  qd S r   r%   .0ar   r%   r&   	<genexpr>N      z3ArrayAttribute.resolve_transpose.<locals>.<genexpr>ztranspose({0}) is not supported, )r8   r
   r   r   r   r   NoneTyperb   r_   r9   anyr   r   join)rI   r<   rJ   rK   r`   r%   r   r&   resolve_transpose-  s,   	z ArrayAttribute.resolve_transposez
array.copyc                 C   s&   |rJ |rJ |j ddd}t|S )Nr   F)r   r   )r9   r
   )rI   r<   rJ   rK   r~   r%   r%   r&   resolve_copyT  s   zArrayAttribute.resolve_copyz
array.itemc                 C   s   |rJ |st |jS d S r   )r
   r5   rI   r<   rJ   rK   r%   r%   r&   resolve_item[  s   
zArrayAttribute.resolve_itemzarray.itemsetc                 C   s&   |rJ t |dkrttj|jS d S )Nr   )r8   r
   r   rZ   r5   r   r%   r%   r&   resolve_itemsetd  s   zArrayAttribute.resolve_itemsetzarray.nonzeroc                 C   s<   |rJ |rJ t |jd}tttjdd|}t|S )Nr   r   )maxr   r   r]   r4   r2   r
   )rI   r<   rJ   rK   r   r~   r%   r%   r&   resolve_nonzerom  s
   zArrayAttribute.resolve_nonzerozarray.reshapec                    s   dd  |rJ |j dvrtdt|dkr9|\} |r!d}nt|}|d u r+d S |j}|j|d}t||S t|dkrCtdt fd	d
|D r[tdd	t
t||jt|d}t|g|R  S )Nc                 S   r   )Nzreshape() arg cannot be {0}TFr   r   r%   r%   r&   r   x  r   z;ArrayAttribute.resolve_reshape.<locals>.sentry_shape_scalarCFz(reshape() supports contiguous array onlyr   )r   r   zreshape() take at least one argc                 3   r   r   r%   r   r   r%   r&   r     r   z1ArrayAttribute.resolve_reshape.<locals>.<genexpr>zreshape({0}) is not supportedr   )r   r   r8   rb   r_   r9   r
   r   r   r   mapstr)rI   r<   rJ   rK   r`   r   r~   r%   r   r&   resolve_reshapev  s,   	

zArrayAttribute.resolve_reshapez
array.sortc                 C   s   |rJ |rJ t tjS r   )r
   r   rZ   r   r%   r%   r&   resolve_sort  s   
zArrayAttribute.resolve_sortzarray.argsortc           
      C   s   |rJ t |}|dtd}t|tjstd|r-d}t|dd | D |jdkrMddd	}t	
|}tttjdd
|j|d}	|	S d S )Nkind	quicksortz"kind" must be a string literalzUnsupported keywords: {!r}c                 S   s   g | ]}|qS r%   r%   )r   kr%   r%   r&   
<listcomp>  s    z2ArrayAttribute.resolve_argsort.<locals>.<listcomp>r   c                 S      d S r   r%   )r   r%   r%   r&   argsort_stub     z4ArrayAttribute.resolve_argsort.<locals>.argsort_stubr   pysig)r   )dictpopr   StringLiteralr   r   r   keysr   r   pysignaturer
   r4   r2   replace)
rI   r<   rJ   rK   kwargsr   rB   r   r   sigr%   r%   r&   resolve_argsort  s   


zArrayAttribute.resolve_argsortz
array.viewc                 C   sJ   ddl m} |r
J |\}||}|d u rd S |j|d}t|g|R  S )Nr   parse_dtyperT   )npydeclr   r9   r
   )rI   r<   rJ   rK   r   r5   r~   r%   r%   r&   resolve_view  s   zArrayAttribute.resolve_viewzarray.astypec                 C   s   ddl m} |r
J |\}t|tjrtd||}|d u r!d S | j|j|s4t	d|||j|f |j
dv r<|j
nd}|j||dd}t|g|R  S )	Nr   r   z5array.astype if dtype is a string it must be constantz<astype(%s) not supported on %s: cannot convert from %s to %sr   r   F)r5   r   r   )r   r   r   r   UnicodeTyper   rV   rW   r5   r   r   r9   r
   )rI   r<   rJ   rK   r   r5   r   r~   r%   r%   r&   resolve_astype  s   zArrayAttribute.resolve_astypezarray.ravelc                 C   "   |rJ |rJ t |jdddS Nr   r   r.   r
   r9   r   r%   r%   r&   resolve_ravel     zArrayAttribute.resolve_ravelzarray.flattenc                 C   r   r   r   r   r%   r%   r&   resolve_flatten  r   zArrayAttribute.resolve_flattenz
array.takec                 C   s   |rt d|\}t|tjrt|jg|R  }|S t|tjr0t|jd|jdg|R  }|S t|tjrFtt|jddg|R  }|S t|tj	r_tt|jt
|dg|R  }|S td| )Nkws not supportedr   )r   r5   r   ztake(%s) not supported for %s)r   r   r   r    r
   r5   r4   r9   Listr0   npr   r   )rI   r<   rJ   rK   argtyr   r%   r%   r&   resolve_take  s    	"zArrayAttribute.resolve_takec                 C   sb   t |jtjr-||jjv r/|j|}t |tjr&|j|j|j|j ddS |j|ddS d S d S Nr,   r5   r   r   r   )	r   r5   r   RecordfieldstypeofNestedArrayr9   r   )rI   r<   r   
attr_dtyper%   r%   r&   generic_resolve  s   
zArrayAttribute.generic_resolveN)"rO   rP   rQ   r   r4   keyrg   rk   ro   rq   rr   rs   rv   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   rc      sT    
&




*







rc   c                   @   s"   e Zd ZejZdd Zdd ZdS )	DTypeAttrc                 C   rd   r   )r   NumberClassr5   rf   r%   r%   r&   resolve_type
  s   zDTypeAttr.resolve_typec                 C   s:   t |jtjjrd}nt |jtjjrd}nd S t|S )Nfi)r   r   r   scalarsFloatr    r   )rI   r<   r[   r%   r%   r&   resolve_kind  s   
zDTypeAttr.resolve_kindN)rO   rP   rQ   r   re   r   r   r   r%   r%   r%   r&   r     s    r   c                   @      e Zd ZdZdd ZdS )StaticGetItemArraystatic_getitemc                 C   s   |\}}t |tjrLt |trNt |jtjrP||jjv rR|j|}t |tjr=|j	|j|j
|j
 dd}t|g|R  S |j	|dd}t|g|R  S d S d S d S d S r   )r   r   r4   r   r5   r   r   r   r   r9   r   r
   )rI   rJ   rK   r<   r=   r   retr%   r%   r&   rM     s"   
zStaticGetItemArray.genericNrO   rP   rQ   r   rM   r%   r%   r%   r&   r         r   c                   @      e Zd ZejZdd ZdS )RecordAttributec                 C   s   | |}|s	J |S r   )r   )rI   recordr   r   r%   r%   r&   r   3  s   
zRecordAttribute.generic_resolveN)rO   rP   rQ   r   r   r   r   r%   r%   r%   r&   r   /      r   c                   @   r   )StaticGetItemRecordr   c                 C   sp   |\}}t |tjr4t |tr6||jvr#td| dt|j  ||}|s,J t	|g|R  S d S d S NField '&' was not found in record with fields )
r   r   r   r   r   KeyErrortupler   r   r
   )rI   rJ   rK   r   r=   r   r%   r%   r&   rM   =  s   


zStaticGetItemRecord.genericNr   r%   r%   r%   r&   r   9  r   r   c                   @   rG   )StaticGetItemLiteralRecordc                 C   s   |\}}t |tjrlt |tjr:|j|jvr(d|j dt|j  }t||	|j}|s2J t
|g|R  S t |tjrn|jt|jkrSd|j d}t|t|j}|	||j }|sdJ t
|g|R  S d S d S )Nr   r   Requested index  is out of range)r   r   r   r   literal_valuer   r   r   r   r   r
   IntegerLiteralr8   r   list)rI   rJ   rK   r   r=   rB   r   field_namesr%   r%   r&   rM   K  s*   

	z"StaticGetItemLiteralRecord.genericNrN   r%   r%   r%   r&   r   I  rR   r   c                   @   r   )StaticSetItemRecordstatic_setitemc           	      C   s   |\}}}t |tjrat |tr+||}| j||d ur)ttj|t	||S d S t |t
rc|t|jkrAd| d}t|t|j| }||}| j||d urettj|t	||S d S d S d S )Nr   r   )r   r   r   r   r   rV   rW   r
   voidliteralintr8   r   r   r   )	rI   rJ   rK   r   r=   value
expectedtyrB   	str_fieldr%   r%   r&   rM   e  s,   




zStaticSetItemRecord.genericNr   r%   r%   r%   r&   r   a  r   r   c                   @   rG   )StaticSetItemLiteralRecordc                 C   s   |\}}}t |tjr@t |tjrB|j|jvr)d|j dt|j  }t||	|j}| j
||d urDttj|||S d S d S d S r   )r   r   r   r   r   r   r   r   r   r   rV   rW   r
   r   )rI   rJ   rK   targetr=   r   rB   r   r%   r%   r&   rM   {  s   

z"StaticSetItemLiteralRecord.genericNrN   r%   r%   r%   r&   r   y  rR   r   c                   @   r   )ArrayCTypesAttributec                 C   ri   r   )r   r3   )rI   ctinfor%   r%   r&   resolve_data  rl   z!ArrayCTypesAttribute.resolve_dataN)rO   rP   rQ   r   rx   r   r  r%   r%   r%   r&   r    r   r  c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )ArrayFlagsAttributec                 C   ri   r   r   booleanrI   ctflagsr%   r%   r&   resolve_contiguous  rl   z&ArrayFlagsAttribute.resolve_contiguousc                 C   ri   r   r  r  r%   r%   r&   resolve_c_contiguous  rl   z(ArrayFlagsAttribute.resolve_c_contiguousc                 C   ri   r   r  r  r%   r%   r&   resolve_f_contiguous  rl   z(ArrayFlagsAttribute.resolve_f_contiguousN)	rO   rP   rQ   r   rz   r   r	  r
  r  r%   r%   r%   r&   r    s
    r  c                   @   s   e Zd ZejZdS )NestedArrayAttributeN)rO   rP   rQ   r   r   r   r%   r%   r%   r&   r    s    
r  c                 C   s@   t | tjr| jrttj| S ttj| S t | tjrtjS | S )zI
    If *ty* is an integer, expand it to a machine int (like Numpy).
    )r   r   r    r1   r   r2   r3   r6   r   r%   r%   r&   _expand_integer  s   r  c                 C   s*   |rt d|rt dt| jj| jdS )Nzargs not supportedr   recvr)r   r
   thisr5   rI   rJ   rK   r%   r%   r&   generic_homog  s
   r  c                 C   s&   |rJ |rJ t t| jj| jdS Nr  )r
   r  r  r5   r  r%   r%   r&   generic_expand  s   r  c           
      C   s  d}d|v rd|vrdd }t |}t||d g }n8d|v r8d|vr8dd }t |}t||d g }nd|v rUd|v rUdd }t |}t||d |d g }t|}|dks_J |d	krttt| jjg|R d
| ji}n|dkrd|vr| jjdkr| jj}nt	j
t| jj| jjd dd}t|g|R d
| ji}nT|dkrd|v rddlm} |\}	||	}	t|	g|R d
| ji}n2|dkrddlm} ||d }	|	}| jjdkrt	j
|| jjd dd}t|g|R d
| ji}n	 |j|dS )zh
    sum can be called with or without an axis parameter, and with or without
    a dtype parameter
    Naxisr5   c                 S   r   r   r%   )r  r%   r%   r&   sum_stub  r   zsum_expand.<locals>.sum_stubc                 S   r   r   r%   rT   r%   r%   r&   r    r   c                 S   r   r   r%   )r  r5   r%   r%   r&   r    r      r   r  r   r   r   r   r   )r   r   r   r8   r
   r  r  r5   r   r   r4   r   r   r   )
rI   rJ   rK   r   r  args_lenrL   return_typer   r5   r%   r%   r&   
sum_expand  sT   



r  c                 C   sP   |rt d|rt dt| jtjsJ tjt| jjddd}t|| jdS )Nzargs unsupportedzkwargs unsupportedr   r   r   r  )r   r   r  r   r4   r  r5   r
   )rI   rJ   rK   r  r%   r%   r&   generic_expand_cumulative  s   r  c                 C   sH   |rJ |rJ t | jjtjtjfrttj| jdS t| jj| jdS r  )r   r  r5   r   r    r6   r
   float64r  r%   r%   r&   generic_hetero_real  s
   r  c                 C   sl   |rJ |rJ t | jjtjtjfrttj| jdS t | jjtjr-t| jjj	| jdS t| jj| jdS r  )
r   r  r5   r   r    r6   r
   r  Complexr   r  r%   r%   r&   generic_hetero_always_real  s   r  c                 C   s    |rJ |rJ t tj| jdS r  )r
   r   r2   r  r  r%   r%   r&   generic_index#  s   r   Tc                    sB   d|  ||d}t d|  tf|  fdd}ttd|  | d S )Nzarray.)r   rM   prefer_literalArray_c                    s   t  |S r   )r   BoundFunctionrf   
temp_classr%   r&   array_attribute_attachment.  rh   z8install_array_method.<locals>.array_attribute_attachmentresolve_)typer   setattrrc   )namerM   r!  my_attrr&  r%   r$  r&   install_array_method)  s   r,  )minr   prodsum)r!  )cumsumcumprod)mean)varstdc                   @   rG   )CmpOpEqArrayc                 C   sB   |rJ |\}}t |tjr||krt|jtjd||S d S d S )NrT   )r   r   r4   r
   r9   r  )rI   rJ   rK   vavbr%   r%   r&   rM   M  s
   zCmpOpEqArray.genericNrN   r%   r%   r%   r&   r5  I  s    r5  )T)8numpyr   operatorr   r   
numba.corer   r   numba.core.typing.templatesr   r   r   r   r	   r
   r   numba.core.typingnumba.core.errorsr   r   r   r   r   r   r   r   rF   getitemrH   setitemrS   rb   rc   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r   r,  fnamefNameeqr5  r%   r%   r%   r&   <module>   sx    $$
 	:  		E


