o
    Y۷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   S/home/ubuntu/vllm_env/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   ret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   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)r0   r1   r2   is_arrayr   rA   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   )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   r5   rK   r   r   r   r8          z!Array.__init__.<locals>.<genexpr>c                 s   rM   r#   r,   rN   r   r   r   r8      rO   r   )tupler;   lenr   rG   rH   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,   rN   r   r   r   
<listcomp>   s    z)Array._compute_layout.<locals>.<listcomp>Fr   r   rY   rZ   )r;   anyr-   reversedr   r   )r   rX   sdrK   r   r   r   rW      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   r5   sr   r   r   r[          z)Array._compute_extent.<locals>.<listcomp>)r   rG   r<   r;   r-   maxr   )r   firstidxlastidxr   r   r   r   r   rV      s   

zArray._compute_extentc                 C   s   d| j | jf S )Nz<Array dims=%s itemsize=%s>)r;   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"   )r5   rK   itr   r   r   r[      s    z%Array.__getitem__.<locals>.<listcomp>c                 S   s   g | ]}|j s|jqS r   )r   r   )r5   r7   r   r   r   r[      s    r   )r   rP   listrQ   r;   r   rD   r   r:   rC   r-   reshaper=   r?   )r   r   nitemr   r;   newshapearrr   r   r   r"      s    


zArray.__getitem__c                 C   
   | j d S )NrY   rX   r@   r   r   r   is_c_contig      
zArray.is_c_contigc                 C   rk   )NrZ   rl   r@   r   r   r   is_f_contig   rn   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[   	  ra   z0Array.iter_contiguous_extent.<locals>.<listcomp>c                 S   rp   r   rq   r_   r   r   r   r[     ra   )rm   ro   r?   r;   r   rG   r.   r-   	itertoolsproductr<   r   r   )r   innerdim	outerdims
outershapeoslenr   r)   rF   r   r   r   rA      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rG   rH   r-   ) r   rQ   rG   pop	TypeErrorkeys
ValueError	enumerater   rR   rS   rT   rU   ro   rm   rf   iter_strides_c_contigiter_strides_f_contigAssertionErrornpempty	ctypeslibc_intparrayrH   r	   r-   NotImplementedErrorrL   r?   r   rA   )r   newdimskwsoldndnewndry   
unknownidx	knownsizer6   rK   newsize
newstridesolddims
oldstridesr    r   r   r   rg     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:   rG   rH   rD   r   rP   r   r   rL   r?   r   r-   rf   rA   )	r   axisri   r   lengthr   axr6   newarrr   r   r   squeeze`  s8   





zArray.squeezerz   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   rm   ro   r   r-   rL   r?   r   rf   rA   r   )r   ry   ri   r   rj   r   r   r   ravel|  s   zArray.ravelr#   )rz   )r0   r1   r2   r3   rB   classmethodrL   r   rW   rV   r(   r"   propertyrm   ro   rA   rg   r   r   r   r   r   r   rC   z   s$    
	
&


MrC   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   )rG   r-   )rj   rG   r-   r9   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   )r]   )r9   r`   r-   rG   r   r   gen  s   z"iter_strides_c_contig.<locals>.gen)rG   r-   r]   rf   )rj   rG   r   r6   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   )r5   re   r   r   r   r8     s    z&is_element_indexing.<locals>.<genexpr>T)r   r   rP   rQ   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   rs   rR   rT   ctypesnumpyr   numbar   r   	CFUNCTYPEc_intc_longr   	ndpointerr   	c_helpersr	   objectr
   r<   r=   rC   r   r   r   r   r   r   r   r   <module>   s>    
R
  

