U
    qh                     @  s>   d dl mZ d dlZd dlmZ dddZG dd deZdS )	    )annotationsN)OpRunc                 C  s  |dkrdd }n,|dkr$dd }n|dkr6dd }ndd }|d	k rP| j | }t| jd
kr|d	krt| }t||D ]\}}||| |||< qz|S t|jdkr|t| }|d	krt|jd	 D ]J}	t|jd
 D ]6}
||||	|
f |
f ||	|
f |||	|
f |
f< qqn^t|jd	 D ]N}	t|jd
 D ]8}
|||	||	|
f f ||	|
f ||	||	|
f f< q:q(|S t|jdkr8t| }|d	kr"t|jd	 D ]n}	t|jd
 D ]X}
t|jd D ]B}||||	|
|f |
|f ||	|
|f |||	|
|f |
|f< qҐqqn|d
krt|jd	 D ]n}	t|jd
 D ]X}
t|jd D ]B}|||	||	|
|f |f ||	|
|f ||	||	|
|f |f< q^qLq:n|dkr4t|jd	 D ]n}	t|jd
 D ]X}
t|jd D ]B}|||	|
||	|
|f f ||	|
|f ||	|
||	|
|f f< qq֐q|S t|jdkrt| }t|jd	 D ]}t|jd
 D ]x}	t|jd D ]b}
t|jd D ]L}||	|
|g}|||	|
|f ||< t|}||| |||	|
|f ||< qqqrq`|S td|j d| ddS )zScatter elements.

    ::
        for 3-dim and axis=0
            output[indices[i][j][k]][j][k] = updates[i][j][k]
        for axis 1
            output[i][indices[i][j][k]][k] = updates[i][j][k]
        and so on.
    addc                 S  s   | | S N xyr   r   J/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_scatter_elements.pyf   s    zscatter_elements.<locals>.fminc                 S  s
   t | |S r   )r   r   r   r   r
   r      s    maxc                 S  s
   t | |S r   )r   r   r   r   r
   r   !   s    c                 S  s   |S r   r   r   r   r   r
   r   &   s    r               z-ScatterND is not implement for indices.shape=z
 and axis=.N)	ndimlenshapenpcopyziprangetupleNotImplementedError)dataindicesupdatesaxis	reductionr   Z	scatteredposZupijkaindexZtuple_indexr   r   r
   scatter_elements   s    







 
 


 (
 &
 $
r'   c                   @  s   e Zd ZdddZdS )ScatterElementsNc                 C  s   t |||||d}|fS )N)r   r    )r'   )selfr   r   r   r   r    resr   r   r
   _runp   s    zScatterElements._run)NN)__name__
__module____qualname__r+   r   r   r   r
   r(   o   s   r(   )r   N)
__future__r   Znumpyr   Zonnx.reference.op_runr   r'   r(   r   r   r   r
   <module>   s   
d