o
    Td7                     @   s(  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ edddgZeejejejjejjdd	ejjejjdd	ejejjejjdd	ejjejjdd	ejej	e	j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dZdddZdd Zdd ZdS )    )
namedtupleN)
_helperlib)configExtentbeginend   )ndimattempt_nocopy_reshapec                   @   sN   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dddZ
dd ZdS )DimzA single dimension of the array

    Attributes
    ----------
    start:
        start offset
    stop:
        stop offset
    size:
        number of items
    stride:
        item stride
    startstopsizestridesinglec                 C   s6   || _ || _|| _|| _|| _|r|dksJ d S d S Nr   r   selfr   r   r   r   r    r   h/home/ncw/WWW/www-new/content/articles/pi-bbp/venv/lib/python3.10/site-packages/numba/misc/dummyarray.py__init__,   s   zDim.__init__c           	      C   s   t |tr?|| j\}}}|| j }| j|t| j  }| j|t| j  }|dkr.d}nt|||}t||||dd}|S |dkrK| ||d  n| dd  }|jdkrXt	t|j|j
|j|jddS )Nr   r   Fr   T)
isinstancesliceindicesr   r   r   abs_compute_sizer   
IndexErrorr   )	r   itemr   r   stepr   r   retslicedr   r   r   __getitem__4   s4   

$
zDim.__getitem__c                 C   s   | j || j  S N)r   r   )r   idxr   r   r   
get_offsetR      zDim.get_offsetc                 C   s   d}|| j | j| j| jf S )Nz*Dim(start=%s, stop=%s, size=%s, stride=%s))r   r   r   r   )r   strfmtr   r   r   __repr__U   s   zDim.__repr__c                 C   s$   t | j| | j| | j| j| jdS )Nr   )r   r   r   r   r   r   )r   baser   r   r   	normalizeY   s   zDim.normalizeNc                 C   sV   |d u r| j }|d u r| j}|d u r| j}|d u r| j}|d u r#| j}t|||||S r$   )r   r   r   r   r   r   r   r   r   r   copy]   s   zDim.copyc                 C   s
   | j |kS r$   r   )r   itemsizer   r   r   is_contiguousj      
zDim.is_contiguous)NNNNN)__name__
__module____qualname____doc__	__slots__r   r#   r&   r)   r+   r,   r/   r   r   r   r   r      s    
r   c                 C   s   t dd t| |D S )Nc                 s   s    | ]
\}}| |V  qd S r$   )r&   ).0idr   r   r   	<genexpr>o   s    z compute_index.<locals>.<genexpr>)sumzip)r   dimsr   r   r   compute_indexn   s   r=   c                   @   s    e Zd ZdZdd Zdd ZdS )ElementFc                 C   s
   || _ d S r$   extent)r   r@   r   r   r   r   u   r0   zElement.__init__c                 c   s    | j V  d S r$   r?   r   r   r   r   iter_contiguous_extentx   s   zElement.iter_contiguous_extentN)r1   r2   r3   is_arrayr   rB   r   r   r   r   r>   r   s    r>   c                   @   s   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dd Z
dd Zedd Zedd Zdd Zdd ZdddZdddZdS )Arraya  A dummy numpy array-like object.  Consider it an array without the
    actual data, but offset from the base data pointer.

    Attributes
    ----------
    dims: tuple of Dim
        describing each dimension of the array

    ndim: int
        number of dimension

    shape: tuple of int
        size of each dimension

    strides: tuple of int
        stride of each dimension

    itemsize: int
        itemsize

    extent: (start, end)
        start and end offset containing the memory region
    Tc           	      C   sJ   g }t ||D ]\}}t||||  ||dd}|| d}q| ||S )NF)r   r   )r;   r   append)	clsoffsetshapestridesr.   r<   ashapeastridedimr   r   r   	from_desc   s   

zArray.from_descc                 C   st   t || _t| j| _t dd | jD | _t dd | jD | _|| _tt	j
| jd| _|  | _|  | _d S )Nc                 s       | ]}|j V  qd S r$   )r   r6   rL   r   r   r   r9          z!Array.__init__.<locals>.<genexpr>c                 s   rN   r$   r-   rO   r   r   r   r9      rP   r   )tupler<   lenr	   rH   rI   r.   	functoolsreduceoperatormulr   _compute_extentr@   _compute_layoutflags)r   r<   r.   r   r   r   r      s   

zArray.__init__c                 C   s   | j sdddS tdd | j D rdddS ddd}| j}t| j D ]!}|jdkr2ddd  S |jdkrE|j|kr@d|d< ||j9 }q$| j}| j D ]}|jdkre|j|kr`d|d	< |  S ||j9 }qL|S )
NT)C_CONTIGUOUSF_CONTIGUOUSc                 S   s   g | ]}|j d kqS )r   r-   rO   r   r   r   
<listcomp>   s    z)Array._compute_layout.<locals>.<listcomp>Fr   r   rZ   r[   )r<   anyr.   reversedr   r   )r   rY   sdrL   r   r   r   rX      s.   










zArray._compute_layoutc                 C   sN   dg| j  }dd | jD }t|| j}t|| j| j }t||}t||S )Nr   c                 S   s   g | ]}|d  qS )r   r   r6   sr   r   r   r\          z)Array._compute_extent.<locals>.<listcomp>)r	   rH   r=   r<   r.   maxr   )r   firstidxlastidxr   r   r   r   r   rW      s   

zArray._compute_extentc                 C   s   d| j | jf S )Nz<Array dims=%s itemsize=%s>)r<   r.   rA   r   r   r   r)      r'   zArray.__repr__c                 C   s   t |ts	|g}nt|}t|}t| j}||kr#td|| f t||k r7|td d  t||k s)dd t| j|D }dd |D }t	|| j
}|rX|j| d S t|jS )Nz%d extra indices givenc                 S   s   g | ]	\}}| |qS r   )r#   )r6   rL   itr   r   r   r\      s    z%Array.__getitem__.<locals>.<listcomp>c                 S   s   g | ]}|j s|jqS r   )r   r   )r6   r8   r   r   r   r\      s    r   )r   rQ   listrR   r<   r   rE   r   r;   rD   r.   reshaper>   r@   )r   r   nitemr	   r<   newshapearrr   r   r   r#      s    


zArray.__getitem__c                 C   
   | j d S )NrZ   rY   rA   r   r   r   is_c_contig      
zArray.is_c_contigc                 C   rl   )Nr[   rm   rA   r   r   r   is_f_contig   ro   zArray.is_f_contigc                 c   s   | j s| jr| jV  dS | jd j| jd jk r-| jd }| jdd }| jdd }n| jd }| jdd }| jdd }|| jrgdd |D }tj	| D ]}t
||}||j ||j fV  qRdS dd | jD }tj	| D ]}t
|| j}||| j fV  qtdS )z Generates extents
        r   r   r   Nc                 S      g | ]}t |qS r   ranger`   r   r   r   r\     rb   z0Array.iter_contiguous_extent.<locals>.<listcomp>c                 S   rq   r   rr   r`   r   r   r   r\     rb   )rn   rp   r@   r<   r   rH   r/   r.   	itertoolsproductr=   r   r   )r   innerdim	outerdims
outershapeoslenr   r*   rG   r   r   r   rB      s*   


zArray.iter_contiguous_extentc              
   O   s  | j }t|}|| jkr| d fS |dd}|r td|  |dvr(tdd}d}t|D ]\}}	|	dk rC|dkr?|}q0td	||	9 }q0|dkro|dksW| j| dkr[td
|d| | j| f ||d d   }t	
tj|d}
|dkr| jrdnd}|
| jkrtd| js| jr|dkrtt| |}nG|dkrtt| |}n;tdt|tjj}tj| jtjjd}tj| jtjjd}tj|tjjd}t||||||| j|dkstd| j| jj||| jd}|t|  fS )NorderCzunknown keyword arguments %sCFAorder not C|F|Ar   r   r   z&can only specify one unknown dimensionz.cannot infer valid shape for unknown dimensionAFz%reshape changes the size of the arrayunreachable)dtypezreshape would require copyrH   rI   r.   ) r	   rR   rH   pop	TypeErrorkeys
ValueError	enumerater   rS   rT   rU   rV   rp   rn   rg   iter_strides_c_contigiter_strides_f_contigAssertionErrornpempty	ctypeslibc_intparrayrI   r
   r.   NotImplementedErrorrM   r@   r   rB   )r   newdimskwsoldndnewndrz   
unknownidx	knownsizer7   rL   newsize
newstridesolddims
oldstridesr!   r   r   r   rh     sn   





zArray.reshapeNc           	      C   s   g g }}|d u r$t | j| jD ]\}}|dkr"|| || qn6t|ts,|f}|D ]}| j| dkr;tdq.tt | j| jD ]\}\}}||vrY|| || qE| j| j	j
||| jd}|t|  fS )Nr   zDcannot select an axis to squeeze out which has size not equal to oner   )r;   rH   rI   rE   r   rQ   r   r   rM   r@   r   r.   rg   rB   )	r   axisrj   r   lengthr   axr7   newarrr   r   r   squeezea  s8   





zArray.squeezer{   c                 C   sj   |dvrt d|dv r| js|dv r1| jr1| jf}| jf}| | jj||| j}|t| 	 fS t
d)Nr|   r}   CAFAzravel on non-contiguous array)r   rn   rp   r   r.   rM   r@   r   rg   rB   r   )r   rz   rj   r   rk   r   r   r   ravel}  s   zArray.ravelr$   )r{   )r1   r2   r3   r4   rC   classmethodrM   r   rX   rW   r)   r#   propertyrn   rp   rB   rh   r   r   r   r   r   r   rD   |   s$    
	
&


LrD   c                 c   sL    |du r| j n|}| j}|V  d}|dd D ]}||9 }|| V  qdS )z$yields the f-contiguous strides
    Nr   r   )rH   r.   )rk   rH   r.   r:   ra   r   r   r   r     s   r   c                 #   sF    du r| j n| j  fdd}tt| D ]}|V  qdS )z$yields the c-contiguous strides
    Nc                  3   s8     V  d} t dd  D ]}| |9 } |   V  qd S r   )r^   )r:   ra   r.   rH   r   r   gen  s   z"iter_strides_c_contig.<locals>.gen)rH   r.   r^   rg   )rk   rH   r   r7   r   r   r   r     s   r   c                 C   sB   t | trdS t | trt| |krtdd | D sdS dS dS )NFc                 s   s    | ]}t |tV  qd S r$   )r   r   )r6   rf   r   r   r   r9     s    z&is_element_indexing.<locals>.<genexpr>T)r   r   rQ   rR   r]   )r   r	   r   r   r   is_element_indexing  s   

r   c                 C   s@   |dkr	| }|}n|}| }| }||krdS || d | d S )z1Algorithm adapted from cpython rangeobject.c
    r   r   r   )r   r   r    lohir   r   r   r     s   r   r$   )collectionsr   rt   rS   rU   ctypesnumpyr   numbar   
numba.corer   r   	CFUNCTYPEc_intc_longr   	ndpointerr   	c_helpersr
   objectr   r=   r>   rD   r   r   r   r   r   r   r   r   <module>   s@    
R
  

