o
    i                    @  sx6  d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZ ddlZddlm  mZ ddlZddlZddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZm Z  dd	l!m"Z" g d
Z#ej$e j%ddZ&dd Z'dNddZ(ej)dd Z*e&dej)dOddZ+e&dej)dOddZ,e&de-dej)dOdd Z.e&d!e-dej)dOd"d#Z/e&d$ej)dPdOd%d&Z0e&d'ej)dPdOd(d)Z1e&d*ej)dPdOd+d,Z2e&d-ej)dOd.d/Z3e&d0ej)dOd1d2Z4e&d3e5d4d4d4d5ej)dQdOd7d8Z6e5d4d4d9ej)dOd:d;Z7ej)dOd<d=Z8ej)dOd>d?Z9e&d@ej)dOdAdBZ:e&dCej)dOdDdEZ;e&dFej)dOdGdHZ<e&dIej)dOdJdKZ=e&dLe5d4dMej)dOdNdOZ>e&dPe5d4dMej)dOdQdRZ?e&dSej)dOdTdUZ@e&dVej)dOdWdXZAe&dYej)dOdZd[ZBe&d\ej)dOd]d^ZCe&d_e5d4d4d4d`d`ej)dOdadbZDe&dcej)dOdddeZEe&dfej)dOdgdhZFe&diej)dOdjdkZGe&dlej-ddmdndoej)dOdpdqZHe&drej)dOdsdtZIe&duej)dOdvdwZJe&dxej)dOdydzZKe&d{ej)dOd|d}ZLe&d~ej)dOddZMe&dej)dOddZNe&dej)dOddZOe&dej-ddddoej)dOddZPe&dej)dOddZQe-dej)dOddZRej)dOddZSej)dRddZTej)dd ZUe&de'ddgde&de'ddgde&de'ddddgdej)dRdSddZVe&de5d4dMdej)dOddZWe&dej)dOddZXe&dej)dOddZYe&dej)dOdd`ZZe&de-dej)dOddZ[e&de-dej)dOddZ\e&de-dej)dOddZ]e&de-ddej)dOddZ^e&de-de5d4d4dMdd4ej)dOddZ_e&dÃe-de5d4d4d4dMdMdMd4dMdM	ej)dOddńZ`e&dƃej-dddǍej)dPdOddɄZae&dʃe-de5d4dMdMej)dOdd̄Zbe&d̓e5d4dΡej)dOddЄZce&dуe-dej)dOddӄZde&dԃej)dOddքZee&d׃e5d4dMdMdMej)dPdOddلZfe&dڃe5d4d4dMdMej)dPdOdd܄Zge&d݃ej)	dPdOdd߄Zhe&de5d4ddMdMej)dPdOddZie&dej)	dPdOddZje&de5d4dMdMej)dTdOddZke&de-de5d4dMd4ej)dOddZle&dej)dOddZme&dej)dPdOddZne&dej)dOddZoe&dej)dOddZpe&dej)dOddZqej)dOddZre&de-dej)dOddZse&d e-dej)dOddZte&dej)dOddZue&dej)dOddZve&d	ej)dOd
dZwe&de5d4d`d`ej)dOddZxe&de-de5d4d5dej)	dUdVddZye&de5d4dMej)dOddZze&de5d4dMdej)dPdOddZ{e&dej)dOddZ|e&d ej)d!d" Z}e&d#e'd$ej~jjjd%dd&e(d$gde&d'e'd(ej~jjjd)dd&e(d(gde&d*e'd+ej~jjjd,dd&e(d+gdej)d-d. Ze&d/ed0ej~jjjd%dd&Ze&d1ed2ej~jjjd)dd&Ze&d3ed4ej~jjjd,dd&Ze&d5e'd6ej~jjje(d6gde&d7e'd8ej~jjje(d8gde&d9e'd:ej~jjje(d:gdej)d;d< Ze&d=e'd>d?ej~jjje(d>gde&d@e'dAd?ej~jjje(dAgde&dBe'dCd?ej~jjje(dCgde&dDe'dEdFej~jjjee(dEgde&dGe'dHdFej~jjjee(dHgde&dIe'dJdFej~jjjee(dJgdej)dPdKdLZej)dWdOdPZej)dQdR Ze&dSej)dOdTdUZej)dXdWdXZe&dYe&dZe&d[ej)dOd\d]Ze&d^e&d_e&d`ej)dOdadbZe&dcej)dYdfdVZe&dge'dhd,die(dhgde&dje'dkdldie(dkgde&dme'dndodie(dngde&dpe'dqd,dre(dqgde&dse'dtdldre(dtgde&due'dvdodre(dvgdej)dZdxdyZe&dzej)dOd{d|Ze&d}ej)dOd~dZe&dej)dd Zej)dd Zej)d[ddZe&dej)dOddZe&de-ddej)dOddZe&de-ddeej)dOddZe&de-ddej)dOddZej)dOddZe&de-ddej)dOddZej)dOddZe&de-ddeej)dOddZe&de-ddeej)dOddZe&dej)dOddZe&dej)dOddZe&dej)dOddZe&dedej)dOddZe&dedej)dOddZe&dedej)dOddZe&dej)dOddZe&dej)dOddZe&dej)dOddZe&de5d4d4d4dMej)d\dOddZe&de5d4dMdej)dPdOdÐdĄZe&dŃe5d4dMdMej)dOdƐdǄZe&dȃe5d4d4d4ddddMddMdMdMdMdMej)	dPdOdɐdʄZe&d˃e5d4d4d4dd9ddMej)dOd̐d̈́Ze&d΃e5d4d4d4ddddMddM	ej)dOdϐdЄZe&dуe5d4d4d4dd4ddMej)dOdҐdӄZe&dԃe5d4d4d4dd4ddMej)dOdՐdքZe&d׃e5d4d4d4dd4ddMej)dOdؐdلZe&dڃe5d4d4d4ddddMdΡej)dOdېd܄Ze&d݃e5d4d4d4ddddMdΡej)dOdސd߄Ze&de5d4d4d4ddddMdΡej)dOddZe&de5d4d4d4d4d4dMd5d5dM	ej)dOddZe&de-dddde5d4dd4d4d5ej)d]ddZe&de-dddde5d4dd4d4d5dej)d^ddZe&de5d4d4d4d4d4dd5d5d	ej)d_ddZe&de5d4dMdMdMej)dOddZe&de-de5d4d`d`d`ej)dOddZe&d e-dej)dOddZe&de5d4dMd4ej)dOddZe&dej)dOddZe&d	ej)dOd
dZe&dej)dOddZe&de5d4d4ddej)	d`dOddZe&dej)dOddZe&de5d4d4dMd5ej)dOddZe&dej)dOddZe&dej)dOddZe&dej)dOdd Ze&d!ej)dOd"d#Ze&d$ej)dOd%d&Ze&d'ej)dOd(d)Ze&d*ej)dOd+d,Ze&d-ej)dOd.d/Ze&d0e5d4d4ej)dOd1d2Ze&d3e5d4d4ej)dOd4d5Ze&d6ej)dadOd7d8Ze&d9e-ddej)dOd:d;Ze&d<ej)dadOd=d>Ze&d?e-ddej)dOd@dAZe&dBe-de5d4ddMej)dOdCdDZe&dEe-de5d4ddMej)dOdFdGZe&dHe-de5d4d4dMej)dOdIdJZe&dKej)dOdLdMZe&dNe&dOe5d4d5dMej)dOdPdQZe&dRe'dRgde&dSe'dSgde&dTe'dTgde&dUe'dUgde&dVe'dVgde&dWe'dWgdej)dNdXdYZe&dZe5d4d`ddMd4ej)dPdOd[d\Ze&d]e5d4d4d4dMej)dOd^d_Ze&d`e5d4dMdMej)dOdadbZe&dce5d4dMdMdMej)dOdddeZe&dfeېdgdhdiej)dOdjdkZe&dleېdgdhdiej)dOdmdnZe&doeېdgdhdiej)dOdpdqZe&dreېdgdhdiej)dOdsdtZe&dueېdgdhdiej)dOdvdwZe&dxeېdgdhdiej)dOdydzZe&d{eېdgdhdiej)dOd|d}Ze&d~eېdgdhdiej)dOddZe&deېdgdhdiej)dOddZe&de5d4dMd4d4d4d4ej)		dbdOddZe&de5d4dMd4d4d4d4ej)					dcdOddZe&dej)	dUdOddZe&dej)dOddZe&dej)	dddOddZe&dej)dadOddZe&de5d4dMd4d4d4ej)dUdOddZe&de5d4dMd4d4d4d4ej)					dcdOddZe&dej)	dUdOddZe&dej)dOddZe&de5d4dMd4d4d4ej)dUdOddZe&de5d4dMd4d4d4d4ej)					dcdOddZe&dej)	dUdOddZe&dej)	dUdOddZe&dej)					dcdOddZe&dej)	dUdOddZe&dej)dOddZe&dej)dOddZe&de-de5d4d5d5ej)deddZe&de-de5d4ej)dOddZe&dÃej-ddddoe5d4ej)dOdĐdńZe&dƃe5d4ej)dOdǐdȄZe&dɃe5d4d5ej)dOdʐd˄Ze&d̃e5d4d5ej)dOd͐d΄Ze&dσej)dOdАdфZe&d҃e5d4dMej)dOdӐdԄZe&dՃe5d4dMdMdej)dPdOd֐dׄZe&d؃ej)dOdِdڄZ e&dۃe5d4dMdMdMdMdej)dPdOdܐd݄Ze&dރej)dOdߐdZe&dej)dOddZe&dej)dOddZe&dej)	dadOddZe&de5d4dMej)dOddZe&de5d4dMej)dOddZej)		dadOddZe5d4d4d4dMdMd5dMdMdM	ej)dOddZ	e5d4d4d4d4dMdMd5dMdM	ej)dOddZ
e&dej)dOddZe&dej)dOddZe&de'de(dgde&de'd e(dgde&de'de(dgddfddZe&de5d4dMej)dOd	d
Ze&dej)dOddZe&de5d4dMej)dOddZe&de5d4d4dMej)dOddZe&de5d4d4dMd`d4ej)dOddZe&dej)dOddZe&dej)dOddZe&dej)dOddZe&d ej)dOd!d"Ze&d#ej)				dgdOd$d%Ze&d&ej)				dgdOd'd(Ze&d)e5d4d5d5dMdej)dOd*d+Ze&d,ej)d\dOd-d.Ze&d/e5d4ej)dOd0d1Ze&d2e5d4ej)dOd3d4Ze&d5e-ddde5d4dMdMej)dOd6d7Ze&d8e5d4ej)dOd9d:Ze&d;ej)dPdOd<d=Ze&d>e5d4ej)dOd?d@Z e&dAej)dOdBdCZ!e&dDej)dOdEdFZ"e&dGe5d4dMdMdMej)dOdHdIZ#e&dJe5d4d4dej)dhdMdNZ$e&dOe5d4d4dej)dhdPdQZ%e&dRe5d4dMd4d4ej)dOdSdTZ&e&dUe5d4dMd4d4ej)dOdVdWZ'e&dXej)dOdYdZZ(e&d[ej)dOd\d]Z)e&d^ej)dOd_d`Z*e&daeej)dOdbdcZ+e&ddej)dOdedfZ,e&dge5d4dMd4d4ej)dUdOdhdiZ-e5d4ddMdMej)dOdjdkZ.e&dlej)dOdmdnZ/e&doej)dOdpdqZ0e&drej)dOdsdtZ1e&duej)dOdvdwZ2e&dxe5d4ddMej)dOdydzZ3e&d{ej)dOd|d}Z4e&d~ej)dOddZ5e&dej)dOddZ6e&dej)dOddZ7e&dej)dOddZ8e&dej)dOddZ9e&de5d4d4ddd4ej)diddZ:e&de5d4d5ddd4ej)djddZ;e&de5d4d4ddd4ej)dkddZ<e&de5d4d4dMej)dldOddZ=e&de5d4ddej)dmdOddZ>e&de5d4dMdd4ej)	dbdOddZ?e&dej)dOddZ@e&de5d4d9ej)dPdnddZAe&dej)dOddZBe&de5d4d9ej)dodpddZCe&de-dddde5d4dMd4d4d5dMej)dOddZDe&de5d4d4dMej)dOddZEe&dej)dOddMZFe&dej)dOddZGe&dej)dOddZHe&dej)dOddÄZIe&dăej)dOdŐdƄZJej)dOdǐdȄZKej)dOdɐdʄZLe&d˃e5d4d4dMdej)dOd̐d̈́ZMe&d΃e5d4d4dMej)dOdϐdЄZNe&dуe-de5d4d4ddMej)dPdOdҐdӄZOe&dԃej)dOdՐdքZPe&d׃ej)dOdؐdلZQe&dڃej)dOdېdrZRe&d܃e5d4ddMd4d4d4d4ej)						dqdrdސd߄ZSe&dej)dOddZTe&dej)dOddZUe&de5d4d`d`ej)dOddZVe&de5d4d4ej)dOddZWe&dej)dPdOddZXe&de5d4ddΡej)dOddZYe&de5d4d4dMej)dPdOddZZe&dej)		dsdOddZ[e&dej)dOddZ\e&dej)dOddZ]e&d dPdOddZ^e&dej)dOddZ_e&dej)dOddZ`e&d	ej)dOd
dZae&dej)dOddZbe&dej)dPdOddZce&dej)dOddZde&ddOddZee&dej)dOddZfe&dej)dtddZge&dej)dOd d!Zhe&d"ej)dOd#d$Zie&d%ej)dOd&d'Zje&d(ej)dOd)d*Zke&d+ej)dOd,d-Zle&d.ej)dud0d1Zme&d2ej)dvd4d5Zne&d6ej)dvd7d8Zoe&d9ej)dOd:d;Zpe&d<ej)dwd>d?Zqe&d@ej)dOdAdBZre&dCe&dDej)dxdEdFZse&dGe&dHej)dxdIdJZte&dKej)dydLdMZudS (z  zhThis file exports ONNX ops for opset 9.

Opset 9 is supported by ONNX release 1.4.1
release on 01/23/19
    )annotationsN)CallableListOptionalSequenceTupleUnion)_C)
_constants_deprecation_type_utilserrorssymbolic_helper)GLOBALS)	_beartype	jit_utilsregistration)Number(  absacosaddaddcmuladdmmaliasamaxaminaminmaxarangeargmaxargmin
as_strided	as_tensorasinatanatan2baddbmm
batch_norm	bernoullibitwise_not
bitwise_orbmmbroadcast_tensorsbroadcast_to	bucketizecatcdistceil	clamp_max	clamp_minclampcloneconstant_pad_nd
contiguousconv_tbcconv_transpose1dconv_transpose2dconv_transpose3dconv1dconv2dconv3dconvert_element_typeconvolutioncoscosine_similaritycrosscumsumdetachdimdivdotdropouteluembedding_bag	embedding
empty_likeemptyeqerfexp	expand_asexpandeyefillflattenfloor_dividefloorfloordivfrobenius_norm	full_likefullgathergegeluget_pool_ceil_paddingglu
group_normgthann_window
hardshrinkhardsigmoid	hardswishhardtanh	index_add
index_copy
index_fill	index_putindex_selectindexinstance_normis_floating_point	is_pinnedisnanitemkl_div
layer_normle
leaky_relulerpliftlinalg_crosslinalg_matrix_normlinalg_normlinalg_vector_normlinearlinspacelog_sigmoidlog_softmaxloglog10log1plog2logical_andlogical_not
logical_orlogical_xorlogit	logsumexp	lstm_celllstmltmasked_fillmasked_fill_matmulmax_pool1d_with_indicesmax_pool2d_with_indicesmax_pool3d_with_indicesmaxmaximummeshgridminminimummishmmmovedimmse_lossmulmultinomialmvnarrownative_layer_normneneg	new_emptynew_fullnew_ones	new_zerosnonzero_numpynonzeronormnumelnumpy_Tone_hot	ones_likeonesonnx_placeholderoverload_by_arg_countpadpairwise_distancepermutepixel_shufflepixel_unshufflepowpreluprim_constant_chunkprim_constant_splitprim_constant	prim_dataprim_device
prim_dtypeprim_ifprim_layoutprim_list_constructprim_list_unpack	prim_loopprim_maxprim_min
prim_shapeprim_tolistprim_tuple_construct	prim_typeprim_unchecked_castprim_uninitialized	rand_likerandrandint_likerandint
randn_likerandn
reciprocalreflection_padrelurelu6	remainderrepeat_interleaverepeatreplication_pad
reshape_asreshaperollrrelursqrtrsubscalar_tensorscatter_addscatterselectselusigmoidsignsilusinsizeslicesoftmaxsoftplus
softshrinksortsplit_with_sizessplitsqrtsquaresqueezestackstd_meanstdsubttaketantanh
tanhshrinktensor	thresholdtotopk	transposetrue_dividetype_asunbindunfoldunsafe_chunkunsafe_split_with_sizesunsafe_split	unsqueezeunsupported_complex_operatorsnoop_complex_operatorsunusedvar_meanvarview_asviewwherewrap_logical_op_with_cast_towrap_logical_op_with_negation
zeros_likezeroszero	   )opsetc                    s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                   s   |  i S N fnargskwargsr  i/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/torch/onnx/symbolic_opset9.py_apply+  s   z_apply_params.<locals>._applyr  )r  r  r!  r  r  r   _apply_params(  s   r"  namestrc                       fdd}|S )z5Exports the function in the current global namespace.c                   s   | t   < t  | S r  )globals__all__appendfuncr#  r  r   wrapper4  s   

z_export.<locals>.wrapperr  )r#  r,  r  r+  r   _export1  s   r-  c                 C  s   |  d}|tj  |S )z%Represents "missing" optional inputs.prim::Constant)opsetTyper	   OptionalTypeZofTensor)gnr  r  r   r  <  s   
r  zaten::_shape_as_tensorr2  jit_utils.GraphContextc                 C     |  d|S NShaper/  r2  inputr  r  r   _shape_as_tensorD     r;  zaten::_reshape_from_tensorc                 C  s.   t |tr| jdg|R ddi}t| ||S )NConcataxis_ir   )
isinstancelistr/  r   )r2  r:  shaper  r  r   _reshape_from_tensorJ  s   
rB  zaten::reshapeTc                 C  s   t | ||S r  )r   _reshape_helperr2  selfrA  r  r  r   r   R     r   zaten::reshape_asc                 C     |  d|}t| ||S r6  r/  r   r2  rE  otherrA  r  r  r   r   Y     r   z	aten::addc                 C  sZ   t |rt |rt dddd|S |r&t t |dkr&| d||}| d||S )NAddr     z)Add between list of tensors not supported   Mul)r   	_is_value_is_tensor_list _onnx_opset_unsupported_detailed_scalar_maybe_get_scalarr/  r2  rE  rJ  alphar  r  r   r   a  s   
r   z	aten::subc                 C  s4   |rt t |dkr| d||}| d||S )NrN  rO  Sub)r   rS  rT  r/  rU  r  r  r   r   m  s   r   z
aten::rsubc                 C  s   t | |||dS )N)rV  )r   rU  r  r  r   r   u  s   r   z	aten::mulc                 C  s0   t |rt |r| d||S | d||S )NAndrO  )r   _is_boolr/  r2  rE  rJ  r  r  r   r   {  s   r   z	aten::divc                 G  s,   t |dkrt| ||S t| ||g|R  S Nr   )lenr  _div_rounding_mode)r2  rE  rJ  r  r  r  r   rF     s   rF   zaten::addcmulvf      ?c              	   C  s2   | j dt|gd}t| |t| t| |||S NConstantZvalue_t)r/  torchr   r   r   )r2  rE  Ztensor1Ztensor2valueZ
value_tensr  r  r   r     s   r   sc                 C  sP   |d u r
t | ||S |dkrt| ||S |dkrt| ||S td| d|)NrW   trunczUnsupported rounding mode: "z$". Expected None, "floor" or "trunc")r  _floor_divide_trunc_divider   SymbolicValueError)r2  rE  rJ  Zrounding_moder  r  r   r]    s   
r]  c                 C  s   |  d||}| j d|tjjd}tj|tjj}|tjjkrBt	|s6t	|r6| j d|tjj
d}|S | j d|| d}|S | j d|tjj
d}|S )NDivCastZto_i)r/  _C_onnxTensorProtoDataTypeINT64r   JitScalarType
from_value	UNDEFINEDr   _is_fpFLOAT	onnx_type)r2  rE  rJ  outscalar_typer  r  r   ri    s"   	ri  c                 C  s   t |s
t |rt| ||}| d|S | d||}| jdtjdtjdd}| dt | ||t | ||}| d|| d	||}| d
|| d| d||}| jdtjdtjdd}	| d	||	}
| d||
S )NFloorrk  rb  r   dtyperc  XorrW  rO  rX  NotEqualrN  )r   rt  r  r/  rd  r   int64Z
_lt_helper)r2  rE  rJ  rw  rF   r  negativemodZ
fixup_maskonefixupr  r  r   rh    s    rh  zaten::floor_dividec                 C     t | ||S r  )ri  rZ  r  r  r   rV        rV   zaten::floordivc                 C  r  r  )rV   rZ  r  r  r   rX     r<  rX   zaten::true_dividec                 C  s   t |s
t |r| d||S t }tjj}|tju s%|tj	u s%J t tj	u r0tjj
}| jd||d}| jd||d}| d||S )a  Division where both inputs are cast to floating types

    If both inputs are floating, performs div as usual
    If only one input is a floating type, the other input is cast to its type
    If neither input is a floating type, both inputs are cast to the default scalar type
    rk  rl  rm  )r   rt  r/  rd  get_default_dtypern  ro  ru  floatdoubleDOUBLE)r2  rE  rJ  rx  Zonnx_scalar_typer  r  r   r    s   r  zaten::reciprocalc                 C  s*   t |s| jd|tjjd}| d|S )Nrl  rm  
Reciprocal)r   rt  r/  rn  ro  ru  r2  rE  r  r  r   r   	  s   
r   z	aten::catic                   s   t |}g  |D ]}t |rt |dsq	 | q	t dks%J t fdd D s2J |    D ]	}| 	| q:t |}| j
dg|R d|iS )Nr   c                 3  sH    | ]}t  d  du pt |du pt |t  d  kV  qdS r   N)r   _get_tensor_rank.0r   Znonempty_tensorsr  r   	<genexpr>"  s    
zcat.<locals>.<genexpr>r=  r>  )r   _unpack_list_is_constant_get_tensor_dim_sizer(  r\  allnodeZremoveAllInputsZaddInputr/  )r2  tensor_listrE   tensorsr   r  r  r   r.     s"   

r.   zaten::stackc                   s2    fddt |D }jdg|R d iS )Nc                      g | ]
}t | gqS r  r   _unsqueeze_helperr  rE   r2  r  r   
<listcomp>5      zstack.<locals>.<listcomp>r=  r>  )r   r  r/  )r2  r  rE   Z
unsqueezedr  r  r   r   1  s   r   z
aten::listc                 C     |S r  r  r  r  r  r   _list<     r  zaten::mmc                 C  s,   | j dtdgd}| j d|||dddS )Nrb  rN  rc  Gemm        r`  Zbeta_falpha_fr/  rd  r   )r2  rE  rJ  Cr  r  r   r   B  s   r   z	aten::bmmc                 C     |  d||S NMatMulr8  rZ  r  r  r   r*   K     r*   zaten::matmulc                 C  r  r  r8  rZ  r  r  r   r   Q  r  r   zaten::addmmr   c              	   C  sB  d }t |}t |}t |}	|d ur|}n|d ur|}n|	d ur%|	}t |}
t |}dd }|d ur||
dsA||dr| d||}|}t |}t |}|dkrm| jdtj|| dd}| d	||}|dkr| jdtjt || dd}| d	||}| d
||S | jd|||t |t |dS )Nc                 S  s   | d uo| |kS r  r  )r^  ur  r  r   is_not_none_nori  s   zaddmm.<locals>.is_not_none_nor   r  rN  rb  rz  rc  rO  rL  r  r  )r   _try_get_scalar_typer  r/  rS  rd  r   r{  )r2  rE  Zmat1Zmat2betarV  rx  self_scalar_typeZmat1_scalar_typeZmat2_scalar_typeZ	mat1_rankZ	mat2_rankr  Zres1Zres2r  r  r   r   W  sX   






r   z	aten::negc                 C  r5  )NZNegr8  r  r  r  r   r     r<  r   z
aten::sqrtc                 C  sT   t j|t jjt jjt jjt jjt jjt jjhv r$| j	d|t
jjd}| 	d|S )Nrl  rm  Sqrt)r   rq  rr  rs  UINT8INT8INT16INTrp  r/  rn  ro  ru  r  r  r  r   r     s   
r   zaten::rsqrtc                 C  s"   |  dttd|t| |S )Nrk  rN  )r/  r   _if_scalar_type_asrd  r   r   r  r  r  r   r     s   r   z
aten::tanhg      ?   )scaleZ
zero_pointc                 C  r5  )NTanhr8  r  r  r  r   r        r   z	aten::sinc                 C  r5  )NZSinr8  r  r  r  r   r     r<  r   z	aten::cosc                 C  r5  )NZCosr8  r  r  r  r   r@     r<  r@   z	aten::tanc                 C  r5  )NZTanr8  r  r  r  r   r     r<  r   z
aten::asinc                 C  r5  )NZAsinr8  r  r  r  r   r"     r<  r"   z
aten::acosc                 C  r5  )NZAcosr8  r  r  r  r   r     r<  r   z
aten::atanc                 C  r5  )NAtanr8  r  r  r  r   r#     r<  r#   zaten::atan2c              
   C  s   |  d||}|  d|}| j dtdd}| j dttjd}|  d||}|  d||  d|||  d	||}|  d
||}	|  d|	||}
|
S )Nrk  r  rb  r   rc  GreaterWhererL  rW  Less)r/  rd  r   mathpi)r2  rE  rJ  sloper#   Z
const_zeroZconst_piZ"condition_second_or_third_quadrantZsecond_third_quadrantZcondition_14_or_23_quadrantresultr  r  r   r$     s   r$   zaten::sigmoidg      p?c                 C  r5  )NSigmoidr8  r  r  r  r   r     r  r   z
aten::signc                 C  r5  )NZSignr8  r  r  r  r   r     r<  r   c                 C  sR   t |t |ks
J t |dkr|d dkr|d tjkr|S | jd||||dS )NrN  r   Slice)axes_iZstarts_iZends_i)r\  r
   	INT64_MAXr/  )r2  r:  axesstartsendsr  r  r   _slice   s   &r  c                 C  sL   t j|t jj}|t jjkr$t|s$|t jjkr$| jd|tj	jd}|S Nrl  rm  )
r   rq  rr  rs  r   rt  rp  r/  rn  ro  r2  rE  rx  r  r  r   _maybe_cast_reduce_op_input	  s   r  c                   s   t jd fdd	}|S )Nc                   st   t | |}|d u s|t krt| |S  rdnd}t||dt|dd}} r.|n|g}| j|||dS )Nisr  rE   keepdimr  
keepdims_i)r  tupler   Z_handle_reduce_dim_none
_get_constr/  )r2  rE  rE   r  ZdescZdim_listallow_multi_dim_supportonnx_op_namer  r   symbolic  s   
z%_reduce_op_symbolic.<locals>.symbolicNN)r   beartype)r  r  r  r  r  r   _reduce_op_symbolic  s   r  c                   s    t  tj fdd}|S )Nc                   sd    | g|R  }|D ]}|j }t|t|kr!|| g|R    S q
td j dt| dS )Nzaten::with 
 arguments)Z_arg_descriptorsr\  r   _unimplemented__name__)r2  r  Z	overloadsoverloadZarg_descriptorsr  r  r   r,  1  s   z&overload_by_arg_count.<locals>.wrapper)	functoolswrapsr   r  )r  r,  r  r  r   r   /  s   
r   z	aten::sumZ	ReduceSumsum)Zdecoratez
aten::mean
ReduceMeanmeanz
aten::prod
ReduceProdprodFr  onnx_opr  boolc                   s$   t |  dt fdd}|S )Nr  c                   s`   t dt ddfdd} rdnd}t dt d|ddfdd	}||fS )
NTr^  nonec                   s   d }|   dkr!t|dd}t| }| jd||d}n|   dkr0t d|S | |}|d urMtj	| }||krM| jd||d}|S Nonnx::Constantr  r{  rl  rm  r.  
r  kindr   r  r   rq  rv  r/  r  rr  )r2  rE  r{  
dtype_onnxr  result_dtype_onnxr#  r  r  r   reduce_nodimO  s"   
z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr  r  c                   s   d }|   dkr!t|dd}t| }| jd||d}n|   dkr0t d|S | |||}|d urOtj	| }||krO| jd||d}|S r  r  )r2  rE  rE   r  r{  r  r  r  r  r  r   
reduce_dimd  s"   z6_reduce_with_dtype.<locals>.reduce.<locals>.reduce_dim)r   quantized_args
parse_args)r2  r  r  r  Zdim_descr  r  r#  r  r  r   reduceM  s   
z"_reduce_with_dtype.<locals>.reduce)r  r   )r  r#  r  r  r  r  r   _reduce_with_dtype@  s   	+r  zaten::cumsumr  c                 C  sJ   t  r|  dkrt dd|S | jd||dS t ddd| d S )Nr.  rC   r{  dim_ir  rM  )r   is_caffe2_aten_fallbackr  r  r  at_onnx_opset_unsupported)r2  r:  rE   r{  r  r  r   rC   |  s
   rC   zaten::_sample_dirichletc                 C  8   t  rt |st dd|S | d|S t d|S )N_sample_dirichletz#We are not able to export generatorr   r  _is_noner  r  _onnx_unsupportedr2  rE  	generatorr  r  r   r    s   
r  zaten::_standard_gammac                 C  r   )N_standard_gammaznot able to export generatorr  r  r  r  r   r    s   
r  zaten::tc                 C  s6   t |}|d u s|dk r| d|S | jd|ddS )Nr  Identity	Transpose)rN  r   Zperm_i)r   r  r/  )r2  rE  rankr  r  r   r     s   
zaten::numpy_Tc                 C  s8   t |}|d usJ tttd|}| jd||dS Nr   r	  r
  )r   r  r@  reversedranger/  )r2  r:  ndimpermr  r  r   r     s   
r   zaten::expandc              	   C  s   t |d}t |s| jdt|d}nt |r/t | t| |d| jdt	dgd}t
jj}t| ||}t| || jdt	dd}t| | d||||}| d||S Nr  rb  rc  r   r~  Expandr   _maybe_get_constrP  r/  rd  
LongTensor_is_packed_listrC  r   r   r   rq  rp  r   r   r  )r2  rE  r   Zimplicitr{  r   neg_onesr  r  r   rR        

 rR   zaten::broadcast_toc              	   C  s   t |d}t |s| jdt|d}nt |r/t | t| |d| jdt	dgd}t
jj}t| ||}t| || jdt	dd}t| | d||||}| d||S r  r  )r2  rE  r   r{  r   r  r  r  r   r,     r  r,   zaten::expand_asc                 C  s   t |d}t|tjrC|j}|tj}g }t|	 D ]%}t
|||||rB|| | jd|j|dd|d}q| d|}| d||S )Nr   rb  T)r  rc  r7  r  )r   r  r?  rd  Tensorr{  r   r  r  rE   equalr  r	  rQ   r(  r/  )r2  rE  rJ  Zself_t	orig_typedimsdrA  r  r  r   rQ     s   
rQ   zaten::embeddingbc                 C  s<   |rt jrtd||dkrt jrtd | d||S )NzUnsupported: ONNX export of embedding with scale_grad_by_freq=True for training mode. ONNX does not support scaling the gradients.r   zWarning: ONNX export of embedding with padding_idx >= 0 for training mode. ONNX does not support not updating the embedding vector at padding_idx during training.Gather)r   Zexport_trainingr   rj  warningswarnr/  )r2  weightindicespadding_idxscale_grad_by_freqsparser  r  r   rK     s   
rK   zaten::embedding_bagc
           
      C  sF   t |s
t dS t  r| jd|||d|||||	d
S t d|S )Nz%embedding_bag with per_sample_weightsrJ      )outputsZscale_grad_by_freq_iZmode_iZsparse_iZinclude_last_offset_iZpadding_idx_i)r   r  r  r  r  )
r2  Zembedding_matrixr$  offsetsr&  moder'  Zper_sample_weightsZinclude_last_offsetr%  r  r  r   rJ     s$   
rJ   z
aten::size)Zquantize_outputc                 C  sh   |d u r
|  d|S t|ddk r-t|}|d ur-t|d| }| j dt|d}t| ||S )Nr7  r  r   rb  rc  )r/  r   r  r  rd  r   Z_size_helperr2  rE  rE   r  r  r  r   r   6  s   
r   zaten::transposec                 C  s|   ||kr|S t |}|d ur*tt|}|| || ||< ||< | jd||dS t  r8| jd|d||dS td|)Nr	  r
  r  int)overload_nameZdim0_iZdim1_izAUnsupported: ONNX export of transpose for tensor of unknown rank.)	r   r  r@  r  r/  r  r  r   rj  )r2  rE  Zdim0Zdim1r  r  r  r  r   r  D  s   
r  zaten::permuter  c                 C  s*   |t tdt|kr|S | jd||dS r  )r@  r  r\  r/  )r2  rE  r  r  r  r   r   ]  s   r   z
aten::viewc                 C  r  r  )r   )r2  rE  r   r  r  r   r  f  r  r  zaten::view_asc                 C  rG  r6  rH  rI  r  r  r   r  m  s   r  zaten::unsafe_chunkc           	      C  s   |d u rt dddd|S t ||}|d u rt dd|S || d | }|g||  }|| }|r8|| | jd||||dS )	Nr  r  rM  'Dynamic number of outputs not supportedunknown dimension sizerN  SplitZsplit_ir>  r)  )r   rR  r  r  r(  r/  )	r2  rE  chunksrE   _outputsr   
split_sizesplitsleftoverr  r  r   r  t  s   

r  zaten::splitc           
      C  s   t ||st dddd|S t | d}| dkr%t| ||||S t |dd}t ||}|d u rH|d ur?|| }n	t dddd	|S |g||  }|| }	|	rZ|	|	 | j
d
||||dS )Nr   r  rM  r/  re  r   r  r5  z$Unknown dimension size not supportedr1  r2  )r   _is_split_staticrR  	_node_getr  rE   r   r  r  r(  r/  )
r2  rE  split_size_or_sizesrE   r4  Z	split_valr5  r   r6  r7  r  r  r   r     s(   



r   zaten::unsafe_splitc                 C     t | ||||S r  )r   )r2  rE  r:  rE   r4  r  r  r   r       r  zaten::split_with_sizesc                 C  s2   t ||st dddd|S | jd||||dS )Nr   r  rM  r/  r1  r2  )r   r8  rR  r/  r2  rE  Zsplit_sizesrE   r4  r  r  r   r     s
   
r   zaten::unsafe_split_with_sizesc                 C  r;  r  )r   r=  r  r  r   r    r<  r  zaten::unbindc                   s^   |d u rt dddd|S jd|dg|  |d}|dkr!|gn|} fdd	|D }|S )
Nr  r  rM  r/  r1  rN  r2  c                   r  r  )r   _squeeze_helper)r  rw  r  r  r   r    s    zunbind.<locals>.<listcomp>)r   rR  r/  )r2  rE  rE   r4  r)  Zsqueezed_outputsr  r  r   r    s   
r  zaten::selectc                 C  sp   t |}t |s/|dk r/|dkrtj}n|d }t j| ||g|g|gd}t | ||gS | jd|||dS )Nr   r  rN  r  r  r  r   r>  )r   rT  rP  r
   r  _slice_helperr>  r/  )r2  rE  rE   rm   Z	end_indexZ
slice_noder  r  r   r     s   
r   zaten::squarec                 C  s   |  d||S NrO  r8  r  r  r  r   r     r  r   zaten::squeezec                 C  sH  |d u r
|  d|S t|dd}|dk rCt|}|d ur<tdt| d d d t||  d	 d
  ||7 }ntdd|S t||}|d u rotdt| d d t| d d d d  tj	| ||gdS |dkrtdt| d d t| d d d d  |S tdt| d d  tj	| ||gdS )NZSqueezer  rE   r   z'ONNX export squeeze with negative axis - might cause the onnx model to be incorrect. (Negative axis is not supported in ONNX. Axis is converted to & based on input shape at export time. CPassing an tensor of different rank in execution will be incorrect.r   %negative axis with unknown input rankz5This model contains a squeeze operation on dimension z on an input z7with unknown shape. Note that if the size of dimension z of the input zVis not 1, the ONNX model will return an error. Opset version 11 supports squeezing on zMnon-singleton dimensions, it is recommended to export this model using opset zversion 11 or higher.r  rN  z. The size of z%this dimension in the given input is z. The model will zWbe exported without the squeeze node. If the model is intended to be used with dynamic z-input shapes, please use opset version 11 to zexport the model.z. If the model is z_intended to be used with dynamic input shapes, please use opset version 11 to export the model.)
r/  r   r  r  r!  r"  r$  r  r  r>  )r2  rE  rE   Zsqueeze_dimr  dim_sizer  r  r   r     s   



r   zaten::preluc              	   C  s   t |}t |}t|}|d ur8|dkr%t | |ttd|d }n|dkr8|dgkr8t | |dg}d}|d urN|d urN||ksNJ d| d| | d||S )Nr  rN  r   z)rank(x) should be >= rank(slope) but got z < PRelu)	r   r  _get_tensor_sizesr\  r  r@  r  r>  r/  )r2  rE  r#  	self_rankZweight_sizesZweight_rankr  r  r   r   +  s    


r   z
aten::siluc                 C  s   |  d||  d|S )NrO  r  r8  r9  r  r  r   r   C  s   r   z
aten::mishc                 C  s   |  d||  d|  d|S )NrO  r  Softplusr8  r9  r  r  r   r   I  s   r   c              
   O  s  | dd}| dtjj}t|}tj|d }t|d  o*|du p*tj	|k }|rq|D ]#}	|	
 rRtj|	}
|
|krRtd| d|  d|
  |	q/t|D ]\}}	|	
 rpt|	sp| jd|	| d	||< qW| j|g|R i |}|r| jd|| d	}|S )
a  Some PyTorch operators (e.g., Clip/Min/ReLU/Pad) are super set of ONNX in terms of data types.
    This function maximizes the exportability of PyTorch-ONNX by allowing ONNX-unsupported PyTorch
    operator data type. For example, `Cast<int>(Clip<float>(Cast<float>(INPUT)))` can be used to mimic
    `Clip<int>(INPUT)` (opset version < 12).

    Args:
        g (torch._C.Graph): graph to write the ONNX representation into.
        op_name (str): operator name in ONNX.
        *args (tuple): operands to the operator.
        **kwargs (dict): attributes to the operator along with "opset_before" (optional, None by default)
            indicating the smallest opset version to trigger such casting behavior and "target_float_t"
            (optional, torch.onnx.JitScalarType.FLOAT by default) indicating the data type of internal operator.

    Returns:
        Optional[torch._C.Value, Tuple[torch._C.Value, ...]]: output(s) of the operator.
    opset_beforeNtarget_float_tr   z
Inputs of z must have same dtype.Got z and rl  rm  )popr   rq  ru  r@  rr  r   rt  r   export_onnx_opset_versionZisCompleteTensorr   rj  Zscalar_name	enumerater/  rv  )r2  Zop_namer  r  rO  rP  inputsZdtype_0Zrequire_castr:  Zinput_scalar_typer  rE  r  r  r   _op_with_optional_float_castO  sB   
rU  z
aten::reluc                 C  s   t | d|ddS )NRelu   rO  rU  r9  r  r  r   r     s   r   zaten::relu6c                 C  s   t | |ddS )Nr      )r3   r9  r  r  r   r     rF  r   z
aten::ceilc                 C  r5  )NCeilr8  r9  r  r  r   r0     r<  r0   zaten::floorc                 C  r5  )Nry  r8  r9  r  r  r   rW     r<  rW   z	aten::lenc                 C  s.   t | || jdtdgd}t| |dgS Nrb  r   rc  )r   r/  rd  r  r   r>  )r2  rE  Zsz_0r  r  r   _len  s   r]  zaten::thresholdc                 C  sD   t |dkrt dd|S t |dkrt dd|S | d|S )Nr   r   znon-zero thresholdznon-zero valuerV  )r   rS  r  r/  )r2  rE  r   re  r  r  r   r     s
   r   zaten::leaky_relur:  _C.Valuenegative_sloper  inplacec                 C  s   | j d||dS )N	LeakyRelur  r8  )r2  r:  r_  r`  r  r  r   rv     s   rv   z	aten::gluc                 C  sP   t ||}|d ur|d dksJ | jd||dd\}}| d|| d|S )Nr  r   r1  )r>  r)  rO  r  )r   r  r/  )r2  r:  rE   rJ  firstsecondr  r  r   r`     s
   r`   zaten::softmaxc              
   C  s^  t |}|d urj|dk r|| }||d k}|r8tt|}|d || ||< |d< | jd||d}|d }| jd||d}|r^|  dkr^t |d	d
}| jd|t	|
 d}|rh| jd||d}|S | d|| jd||gdd}| d|}	t j| |	|gd}
| d|	|
}|r|  dkrt |d	d
}| jd|t	|
 d}|S )Nr   rN  r  r	  r
  ZSoftmaxr@  r.  r  r{  rl  rm  rW  	ReduceMaxr  ExprI  rk  )r   r  r@  r  r/  r  r  r  r   rq  rv  _reducesum_helper)r2  r:  rE   r{  	input_dimis_transpose_requiredr  r   parsed_dtyperP   r  r  r  r   r     s>   
r   zaten::softplusc                 C  s@   t |d}|dkr| d| d| d|||S | d|S )Nr_  rN  rk  rN  rO  )r   r  r/  )r2  rE  r  r   Z
beta_constr  r  r   r     s    r   zaten::get_pool_ceil_paddingc                   s   t | }|d ur|t d  nd d u s!tdd D r(t dd| S fddtdtD   fddtdt D   fd	dtdtD fd
dtdtD S )Nc                 s      | ]}|d u V  qd S r  r  r  r  r  r  r   r        z(get_pool_ceil_padding.<locals>.<genexpr>r_   input size not accessiblec              	     sB   g | ]}t t | d |   |  t|  d qS r  rN  )r-  r  r0   r  rl  )rE   kernel_sizepaddingstrider  r   r     s    0z)get_pool_ceil_padding.<locals>.<listcomp>r   c                   sD   g | ]} | d  |  | |  kr | d  n | qS rN  r  rl  )ceiled_output_dimrE   rq  rr  r  r   r  &  s    $c                   sP   g | ]$}| d krdn| | d|    | d  |  d    qS rN  r   r  r  rl  )rt  rE   rp  rq  rr  r  r   r  ,  s    *c                   sd   g | ].}| d |    | kr*|  | d k r"t | nt  | d nt | qS ro  r-  rl  )rp  rq  padding_ceilr  r   r  6  s    
)r   rL  r\  anyr  r  )r:  rp  rr  rq  sizesr  )rt  rE   rp  rq  rw  rr  r   r_     s&   


r_   zaten::max_pool1dZ
max_pool1drN  )return_indiceszaten::max_pool2dZ
max_pool2dr  zaten::max_pool3dZ
max_pool3d   c              	     sD   t ddddddt ddddddtj fdd}|S )NTFr^  r  r  c                   s6  t |dhkrt d|S |s|}t|}|r2t||||}|tdd t||D  }n|d }|||d}r| jd|fddi|\}	}
| jd|dd	d
 tD dd
 tD d\}}tj| |dd
 tD t	dt	dd}t
| |
|}
|	|
fS | jd|fddi|}	|	S )NrN  dilationc                 s      | ]	\}}|| V  qd S r  r  r  ar  r  r  r   r  k  s    z1_max_pool.<locals>.symbolic_fn.<locals>.<genexpr>r  )kernel_shape_ipads_i	strides_iMaxPoolr)  c                 S     g | ]}d qS rs  r  r  _r  r  r   r        z2_max_pool.<locals>.symbolic_fn.<locals>.<listcomp>c                 S  r  rs  r  r  r  r  r   r    r  )r)  r  r  c                 S  s   g | ]}d | qS )r  r  rl  r  r  r   r        r   r?  )setr   r  r  r_   zipr/  r  rA  r@  r   )r2  r:  rp  rr  rq  r|  	ceil_moderw  r  rr$  r  Zflattened_indicesrf  r#  ndimsrz  tuple_fnr  r   symbolic_fn`  sB   


z_max_pool.<locals>.symbolic_fnr   r  r  r   r  )r#  r  r  rz  r  r  r  r   	_max_poolC  s
   4r  zaten::max_pool1d_with_indicesr   zaten::max_pool2d_with_indicesr   zaten::max_pool3d_with_indicesr   zaten::avg_pool1dZ
avg_pool1dzaten::avg_pool2dZ
avg_pool2dzaten::avg_pool3dZ
avg_pool3dc              
     s>   t dt dddddddtj	 dd fdd}|S )NTr^  r  r  r  r:  r^  rp  Sequence[int]rr  rq  Union[int, Sequence[int]]r  r-  count_include_padc              	     s   |s|}t |||| }t|tsJ |}|r.t| d|d| d dddd}dt| }|rFt||||}	|td	d
 t|	|D  }n|d }| jd||||d}
|
S )NPad)r   r   r  constantr  rM  r  mode_sZvalue_frO  r   c                 s  r}  r  r  r~  r  r  r   r    s    
z1_avg_pool.<locals>.symbolic_fn.<locals>.<genexpr>AveragePool)r  r  r  )	r   Z_avgpool_helperr?  r  rU  r\  r_   r  r/  )r2  r:  rp  rr  rq  r  r  Zdivisor_overrideZadjusted_paddingrw  outputr#  r  r  r   r    s@   
	
z_avg_pool.<locals>.symbolic_fnr  )r:  r^  rp  r  rr  r  rq  r  r  r-  r  r-  r  )r#  r  r  r  r  r   	_avg_pool  s   	1r  zaten::adaptive_avg_pool1dZadaptive_avg_pool1dr  zaten::adaptive_avg_pool2dZadaptive_avg_pool2dzaten::adaptive_avg_pool3dZadaptive_avg_pool3dzaten::adaptive_max_pool1dZadaptive_max_pool1dr  zaten::adaptive_max_pool2dZadaptive_max_pool2dzaten::adaptive_max_pool3dZadaptive_max_pool3dc                   s(   t ddtj fdd}|S )NTFc              	     s  }zt dW n ty   t d| Y S w dgt kr-dkr-| d|S t |}z|dd   W n tyE   d  Y nw  d u sStdd  D rkdgt krd| d	|d fS t d
|S  fddt	dt D }|dgt| krdgt kr| d	|d fS t d|S  fddt	dt D }dkr| |||dt  dt  dS | j|||d}|S )Nr  z4adaptive pooling, since output_size is not constant.rN  r  ZGlobalAveragePoolr  c                 s  rk  r  r  rl  r  r  r   r  a  rm  z6_adaptive_pool.<locals>.symbolic_fn.<locals>.<genexpr>ZGlobalMaxPoolrn  c                   s   g | ]
} | |  qS r  r  rl  rE   output_sizer  r   r  h      z7_adaptive_pool.<locals>.symbolic_fn.<locals>.<listcomp>r   z-output size that are not factor of input sizec                   s    g | ]}t  | |  qS r  rv  rl  r  r  r   r  o  s     r  r  rs  F)r  r  )
r   
_parse_arg	Exceptionr  r\  r/  rL  rx  r  r  )r2  r:  r  Zoutput_size_valuery  r  kr  r  r#  r  typer  r   r  C  sD   
$z#_adaptive_pool.<locals>.symbolic_fn)r   r  r   r  )r#  r  r  r  r  r  r  r   _adaptive_pool  s   
A1r  rE   r-  c                 C  sF   t |dd dg| d t|   }|ddd |ddd  }|S )zGenerate paddings in ONNX order based on pad in pytorch.
    Args:
        dim: the dimension of the tensor.
        pad: the paddings in pytorch.
            The order is dim_n_begin, dim_n_end, dim_n-1_begin, dim_n-1_end, ...
    Nr   r  r  )r@  r\  )rE   r   paddingsr  r  r   _prepare_onnx_paddingsy  s   &r  c              
   C  sh   t | d}t |r2t |r2t |}z
dd |D }W |S  ty1   t dddd|  Y S w |S )Nr  c                 S  s   g | ]	}t |d dqS )r  rq  )r   r  )r  r^  r  r  r   r    s    z)_convert_padding_node.<locals>.<listcomp>r  r  rM  z)The sizes of the padding must be constant)r   r  rP  r  r  r  rR  )r:  rq  
input_listr  r  r   _convert_padding_node  s   
	
r  zaten::constant_pad_ndc              
   C  sj   d}z	t |dd}W n ty   t dddd| Y S w t|}tt ||}t| d||||ddS )	Nr  r_  re  r  r  rM  z*The value for the padding must be constantr  )r   r  r  rR  r  r  r  rU  )r2  r:  rq  re  r+  r  r  r  r   r5     s   
r5   r   c                 C  sH  t |}t|d dksJ t|d }|}t|D ]}|d| d   }|d| d   }g }	|dkrJtj| |d| g| gtjgd}
|	|
 |dk sR|dk rvt	d| }t	d|  }tj| |d| g|g|gd}|	| n|	| |dkrtj| |d| gdg|gd}|	| | j
dg|	R dd| i}q|S )Nr  r   rN  r?  r=  r>  )r  r\  r  r   rA  r
   r  r(  builtinsr   r/  )r2  r:  r   rq  r  curidxZpad_rZpad_lr  leftstartendmiddlerightr  r  r   _pad_circular  s@   


r  zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C  0   d}t |}tt||}t| d|||ddS )Nreflectr  rM  r  r  rO  r  r  r   r  rU  r2  r:  rq  r+  r  r  r  r   r        r   zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C  r  )Nedger  rM  r  r  r  r  r  r   r     r  r   z	aten::padr+  re  c                 C  sp   t |d}|dkrt| ||S |dkrt| ||S |dkr%t| |||S |dkr/t| ||S td| |)Nrf  Z	replicater  r  ZcircularzUnrecognized padding mode )r   r  r   r   r5   r  r   rj  )r2  r:  r   r+  re  r  r  r   r     s   	zaten::upsample_nearest1dZupsample_nearest1dZnearestzaten::upsample_nearest2dZupsample_nearest2dr(  zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dr}   zaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3dinterpolate_modec                   s    fdd}|S )Nc                   sb   t | |\}}t  t |}|rt d|S |d u r(t | || }| jd||dS )Nzalign_corners == TrueUpsampler  )r   Z_get_interpolate_attributesZ_interpolate_warningrT  r  Z_interpolate_size_to_scalesr/  )r2  r:  r  r  scalesalign_cornersrE   r  r#  r  r   r  7  s   

z!_interpolate.<locals>.symbolic_fnr  )r#  rE   r  r  r  r  r   _interpolate  s   ,r  zaten::__interpolatec           	      C  s*   t | |||||\}}| jd|||dS )Nr  r  )r   Z _interpolate_get_scales_and_moder/  )	r2  r:  r   Zscale_factorr+  r  Zrecompute_scale_factorZ	antialiasr  r  r  r   __interpolateH  s   r  zaten::bitwise_notc                 C  "   t |std|| d|S NzOONNX export does NOT support exporting bitwise Not for non-boolean input valuesr}  r   rY  r   rj  r/  r9  r  r  r   r(   Z     
r(   zaten::bitwise_orc                 C  s:   t |std|t |std|| d||S )NzVONNX export does NOT support exporting bitwise OR for non-boolean input values. self: zWONNX export does NOT support exporting bitwise OR for non-boolean input values. other: Orr  rZ  r  r  r   r)   f     

r)   c                   r%  )Nc                   s   t   fdd}|S )Nc                   s,   t  d  } | || |d|| |dS )NZ_cast_F)r&  )r2  r:  rJ  Zto_cast_func)r  to_typer  r   wrap_with_cast{  s   zGwrap_logical_op_with_cast_to.<locals>.decorator.<locals>.wrap_with_castr  r  )r  r  r  r  r   	decoratorz  s   z/wrap_logical_op_with_cast_to.<locals>.decoratorr  )r  r  r  r  r   r  x  s   r  r*  r   returnc                   s   t   fdd}|S )Nc                   s   |  d | ||S )Nr}  r8  r2  r:  rJ  r)  r  r   wrap_with_not  s   z4wrap_logical_op_with_negation.<locals>.wrap_with_notr  )r*  r  r  r)  r   r    s   r  zaten::__not_c                 C  r  r  r  r  r  r  r   __not_  r  r  zaten::eqc                 C  s   t | tjrt | tjr| jdtjdtjddS | }| }|	 |	   kr3dkr\n n'|
d|
d  krEdkr\n n| jdtj|d|dktjddS | d||S )	Nrb  Trz  rc  r  re  rf  r~  )r?  r  r	   DeviceObjTyper/  rd  r   r  r  r  kindOfrf  )r2  rE  rJ  Z	self_nodeZ
other_noder  r  r   rN     s    
 $rN   zaten::nec                 C  r  r  )rN   rZ  r  r  r   r     r  r   zaten::gtc                 C  r  r  _gt_implr  r  r  r   rb     r  rb   c                 C  J   t |rt |r| jd|tjjd}| jd|tjjd}| d||S )Nrl  rm  r  r   rY  r/  rn  ro  INT32r  r  r  r   r       r  zaten::ltc                 C  r  r  _lt_implr  r  r  r   r     r  r   c                 C  r  )Nrl  rm  r  r  r  r  r  r   r    r  r  zaten::gec                 C  r  r  r  r  r  r  r   r]     r  r]   zaten::lec                 C  r  r  r  r  r  r  r   ru     r  ru   zaten::__and_c                 C  :   t |std|t |std|| d||S )NzOONNX export does NOT support exporting bitwise AND for non-boolean input valuesrX  r  r  r  r  r   __and_  r  r  zaten::__or_c                 C  r  )NzNONNX export does NOT support exporting bitwise OR for non-boolean input valuesr  r  r  r  r  r   __or_  r  r  zaten::__xor_c                 C  r  )NzOONNX export does NOT support exporting bitwise XOR for non-boolean input valuesr|  r  r  r  r  r   __xor_	  r  r  zaten::logical_andZBoolc                 C  r  )NrX  r8  r  r  r  r   r   "	  rF  r   zaten::logical_orc                 C  r  )Nr  r8  r  r  r  r   r   )	  rF  r   zaten::logical_xorc                 C  r  )Nr|  r8  r  r  r  r   r   0	  rF  r   zaten::logical_notc                 C  s   |  d| j d|tjjdS )Nr}  rl  rm  r/  rn  ro  BOOLr9  r  r  r   r   7	  s   r   zaten::__rshift_c                 C     t j|}t j|t jj|kr| jd|| d}| jdtjdtjdd}t	
|s7| jd|tjjd}| d||}| jd|| d}| d||}|S )	Nrl  rm  rb  r  rz  rc  Powrk  r   rq  rr  rs  r/  rv  rd  r   float32r   rt  rn  ro  ru  )r2  rE  rJ  r  twotwo_powrshiftr  r  r   	__rshift_=	  (   
r  zaten::__lshift_c                 C  r  )	Nrl  rm  rb  r  rz  rc  r  rO  r  )r2  rE  rJ  r  r  r  lshiftr  r  r   	__lshift_[	  r  r  zaten::wherec              	   C  s`   t |s| jd|tjjd}|d u r(t| |}t | || jdt	dd|S | d|||S )Nrl  rm  rb  rN  rc  r  )
r   rY  r/  rn  ro  r  r   Z_unbind_helperrd  r   )r2  	conditionrE  rJ  r4  r  r  r   r  y	  s   

r  zaten::log_softmaxc           	      C  s   t |}|d u rt ddS |dk r|| }||d k}|r>tt|}|d || ||< |d< | jd||d}|d }| jd||d	}|rd|  d
krdt |dd}| jd|t	
| d}|rn| jd||d}|S )NrE   fONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.r   rN  r  r	  r
  Z
LogSoftmaxr@  r.  r  r{  rl  rm  )r   r  r  r@  r  r/  r  r  r  r   rq  rv  )	r2  r:  rE   r{  rh  ri  r  Z	return_oprj  r  r  r   r   	  s.   
r   zaten::_log_softmaxc                 C  s>   |rt j|t jjt jjkr| jd|tjjd}t	| ||S r  )
r   rq  rr  rs  HALFr/  rn  ro  ru  r   )r2  r:  rE   Zhalf_to_floatr  r  r   _log_softmax	  s   r  zaten::_convolutionc                 C  s  t |}z|dd  }W n ty   d }Y nw |d u s&tdd |D r,td|||g}t |sAt |dkrA|| |dd  ||| ||	d}tdd |D rj|s\J t	|t	|ksfJ ||d< | j
|rpd	nd
g|R i |}t |st |dkr| 
d||S |S )Nr  c                 s  rk  r  r  rl  r  r  r   r  	  rm  z_convolution.<locals>.<genexpr>DUnsupported: ONNX export of convolution for kernel of unknown shape.rN  )r  r  r  dilations_igroup_ic                 s  s    | ]}|d kV  qdS r  r  )r  or  r  r   r  	  rm  Zoutput_padding_iZConvTransposeConvrL  )r   rL  r  rx  r   rj  r  r  r(  r\  r/  )r2  r:  r#  biasrr  rq  r|  
transposedoutput_paddinggroupsZ	benchmarkZdeterministiccudnn_enabledZ
allow_tf32weight_sizekernel_shaper  r  r3  r  r  r   _convolution	  s@   



 r   zaten::_convolution_modec                 C  s   t |}z|dd  }	W n ty   d }	Y nw |	d u s&tdd |	D r,td|||g}
t |sAt |dkrA|
| |dkrHd}n|dkrNd	}|dd  ||||d
}| j	dg|
R i |}t |syt |dkry| 	d||S |S )Nr  c                 s  rk  r  r  rl  r  r  r   r  
  rm  z$_convolution_mode.<locals>.<genexpr>r  rN  validZVALIDsameZ
SAME_UPPER)r  r  Z
auto_pad_sr  r  r  rL  )
r   rL  r  rx  r   rj  r  r  r(  r/  )r2  r:  r#  r  rr  rq  r|  r  r  r  r  r  r3  r  r  r   _convolution_mode
  s@   


r  zaten::convolutionc
           
      C  s"   t | |||||||||	d d d d S r  r   )
r2  r:  r#  r  rr  rq  r|  r  r  r  r  r  r   r?   C
  s    r?   zaten::conv1dc           	      C  X   t |d}|dv rt| |||||||S t |d}t| ||||||dd|d d d d S Nrf  )r  r  r  Fr  r   r  r  r   	r2  r:  r#  r  rr  rq  r|  r  Zstr_paddingr  r  r   r;   d
  :   r;   zaten::conv2dc           	      C  r  r  r  r  r  r  r   r<   
  r	  r<   zaten::conv3dc           	      C  r  r  r  r  r  r  r   r=   
  r	  r=   zaten::conv_transpose1dc	           	      C  "   t | ||||||d||d d d d S NTr  	r2  r:  r#  r  rr  rq  r  r  r|  r  r  r   r8   
      r8   zaten::conv_transpose2dc	           	      C  r
  r  r  r  r  r  r   r9   
  r  r9   zaten::conv_transpose3dc	           	      C  r
  r  r  r  r  r  r   r:     r  r:   zaten::batch_normc
                 C  s   t |d t r"t |||||gs"tjdk r"t dddd|S t | |||||\}}}}| j	d||||||d| |s@dndd	}
|sH|
S |
\}}}}}|
|  |
|  |d	|   |d	|   |S )
Nr&      ZBatchNormalizationr  zaAll input tensors must have the same `dtype`. Turn off Autocast or export using opset version 15.rN  r  )	epsilon_fZ
momentum_fr)  zbatch_norm_dead_output-)r   check_training_moderd  Zis_autocast_enabledZargs_have_same_dtyper   rR  rR  Z_batchnorm_helperr/  r0  r  ZsetDebugNameZ	debugName)r2  r:  r#  r  running_meanrunning_vartrainingmomentumepsr  rw  resZnew_running_meanZnew_running_varZ
saved_meanZ	saved_varr  r  r   r&   6  sJ   
	
r&   zaten::native_layer_normnormalized_shaper  r#  r  r  #Tuple[_C.Value, _C.Value, _C.Value]c                 C  sl  dd t t|ddD }t| d}t| |}| jd||d}	t| ||	}
tj|
tjj	k}|rFtj|}| jd|
t|
 d	}
| jdt| |
||d}t| | d
||}| d|
|}|rxtj|}| jd|t|
 d	}|d u st|st| ||}|d u st|st| ||}|r| jd|t|
 d	}| d|}nt| |}||	|fS )Nc                 S  s   g | ]}| qS r  r  rl  r  r  r   r  |  s    z%native_layer_norm.<locals>.<listcomp>r   r         @r  rI  rl  rm  rL  rk  r  )r  r\  r   Z_generate_wrapped_numberr/  r   r   rq  rr  r  rv  r   r   r  r   r   r   )r2  r:  r  r#  r  r  r  Ztwo_cstZeps_cstr  	numeratorZis_type_halfZ	eps_dtypeZvariancedenominator
normalizedZinput_dtypeZrdenominatorr  r  r   r   p  sB   


r   zaten::layer_normcudnn_enablec           	   	   C  s<   t  r| jd||||||dS t| |||||\}}}|S )Nrt   )Znormalized_shape_ieps_fZcudnn_enable_i)r   r  r  r   )	r2  r:  r  r#  r  r  r  r  r  r  r  r   rt     s   	rt   zaten::instance_normuse_input_statsr  r   r  c
                 C  s&  t |d t |d}
|d u st |r6|
d u rtd|tjdg|
 tj	
| d}| jd|d}|d u s?t |r`|
d u rItd|tjdg|
 tj	
| d}| jd|d}|d u srt |sr|d u srt |r|| jd	||||d
S t |}| }|d }|d u rtd||d }d|d< || |d< t| || jdtj|gtjdd}t| || jdtj|gtjdd}t| || jdtj|gtjdd}t| || jdtj|gtjdd}| d|| jdt|d}t| |||||||||	
}t| || jdt|dS )Nrn   rN  zCUnsupported: ONNX export of instance_norm for unknown channel size.r`  rz  rb  rc  r  InstanceNormalizationr  r   zJUnsupported: ONNX export of instance_norm training for unknown batch size.ZReshape)r   r  r  r  r   rj  rd  r   r   rq  rr  r{  r/  rL  copyr   r  r  r&   r  )r2  r:  r#  r  r  r  r  r  r  r  channel_sizeweight_value
bias_value
input_sizeZinput_size_reshaper3  cweight_bias_Zrunning_mean_Zrunning_var_input_reshapedrw  r  r  r   rn     s   
rn   zaten::unfoldc                   s   t  rjd ||dS t }z|  }W n ty$   d }Y nw |d urotd||}t||d |} fddt||D }	t|}
ttd|
	
   fdd|	D }jdg|R d	 iS t d
dS )Nr  )Zdimension_iZsize_iZstep_ir   rN  c              	     s*   g | ]\}}t j g|g|gd qS )r?  r   rA  )r  lowhi)	dimensionr2  r:  r  r   r  <  s    zunfold.<locals>.<listcomp>c              
     s(   g | ]}t jd |d gqS )r	  r
  )r   r  r/  r  )r.  r2  r  r  r   r  E  s    r=  r>  ZUnfoldrn  )r   r  r  rL  r  r  r  r\  r@  r(  rQ  r/  r  )r2  r:  r.  r   stepry  ZsizedimZlow_indicesZ
hi_indicesr   r  r	  r  )r.  r2  r:  r  r   r  +  s0   
r  z	aten::eluc                 C  sJ   |r|dkrt dd|S |r|dkrt dd|S | jd|t |dS )Nr`  r  zdoes not support scale in Eluinput_scalez#does not support input_scale in EluElurb  )r   r  r/  rS  )r2  r:  rV  r  r0  r  r  r   rI   R  s   rI   z
aten::seluc                 C  r5  )NZSelur8  r9  r  r  r   r   c  r  r   zaten::index_selectc                 C  s   t | |||S r  )r   _select_helper)r2  rE  rE   rm   r  r  r   rl   j  s   rl   zaten::index_putc                 C  s   t |rt |}n|g}t  r$|g| ||g }| jdg|R  S t |d}t|dkr:|r8t| ||S |S t ddd| d S )Nrk   r  r   r  rM  )	r   r  r  r  r  r  r\  r   r  )r2  rE  Zindices_list_valuevalues
accumulateZindices_listr  r  r  r   rk   t  s   
rk   zaten::index_fillc           	      C  sr   t |d}t  r| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t| ||||S )Nr  rj   Z
int_Scalar)r.  r  )	r   r  r  r  _index_fill_reshape_helperrT  r  rR   r   )	r2  rE  rE   rm   re  	dim_valueexpanded_index_shapeexpanded_indexZexpanded_valuer  r  r   rj     s"   	
rj   zaten::index_copyc                 C  sL   t |d}t  r| jd||||dS t | |||\}}t| ||||S )Nr  ri   r  )r   r  r  r  r5  r   )r2  rE  rE   rm   sourcer6  r7  r8  r  r  r   ri     s   ri   zaten::bucketizec                 C  s   t jj}|r
t jj}| jd| d|| d|dd}t|}|d us&J ttd|d }t	| t
| |||d }	|rDt| ||	}
nt| ||	}
| jd|
|d}tj| |dgddS )	Nr=  r7  r   r@  rN  rl  rm  r  )rn  ro  rp  r  r/  r   r  r@  r  rR   r  r]   rb   rg  )r2  rE  Z
boundariesZ	out_int32r  Zout_type	new_shapeZtensor_rankZunsqueeze_axesZexpanded_boundariescondZcond_outr  r  r   r-     s$   "

r-   zaten::type_asc                 C  sf   t |}t |}||kr|d ur|S |d ur"| jd|| dS t  r-| d||S td|)Nrl  rm  r  zUnsupported: ONNX export of type_as for tensor of unknown dtype. Please check if the dtype of the parameter passed to the type_as function is correct.)r   r  r/  rv  r  r  r   rj  )r2  rE  rJ  
self_dtypeZother_dtyper  r  r   r    s    

r  zaten::cosine_similarityc           	      C  s   t  r| jd||||dS t j| t| |||gdd}t j| t| |||gdd}t j| t| |||gdd}t| t| t| ||| jdt	|gd}t
| ||S )NrA   )r  r  r   r  rb  rc  )r   r  r  rg  r   r   r   r/  rd  r   rF   )	r2  x1x2rE   r  rB   Zx1_l2Zx2_l2Zdiv_tensr  r  r   rA     s   &rA   zaten::pairwise_distancec                 C  s   t |s| jdt|gd}t| | jdtjdgtjddt| ||}t j| t	| t
| |||dgt |dd}t	| ||S )Nrb  rc  rN  rz  r  r  r  )r   rP  r/  rd  r   rF   r  r   rg  r   r   r  )r2  Zinput1Zinput2pr  r  Zinv_pZ	summationr  r  r   r     s   


r   zaten::clonec                 C  r  r  r  )r2  r:  Zunused_memory_formatr  r  r   r4        r4   z	aten::absc                 C  r5  )NAbsr8  r  r  r  r   r     r<  r   z	aten::logc                 C  r5  )NLogr8  r  r  r  r   r   !  r<  r   zaten::log1pc              	   C  s    t | t| ttd||S )NrN  )r   r   r   r  rd  r   r  r  r  r   r   '      r   zaten::log10c              	   C  s*   d}|  dt| || j dt|gdS )NgUk@rk  rb  rc  r/  r   rd  r   )r2  rE  Z_ln10r  r  r   r   -  s   &r   z	aten::powc                 C  sb   t j|}t|st jj}| jd|| d}t|s(| jd|| d}| d||}|S )Nrl  rm  r  )r   rq  rr  r   rt  ru  r/  rv  )r2  rE  exponentZf_dtyper   r  r  r   r   4  s   

r   zaten::clampc              	   C  sx   t |rt| ||S t |rt| ||S t |r2t |r2t| d|t |dt |dddS t| t| |||S )NClipr_     min_fmax_frO  )r   r  r1   r2   r  rU  r  )r2  rE  r   r   r  r  r   r3   E  s   



	r3   zaten::clamp_minc                 C  V   t |rt| d|t |dddS tj|}| jd|| d}t| d||ddS )	NrF  r_  rG  )rI  rO  rl  rm  MaxrX  	r   r  rU  r  r   rq  rr  r/  rv  )r2  rE  r   r{  r  r  r   r2   \     
r2   zaten::clamp_maxc                 C  rK  )	NrF  r_  rG  )rJ  rO  rl  rm  MinrX  rM  )r2  rE  r   r{  r  r  r   r1   j  rN  r1   z	aten::maxc                 C     |d u r|d u r| j d|ddS |d u rt| d||ddS t|dd}t|dd	}| j d||g|d
}| j d|||d}||fS )Nre  r   r  rL  rG  rX  r  rE   r  r  ArgMaxr>  r  r/  rU  r   r  )r2  rE  dim_or_yr  rE   r   r$  r  r  r   r   x  s   r   zaten::maximumc                 C     t | ||dS N)rU  )r   r  r  r  r   r     rF  r   z	aten::minc                 C  rP  )N	ReduceMinr   rQ  rO  rG  rX  r  rE   r  r  ArgMinrS  rT  )r2  rE  rU  r  rE   r   r$  r  r  r   r     s   r   zaten::minimumc                 C  rV  rW  )r   r  r  r  r   r     rF  r   z
aten::amaxc                 C     | j d|||dS )Nre  r  r8  r2  rE  rE   r  r  r  r   r        r   z
aten::aminc                 C  rZ  )NrX  r  r8  r[  r  r  r   r     r\  r   zaten::aminmaxc                 C  sR   d|i}t |st |dd}|g|d< | jd|fi || jd|fi |fS )Nr  r  rE   r  rX  re  )r   r  r  r/  )r2  rE  rE   r  Zreduce_kwargsr  r  r   r     s   

r   z	aten::expc                 C  r5  )Nrf  r8  r  r  r  r   rP     r<  rP   zaten::dropout_zaten::dropoutc                 C  s.   t |d |s
|S | jd||dd\}}|S )NrH   ZDropoutr  )Zratio_fr)  )r   r  r/  )r2  r:  r?  trainr  r  r  r  r   rH     s
   rH   zaten::alpha_dropout_zaten::feature_alpha_dropout_zaten::feature_dropout_zaten::feature_alpha_dropoutzaten::alpha_dropoutzaten::feature_dropoutc                   s$   t dddtj fdd}|S )Nr^  r  r  c                   s   |r	t  d|S |S )Nztraining mode)r   r  )r2  r:  r?  r]  r+  r  r   feature_dropout  s   z-_unsupported_dropout.<locals>.feature_dropoutr   r  r   r  )r#  r^  r  r+  r   _unsupported_dropout  s   r`  z
aten::normc                 C  st   |dkr	t d}n|dkrt d}ntd||| |||d}|d ur8t|dd}| jd	|t| d
}|S )NrN  ZReduceL1r  ZReduceL2z)ONNX export only p-norms with p of 1 or 2)rE   r  r  r{  rl  rm  )	r  r   rj  r   r  r/  r   rq  rv  )r2  rE  r?  rE   r  r{  r_  r  r  r  r   r     s   

r   zaten::conv_tbcc              	   C  st   t  r| jd||||dS | jd|g dd}| jd|g dd}t| |||dg|gdgd}| jd|g ddS )	Nr7   )Zpad_ir	  )rN  r  r   r
  )r  rN  r   rN  )r  r   rN  )r   r  r  r/  r;   )r2  r:  r#  r  r   convr  r  r   r7     s   r7   zaten::_uniquec                 C  s(   t  r| jd|||ddS t d|S )N_uniquer  )sorted_ireturn_inverse_ir)  )r   r  r  r  )r2  r:  sortedreturn_inverser  r  r   rb  $  s   rb  zaten::_unique2c                 C  s2   t  r| jd||||ddS t ddd| d S )N_unique2r{  )rc  rd  Zreturn_counts_ir)  r  rM  )r   r  r  r  )r2  r:  re  rf  Zreturn_countsr  r  r   rg  4  s   	rg  zaten::_cast_Bytez2.0z
the futurez8Avoid using this function and create a Cast node insteadc                 C     | j d|tjjdS r  )r/  rn  ro  r  r2  r:  Znon_blockingr  r  r   
_cast_ByteE     rj  zaten::_cast_Charc                 C  rh  r  )r/  rn  ro  r  ri  r  r  r   
_cast_CharP  rk  rl  zaten::_cast_Shortc                 C  rh  r  )r/  rn  ro  r  ri  r  r  r   _cast_Short[  rk  rm  zaten::_cast_Intc                 C  rh  r  )r/  rn  ro  r  ri  r  r  r   	_cast_Intf  rk  rn  zaten::_cast_Longc                 C  rh  r  )r/  rn  ro  rp  ri  r  r  r   
_cast_Longq  rk  ro  zaten::_cast_Halfc                 C  rh  r  )r/  rn  ro  ZFLOAT16ri  r  r  r   
_cast_Half|  rk  rp  zaten::_cast_Floatc                 C  rh  r  )r/  rn  ro  ru  ri  r  r  r   _cast_Float  rk  rq  zaten::_cast_Doublec                 C  rh  r  )r/  rn  ro  r  ri  r  r  r   _cast_Double  rk  rr  zaten::_cast_Boolc                 C  rh  r  r  ri  r  r  r   
_cast_Bool  rk  rs  zaten::emptyc                 C     t | |||||S r  )r  )r2  ry  r{  layoutdevice
pin_memorymemory_formatr  r  r   rM        rM   zaten::empty_likec                 C  rt  r  )r  )r2  r:  r{  ru  rv  rw  rx  r  r  r   rL     ry  rL   zaten::new_emptyc                 C  2   t |}t |r|d ur|}t| |||||S r  )r   r  r  rM   r2  rE  ry  r{  ru  rv  rw  r<  r  r  r   r        
r   zaten::scalar_tensorc                 G  s<   t |dd}|d u rtjj}| jd|t| d}|S )Nr  r{  rl  rm  )r   r  r   rq  ru  r/  rv  )r2  Zscalarr{  optionsr  r  r   r     s
   r   zaten::tensorc                 C  s
  t |dd}t |rV|d u rtjt |d }t }t |D ]&}| jdt	
dgd}t | ||}| jd|t| d}|| q#| jd	g|R d
diS |d u r`tj|}t |rxt |sot |rx| jd|ddd}| jd|t| dS )Nr  r{  r   rb  rN  rc  rl  rm  r=  r>  ZConcatFromSequence)r>  Z
new_axis_i)r   r  r  r   rq  rr  r  r@  r/  rd  r  rC  rv  r(  Z_is_listrQ  Z_is_scalar_list)r2  datar{  rv  requires_gradr  r   Zshape_referencer  r  r   r     s,   

r   zaten::as_tensorc                 C     t | |||S r  )r   )r2  r~  r{  rv  r  r  r   r!     r  r!   zaten::zerosc                 C  sz   |d u r	t jj}nt |}t|d}t|tr-t|dkr-| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   rb  rc  ConstantOfShaperz  r   rq  ru  r   r  r?  r@  r\  r/  rd  r   r   r  r{  r2  ry  r{  ru  rv  rw  rx  sizes_r  r  r   r    s   

r  zaten::zeros_likec           	      C  T   |  d|}t|rtj|tjj}nt|}| j d|tjdg|	 ddS )Nr7  r  r   rz  rc  
r/  r   r  r   rq  rr  ru  rd  r   r{  	r2  r:  r{  ru  rv  rw  rx  rA  rx  r  r  r   r       

r  zaten::new_zerosc                 C  rz  r  )r   r  r  r  r{  r  r  r   r   +  s   
r   z
aten::zeroc                 C  s   t |}t| ||S r  )r   r  r  )r2  rE  r<  r  r  r   r  7  s   
r  z
aten::onesc                 C  sz   |d u r	t jj}nt |}t|d}t|tr-t|dkr-| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   rb  rc  r  rN  rz  r  r  r  r  r   r   >  s   

r   zaten::ones_likec           	      C  r  )Nr7  r  rN  rz  rc  r  r  r  r  r   r   P  r  r   zaten::new_onesc                 C  rz  r  )r   r  r  r   r{  r  r  r   r   j  r|  r   z
aten::fullc              	   C  s   t |d}t |r,|d u rtjjn|}t| ||||}t| ||| jdt	
ddS t |dd}|d u r<tjj}	nt|}	t |d}
t|
tr`t|
dkr`| jdt	
g t	jd}| jd	||d|	 dS )
Nr   rb  rN  rc  r  r{  r  r   r  )r   r  rP  r   rq  ru  r  r   r/  rd  r   r  r?  r@  r\  r   r  r  r{  )r2  ry  re  r{  ru  rv  rw  const_valuetmprx  r  r  r  r   r[   u  s"   


r[   zaten::full_likec              	   C  s   t |d}t |dd}|d u rtj|tjj}nt|}t |rFt| ||||}	| j	d||
 d}t| |	|| j	dtddS | 	d	|}
| j	d
|
tj|g| ddS )Nr_  r  r{  rl  rm  rb  rN  rc  r7  r  rz  )r   r  r  r   rq  rr  ru  rP  r  r/  rv  r   rd  r   r{  )r2  r:  
fill_valuer{  ru  rv  rw  rx  rx  r  rA  r  r  r   rZ     s"   

rZ   zaten::new_fullc           	      C  s4   t |}t |r|d ur|}t| ||||||S r  )r   r  r  r[   )	r2  rE  r   r  r{  ru  rv  rw  r<  r  r  r   r     s   
r   	aten::eyec                 G  s   t |dkr,|\}}}}}t| |dg}| jd||dd}t| ||||}	| d|	S t |dkr]|\}}
}}}}| jdt| |dgt| |
dgdd}t| ||||}	| d|	S tddt | d	S )
Nr  r   r=  r@  ZEyeLikerZ  r  r  r  )r\  r   r  r/  r  r  )r2  r  r3  r{  ru  rv  rw  rJ  rA  r   mr  r  r   rS     s"   rS   aten::slicec                 G  s  t |dkr|\}}}}t|d}|dkrtd||  dko+t| t	j
}|  dko;t| t	j
}|  dk}	|  dk}
|sP|	r\|sT|
r\|  dkrtjtjjkritd|t| |dg}t| |dg}t| |dg}| d	||||S |rdnt|d}|rtjnt|d}t|d}tj| ||g|g|gd
S t |dkr|\}}}d}|  dkot| t	j
}|  dkot| t	j
}|rdnt|d}|rtjnt|d}tj| ||g|g|gd
S tddt | dS )Nr(  r  rN  z"step!=1 is currently not supportedr.  r  zUnsupported: ONNX export of Slice with dynamic inputs. DynamicSlice is a deprecated experimental op. Please use statically allocated variables or export to a higher opset version.r   ZDynamicSlicer?  r{  r  r  r  )r\  r   r  r   rj  r  r  r?  r  r	   NoneTyper   operator_export_typern  ZOperatorExportTypesZONNXr  r/  r
   r  rA  r  )r2  rE  r  rE   r  r  r/  Zis_start_noneZis_end_noneZis_start_onnx_constZis_end_onnx_constZstart_unsqueezedZend_unsqueezedZdim_unsqueezedr  r  r   r     s   






r   zaten::hardtanhrE  min_valmax_valc                 C  s   t | d|||ddS )NrF  rG  rH  rY  )r2  rE  r  r  r  r  r   rg   %  s   rg   zaten::hardswishc                 C  s   t | |}| d||S rB  )re   r/  )r2  rE  hsr  r  r   rf   /  s   
rf   zaten::hardsigmoidc                 C  s   | j d|ddS )NHardSigmoidgUUUUUU?rb  r8  r  r  r  r   re   8  s   re   zaten::tanhshrinkc                 C  s   |  d|t| |S )NrW  )r/  r   r  r  r  r   r   C     r   zaten::hardshrinkc                 C  sx   t j|t jj}| jdtj|| dd}t| t	| ||t
| |t| |}| d||| jdtjd| ddS Nrb  rz  rc  r  r   )r   rq  rr  ru  r/  rd  r   r{  r   rb   r   r   )r2  rE  lambdrx  lambd_opr;  r  r  r   rd   J  s"   "rd   zaten::softshrinkc           	      C  s   t j|t jj}| jdtj|| dd}t| ||}| d|t	| ||| jdtjd| dd}t
| |t| |}| d|t| ||| jdtjd| dd}t| ||S r  )r   rq  rr  ru  r/  rd  r   r{  rb   r   r   r   r   )	r2  rE  r  rx  r  Zgt_condZgt_outZlt_condZlt_outr  r  r   r   a  s8   
	
	r   zaten::aliasc                 C  r  r  r  r  r  r  r   r     r  r   zaten::unsqueezec                 C  s~   |dk r6t |}|d ur/tdt| d d d t|| d  d d  || d }nt d	d
|S t j| ||gdS )Nr   z)ONNX export unsqueeze with negative axis rC  rD  rE  rN  rF  rG  r	  rH  rI  )r   r  r!  r"  r$  r  r  r,  r  r  r   r	    s2   

r	  z
aten::sortc                 C  sn   |d urt dd| t |}z|| }W n ty!   d }Y nw |d u r-t dd|S | jd|||ddS )NZSortz'Out parameter is not supported for sortrn  TopKr  Zk_ir>  r)  )r   r  rL  r  r/  )r2  rE  rE   Z	decendingrw  Z
self_sizesrJ  r  r  r   r     s   
r   zaten::numelc                 C  s   |  d|}| j d|ddS )Nr7  r  r   rQ  r8  rD  r  r  r   r     s   r   z
aten::topkc                 C  s<   |d urt dd| |st dd| | jd|||ddS )Nr  z'Out parameter is not supported for topkzAscending TopK is not supportedr  r  )r   r  r/  )r2  rE  r  rE   Zlargestre  rw  r  r  r   r     s   r   zprim::convert_element_typec                 G  s,   t |d dd}| jd|t| dS )Nr   r  r{  rl  rm  )r   r  r/  r   rq  rv  )r2  rE  r  r{  r  r  r   r>     s   r>   zaten::toc                 G  s  t jdd }||r|S t|dkrt|d }t|d rJ|d   dkrJt|d  d}t|t	j
rJt|jdkrH| }t|}n|}t|sUt|t	j
rgtj|d }| jd|| dS | jd|t| dS t|d	krt|d
 dd}| jd|t| dS t|dkrt|d dd}| jd|t| dS t|dkrt|d dd}| jd|t| dS td|S )Nc                 S  s   t | dkr&| d   dkp%| d  tj p%t| d  tj	S t | dkr9t
| d dd}|d u S t | dv rLt
| d dd}|d u S d	S )
Nr(  r   prim::devicer  rN  r  r{  )rZ     F)r\  r  r  r  isSubtypeOfr	   ListTypeofIntsr?  r  r   r  )r  r{  r  r  r   is_aten_to_device_only  s   z"to.<locals>.is_aten_to_device_onlyr(  r   r  re  rl  rm  r  rN  r  r{  rZ  r  zUnknown aten::to signature)r   r  r\  r   rP  r  r  r9  r?  rd  r  rA  rr   r-  r   rq  rr  r/  rv  r  r  )r2  rE  r  r  r{  Ztvalr  r  r   r     sB   

r   zaten::repeatc                 C  s0   t jj}t| ||}| d||}| d||S )Nr  ZTile)r   rq  rp  r   r/  )r2  rE  repeatsr{  Zshape_r  r  r   r   %  s   r   zaten::repeat_interleavec              
   C  s  |}t |r t | || jdtdgd}tjdtjd}nt |}t |}t 	|}t 	|}|d u r>t
d||d u rHt
d||d u rRt
d||dk r\|t|7 }| }	t|D ]\}
}|d u rtd	\||
< |	|
< qd|dks|d
kr|d d
kr|| dkrt dddd|S t | |||S |d
kr|| dkrt dddd|S |d d u rt dddd|S |d || ksJ d|d }nt
d|t }t | ||d}t | |||}d\||< |	|< t|D ]X\}
}t| ||
 |d
 }| jdt|	d |d
  d|| jdt|	|d
 d  dg}| jdg|R ddi}t| ||d }t j| || jdt|ddd}|| q| jdg|R d|iS )Nrb  r  rc  r   rz  zGUnsupported: ONNX export of repeat_interleave for unknown repeats rank.zGUnsupported: ONNX export of repeat_interleave for unknown repeats size.zEUnsupported: ONNX export of repeat_interleave for unknown input size.)r   r  rN  r   r     z3Unsupported along dimension with unknown input sizez*Unsupported for cases with dynamic repeatsz2repeats must have the same size as input along dimz%repeats must be 0-dim or 1-dim tensor)r  rN  r=  r>  Z	allowzero)r   r  rC  r/  rd  r   r  rT  r  rL  r   rj  r\  r"  rS  rR  Z-_repeat_interleave_single_value_repeat_helperr@  Z_repeat_interleave_split_helperr	  r  rR   r(  )r2  rE  r  rE   r  r:  Zrepeats_dimZrepeats_sizesZinput_sizesZinput_sizes_tempr  r&  ZrepsZfinal_splitsZr_splitsZi_splitsZr_splitZi_splitZr_concatr  r  r   r   .  s   





r   zaten::pixel_shufflec           	      C  s  t |}t|dkrt dd|S tdd |dd  D rvt j| t | |ddg| jd	t	d
d||d
d
gdd
d}| jd|g dd}t j| || jd	t	g ddd
d}t j| || jd	t	g ddd
d}t 
| |ddgS |d | | }t j| || jd	t	d||||d |d gdd
d}| jd|g dd}t j| || jd	t	d||d | |d | gdd
dS )Nr(  r   only support 4d inputc                 s  rk  r  r  rl  r  r  r   r    rm  z pixel_shuffle.<locals>.<genexpr>rN  r  r{  rb  r   r  rc  r  r	  )r   rN  r(  r  r  r{  r
  )r   r   r  rN  r   r   )r   r   r   r   r  rN  r  r   rL  r\  r  rx  rC  r  r/  rd  r   r>  )	r2  rE  Zupscale_factorr  
after_viewafter_transpose	reshape_h	reshape_woutput_channelr  r  r   r     s~   
	

r   zaten::pixel_unshufflec           
      C  s  t |}t|dkrt dd|S tdd |dd  D rxt j| t | |dg| jdt	d	d	d
|d	gdd	d}t j| || jdt	d	d	d	d	d
|gdd	d}| jd|g dd}t j| || jdt	g ddd	d}t 
| |ddgS |d | | }t j| || jdt	d
|d |d | ||d | |gdd	d}	| jd|	g dd}t j| || jdt	d
||d | |d | gdd	dS )Nr(  r   r  c                 s  rk  r  r  rl  r  r  r   r    rm  z"pixel_unshuffle.<locals>.<genexpr>rN  r{  rb  r   r  rc  r  r	  )r   rN  r{  r  r  r(  r
  )r   r  rN  rN  r   r   r  r  )
r2  rE  Zdownscale_factorr  r  r  r  Zfinal_reshaper  r  r  r  r   r     sx   




r   c           *   
     s  t d d d d d  g d}ttdd |D |}|r#d	nd
dkr<t  d|	  kr<tdd|S t  d|	  ksJJ  fddtdt D |
rfjd|g dd}|rq|rqtdd|S 	dr|d	d  
  }d d }t|dd u rtdd|S |	 }|}g }dksdkr|}n
dkr|\}}g }|d u rtn|}dkrg dndkrg dtjdd tjfdd}tjfdd}tjfd d!}tD ]-}|r#d	kr||\}}}n
||\}}t}||d f}nUd	krF|d
| \}} }!|d
| d \}"}#}$jd"|!|$dd#}n|d
| \}} |d
| d \}"}#t}jd"||"dd#}jd"| |#dd#}d
| d
| d
 f}|||||g}%|%||g|R   dkr|%||g|R   |ri nd$d%i}&dkr|	r||g}'n|g}'jdg|%R d
|'d&|&\}}(n/dkrވjdg|%R d
dd'|&\}}(ndkrjdg|%R d(d)|&\}}(})|	rjd|g d*d}tj|jd+tg d,d-dd.}nt|dg}||( dkr-||) q|
r;jd|g dd}dkrB|(njd"g|R d/di}dksXdkr\||fS dkrydkrh|)njd"g|R d/di}|||fS d S )0NzVExporting a model to ONNX with a batch_size other than 1, with a variable length with z can cause an error z9when running the ONNX model with a different batch size. z4Make sure to save the model with a batch size of 1, z=or define the initial states (h0/c0) as inputs of the model. )rV  r  r  ZAffinera  ZThresholdedReluZ
ScaledTanhr  r1  ZSoftsignrN  c                 S  s   g | ]}|  qS r  )lower)r  Zact_funr  r  r   r  N  r  z _generic_rnn.<locals>.<listcomp>r(  r  LSTMrN  zLSTMs with projectionsc                   s   g | ]
} ||  qS r  r  rl  )all_weightsweights_per_layerr  r   r  W  r  r   r	  ru  r
  zRNN/GRU/LSTMzdropout in training modeRNNzunknown hidden sizeGRU))rN  r  r   rN  )r  r{  )r  )r{  r(  )rN  r{  c                   s.    fdd|D } j dg|R ddiS )Nc              	     s2   g | ]\}}t j d g| g| gdqS )r   r?  r+  )r  xyr2  r3  wr  r   r    s     z8_generic_rnn.<locals>.reform_weights.<locals>.<listcomp>r=  r>  r   r8  )r2  r  r3  Z	intervalsZslicesr  r  r   reform_weights  s   z$_generic_rnn.<locals>.reform_weightsc                   s`   |  }dkr|\}}ndksdkr# fdd|D \}}t  fdd||fD S )Nr  r  r  c                 3      | ]
} |V  qd S r  r  r  r  r2  hidden_sizereform_permutationr  r  r   r        
zB_generic_rnn.<locals>.transform_weights_no_bias.<locals>.<genexpr>c                 3       | ]}t  |d gV  qdS r  r  r  r  r2  r  r   r    s    
)r  )layer_indexweights	weight_ih	weight_hhr2  r  layer_weightsr  r  variantr  r   transform_weights_no_bias  s   

z/_generic_rnn.<locals>.transform_weights_no_biasc                   s|   |  }dkr|\}}}}ndksdkr' fdd|D \}}}} j d||dd}t fd	d|||fD S )
Nr  r  r  c                 3  r  r  r  r  r  r  r   r    r  z:_generic_rnn.<locals>.transform_weights.<locals>.<genexpr>r=  r   r@  c                 3  r  r  r  r  r  r  r   r    s
    
)r/  r  )r  r  r  r  Zbias_ihZbias_hhbias_concatr  r  r   transform_weights  s   z'_generic_rnn.<locals>.transform_weightsc                   s&   dkr| S t j | dg|g|gdS )NrN  r   r?  r+  )r  r  r  )r2  
num_layersr  r   retrieve_state  s   z$_generic_rnn.<locals>.retrieve_stater=  r@  Zdirection_sbidirectional)r)  hidden_size_iZactivations_s)r)  r  Zlinear_before_reset_ir{  )r)  r  )r   r  rN  r{  rb  )r   r   r  rc  r  r>  )r!  r"  dictr  r\  r   r  r  r/  
startswithr  r  r  r   r  r(  rC  rd  r  r>  )*r2  r  r:  Zinitial_statesr  
has_biasesr  rH   r]  r  batch_firstbatch_sizesZonnxActivationsZvariantToOnnxActivationMapZnonlinearityw_hhZunidirectionalZprev_outputh_outsZh0Zc0c_outsZsequence_lensr  r  r  r  r  r  r  Zstate_indicesZweight_ih_fZweight_hh_fZbias_fZweight_ih_bZweight_hh_bZbias_brT  extra_kwargsZ
activationZh_outZc_outr  )	r  r2  r  r  r  r  r  r  r  r   _generic_rnn'  s  



	









&
&
r  c
                 C  s2   t |t |}
}t| d||
|||||||	S )Nr  r   r  r  )r2  r:  hidden_vweight_vr  r  rH   r]  r  r  hiddenr#  r  r  r   
_lstm_full  s$   r  c
                 C  s4   t |t |}
}t| d||
||||||	|dS )Nr  r  r  )r2  r:  r  r  r  r  r  rH   r]  r  r  r#  r  r  r   _lstm_packed-  s$   r  z
aten::lstmc                 G  s.   t |d rt| g|R  S t| g|R  S Nr{  )r   rQ  r  r  r2  r  r  r  r   r   M  s   r   zaten::lstm_cellc                   s   t  |dg}t |} fdd|D }t |r!||||fn||f}t |r,dnd}	t d||||	dddddd\}
}}t  |dgt  |dgfS )	Nr   c                   s   g | ]
}t  |d gqS r  r  r  r  r  r   r  [  r  zlstm_cell.<locals>.<listcomp>TFr  rN  )r  rH   r]  r  r  )r   r  r  Z
_is_tensorr  r>  )r2  rE  r  Zw_ihr  Zb_ihZb_hhr:  r#  r  r  r  r  r  r  r   r   V  s0   
r   z	aten::grur  Zgruzaten::rnn_tanhZRNN_TANHZrnn_tanhzaten::rnn_reluZRNN_RELUZrnn_relur  c                   sd   t ddddddddd	tjfdd t ddddddddd	fdd fdd	}|S )
Nr^  r  r_  c
                   s&   t |}
t|  |||
||||||	S r  r  )r2  r:  r  r  r  r  rH   r]  r  r  r#  r  r  r   	_rnn_fullz  s   
z"_one_hidden_rnn.<locals>._rnn_fullc
                   s(   t |}
t|  |||
|||||	|dS )Nr  r  )r2  r:  r  r  r  r  r  rH   r]  r  r#  r  r  r   _rnn_packed  s   
z$_one_hidden_rnn.<locals>._rnn_packedc                   s.   t |d r| g|R  S  | g|R  S r  )r   rQ  r  )r  r  r  r   r    s   z!_one_hidden_rnn.<locals>.symbolicr_  )r  r  r  )r  r  r  r   _one_hidden_rnnr  s   r  zaten::_dim_arangec                 C  sT   |  d|}| j d|| j dt|ddd}t r!|  d|S t| |dd d d S )	Nr7  r   rb  rc  r   r@  z_caffe2::Ranger(  )r/  rd  r   r   r  r   )r2  likerE   Z
like_shapestopr  r  r   _dim_arange  s   r  zaten::detachc                 C  r  r  r  r9  r  r  r   rD     r@  rD   zaten::contiguousc                 C  s   |dkr
t d||S )Nr  z-onnx memory_format support is not implemented)r   rj  )r2  r:  rx  r  r  r   r6     s
   r6   zaten::_pack_padded_sequencec                 C  sz   |r| j d|g dd}| tjj std|t	j
|t	j
jt	j
jkr4| j d|tjjd}| j d||dd	S )
Nr	  ru  r
  z*'lengths' must be a Tensor for ONNX exportrl  rm  zprim::PackPaddedr  r)  )r/  r  r  rd  r	   Z
TensorTypegetr   rj  r   rq  rr  rs  r  rn  ro  r  )r2  r:  lengthsr  r  r  r   _pack_padded_sequence  s   r  zaten::_pad_packed_sequencec                 C  s6   | j d||dd\}}|r| j d|g dd}||fS )Nzprim::PadPackedr  r  r	  ru  r
  r8  )r2  r~  r  r  Zpadding_valuetotal_lengthr  r  r  r   _pad_packed_sequence  s   r  zaten::randintc                 G  s  t |dd}t |dd}t |dd}|d u rtjj}nt|}|d u r-t d||d u r7t d|t |d}	t |	r[| jd|t	j
dgt	jd	d
}
| jd|
||d}n	| jd|	||d}tjj}| jd|| d}||kr| jd|| d}|S )Nr  r{  r,  highr   r  r  r   rz  rc  RandomUniformLikelow_fhigh_fRandomUniform)shape_ir  r  rl  rm  )r   r  r   rq  rp  r  r  rP  r/  rd  r   r  rv  )r2  r,  r  shapesr{  r}  low_ihigh_irx  rA  shape_constr   	int_dtyper   r  r  r   r     sD   


r   zaten::randint_likec                 G  s   t |dd}t |dd}t |dd}|d u rtjj}nt|}|d u r-t d||d u r7t d|| jd|||d}	tjj}
| jd|	|
 d	}|
|kr\| jd|| d	}|S )
Nr  r{  r,  r  r   r  r  rl  rm  )r   r  r   rq  rp  r  r/  rv  )r2  rE  r,  r  r{  r}  r  r  rx  r   r  r   r  r  r   r   7  s*   

r   zaten::randnc                 G     t |dd}|d u rtjj}nt|}t |d}t |r9| jd|tj	dgtj
dd}| jd|| d	S | jd
|| dS )Nr  r{  r  r  r   rz  rc  RandomNormalLikedtype_iZRandomNormalr  r  r   r  r   rq  ru  r  rP  r/  rd  r   r  rv  r2  r  r{  r}  rx  rA  r  r  r  r   r   U  *   


r   z
aten::randc                 G  r  )Nr  r{  r  r  r   rz  rc  r  r  r  r  r  r   r  r  r   r   p  r  r   zaten::randn_likec                 C  sH   t |dd}|d u rtj|tjj}nt|}| jd|| dS )Nr  r{  r  r  r   r  r   rq  rr  ru  r/  rv  )r2  rE  r{  ru  rv  rw  rx  rx  r  r  r   r     s   
r   zaten::rand_likec                 C  sB   t |dd}|d u rtj|tjj}| jd|t| dS )Nr  r{  r  r  r  )r2  rE  r{  ru  rv  rw  rx  r  r  r   r     s   r   zaten::rreluc                 C  s@   |s|| d }| j d||dS | j d|||d}|  d||S )Nr  ra  rb  r  )r  r  rK  r8  )r2  r:  r  upperr  r  r  r?  r  r  r   r     s
   r   zaten::bernoullic           	      C  s   |d urt |st dd| |d ur t |s t dd| tj|tjj}|tjjkr6t dd|S | jd|dd| d}|d urMt |sM|n|}| d	||}| jd
|| dS )NZ	Bernoulliz,out parameter is not supported for bernoulliz(generator is not supported for bernoulliinput dtype not accessibler  r`  r  )r  r  r  r  rl  rm  )	r   r  r  r   rq  rr  rs  r/  rv  )	r2  r:  r?  r  rw  r{  ZrandsZprobr  r  r  r   r'     s2   r'   zaten::log_sigmoidc                 C     |  d|}|  d|S )Nr  rB  r8  )r2  r:  r?  r  r  r   r     rK  r   z	aten::erfc                 C  r5  )NErfr8  r9  r  r  r   rO     r  rO   zaten::flattenc                 C  s   t |}|d u rt dd|S |dkrt | |dgS |dkr&| d|S |dk r.|| }|dkr@||d kr@| jd||dS |dkrT||d krT| jd||d dS t | ||||S )	NrE   r  r   rN  r  Flattenr@  r  )r   r  r  rC  r/  Z_flatten_helper)r2  r:  Z	start_dimZend_dimrE   r  r  r   rU     s$   
rU   zaten::nonzeroc                 C  s   t | | d|S )z/Emitted from `torch.nonzero(x, as_tuple=False)`ZNonZero)r   r/  r9  r  r  r   r     r\  r   zaten::nonzero_numpyc                 C  s   t | t| |d|dS )NrN  )r4  )r  r   )r2  r:  r4  r  r  r   r     s   r   zaten::isnanc                 C  s   |  d|}|S )NZIsNaNr8  )r2  r:  r  r  r  r   rq     s   rq   z	aten::anyc              	   G  s   t |dkr|d }d\}}n|\}}}t|dg}t|d}| jd|tjjd}tj| |||d}t| || jdt	j
dt	jd	d
S )NrN  r   r[  r  rl  rm  r  rb  rz  rc  )r\  r   r  r/  rn  ro  rp  rg  rb   rd  r   long)r2  r  r:  rE   r  Z	input_sumr  r  r   _any$  s   

"r	  z	aten::allc              	   G  sL   |  d|d }t|dkr|  dt| |S |  dt| ||d |d S )Nr}  r   rN  r  )r/  r\  r	  )r2  r  r:  r  r  r   _all7  s   r
  zaten::narrowc                 C  s   t j| ||g|g|| gdS )Nr?  r+  )r2  r:  rE   r  lengthr  r  r   r   C  s   r   zaten::argmaxtorch._C.Valuer  c                 C     t | |||dS )NrR  r   Z_argmin_argmax_helperr2  r:  rE   r  r  r  r   r   L     	r   zaten::argminc                 C  r  )NrY  r  r  r  r  r   r   X  r  r   zaten::scatterc                 C  s~   t j|t jj}t|}t|r| jd||||dS t j|}||kr1| jd|| d}| jd||t	| |||dS )NZScatterr@  rl  rm  )
r   rq  rr  rs  r   rT  rP  r/  rv  rQ   )r2  rE  rE   rm   srcZsrc_typer  r  r  r   r   d  s   

r   zaten::scatter_addc                 C  sz   t |}|d u rt dd|S t j|dd}|r(| jdtj|| dd}nt| ||}t 	| ||||}t
| ||S )Nr   r  F)Zallow_nonstaticrb  rz  rc  )r   r  r  rL  r/  rd  r  r{  r  Z_scatter_helperr   )r2  rE  rE   rm   r  rx  ry  Zto_addr  r  r   r   w  s   
r   z
aten::log2c              	   C  s(   d}|  dt| || j dt|dS )Ng9B.?rk  rb  rc  rD  )r2  rE  Z_ln2r  r  r   r     s   $r   zaten::is_floating_pointc                 C  s6   t |r| jdtdgdS | jdtdgdS Nrb  rN  rc  r   )r   rt  r/  rd  
BoolTensorr  r  r  r   ro     s   
ro   zaten::__is_c                 C  sL   t |r t |r| jdtdgdS | jdtdgdS t| ||S r  )r   r  r/  rd  r  rN   rZ  r  r  r   __is_  s
   

r  zaten::__isnot_c                 C  r  r  )r  rZ  r  r  r   __isnot_  r  r  zaten::one_hotc                 C  sn   | j dtddgd}tj|tjjtjjtjjtjj	tjj
hv r-| j d|tjjd}| j d|||dd	S )
Nrb  r   rN  rc  rl  rm  OneHotr  r@  )r/  rd  r  r   rq  rr  rs  r  r  r  r  rn  ro  rp  )r2  rE  Znum_classesr3  r  r  r   r     s   r   zaten::gatherc           	   	   C  s   t |drt dd|S tj|}| jdtddgd}t	| || jdt|gd}| jd| jd	||||d
|
 d}| dt | ||d g|}t j| ||gddS )Nr  r\   zsparse_grad == Truerb  r   rN  rc  rl  r  r@  rm  rO  r  )r   r  r  r   rq  rr  r/  rd  r  r   rv  r  rg  )	r2  rE  rE   rm   Zsparse_gradrx  r3  depthr   r  r  r   r\     s   r\   c              	   C  s8  |d u r| j d|dd}|}t| |}n1| j d|||d}| j d||dd}|  d|}| j d|| j dt|d	dd
}| j d|dd}|  d||}	|  d|	|	}
|d u rYdn|}| j d|
||d}|d u rjd}|dkr| j d|tjjd}| j dtj|tjdd	}|  d||}|  d||  d||}||fS )Nr  r   rQ  r  rN  r7  r   rb  rc  r@  r  rW  rO  rl  rm  rz  rk  )r/  r   rd  r   rn  ro  ru  r  )r2  r:  rE   Z
correctionr  r  Zt_meanZnum_elementsZredudced_dimsZsub_vZsqr_subZkeepdim_meanr  r  r   r  r  r   	_var_mean  s8   
r  z	aten::stdc                 G  s"   t | |g|R  \}}| d|S Nr  r  r/  r2  r:  r  r  r  r  r  r   r     s   r   z	aten::varc                 G  s   t | |g|R  \}}|S r  )r  r  r  r  r   r    s   r  zaten::var_meanc                 G  s2   t |dkrt| |d |d d S t| |g|R  S )NrN  r   )r\  r  )r2  r:  r  r  r  r   r     s   r  zaten::std_meanc                 G  s&   t | |g|R  \}}| d||fS r  r  )r2  r:  r  r  r  r  r  r   r     s   r   zaten::logsumexpc                 C  rZ  )NZReduceLogSumExpr  r8  r  r  r  r   r     s   r   aten::arangec           
        s  t  r jdg|R  S tjdd }tj fdd}t|dks)t|dkrpt|dkr2d }n||d }t j |d	 |d
\}}}}t  |d	g}||}t  t	 t
 ||d d dg}	 jd|	t| dS t|dks|t|dkrt|dkrd }n||d }t j |d	 |d |d |d\}}}}t  |d	g}t  |d	g}t  |d	g}| d d|||}t  t	 t
 |d d d dg}	 d d|	||}	 jd|	t| dS t|dkrO||d }t j |d	 |d |d\}}}}t  |d	g}t  |d	g}| d||} dt  t	 t
 ||g|dd  R  dg|}	 jd|	t| dS t ddt| dS )Nr   c                 S  s   t | d} | S )Nr  )r   r  rz  r  r  r   _get_arange_dtype"  s   z!arange.<locals>._get_arange_dtypec                   s.   t | r jd d| tjj d} | S )Nrl  r[  rm  )r   rt  r/  r   rq  rp  rv  )range_tensorr  r  r   _float_step_convert'  s   


z#arange.<locals>._float_step_convertr  r  rN  r   )r  r{  rl  rm  r(  r  r{  )r  r  r/  r{  rk  rW  rL  rO  rZ  )r  r  r{  r  r  r  )r   r  r  r   r  r\  Z_arange_cast_helperr  r>  r   r   r/  r   rq  rv  r  )
r2  r  r  r  r{  r  r  r/  r  Zarange_tensorr  r  r   r     st   
	
&r   zaten::linspacec           
      C  sT   t | |d }t| t| ||t| || jdtjdtjdd}	t| t	| ||	|S )Nrb  rN  rz  rc  )
r   Z_arange_helperrF   r   r/  rd  r   r  r   r   )
r2  r  r  Zstepsr{  ru  rv  rw  r  r/  r  r  r   r~   o  s   
 r~   z
aten::liftc                 C  r  r  r  r  r  r  r   rx   }  r@  rx   zaten::masked_fillc                 C  s6   | j d|tjjd}t|}|  d|t|||S )Nrl  rm  r  )r/  rn  ro  r  r   rT  r  r2  rE  maskre  r  r  r   r     s   
r   zaten::masked_fill_c                 C  r  r  )r   r   r  r  r   r     r  r   aten::indexc                   s0  t  rjd|ddS t |rt |}n|g}tjfddfdd|D }t|dkr@t jd	|d	 d
dS dd t	|D  t d	krQS t dkrdt
 d	 | d	  S t }|d u rtt ddS tdtj d t }tfddt|D jd  fddt|D  djd|d| d  } d  }t|d ddD ]}d| |  |}	d||	}d| |  }qt
d	|t|}
 tt d	  d d krzjdtdgdg fddt|D  }jdg|R dd	i}t |ttd d	 d d	g tt d	 d || d  }jd|dfd dt d	 D |
g  fd!dt d	 |D  }jdg|R dd	i}njd|
g fd"dt|D R dd	i}t |S )#Nrm   r  )r.  c                   sh   t | s2tj| tjjtjjkst | r2 jdk r"t	
dtd t  t | dg} | S )Nr  z?Exporting masked indices are only supported after ONNX opset 9.zExporting aten::index operator with indices of type Byte. Only 1-D indices are supported. In any other case, this will produce an incorrect ONNX graph.rN  )r   r  r   rq  rr  rs  r  rY  r  r   rj  r!  r"  r>  r   )rm   r  r  r   try_mask_to_index  s$   

z index.<locals>.try_mask_to_indexc                   s   g | ]} |qS r  r  )r  r  )r#  r  r   r    r  zindex.<locals>.<listcomp>rN  r   F)Zapply_reshapec                 S  s   g | ]\}}t |s|qS r  )r   r  )r  r  r  r  r  r   r    s
    r"  zoperator of advanced indexing on tensor of unknown rank. Try turning on shape inference during export: torch.onnx._export(..., onnx_shape_inference=True).z=Exporting aten::index operator of advanced indexing in opset z is achieved by combination of multiple ONNX operators, including Reshape, Transpose, Concat, and Gather. If indices include negative values, the exported graph will produce incorrect results.c              
     s0   g | ]} j d  j dt|gdddqS )r   rb  rc  r   r@  )r/  rd  r  r  rE   )r2  shape_tensorr  r   r    s    r	  c                   s   g | ]}| vr|qS r  r  rl  )adv_idx_indicesr  r   r        r
  r  r@  r  r  rO  rL  rb  rc  c                      g | ]
}| vr| qS r  r  rl  r&  dim_tensor_listr  r   r    s    r=  r>  c                   s   g | ]} | qS r  r  rl  )r*  r  r   r  %  r  c                   r(  r  r  rl  r)  r  r   r  '  
    c                   r(  r  r  rl  r)  r  r   r  2  r+  )r   r  r  r  r  r   r  r\  r2  rS  rl   r  r  r!  r"  r   rR  r;  r  r/  r@  rd  r  rC  )r2  rE  rm   r$  r  Zadv_idx_countZcum_adv_index
multiplierr  Z	adv_indexZcum_adv_index_shape_tensorZfolded_adv_idx_shape_listZfolded_adv_idx_shapeZadv_idx_permuteZfinal_shape_listZfinal_shaper  )r&  r*  r2  rE  r%  r#  r   rm     s   

	


	rm   zaten::linalg_normordOptional[Sequence[int]]r{  c                 C  s   d }|d u r>t |rt | |dg}| jdtdgd}t |}|d u r.t dd|S |dkr9t |d}n!d	dg}nt	|dkrZt |rT| jdtdgd}t |d}|ret
| |||||S t| |||||S )
Nr  rb  r  rc  rE   (Input rank must be known at export time.rN  r_  r   )r   r  rC  r/  rd  r  r  r  r  r\  r|   rz   )r2  rE  r-  rE   r  r{  	ord_valueself_dimr  r  r   r{   =  s(   



r{   zaten::linalg_vector_normc                 C  s   |d u rt | |dg}d}|tjkr"| jd| d|||d}|S |tj kr7| jd| d|||d}|S |dkrDt dd	d
d|S | jdtj|tjdd}t j	| | d| d||||d}| d|| d| jdtjdtjdd|}|S )Nr  Fre  rA  r  rX  r   r|   r  rM  zord=0 not supportedrb  rz  rc  r  rk  rN  )
r   rC  r  infr/  rR  rd  r   r  rg  )r2  rE  r-  rE   r  r{  r  Zord_opr  r  r   r|   a  s6   

	r|   zaten::linalg_matrix_norm	List[int]c              	   C  s  t |d}|dkrt| |||S |dkrt dd|S t |d}|d u r-t| |||S |dks5|dkr<t dd	|S t |}|d u rLt dd
|S |d dk rZ|d  |7  < |d dk rh|d  |7  < |tjkss|tj kr|d |d |d< |d< |d |d kr|s|d  d8  < t j| | d||d g|d}|dkrt	| || jdt
|d gd|d\}	}
|	S t| || jdt
|d gd|d\}	}
|	S )Nrf  ZfroZnuczlinalg.matrix_normzord==nucr_  r  r  zord==2r/  r   rN  rA  r  rb  rc  )rU  r  )r   r  rY   r  r  r  r2  rg  r/  r   rd  r  r   )r2  rE  r-  rE   r  r{  r0  r1  r  r  r$  r  r  r   rz     sR   


rz   zaten::linalg_crossr  c                 C  r  r  )rB   )r2  r:  rJ  rE   r  r  r   ry     rF  ry   zaten::frobenius_normc                 C  s,   |  d||}tj| |||d}|  d|S )NrO  r  r  )r/  r   rg  )r2  rE  rE   r  ZsqrZsumsqrr  r  r   rY     s   rY   zaten::multinomialc                 C  sZ   |d urt |st dd| |s|dkrt dd| t| |}| jd|tjj|dS )NZMultinomialz*generator is not supported for multinomialrN  zGreplacement=False when num_samples > 1 is not supported for multinomial)r  Zsample_size_i)r   r  r  r   r/  rn  ro  rp  )r2  r:  Znum_samplesreplacementr  Z	log_inputr  r  r   r     s"   
r   zaten::baddbmmc           
      C  s\   t j|}t| ||}t| || jd|| d}t| || jd|| d}	t| ||	S r  )r   rq  rr  r   r   r/  rv  r   )
r2  rE  Zbatch1Zbatch2r  rV  rx  Z	batch_mulZmul_aZmul_br  r  r   r%     s   r%   zaten::meshgridindexingOptional[str]c                   s:  |d u rd}n|dvrt d| ||dkr%|d |d |d< |d<  fddt|D } fd	d|D } jd
g|R ddi}g }t|D ]6\}} jdtjdtjddgt	| }	|| |	|< t
 | jd
g|	R ddi}
| d|
| qL|dkr|d |d |d< |d<  jdg|R  S )Nij>   xyr7  zUnsupported indexing: r8  rN  r   c                   s,   g | ]}t  | jd tdgdqS )rb  r  rc  )r   rC  r/  rd  r  r  r  r  r   r    s    zmeshgrid.<locals>.<listcomp>c                   s   g | ]}  d |qS )r7  r8  r  r  r  r   r    r'  r=  r>  rb  rz  rc  r  prim::ListConstruct)r   rj  r   r  r/  rS  rd  r   r  r\  rB  r(  )r2  r  r5  r  Ztensors_shapeZ	out_shaperw  r  r   r  Z
t_reshapedr  r  r   r     s0   

 r   zaten::remainderc                 C  s(   t | ||}| d||}| d||S )NrO  rW  )rh  r/  )r2  r:  rJ  rF   Zquor  r  r   r   %  s   r   z
aten::geluapproximatec                 C  s"  |dkrXt dt j }d}tj|tjd}tj|tjd}tjdtjd}tjdtjd}t| |t| ||}	t| |t| |t| ||	}
t| |t| |t| || d|
S d}| d	| d
|tj|tjd}t| || jdtjdtjdd}t| t| ||| jdtjdtjddS )Nr   r  gHm?rz  r`        ?r  g;f?r  rk  rb  rN  rc  )	r  r   r  rd  r   r  r   r   r/  )r2  rE  r:  ZkBetaZkKappar  kappar  ZhalfZ	self_cubeinnerZ_sqrt2rO   Zerf_plusoner  r  r   r^   -  s(   $"
r^   zaten::group_normc              
   C  s  t  r| jd||||||dS t |d}|d ur"|| dks"J t |}|d u r2t dd|S d|dg}	t | || jdt	|	d}
| jdtj
d	g| tj| d
d}| jdtj
dg| tj| d
d}| jd|
|||d}t | || d|}|d u s|  rtj
d	gtj| d
}| jd|d}|d u s|  rtj
dgtj| d
}| jd|d}ttd|d }t| t| |t | ||t | ||S )Nra   )Znum_groups_ir  Zcudnn_enabled_irN  r   zunknown input rankr  rb  rc  r`  rz  r  r   r!  r7  )r   r  r  r  r  r  rC  r/  rd  r  r   r   rq  rr  r{  r  
mustBeNoner@  r  r   r   r  )r2  r:  Z
num_groupsr#  r  r  r  r#  Z
input_rankrA  r*  r(  r)  Znorm_reshapedr   r$  r%  r  r  r  r   ra   J  sl   



ra   zaten::_weight_normc                 C  s   t |}|d ur:tt|}|d ur$|dk r||7 }|dkr$|| t| |d|d}| d||}| d||S t  rG| jd|||dS t	
d|)	Nr  r  rN  rk  rO  _weight_normr  zDUnsupported: ONNX export of _weight_norm for tensor of unknown rank.)r   r  r@  r  remover   r/  r  r  r   rj  )r2  r  Zweight_grE   r  r  Znorm_vrF   r  r  r   r?    s"   

r?  z	aten::dimc                 C  r  )zFImplement the dim functionality available for a pytorch tensor in ONNXr7  Sizer8  rD  r  r  r   rE     s   zaten::__contains_c                 C  s`   t |}tdd |D r*t |r*| jdtt | ddd |D v dS t	
d|)Nc                 s  s    | ]}t |V  qd S r  )r   r  r  r  r  r   r    s    

z__contains_.<locals>.<genexpr>rb  re  c                 s  s     | ]}t | d V  qdS )re  N)r   r9  r  r  r  r  r   r    s    rc  zJUnsupported: ONNX export of __contains__ for non-constant list or element.)r   r  r  r  r/  rd  r   r9  r  r   rj  )r2  rE  elementZunpacked_listr  r  r   __contains_  s$   
rC  zaten::__getitem_c                 C  s    t | || jdtdgd|S r\  )r   r/  rd  r   )r2  rE  r  r  r  r   
__getitem_  rC  rD  z
aten::itemc                 C  r  r  r  r  r  r  r   rr     r  rr   z
aten::takec              
   C  sD   t | || jdtjdgtjdd}t| |d|}t| ||}|S )Nrb  r  rz  rc  r   )r   rC  r/  rd  r   r  rl   r   )r2  rE  rm   Zself_flattenedrw  r  r  r   r     s   r   c                 C  s&   t | ||}t| |}t| ||}|S r  )r   rP   r   )r2  r:  targetdiff_Zexp_r  r  r  r   _kl_div_log_target_impl  s   
rG  c           	      C  sZ   t | |}t| ||}t| ||}t| |}t| || jdtdd}t| |||}|S r\  )	r   r   r   r  rb   r/  rd  r   r  )	r2  r:  rE  Zlog_rF  Z
output_posZzeros_Zmask_r  r  r  r   _kl_div_non_log_target_impl  s   

rH  zaten::kl_divc                 C  sf   |r	t | ||}nt| ||}|dkr|S |dkr!| jd|ddS |dkr-tj| |ddS td|S )Nr   rN  r  rQ  r  z4kl_div with reduction other than none, mean, or sum.)rG  rH  r/  r   rg  r  )r2  r:  rE  	reductionZ
log_targetr  r  r  r   rs     s   rs   zaten::mse_lossc                 C  sd   t | t| ||t| ||}|dkr|S |dkr | jd|ddS |dkr,tj| |ddS td|S )Nr   rN  r  rQ  r  z6mse_loss with reduction other than none, mean, or sum.)r   r   r/  r   rg  r  )r2  r:  rE  rI  r  r  r  r   r     s   r   zaten::as_stridedc                 C  s  t |d}t|}t | || jdtjdgtjdd}t |s`tjdgtj	d}t
t||D ]\}\}	}
dg| }d||< |t|	||
  }q2|rT|| }| d|| jd|dS d }t
|D ]Y\}}
dg| }d||< t| || jdtdgd| jdt|d}	t | t| |	d	d d d | jdt|d}| d
|| jdt|
gd}|d u r|}qf| d||}qf|r| d|| dt|g}| d||S )Nr  rb  r  rz  rc  r   rN  r   r(  rO  rL  )r   r  r\  rC  r/  rd  r   r  rP  r  rS  r  r   r  r   )r2  rE  ry  stridesoffsetr  Zself_1dindr  r   rr  Zr_sizeZtmp_indr  r  r   r      sL   


r    zaten::__derive_indexc              	   C  s   |  d||  d||S )NrL  rO  r8  )r2  rm   r  r/  r  r  r   __derive_indexN  s   rM  zaten::__range_lengthc                 C  s6   |  d||}|  dt| ||}| j d|tjjdS )NrW  r[  rl  rm  )r/  r  rn  ro  rp  )r2  lor-  r/  r   rF   r  r  r   __range_lengthT  s   rO  zaten::linearc                 C  s   t |}t| |}|dkr9|  s9| jdtjdtjdd}| jdtjdtjdd}t	| |||||}|S t
| ||}|  sKt| ||}|S )Nr  rb  rN  rz  rc  )r   r  r   r  r>  r/  rd  r   r  r   r   r   )r2  r:  r#  r  r  rV  r  r  r  r  r   r}   d  s   

zaten::hann_windowOptional[int]c              	   C  s   |d u rt  }|r|jst j}tj|}	nt|}	t| |dd d d }
| jd|
t	j
jd}t| | jdt jtjt jdd|}|du rVt| || jdt jdt jdd}t| ||}| jdt| t| ||	 d}|S )	Nr(  rl  rm  rb  rz  rc  FrN  )rd  r  ro   r  r   rq  Z
from_dtyper   r/  rn  ro  ru  r   r   r  r  r   r-  rF   r   r   rv  )r2  Zwindow_lengthZperiodicr{  ru  rv  rw  r  Zdtype_rx  Zn_arrayr  r  r  r   rc   u  s,   

rc   zaten::mvc                 C  r  r  r   )r2  rE  Zvecr  r  r   r     r<  r   z	aten::dotc                 C  r  r  rQ  rZ  r  r  r   rG     r<  rG   zaten::movedimc           
      C  s   | d}| d}| | ksJ ||k r|S t|}|d us'J tt|}| }| }t|	 |	 D ]\}}	|||	< d||< d||	< q>dd |D }dd |D }t||D ]\}}	|||	< qb| j
d||dS )Nr  c                 S     g | ]}|d kr|qS r  r  r$  r  r  r   r    r'  zmovedim.<locals>.<listcomp>c                 S  rR  rS  r  r$  r  r  r   r    r'  r	  r
  )r  r   r  r   r  r@  r  r"  r  tolistr/  )
r2  rE  r9  destinationrM  r  Zsrc_dimsZdst_dimsr  dstr  r  r   r     s&   




r   z
aten::fillc                 C  s    t j|t jj}t| |||S r  )r   rq  rr  ru  rZ   )r2  rE  re  rx  r  r  r   rT     s   rT   zaten::index_addc                   s  t d |rtt|dkrtdd|S t d  d u r(td|t	|}t	|}|d u s:|d u r@td|||krZ|| }t
|D ]}	t| |t	|g}qLt| }
t| }|
d urx|d urx|
|krxtd|tt
|}d	d
 t
|D } fdd
t
|D }tj| ||||d}t| ||}t
 D ]
}	t| |dg}qt
|  d D ]}	t| |t	|g}qt| | t| |||S )NzyWarning: ONNX export does not support duplicated values in 'index' field, this will cause the ONNX model to be incorrect.rN  rh   z
alpha != 1r  zXONNX export does NOT support exporting 'index_add_()' function with unknown 'dim' value.z~ONNX export does NOT support exporting 'index_add_()' function while the rank of self tensor or tensor to be added is unknown.zoONNX export does not support exporting 'index_add_()' function with duplicated values in 'index' parameter yet.c                 S  r  r  r  rl  r  r  r   r    r  zindex_add.<locals>.<listcomp>c                   s   g | ]}| krt jnd qS rs  )sysmaxsizerl  rE   r  r   r    s    r?  r   )r!  r"  r   rS  rT  r  r  r   rj  r  r  r  r  r@  rA  rQ   r   )r2  rE  rE   rm   rJ  rV  Zself_dim_rankZother_dim_rankdeltar  Zother_dim_sizeZself_dim_sizeZnew_shape_axesZnew_shape_startsZnew_shape_endsr:  r  rY  r   rh     s\   


rh   z
aten::rollc                 C  s   t |t |ks
J |}tt |D ]A}g }tj| ||| g||  gtjgd}|| tj| ||| gdg||  gd}|| | jdg|R d|| i}q|S )Nr?  r   r=  r>  )r\  r  r   rA  rW  rX  r(  r/  )r2  rE  Zshiftsr  r  r  r  rA  r  r  r   r     s   

r   zaten::crossc                 C  sp   t ||}t| |dg|g}t| |dg|g}t| |dg|g}t| |dg|g}t| t| ||t| ||S )Nr  rN  )r   Z_get_dim_for_crossr   r   r   )r2  r:  rJ  rE   Zroll_x_1Zroll_y_1Zroll_x_2Zroll_y_2r  r  r   rB   4  s   rB   zaten::cdistr  #use_mm_for_euclid_dist_if_necessaryc                 C  sR   t |}|d usJ t | ||d g}t | ||d g}t| |||dddS )NrN  r  gư>F)r  r  )r   r  r  r   )r2  r=  r>  r?  Zcompute_moder  Zbroadcasted_x1Zbroadcasted_x2r  r  r   r/   H  s   
r/   z
aten::lerpc                 C  sx   |  d||}t| |  d|| j dtdd|  d||  d|||  d||  d||  d| j dtdd|S )	NrW  r  rb  r;  rc  rL  rO  r`  )r/  r  rd  r   )r2  rE  r  r#  diffr  r  r   rw   `  s   rw   zaten::broadcast_tensorsc                   sT   t |}t |d |D ]}t |q fdd|D } jdg|R  S )Nr   c                   s   g | ]}t  |qS r  )rQ   r  r2  Zt_with_final_shaper  r   r    r'  z%broadcast_tensors.<locals>.<listcomp>r9  )r   r  r  r   r/  )r2  rE  Zall_tensorsr   Zt_listr  r]  r   r+   v  s   
r+   zaten::is_pinnedc                 C     d S r  r  )r2  rE  rv  r  r  r   rp     r  rp   prim::ConstantSplitc                 C  s^   t ||}|d u rt dd|S |g||  }|| }|r#|| | jd|||t|dS )Nr_  r0  r1  r2  )r   r  r  r(  r/  r\  )r2  rE  r5  rE   r   r6  r7  r  r  r   r     s   
r   prim::ConstantChunkc                 C  s@   t ||}|d u rt dd|S || d | }t| |||S )Nr`  r0  rN  )r   r  r  r   )r2  rE  r3  rE   rJ  r5  r  r  r   r     s   r   zprim::shapec                 C  r5  r6  r8  r  r  r  r   r     r<  r   z	prim::maxc                 C  s   t | d||ddS )NrL  rG  rX  rY  rZ  r  r  r   r     s   r   z	prim::minc                 C  sB   |st |rt| || jdtdgd}t| |S t| ||S r\  )r   r  r   r/  rd  r   r   rZ  r  r  r   r     s
   

r   z
prim::datac                 C  r  r  r  r  r  r  r   r     r  r   zprim::layoutc                 C  s   | j dtddS r\  r  r  r  r  r   r     r  r   r9  c                 O  r^  r  r  r2  rT  r  r  r  r   r     r  r   zprim::ListUnpackOptional[List[_C.Value]]c                 O  s2   t |dkr|d   dkrt|d S d S )NrN  r   r9  )r\  r  r  r   r  ra  r  r  r   r     s    r   zprim::TupleConstructc                 O  r^  r  r  ra  r  r  r   r     r  r   zprim::Uninitializedc                 O  r^  r  r  ra  r  r  r   r     r  r   zprim::unchecked_castc                 C  r  r  r  r  r  r  r   r     r  r   zprim::dtypec                 C  s.   t |}|d u rtjj}| jdt|dS ra  )r   r  r   rq  ru  r/  rd  r   r  r  r  r   r     s   
r   prim::tolistc                 C  s&   t |d}|dkrt dd|S |S )ztolist is currently supported only for 1D input tensors.

    dim_val and elem_ty_val represent dimension and type annotations
    that need to match dimension and type of the input tensor.
    r  rN  rc  zdim_val > 1)r   r  r  )r2  r:  Zdim_valZelem_ty_valrE   r  r  r   r      s   r   r  Nonec                 O  s>   | j   }t|tjrd S tdd|  d| j  S )Nr  z,output type should be 'DeviceObjType', not '')	original_noder  r  r?  r	   r  r   r  r  )r2  rT  r  output_typer  r  r   r     s   r   z
prim::LoopList[_C.Value]c                 O  s   | j }| j}| j}tj}tj}t| }tj	| dg|R |
 t|d\}	}
}t||
D ]L\}}t| D ]6\}}|dkrP|t|k rP|||   |dkro|d t|k rot| tjso|||d    q9tj||j||d q/tj||}tjrtj||| |S )NZLoopr)  Zn_blocksr   rN  F)rf  envparams_dictr   r  rR  r  blocksr   add_op_with_blocksoutputsSizer\  r  rS  rT  r0  r  r?  r	   r1  rd  _jit_pass_onnx_blockblock%_jit_pass_fixup_onnx_controlflow_nodeonnx_shape_inference(_jit_pass_onnx_node_shape_type_inference)r2  rT  attrsr  rj  rk  r  opset_version
old_blocksnew_op_outputsnew_block_contextsnew_node	old_blocknew_block_contextr  Zb_infixed_outputsr  r  r   r     sL   r   zprim::Ifc                 O  s  | j }| j}| j}| j}tj}tj}|d   dk}	|	rt	
|d  d }
t|
tr3t|
nt|
}|r;dnd}t| | }tj||||d}t| }t| }g }tt|D ]!}|| |vrytd||  d|| |||  }|| qc|S t| }tj| dg|R | t|d	\}}}t||D ]\}}tj||j||d
 qtj||}tj rtj!||| |S )Nr   r  re  rN  TzThe sub block ATen output z is not in env.Ifri  F)"rf  rp  rj  rk  r   r  rR  r  r  r   r9  rT  r?  r@  r  r  rl  rd  r	   ro  r)  r  r\  r   rj  r(  r  r   rm  rn  r  rq  rr  rs  )r2  rT  rt  r3  rp  rj  rk  r  ru  Z	static_ifZ
input_flagr  Z	block_idxZ	current_bZif_output_listZcurrent_b_listZfinal_b_listr  Zonnx_brv  rw  rx  ry  rz  r{  r|  r  r  r   r   S  sp   r   r.  c                   s(   j }| r	d S t|  tjrd S |ddkr' jdt	
|ddS |ddkr9 jdt	
|ddS |  tj sQ|  tj r_ jdtt	
|ddS |  tj r fddt	
|dD } jd	g|R  S td
|d dtj d| )Nre  r   rb  rc  rf  Zvalue_sc                   s   g | ]	} j d |dqS )rb  r~  r8  )r  rf  r  r  r   r    s    z!prim_constant.<locals>.<listcomp>r9  z"Unsupported prim::Constant kind: 'z'. Please send a bug report at .)rf  r>  r?  r  r  r	   r  r  r/  r   r9  r  r  r  ZofFloatsrd  r   Z	ofStringsr   rj  r
   ZPYTORCH_GITHUB_ISSUES_URL)r2  rT  rt  r  Zstr_constantsr  r  r   r     s8   

r   
prim::typedevice_valuec                 O  sJ   |   dkrt|   }|d ur| jdt|dS tdd|S )Nr  rb  r~  r  z,Device type cannot be statically determined.)	r  r  r   Zget_device_from_valuer:  r/  r$  r   r  )r2  r  r  r  rv  r  r  r   r     s   r   zonnx::Placeholderc                 O  s"   | j }| j}| j}tj|||S r  )rf  rp  rj  rd  r	   Z'_jit_onnx_convert_pattern_from_subblock)r2  rT  rt  r  rp  rj  r  r  r   r     s   r   zaten::resolve_conjzaten::resolve_negc                 C  r  r  r  r9  r  r  r   r    s   	r  zaten::_conjzaten::conj_physicalc                 C  s    t |rt d|S t| |S )Nz aten::_conj, aten::conj_physical)r   Zis_complex_valuer  r  r9  r  r  r   r
    s   
	
r
  zaten::logitc                 C  s   | j dtdd}t|sC| j d|tj| d}|  d||}|  d||}|  d|||}|  d	||}|  d|||}n|}|  d||}	|  d
||	}
|  d|
S )Nrb  r`  rc  rl  rm  rW  r  r  r  rk  rB  )	r/  rd  r   r   r  r   rq  rr  rv  )r2  rE  r  r  Zone_sub_epsZself_less_equal_one_sub_epsZtemporary_selfZtemporary_self_less_epszr   rF   r  r  r   r   	  s   
r   )r#  r$  )r2  r4  r  )r`  )T)r  r$  r#  r$  r  r  r  )F)r2  r4  r:  r^  r_  r  r`  r  )rE   r-  )r2  r4  r:  r^  r   r^  )
r2  r4  r:  r^  r   r^  r+  r^  re  r^  )r#  r$  rE   r-  r  r$  )r*  r   r  r   )NNN)r2  r4  r:  r^  r  r  r#  r^  r  r^  r  r  r  r  )r2  r4  r:  r^  r  r  r#  r^  r  r^  r  r  r  r  r  r^  )
r2  r4  r  r  r  r   r  r   r  r  )FFr  )FN)NNNFN)NNF)r2  r4  rE  r^  r  r  r  r  )r  r$  )NNFN)r2  r4  r:  r  rE   r  r  r  )r2  r4  rE  r  r-  r  rE   r.  r  r  r{  r  )r2  r4  rE  r  r-  r  rE   r.  r  r  r{  r  )r2  r4  rE  r  r-  r  rE   r3  r  r  r{  r  rS  )NF)r2  r4  r5  r6  )r  )r2  r4  rE  r  r:  r$  )TNNNNF)r2  r4  r{  rP  )r  r[  )r2  r4  r  rb  )r2  r4  r  rd  )r2  r4  r  rh  )r2  r4  r  r^  )r2  r4  r:  r^  )r2  r4  rE  r  r  r  (v  __doc__
__future__r   r  r  r  rW  r!  typingr   r   r   r   r   r   rd  Ztorch._C._onnxr	   Z_onnxrn  Ztorch.nn.modules.utilsZ
torch.onnxr
   r   r   r   r   Ztorch.onnx._globalsr   Ztorch.onnx._internalr   r   r   Ztorch.typesr   r'  partialZonnx_symbolicZ_onnx_symbolicr"  r-  r  r  r;  rB  r  r   r   r   r   r   r   rF   r  r   r]  ri  rh  rV   rX   r  r   r.   r   r  r   r*   r   r   r   r   r   r   r   r@   r   r"   r   r#   r$   r   r   r  r  r  r   r  rC   r  r  r   r   rR   r,   rQ   rK   rJ   r   r  r   r  r  r  r   r  r   r  r  r   r   r   r   r   r   rU  r   r   r0   rW   r]  r   rv   r`   r   r   r_   nnmodulesutilsZ_singleZ_pairZ_tripler  r   r   r   r  r  r  r  r5   r  r   r   r   r  r  r(   r)   r  r  r  rN   r   rb   r  r   r  r]   ru   r  r  r  r   r   r   r   r  r  r  r   r  r   r  r?   r;   r<   r=   r8   r9   r:   r&   r   rt   rn   r  rI   r   rl   rk   rj   ri   r-   r  rA   r   r4   r   r   r   r   r   r3   r2   r1   r   r   r   r   r   r   r   rP   rH   r`  r   r7   rb  rg  
deprecatedrj  rl  rm  rn  ro  rp  rq  rr  rs  rM   rL   r   r   r   r!   r  r  r   r  r   r   r   r[   rZ   r   rS   r   rg   rf   re   r   rd   r   r   r	  r   r   r   r>   r   r   r   r   r   r  r  r  r   r   r  r  rD   r6   r  r  r   r   r   r   r   r   r   r'   r   rO   rU   r   r   rq   r	  r
  r   r   r   r   r   r   ro   r  r  r   r\   r  r   r  r  r   r   r   r~   rx   r   r   rm   r{   r|   rz   ry   rY   r   r%   r   r   r^   ra   r?  rE   rC  rD  rr   r   rG  rH  rs   r   r    rM  rO  r}   rc   r   rG   r   rT   rh   r   rB   r/   rw   r+   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r   r  r  r  r   <module>   s      		



5
4	


!
>5	

	>+			;



8			


7)		







C	7###7:_$
#



	

	
		H


Kh
F
C fC

*
		"Q *!&;

E	
,	& 
E
2W"	