o
    W۷i                     @  sf   d dl mZ d dlZd dlZd dlmZ d dlmZ G dd dZeddd	d
Z	eddddZ
dS )    )annotationsN)_core)internalc                   @  sT   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd Zdd ZdS )flatitera\  Flat iterator object to iterate over arrays.

    A flatiter iterator is returned by ``x.flat`` for any array ``x``. It
    allows iterating over the array as if it were a 1-D array, either in a
    for-loop or by calling its ``next`` method.

    Iteration is done in row-major, C-style order (the last index varying the
    fastest).

    Attributes:
        base (cupy.ndarray): A reference to the array that is iterated over.

    .. note::
       Restricted support of basic slicing is currently supplied. Advanced
       indexing is not supported yet.

    .. seealso:: :func:`numpy.flatiter`

    c                 C  s   || _ d| _d S )Nr   )_base_index)selfa r
   L/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupy/_indexing/iterate.py__init__   s   
zflatiter.__init__c           	      C  s&  |t u r|| d d < d S t|trtdt|trtdt|rLt|}| j}|j	}g }|j
D ]}|| }|||  ||; }q2||t|< d S t|tr| j}t||j	}|j}|j}|j|j }|dkrt|d | d }n|d | d }tj||jd}t|||||d d S td)Nunsupported iterator indexr      )dtypesize)Ellipsis
isinstancetuple
IndexErrorboolnumpyisscalarintr   r   shapeappendslicer   complete_slicestartstepstopcupyasarrayr   _flatiter_setitem_slice)	r   indvaluebaser   indicesss_starts_stepr
   r
   r   __setitem__#   s>   





zflatiter.__setitem__c                 C  s  |t u r
| d d  S t|trtdt|trtdt|rJt|}| j}|j	}g }|j
D ]}|| }|||  ||; }q0|t|  S t|tr| j}t||j	}|j}|j}|j|j }|dkrr|d | d }n|d | d }t||||dS td)Nr   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   copyr   r   r   r   r   r    _flatiter_getitem_slice)r   r$   r&   r   r'   r(   r)   r*   r
   r
   r   __getitem__J   s6   





zflatiter.__getitem__c                 C  s   | S Nr
   r   r
   r
   r   __iter__m   s   zflatiter.__iter__c                 C  s.   | j }|t| krt |  j d7  _ | | S )Nr   )r   lenStopIteration)r   indexr
   r
   r   __next__p   s
   zflatiter.__next__c                 C  s
   | j  S )z*Get a copy of the iterator as a 1-D array.)r&   flattenr0   r
   r
   r   r,   w   s   
zflatiter.copyc                 C  s   | j S )z/A reference to the array that is iterated over.)r   r0   r
   r
   r   r&   {   s   zflatiter.basec                 C  s   | j jS r/   )r&   r   r0   r
   r
   r   __len__   s   zflatiter.__len__N)__name__
__module____qualname____doc__r   r+   r.   r1   r5   r,   propertyr&   r7   r
   r
   r
   r   r   
   s    '#
r   z"raw T val, int64 start, int64 stepzraw T az)a[start + i * step] = val[i % val.size()]cupy_flatiter_setitem_slicez raw T a, int64 start, int64 stepzT ozo = a[start + i * step]cupy_flatiter_getitem_slice)
__future__r   r   r!   r   
cupy._corer   r   ElementwiseKernelr#   r-   r
   r
   r
   r   <module>   s"     