o
    i                     @   sZ   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 )    N)_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	   S/home/ubuntu/veenaModal/venv/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__H   s6   





zflatiter.__getitem__c                 C   s   | S Nr	   r   r	   r	   r
   __iter__k   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__n   s
   zflatiter.__next__c                 C   s
   | j  S )z*Get a copy of the iterator as a 1-D array.)r%   flattenr/   r	   r	   r
   r+   u   s   
zflatiter.copyc                 C   s   | j S )z/A reference to the array that is iterated over.)r   r/   r	   r	   r
   r%   y   s   zflatiter.basec                 C   s   | j jS r.   )r%   r   r/   r	   r	   r
   __len__   s   zflatiter.__len__N)__name__
__module____qualname____doc__r   r*   r-   r0   r4   r+   propertyr%   r6   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)	r   r    r   
cupy._corer   r   ElementwiseKernelr"   r,   r	   r	   r	   r
   <module>   s      