U
    •Ê¹j¥  ã                   @   s  d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ ejejdd�Zedƒe	 d	d	d
d
d¡ejejdœdd„ƒƒƒZedƒe	 d	d
d	d	¡ejejdœdd„ƒƒƒZedƒe	 d	d
d	d	dd¡ejejejjeejjejjeedœdd„ƒƒƒZdS )aõ  This file exports ONNX ops for opset 16.

Note [ONNX Operators that are added/updated in opset 16]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
https://github.com/onnx/onnx/blob/main/docs/Changelog.md#version-16-of-the-default-onnx-operator-set
New operators:
    GridSample https://github.com/onnx/onnx/pull/3557

Updated operators:
    Identity
    If
    LeakyRelu
    Loop
    PRelu
    RoiAlign
    Scan
    ScatterElements
    ScatterND
    Where
    GreaterOrEqual
    LessOrEqual
é    N)ÚGRID_SAMPLE_INTERPOLATION_MODESÚGRID_SAMPLE_PADDING_MODES)Ú_type_utilsÚerrorsÚsymbolic_helperÚutils)Ú	_beartypeÚ	jit_utilsÚregistrationé   )Zopsetzaten::grid_samplerÚvÚiÚb)Úgc                 C   s^   t  |¡dkrt  d¡S dd„ t ¡ D ƒ| }dd„ t ¡ D ƒ| }| jd||t|ƒ||d�S )Né   z#GridSample with 5D volumetric inputc                 S   s   i | ]\}}||“qS © r   ©Ú.0Úkr   r   r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/onnx/symbolic_opset16.pyÚ
<dictcomp>9   s      z grid_sampler.<locals>.<dictcomp>c                 S   s   i | ]\}}||“qS r   r   r   r   r   r   r   :   s      Z
GridSample)Zalign_corners_iÚmode_sÚpadding_mode_s)r   Z_get_tensor_rankZ_onnx_unsupportedr   Úitemsr   ÚopÚint)r   ÚinputÚgridZ	mode_enumZpadding_mode_enumZalign_cornersr   r   r   r   r   Úgrid_sampler+   s    
úr   zaten::scatter_addc           
      C   s*  t  ¡ r| jd||||dd�S tj |tjj¡}t  |¡}t  |¡}t|ƒt|ƒkrnt  	dd|› d|› d�¡S ||ks~d |kr¸|  
d|¡}| j
d	t d
gt|ƒ ¡d�}	|  
d||	|¡}t  |¡}t  |¡râ| j
d||||dd�S tj |¡|k�r| j
d|tj |¡ ¡ d�}| j
d||||dd�S d S )NZscatterÚsrc)Zoverload_nameÚscatter_addz	`index` (z0) should have the same dimensionality as `src` (ú)ÚShapeÚConstantr   ©Zvalue_tÚSliceÚScatterElementsÚadd©Zaxis_iZreduction_sZCast)Zto_i)r   Zis_caffe2_aten_fallbackÚatr   ZJitScalarTypeÚ
from_valueZ	UNDEFINEDZ_get_tensor_sizesÚlenZ_unimplementedr   ÚtorchÚtensorZ_maybe_get_scalarZ	_is_valueZ	onnx_type)
r   ÚselfÚdimÚindexr   Zsrc_typeZ	src_sizesZindex_sizesZadjusted_shapeZstartsr   r   r   r    E   sD     ÿ

þ	

ýúr    zaten::scatter_reduceÚs)r   r.   r/   r0   r   ÚreduceÚinclude_selfc              
   C   sÄ  |dkrt  d¡‚|s t  d¡‚dddddd	œ}|| }|  d
|  d|¡¡}	|  d|	| jdtjdtjd�d�¡}
tj| d|
ddd�\}\}}}|jdtjdgtjd�d�}| d||¡}t 	|j
|¡ | d||¡}t 	|j
|¡ | d||¡}t 	|j
|¡ | d|¡}t 	|j
|¡ | d|¡}t 	|j
|¡ | d|¡}t 	|j
|¡ | jd|ž||dœŽ}tj| d|
ddd�\}\}}}| d|¡}t 	|j
|¡ | d|¡}t 	|j
|¡ | ¡  ¡ }|S )NÚmeanz7ONNX does not support mean reduction for scatter_reducez;ONNX does not support include_self=False for scatter_reduceÚnoner'   ÚmulÚminÚmax)r4   ÚsumÚprodZaminZamaxÚSizer"   ZEqualr#   r   )Zdtyper$   ÚIfé   é   )Zn_blocksÚoutputséÿÿÿÿZReshapeZIdentityr&   r(   é   ZSqueeze)r&   )r   ZOnnxExporterErrorr   r,   r-   Zint64r	   Zadd_op_with_blocksr   Z_add_output_to_blockÚblockÚnodeÚoutput)r   r.   r/   r0   r   r2   r3   Zreduce_modeZonnx_reduceZ	self_rankZself_rank_is_zeroZif_opZ
if_contextZelse_contextÚ_Zneg_1Zself_reshapeZindex_reshapeZsrc_reshapeZself_identityZindex_identityeZsrc_identityÚresultZresult_squeezedZresult_identityZresult_finalr   r   r   Úscatter_reducex   sn    ÿÿû  ÿ    ÿ    ÿrG   )Ú__doc__Ú	functoolsr,   Ztorch.nn.functionalr   r   Z
torch.onnxr   r   r   r   Ztorch.onnx._internalr   r	   r
   ÚpartialZonnx_symbolicZ_onnx_symbolicÚ
parse_argsZbeartypeZGraphContextr   r    Z_CÚValuer   ÚstrÚboolrG   r   r   r   r   Ú<module>   s4   ÿ0ù