o
    h                     @   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dejfddZede	d	d
d	d	ejdejfddZede	d	d
d	d	ddejdejdejjdedejjdejjdedef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   )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      i | ]\}}||qS  r   .0kr   r   r   Q/var/www/html/ai/venv/lib/python3.10/site-packages/torch/onnx/symbolic_opset16.py
<dictcomp>9       z grid_sampler.<locals>.<dictcomp>c                 S   r   r   r   r   r   r   r   r   :   r   
GridSample)align_corners_imode_spadding_mode_s)r   _get_tensor_rank_onnx_unsupportedr   itemsr   opint)r   inputgrid	mode_enumpadding_mode_enum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r7t 	dd| d| dS ||ks?d |v r\| 
d|}| j
d	td
gt| d}	| 
d||	|}t |}t |rq| j
d||||ddS tj||kr| j
d|tj| d}| j
d||||ddS )Nscattersrc)overload_namescatter_addz	`index` (z0) should have the same dimensionality as `src` ()ShapeConstantr   value_tSliceScatterElementsaddaxis_ireduction_sCast)to_i)r   is_caffe2_aten_fallbackatr   JitScalarType
from_value	UNDEFINED_get_tensor_sizeslen_unimplementedr!   torchtensor_maybe_get_scalar	_is_value	onnx_type)
r   selfdimindexr*   src_type	src_sizesindex_sizesadjusted_shapestartsr   r   r   r,   E   sB   

	

r,   zaten::scatter_reducesrG   rH   rI   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g|R ||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noner4   mulminmax)rR   sumprodaminamaxSizer.   Equalr/   r   )dtyper0   If      )n_blocksoutputsReshapeIdentityr3   r5      Squeeze)r   OnnxExporterErrorr!   rB   rC   int64r	   add_op_with_blocksr   _add_output_to_blockblocknodeoutput)r   rG   rH   rI   r*   rP   rQ   reduce_modeonnx_reduce	self_rankself_rank_is_zeroif_op
if_contextelse_context_neg_1self_reshapeindex_reshapesrc_reshapeself_identityindex_identityesrc_identityresultresult_squeezedresult_identityresult_finalr   r   r   scatter_reducex   sZ   

r   )__doc__	functoolsrB   torch.nn.functionalr   r   
torch.onnxr   r   r   r   torch.onnx._internalr   r	   r
   partialonnx_symbolic_onnx_symbolic
parse_argsbeartypeGraphContextr(   r,   _CValuer"   strboolr   r   r   r   r   <module>   sF    0