U
    rhX                     @  sR   d dl mZ d dlZd dlZd dlmZ d dlmZ d
ddZ	G dd	 d	eZ
dS )    )annotationsN)Base)expectnonec              	     s   dk r| j    jd   j d d   dd dd dd } fd	d
tj  D }ttj|dd}| |  t|}|  | tt	j  t
 t| }|dkr|t| |t|< n|||| }}t|D ]\}	}
|dkr6||
  |||	  7  < nr|dkrZ||
  |||	  9  < nN|dkrt||
 |||	  ||
< n&|dkr
t||
 |||	  ||
< q
|S )Nr      c                 S  s   t d g| j }|||< |S N)slicendim)ZarraxisiZslc r   O/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/scatterelements.py
make_slice   s    z$scatter_elements.<locals>.make_slicec                 S  s,   | d }t dt| D ]}|| | f}q|S )Nr   r   )rangelen)packedunpackedr   r   r   r   unpack   s    z scatter_elements.<locals>.unpackc                   s>   g }t t| d D ]  |t fdd| D  qt|S )Nr   c                 3  s   | ]}|  V  qd S r   r   ).0Zidx_elementr   r   r   	<genexpr>#   s     zGscatter_elements.<locals>.make_indices_for_duplicate.<locals>.<genexpr>)r   r   appendtuplelist)idxZ	final_idxr   r   r   make_indices_for_duplicate   s    z4scatter_elements.<locals>.make_indices_for_duplicatec              	     sH   g | ]@}t jd  dt | d dd gqS )r   r   )npindicesZreshaper	   r   )r   r   r
   Zidx_xsection_shaper   r   r   r   r   
<listcomp>)   s   z$scatter_elements.<locals>.<listcomp>)r
   r   addmulmaxmin)r	   shaper   r   r   ZconcatenateinsertpoprepeatZarangeprodcopyr   	enumeratemaximumZminimum)datar   updatesr
   	reductionr   r   Zupdates_idxZ	scatterediterZidx_setr   r   r   scatter_elements   sN    
 

 



 


 
r1   c                   @  sx   e Zd ZeddddZeddddZeddddZeddd	d
ZeddddZeddddZ	dS )ScatterElementsNone)returnc                  C  s   t jjddddgdgd} tjdtjd}tjd	d
dgd
dd	ggtjd}tjdddgdddggtjd}t|||}t	| |||g|gdd d S )Nr2   r-   r   r.   y)inputsoutputs)   r8   Zdtyper   r            ?皙?g333333?       @ @g@Z"test_scatter_elements_without_axisr6   r7   name)
onnxhelper	make_noder   zerosfloat32arrayint64r1   r   )noder-   r   r.   r5   r   r   r   $export_scatter_elements_without_axisS   s      z4ScatterElements.export_scatter_elements_without_axisc                  C  s   d} t jjddddgdg| d}tjdd	d
ddggtjd}tjddggtjd}tjddggtjd}t|||| }t||||g|gdd d S )Nr   r2   r-   r   r.   r5   r6   r7   r
   r;   r=         @      @      @r9   r8   r<   r>   Ztest_scatter_elements_with_axisr?   	rA   rB   rC   r   rF   rE   rG   r1   r   r
   rH   r-   r   r.   r5   r   r   r   !export_scatter_elements_with_axisk   s"    z1ScatterElements.export_scatter_elements_with_axisc                  C  s   d} t jjddddgdg| d}tjdd	d
ddggtjd}tjddggtjd}tjddggtjd}t|||| }t||||g|gdd d S )Nr   r2   r-   r   r.   r5   rJ   r;   r=   rK   rL   rM   r9   r<   r>   Z+test_scatter_elements_with_negative_indicesr?   rN   rO   r   r   r   -export_scatter_elements_with_negative_indices   s"    z=ScatterElements.export_scatter_elements_with_negative_indicesc                  C  s   d} t jjddddgdg| dd}tjd	d
dddggtjd}tjddggtjd}tjddggtjd}t|||| dd}t||||g|gdd d S )Nr   r2   r-   r   r.   r5   r!   r6   r7   r
   r/   r;   r=   rK   rL   rM   r9   r<   r>   r/   Z,test_scatter_elements_with_duplicate_indicesr?   rN   rO   r   r   r   .export_scatter_elements_with_duplicate_indices   s$    z>ScatterElements.export_scatter_elements_with_duplicate_indicesc                  C  s   d} t jjddddgdg| dd}tjd	d
dddggtjd}tjddggtjd}tjddggtjd}t|||| dd}t||||g|gdd d S )Nr   r2   r-   r   r.   r5   r#   rS   r;   r=   rK   rL   rM   r9   r<   r>   rT   Z(test_scatter_elements_with_reduction_maxr?   rN   rO   r   r   r   *export_scatter_elements_with_reduction_max   s$    z:ScatterElements.export_scatter_elements_with_reduction_maxc                  C  s   d} t jjddddgdg| dd}tjd	d
dddggtjd}tjddggtjd}tjddggtjd}t|||| dd}t||||g|gdd d S )Nr   r2   r-   r   r.   r5   r$   rS   r;   r=   rK   rL   rM   r9   r<   r>   rT   Z(test_scatter_elements_with_reduction_minr?   rN   rO   r   r   r   *export_scatter_elements_with_reduction_min   s$    z:ScatterElements.export_scatter_elements_with_reduction_minN)
__name__
__module____qualname__staticmethodrI   rP   rR   rU   rV   rW   r   r   r   r   r2   R   s   r2   )r   r   )
__future__r   Znumpyr   rA   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r1   r2   r   r   r   r   <module>   s   
D