o
    0 i7                     @   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	 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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   i/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/numba/cuda/cudadrv/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   retZslicedr   r   r   __getitem__2   s4   

$
zDim.__getitem__c                 C   s   | j || j  S N)r   r   )r   idxr   r   r   
get_offsetP      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   Zstrfmtr   r   r   __repr__S   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   	normalizeW   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_contiguoush      
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>m   s    z compute_index.<locals>.<genexpr>)sumzip)r   dimsr   r   r   compute_indexl   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   s   r-   zElement.__init__c                 c   s    | j V  d S r"   r<   r   r   r   r   iter_contiguous_extentv   s   zElement.iter_contiguous_extentN)r.   r/   r0   is_arrayr   r?   r   r   r   r   r;   p   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   )r8   r
   append)	clsoffsetshapestridesr+   r9   ZashapeZ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   r3   rG   r   r   r   r6          z!Array.__init__.<locals>.<genexpr>c                 s   rI   r"   r*   rJ   r   r   r   r6      rK   r   )tupler9   lenr   rE   rF   r+   	functoolsreduceoperatormulr   _compute_extentr=   _compute_layoutflags)r   r9   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*   rJ   r   r   r   
<listcomp>   s    z)Array._compute_layout.<locals>.<listcomp>Fr   r   rU   rV   )r9   anyr+   reversedr   r   )r   rT   sdrG   r   r   r   rS      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   r3   sr   r   r   rW          z)Array._compute_extent.<locals>.<listcomp>)r   rE   r:   r9   r+   maxr   )r   ZfirstidxZlastidxr   r   r   r   r   rR      s   

zArray._compute_extentc                 C   s   d| j | jf S )Nz<Array dims=%s itemsize=%s>)r9   r+   r>   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!   )r3   rG   itr   r   r   rW      s    z%Array.__getitem__.<locals>.<listcomp>c                 S   s   g | ]}|j s|jqS r   )r   r   )r3   r5   r   r   r   rW      s    r   )r   rL   listrM   r9   r   rB   r   r8   rA   r+   reshaper;   r=   )r   r   Znitemr   r9   newshapearrr   r   r   r!      s    


zArray.__getitem__c                 C   
   | j d S )NrU   rT   r>   r   r   r   is_c_contig      
zArray.is_c_contigc                 C   rd   )NrV   re   r>   r   r   r   is_f_contig   rg   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   rW   	  r]   z0Array.iter_contiguous_extent.<locals>.<listcomp>c                 S   ri   r   rj   r[   r   r   r   rW     r]   )rf   rh   r=   r9   r   rE   r,   r+   	itertoolsproductr:   r   r   )r   ZinnerdimZ	outerdimsZ
outershapeZoslenr   r'   rD   r   r   r   r?      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 arrayZunreachable)Zdtypezreshape would require copyrE   rF   r+   ) r   rM   rE   pop	TypeErrorkeys
ValueError	enumerater   rN   rO   rP   rQ   rh   rf   r`   iter_strides_c_contigiter_strides_f_contigAssertionErrornpempty	ctypeslibc_intparrayrF   r	   r+   NotImplementedErrorrH   r=   r   r?   )r   ZnewdimskwsZoldndZnewndrn   Z
unknownidxZ	knownsizer4   rG   Znewsize
newstridesZolddimsZ
oldstridesr    r   r   r   ra     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 onert   )r8   rE   rF   rB   r   rL   rx   ry   rH   r=   r   r+   r`   r?   )	r   Zaxisrb   r   lengthr   axr4   Znewarrr   r   r   squeeze`  s8   





zArray.squeezero   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)Nrp   rq   CAZFAzravel on non-contiguous array)rx   rf   rh   r   r+   rH   r=   r   r`   r?   r   )r   rn   rb   r   rc   r   r   r   ravel|  s   zArray.ravelr"   )ro   )r.   r/   r0   r1   r@   classmethodrH   r   rS   rR   r&   r!   propertyrf   rh   r?   ra   r   r   r   r   r   r   rA   z   s$    
	
&


MrA   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   )rE   r+   )rc   rE   r+   r7   r\   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   )rY   )r7   r\   r+   rE   r   r   gen  s   z"iter_strides_c_contig.<locals>.gen)rE   r+   rY   r`   )rc   rE   r   r4   r   r   r   rz     s   rz   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   )r3   r_   r   r   r   r6     s    z&is_element_indexing.<locals>.<genexpr>T)r   r   rL   rM   rX   )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   rl   rN   rP   ctypesnumpyr}   Znumbar   r   Z	CFUNCTYPEc_intZc_longr   Z	ndpointerr   Z	c_helpersr	   objectr
   r:   r;   rA   r{   rz   r   r   r   r   r   r   <module>   s>    
R
  

