a
    db                    @   s:  d 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%e&dddZ'ej(dd Z)e$dej(ej*dddZ+e$dej(ej*dddZ,e$de-dej(ej*dddZ.e$de-dej(ej*ddd Z/e$d!ej(dej*dd"d#Z0e$d$ej(dej*dd%d&Z1e$d'ej(dej*dd(d)Z2e$d*ej(ej*dd+d,Z3e$d-ej(ej*dd.d/Z4e$d0e5d1d1d1d2ej(d ej*dd4d5Z6e5d1d1d6ej(ej*dd7d8Z7ej(ej*dd9d:Z8ej(ej*dd;d<Z9e$d=ej(ej*dd>d?Z:e$d@ej(ej*ddAdBZ;e$dCej(ej*ddDdEZ<e$dFej(ej*ddGdHZ=e$dIe5d1dJej(ej*ddKdLZ>e$dMe5d1dJej(ej*ddNdOZ?e$dPej(ej*ddQdRZ@e$dSej(ej*ddTdUZAe$dVej(ej*ddWdXZBe$dYej(ej*ddZd[ZCe$d\e5d1d1d1d]d]ej(ej*dd^d_ZDe$d`ej(ej*ddadbZEe$dcej(ej*ddddeZFe$dfej(ej*ddgdhZGe$diej-ddjdkdlej(ej*ddmdnZHe$doej(ej*ddpdqZIe$drej(ej*ddsdtZJe$duej(ej*ddvdwZKe$dxej(ej*ddydzZLe$d{ej(ej*dd|d}ZMe$d~ej(ej*dddZNe$dej-ddddlej(ej*dddZOe$dej(ej*dddZPe-dej(ej*dddZQej(ej*dddZRej(d!ddZSej(dd ZTe$de%ddgde$de%ddgde$de%ddddgdej(d"e&e&eUdddZVe$de5d1dJdej(ej*dddZWe$dej(ej*dddZXe$dej(ej*dddZYe$dej(ej*ddd]ZZe$de-dej(ej*dddZ[e$de-dej(ej*dddZ\e$de-ddej(ej*dddZ]e$de-de5d1d1dJdd1ej(ej*dddZ^e$de-de5d1d1d1dJdJdJd1dJdJ	ej(ej*dddZ_e$dej(d#ej*dddZ`e$de-de5d1dJdJej(ej*dddZae$de5d1d¡ej(ej*dddĄZbe$dŃe-dej(ej*dddǄZce$dȃej(ej*dddʄZde$d˃e5d1dJdJdJej(d$ej*ddd̈́Zee$d΃e5d1d1dJdJej(d%ej*dddЄZfe$dуej(d&ej*dddӄZge$dԃe5d1ddJdJej(d'ej*dddքZhe$d׃ej(d(ej*dddلZie$dڃe5d1dJdJej(d)ej*ddd܄Zje$d݃e-de5d1dJd1ej(ej*ddd߄Zke$dej(ej*dddZle$dej(d*ej*dddZme$dej(ej*dddZne$dej(ej*dddZoe$dej(ej*dddZpej(ej*dddZqe$de-dej(ej*dddZre$de-dej(ej*dddZse$dej(ej*dddZte$dej(ej*dddZue$dej(ej*dddZve$d e5d1d]d]ej(ej*dddZwe$de-de5d1d2dej(d+ej*ejxeyeUdddZze$de5d1dJej(ej*ddd	Z{e$d
e5d1dJdej(d,ej*dddZ|e$dej(ej*dddZ}e$dej(dd Z~e$de%dejjjjddde'dgde$de%dejjjjddde'dgde$de%dejjjjddde'dgdej(dd Ze$ded ejjjjdddZe$d!ed"ejjjjdddZe$d#ed$ejjjjdddZe$d%e%d&ejjjje'd&gde$d'e%d(ejjjje'd(gde$d)e%d*ejjjje'd*gdej(d+d, Ze$d-e%d.d/ejjjje'd.gde$d0e%d1d/ejjjje'd1gde$d2e%d3d/ejjjje'd3gde$d4e%d5d6ejjjjee'd5gde$d7e%d8d6ejjjjee'd8gde$d9e%d:d6ejjjjee'd:gdej(d-d;d<Zej(ed=d>d?Zej(d@dA Ze$dBej(ej*ddCdDZej(ej*ejxejxdEdFdGZe$dHe$dIe$dJej(ej*ddKdLZe$dMe$dNe$dOej(ej*ddPdQZe$dRej(ej*ejxejxejxejxdSdTdUZe$dVe%dWddXe'dWgde$dYe%dZd[dXe'dZgde$d\e%d]d^dXe'd]gde$d_e%d`ddae'd`gde$dbe%dcd[dae'dcgde$dde%ded^dae'degdej(e&ee&dfdgdhZe$diej(ej*ddjdkZe$dlej(ej*ddmdnZe$doej(dpdq Zej(drds Zej(eedtdudvZe$dwej(ej*ddxdyZe$dze-ddej(ej*dd{d|Ze$d}e-ddeej(ej*dd~dZe$de-ddej(ej*dddZej(ej*dddZe$de-ddej(ej*dddZej(ej*dddZe$de-ddeej(ej*dddZe$de-ddeej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dedej(ej*dddZe$dedej(ej*dddZe$dedej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$de5d1d1d1dJej(d.ej*dddZe$de5d1dJdej(d/ej*dddZe$de5d1dJdJej(ej*dddZe$de5d1d1d1ddddJddJdJdJdJdJej(d0ej*dddZe$de5d1d1d1ddddJddJ	ej(ej*dddZe$de5d1d1d1ddddJej(ej*dddZe$de5d1d1d1ddddJej(ej*dddZe$de5d1d1d1ddddJej(ej*dddZe$de5d1d1d1ddddJd¡ej(ej*dddÄZe$dăe5d1d1d1ddddJd¡ej(ej*ddŐdƄZe$dǃe5d1d1d1ddddJd¡ej(ej*ddȐdɄZe$dʃe5d1d1d1d1d1dJd2d2dJ	ej(ej*ddːd̄Ze$d̓e-dddde5d1dd1d1d2ej(ej*ejxe
e ejxejxeyeejxejxejxf dΜdϐdЄZe$dуe-dddde5d1dd1d1d2dej(ej*ejxe
e ejxejxeyeUejxdҜdӐdԄZe$dՃe5d1d1d1d1d1dd2d2d	ej(ej*eUe e eUd֜dאd؄Ze$dكe5d1dJdJdJej(ej*ddڐdۄZe$d܃e-de5d1d]d]d]ej(ej*ddݐdބZe$d߃e-dej(ej*dddZe$de5d1dJd1ej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$de5d1d1ddej(d1ej*dddZe$dej(ej*dddZe$de5d1d1dJd2ej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$d ej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$d	ej(ej*dd
dZe$dej(ej*dddZe$de5d1d1ej(ej*dddZe$de5d1d1ej(ej*dddZe$dej(d2ej*dddZe$de-ddej(ej*dddZe$dej(d3ej*dddZe$de-ddej(ej*ddd Ze$d!e-de5d1ddJej(ej*dd"d#Ze$d$e-de5d1ddJej(ej*dd%d&Ze$d'e-de5d1d1dJej(ej*dd(d)Ze$d*ej(ej*dd+d,Ze$d-e$d.e5d1d2dJej(ej*dd/d0Ze$d1e%d1gde$d2e%d2gde$d3e%d3gde$d4e%d4gde$d5e%d5gde$d6e%d6gdej(e&dd7d8Ze$d9e5d1d]ddJej(ej*dd:d;Ze$d<e5d1d1d1dJej(ej*dd=d>Ze$d?e5d1dJdJej(ej*dd@dAZe$dBe5d1dJdJdJej(ej*ddCdDZe$dEeېdFdGdHej(ej*ddIdJZe$dKeېdFdGdHej(ej*ddLdMZe$dNeېdFdGdHej(ej*ddOdPZe$dQeېdFdGdHej(ej*ddRdSZe$dTeېdFdGdHej(ej*ddUdVZe$dWeېdFdGdHej(ej*ddXdYZe$dZeېdFdGdHej(ej*dd[d\Ze$d]eېdFdGdHej(ej*dd^d_Ze$d`eېdFdGdHej(ej*ddadbZe$dce5d1dJd1d1d1d1ej(d4ej*ddddeZe$dfe5d1dJd1d1d1d1ej(d5ej*ddgdhZe$diej(d6ej*ddjdkZe$dlej(ej*ddmdnZe$doej(d7ej*ddpdqZe$drej(d8ej*ddsdtZe$due5d1dJd1d1d1ej(d9ej*ddvdwZe$dxe5d1dJd1d1d1d1ej(d:ej*ddydzZe$d{ej(d;ej*dd|d}Ze$d~ej(ej*dddZe$de5d1dJd1d1d1ej(d<ej*dddZe$de5d1dJd1d1d1d1ej(d=ej*dddZe$dej(d>ej*dddZe$dej(d?ej*dddZe$dej(d@ej*dddZe$dej(dAej*dddZe$dej(ej*dddZe$dej(ej*dddZe$de-de5d1d2d2ej(ej*ejxeyeydddZe$de-de5d1ej(ej*dddZe$dej-ddddle5d1ej(ej*dddZe$de5d1ej(ej*dddZe$de5d1d2ej(ej*dddZe$de5d1d2ej(ej*dddZe$dej(ej*dddZe$de5d1dJej(ej*dddZe$de5d1dJdJdej(dBej*dddZe$dej(ej*dddZ e$de5d1dJdJdJdJdej(dCej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dej(ej*dddÄZe$dăej(dDej*ddŐdƄZe$dǃe5d1dJej(ej*ddȐdɄZe$dʃe5d1dJej(ej*ddːd̄Zej(dEej*dd͐d΄Ze5d1d1d1dJdJd2dJdJdJ	ej(ej*ddϐdЄZ	e5d1d1d1d1dJdJd2dJdJ	ej(ej*ddѐd҄Z
e$dӃej(ej*ddԐdՄZe$dփej(ej*ddאd؄Ze$de%dڃe'dۃgde$de%d݃e'dރgde$de%de'dgde&dddZe$de5d1dJej(ej*dddZe$dej(ej*dddZe$de5d1dJej(ej*dddZe$de5d1d1dJej(ej*dddZe$de5d1d1dJd]d1ej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZe$dej(dFej*dddZe$dej(dGej*dddZe$d e5d1d2d2dJdej(ej*dddZe$dej(dHej*dddZe$de5d1ej(ej*dddZe$d	e5d1ej(ej*dd
dZe$de-ddde5d1dJdJej(ej*dddZe$de5d1ej(ej*dddZe$dej(dIej*dddZe$de5d1ej(ej*dddZe$dej(ej*dddZe$dej(ej*dddZ e$de5d1dJdJdJej(ej*ddd Z!e$d!e5d1d1dej(ej*ejjxejjxeUd"d#d$Z"e$d%e5d1d1dej(ej*ejjxejjxeUd"d&d'Z#e$d(e5d1dJd1d1ej(ej*dd)d*Z$e$d+e5d1dJd1d1ej(ej*dd,d-Z%e$d.ej(ej*dd/d0Z&e$d1ej(ej*dd2d3Z'e$d4ej(ej*dd5d6Z(e$d7eej(ej*dd8d9Z)e$d:ej(ej*dd;d<Z*e$d=e5d1dJd1d1ej(dJej*dd>d?Z+e5d1ddJdJej(ej*dd@dAZ,e$dBej(ej*ddCdDZ-e$dEej(ej*ddFdGZ.e$dHej(ej*ddIdJZ/e$dKej(ej*ddLdMZ0e$dNe5d1ddJej(ej*ddOdPZ1e$dQej(ej*ddRdSZ2e$dTej(ej*ddUdVZ3e$dWej(ej*ddXdYZ4e$dZej(ej*dd[d\Z5e$d]ej(ej*dd^d_Z6e$d`ej(ej*ddadbZ7e$dce5d1d1ddd1ej(ej*ejjxejjxe	e
e  eUejjxdddedfZ8e$dge5d1d2ddd1ej(ej*ejjxeye	e
e  eUejjxdddhdiZ9e$dje5d1d1ddd1ej(ej*ejjxejjxee eUejjxdddkdlZ:e$dme5d1d1dJej(dKej*ddodpZ;e$dqe5d1ddej(dLej*ddrdsZ<e$dte5d1dJdd1ej(dMej*ddudvZ=e$dwej(ej*ddxdyZ>e$dze5d1d6ej(dNej*e	e& d{d|d}Z?e$d~ej(ej*dddZ@e$de5d1d6ej(dOej*ejjxe&dddZAe$de-dddde5d1dJd1d1d2dJej(ej*dddZBe$de5d1d1dJej(ej*dddZCe$dej(ej*dddZDe$dej(ej*dddZEe$dej(ej*dddZFe$dej(ej*dddZGe$dej(ej*dddZHej(ej*dddZIej(ej*dddZJe$de5d1d1dJdej(ej*dddZKe$de5d1d1dJej(ej*dddZLe$de-de5d1d1ddJej(dPej*dddZMe$dej(ej*dddZNe$dej(ej*dddZOe$dej(ej*dddaZPe$de5d1ddJd1d1d1d1ej(dQej*e	e dddZQe$dej(ej*dddZRe$dej(ej*dddZSe$de5d1d]d]ej(ej*dddZTe$de5d1d1ej(ej*dddZUe$dej(dRej*dddZVe$de5d1dd¡ej(ej*ddÐdĄZWe$dŃe5d1d1dJej(dSej*ddƐdǄZXe$dȃej(dTej*ddːd̄ZYe$d̓ej(ej*ddΐdτZZe$dЃej(ej*ddѐd҄Z[e$dӃdUej*ddԐdՄZ\e$dփej(ej*ddאd؄Z]e$dكej(ej*ddڐdۄZ^e$d܃ej(ej*ddݐdބZ_e$d߃ej(ej*dddZ`e$dej(dVej*dddZae$dej(ej*dddZbe$dej*dddZce$dej(ej*dddZde$dej(ej*e	eejx  dddZee$dej(ej*dddZfe$dej(ej*dddZge$dej(ej*dddZhe$dej(ej*dddZie$dej(ej*ddd Zje$dej(ej*ddddZke$dej(ej*eejx dddZle$dej(ej*eejx ddd	Zme$d
ej(ej*dddZne$dej(ej*ejxdddZoe$dej(ej*dddZpe$de$dej(ej*ejxdddZqe$de$dej(ej*ejxdddZrdS (W  zhThis file exports ONNX ops for opset 9.

Opset 9 is supported by ONNX release 1.4.1
release on 01/23/19
    N)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baddbmm
batch_norm	bernoullibitwise_not
bitwise_orbmmbroadcast_tensors	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_orlogical_xor	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
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  c/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/onnx/symbolic_opset9.py_apply$  s    z_apply_params.<locals>._applyr  )r  r  r  r  r  r  _apply_params!  s    r  namec                    s    fdd}|S )z5Exports the function in the current global namespace.c                    s   | t   < t  | S r  )globals__all__appendfuncr  r  r  wrapper-  s    

z_export.<locals>.wrapperr  )r  r#  r  r  r  _export*  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  5  s    
r  zaten::_shape_as_tensorr)  c                 C   s   |  d|S NShaper&  r)  inputr  r  r  _shape_as_tensor=  s    r1  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   )r)  r0  shaper  r  r  _reshape_from_tensorC  s    
r7  zaten::reshapeTc                 C   s   t | ||S r  )r   _reshape_helperr)  selfr6  r  r  r  r   K  s    r   zaten::reshape_asc                 C   s   |  d|}t| ||S r,  r&  r   r)  r:  otherr6  r  r  r  r   R  s    r   z	aten::addc                 C   sZ   t |r&t |r&t dddd|S |rLt t |dkrL| 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&  r)  r:  r=  alphar  r  r  r   Z  s    
r   z	aten::subc                 C   s4   |r&t t |dkr&| d||}| d||S )Nr@  rA  Sub)r   rE  rF  r&  rG  r  r  r  r   f  s    r   z
aten::rsubc                 C   s   t | |||dS )N)rH  )r   rG  r  r  r  r   n  s    r   z	aten::mulc                 C   s4   t |r"t |r"| d||S | d||S d S )NAndrA  )r   _is_boolr&  r)  r:  r=  r  r  r  r   t  s    r   z	aten::divc                 G   s0   t |dkrt| ||S t| ||g|R  S d S Nr   )lenr   _div_rounding_mode)r)  r:  r=  r  r  r  r  rC   ~  s    rC   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   )r)  r:  Ztensor1Ztensor2valueZ
value_tensr  r  r  r     s    r   sc                 C   sT   |d u rt | ||S |dkr(t| ||S |dkr<t| ||S td| d|d S )NrT   trunczUnsupported rounding mode: "z$". Expected None, "floor" or "trunc")r   _floor_divide_trunc_divider   SymbolicValueError)r)  r:  r=  Zrounding_moder  r  r  rO    s    
rO  c                 C   s   |  d||}| j d|tjjd}tj|tjj}|tjjkrt	|sjt	|rj| j d|tjj
d}q| j d|| d}n| 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)r)  r:  r=  outscalar_typer  r  r  r[    s    r[  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 d S )NFloorr]  rT  r   dtyperU  XorrI  rA  rJ  NotEqualr@  )r   rf  r   r&  rV  r   int64Z
_lt_helper)r)  r:  r=  ri  rC   r  negativemodZ
fixup_maskonefixupr  r  r  rZ    s     rZ  zaten::floor_dividec                 C   s   t | ||S r  )r[  rL  r  r  r  rS     s    rS   zaten::floordivc                 C   s   t | ||S r  )rS   rL  r  r  r  rU     s    rU   zaten::true_dividec                 C   s   t |st |r"| d||S t }tjj}|tju sJ|tj	u sJJ t tj	u r`t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
    r]  r^  r_  )r   rf  r&  rV  get_default_dtyper`  ra  rg  floatdoubleDOUBLE)r)  r:  r=  rj  Zonnx_scalar_typer  r  r  r     s    r   zaten::reciprocalc                 C   s*   t |s| jd|tjjd}| d|S )Nr^  r_  
Reciprocal)r   rf  r&  r`  ra  rg  r)  r:  r  r  r  r     s    
r   z	aten::catic                    s   t |}g  |D ]&}t |r.t |ds.q | qt dksJJ t fdd D sdJ |    D ]}| 	| qtt |}| j
dg|R d|iS )Nr   c                    sD   g | ]<}t  d  du p>t |du p>t |t  d  kqS r   N)r   _get_tensor_rank.0r   Znonempty_tensorsr  r  
<listcomp>  s   zcat.<locals>.<listcomp>r2  r3  )r   _unpack_list_is_constant_get_tensor_dim_sizer   rN  allnodeZremoveAllInputsZaddInputr&  )r)  tensor_listrB   tensorsr   r  r  r  r+     s&    

	
r+   zaten::stackc                    s2    fddt |D }jdg|R d iS )Nc                    s   g | ]}t | gqS r  r   _unsqueeze_helperr  rB   r)  r  r  r  0  s   zstack.<locals>.<listcomp>r2  r3  )r   r  r&  )r)  r  rB   Z
unsqueezedr  r  r  r   ,  s    r   z
aten::listc                 C   s   |S r  r  r{  r  r  r  _list7  s    r  zaten::mmc                 C   s,   | j dtdgd}| j d|||dddS )NrT  r@  rU  Gemm        rR  Zbeta_falpha_fr&  rV  r   )r)  r:  r=  Cr  r  r  r   =  s    r   z	aten::bmmc                 C   s   |  d||S NMatMulr.  rL  r  r  r  r(   F  s    r(   zaten::matmulc                 C   s   |  d||S r  r.  rL  r  r  r  r   L  s    r   zaten::addmmr   c              	   C   sH  d }t |}t |}t |}	|d ur0|}n|d ur>|}n|	d urJ|	}t |}
t |}dd }|d ur&||
ds||dr&| d||}|}t |}t |}|dkr| 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  )rP  ur  r  r  is_not_none_nord  s    zaddmm.<locals>.is_not_none_nor   r  r@  rT  rl  rU  rA  r>  r  r  )r   _try_get_scalar_typer~  r&  rE  rV  r   rm  )r)  r:  Zmat1Zmat2betarH  rj  self_scalar_typeZmat1_scalar_typeZmat2_scalar_typeZ	mat1_rankZ	mat2_rankr  Zres1Zres2r  r  r  r   R  sX    








r   z	aten::negc                 C   s   |  d|S )NZNegr.  r{  r  r  r  r     s    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 rH| j	d|t
jjd}| 	d|S )Nr^  r_  Sqrt)r   rc  rd  re  UINT8INT8INT16INTrb  r&  r`  ra  rg  r{  r  r  r  r     s    
r   zaten::rsqrtc                 C   s"   |  dttd|t| |S )Nr]  r@  )r&  r   _if_scalar_type_asrV  r   r   r{  r  r  r  r     s    r   z
aten::tanhg      ?   )scaleZ
zero_pointc                 C   s   |  d|S )NTanhr.  r{  r  r  r  r     s    r   z	aten::sinc                 C   s   |  d|S )NZSinr.  r{  r  r  r  r     s    r   z	aten::cosc                 C   s   |  d|S )NZCosr.  r{  r  r  r  r=     s    r=   z	aten::tanc                 C   s   |  d|S )NZTanr.  r{  r  r  r  r     s    r   z
aten::asinc                 C   s   |  d|S )NZAsinr.  r{  r  r  r  r!     s    r!   z
aten::acosc                 C   s   |  d|S )NZAcosr.  r{  r  r  r  r     s    r   z
aten::atanc                 C   s   |  d|S )NZAtanr.  r{  r  r  r  r"     s    r"   zaten::sigmoidg      p?c                 C   s   |  d|S )NSigmoidr.  r{  r  r  r  r     s    r   z
aten::signc                 C   s   |  d|S )NZSignr.  r{  r  r  r  r     s    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 )Nr@  r   Slice)axes_iZstarts_iZends_i)rN  r	   	INT64_MAXr&  )r)  r0  axesstartsendsr  r  r  _slice  s    &r  c                 C   sL   t j|t jj}|t jjkrHt|sH|t jjkrH| jd|tj	jd}|S Nr^  r_  )
r   rc  rd  re  r   rf  rb  r&  r`  ra  r)  r:  rj  r  r  r  _maybe_cast_reduce_op_input  s    
r  c                    s   t jd fdd	}|S )Nc                    sx   t | |}|d u s|t kr*t| |S  r2dnd}t||dt|dd }} r\|n|g}| j|||dS d S )Nisr|  rB   keepdimr  
keepdims_i)r  tupler   Z_handle_reduce_dim_none
_get_constr&  )r)  r:  rB   r  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_descriptorsrN  r   _unimplemented__name__)r)  r  Z	overloadsoverloadZarg_descriptorsr  r  r  r#    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  r  c                    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 )
NTrP  nonec                    sb   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |S Nonnx::Constantr|  rm  r^  r_  r%  	r  kindr   r  r&  r   rc  rh  r  )r)  r:  rm  r  r  r  r  reduce_nodim3  s    z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr  r|  c                    sf   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |||S r  r  )r)  r:  rB   r  rm  r  r  r  
reduce_dimA  s    z6_reduce_with_dtype.<locals>.reduce.<locals>.reduce_dim)r   quantized_args
parse_args)r)  r  r  r  Zdim_descr  r  r  r  r  r  reduce1  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  r6|  dkr&t dd|S | jd||dS t ddd| d S )Nr%  r@   rm  dim_ir  r?  )r   is_caffe2_aten_fallbackr  r  r  at_onnx_opset_unsupported)r)  r0  rB   rm  r  r  r  r@   R  s
    r@   zaten::_sample_dirichletc                 C   s8   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r)  r:  	generatorr  r  r  r  ^  s    
r  zaten::_standard_gammac                 C   s8   t  r,t |s t dd|S | d|S t d|S )N_standard_gammaznot able to export generatorr  r  r  r  r  r  j  s    
r  zaten::tc                 C   s6   t |}|d u s|dk r&| d|S | jd|ddS )Nr  ZIdentity	Transpose)r@  r   Zperm_i)r   r~  r&  )r)  r:  rankr  r  r  r   w  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~  r5  reversedranger&  )r)  r0  ndimpermr  r  r  r     s    
r   zaten::expandc              	   C   s   t |d}t |s,| jdt|d}n2t |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  rT  rU  r   rp  Expand)r   _maybe_get_constrB  r&  rV  
LongTensor_is_packed_listr8  r   r   r   rc  rb  r   r   r
  )r)  r:  r   Zimplicitrm  r   Zneg_onesr  r  r  rO     s    

 rO   zaten::expand_asc                 C   s   t |d}t|tjr|j}|tj}g }t|	 D ]F}t
|||||r:|| | jd|||d}q:| d|}| d||S )Nr   rT  rU  r-  r  )r   r  r4  rV  Tensorrm  r   rx  r  rB   equalr  r  rN   r   r&  )r)  r:  r=  Zself_t	orig_typedimsdr6  r  r  r  rN     s    
rN   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   r\  warningswarnr&  )r)  weightindicespadding_idxscale_grad_by_freqsparser  r  r  rH     s    
rH   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_weightsrG      )outputsZscale_grad_by_freq_iZmode_iZsparse_iZinclude_last_offset_iZpadding_idx_i)r   r  r  r  r  )
r)  Zembedding_matrixr  offsetsr  moder  Zper_sample_weightsZinclude_last_offsetr  r  r  r  rG     s$    
rG   z
aten::sizec                 C   sh   |d u r|  d|S t|ddk rZt|}|d urZt|d| }| j dt|d}t| ||S )Nr-  r|  r   rT  rU  )r&  r   r  r~  rV  r   Z_size_helperr)  r:  rB   r  r  r  r  r     s    
r   zaten::transposec                 C   s   ||kr|S t |}|d urTtt|}|| ||  ||< ||< | jd||dS t  rp| jd|d||dS td|d S )Nr  r  r   int)overload_nameZdim0_iZdim1_izAUnsupported: ONNX export of transpose for tensor of unknown rank.)	r   r~  r5  r  r&  r  r  r   r\  )r)  r:  Zdim0Zdim1r  r  r  r  r  r     s    
r   zaten::permuter  c                 C   s*   |t tdt|kr|S | jd||dS r  )r5  r  rN  r&  )r)  r:  r  r  r  r  r     s    r   z
aten::viewc                 C   s   t | ||S r  )r   )r)  r:  r   r  r  r  r	  $  s    r	  zaten::view_asc                 C   s   |  d|}t| ||S r,  r;  r<  r  r  r  r  +  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||  }|| }|rp|| | jd||||dS )	Nr   r  r?  'Dynamic number of outputs not supportedunknown dimension sizer@  SplitZsplit_ir3  r   )r   rD  r  r  r   r&  )	r)  r:  chunksrB   _outputsr   
split_sizesplitsleftoverr  r  r  r   2  s    

r   zaten::splitc           
      C   s   t ||st dddd|S t | d}| dkrJt| ||||S t |dd}t ||}|d u r|d ur~|| }nt dddd	|S |g||  }|| }	|	r|	|	 | j
d
||||dS )Nr   r  r?  r  rW  r   r|  r  z$Unknown dimension size not supportedr  r	  )r   _is_split_staticrD  	_node_getr  rB   r   r  r  r   r&  )
r)  r:  split_size_or_sizesrB   r  Z	split_valr  r   r  r  r  r  r  r   G  s(    



r   zaten::unsafe_splitc                 C   s   t | ||||S r  )r   )r)  r:  r  rB   r  r  r  r  r  c  s    r  zaten::split_with_sizesc                 C   s2   t ||st dddd|S | jd||||dS )Nr   r  r?  r  r  r	  )r   r  rD  r&  r)  r:  Zsplit_sizesrB   r  r  r  r  r   k  s
    
r   zaten::unsafe_split_with_sizesc                 C   s   t | ||||S r  )r   r  r  r  r  r   v  s    r   zaten::unbindc                    s^   |d u rt dddd|S jd|dg|  |d}|dkrB|gn|} fdd	|D }|S )
Nr   r  r?  r  r  r@  r	  c                    s   g | ]}t | gqS r  )r   _squeeze_helper)r  ri  r  r  r  r    s   zunbind.<locals>.<listcomp>)r   rD  r&  )r)  r:  rB   r  r   Zsqueezed_outputsr  r  r  r   ~  s    
r   zaten::selectc                 C   st   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 d S )Nr   r  r@  r  r  r  r  r3  )r   rF  rB  r	   r  _slice_helperr  r&  )r)  r:  rB   rj   Z	end_indexZ
slice_noder  r  r  r     s    
r   zaten::squarec                 C   s   |  d||S NrA  r.  r{  r  r  r  r     s    r   zaten::squeezec                 C   sJ  |d u r|  d|S t|dd}|dk rt|}|d urxtdt| d d d t||  d	 d
  ||7 }ntdd|S t||}|d u rtdt| d d t| d d d d  tj	| ||gdS |dkrtdt| d d t| d d d d  |S tdt| d d  tj	| ||gdS )NZSqueezer|  rB   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  r@  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  strr  r  r  )r)  r:  rB   Zsqueeze_dimr  dim_sizer  r  r  r     s    




r   zaten::preluc              	   C   s   t |}t |}t|}|d urp|dkrJt | |ttd|d }n&|dkrp|dgkrpt | |dg}d}|d ur|d ur||ksJ d| d| | d||S )Nr  r@  r   z)rank(x) should be >= rank(slope) but got z < PRelu)	r   r~  _get_tensor_sizesrN  r  r5  r  r  r&  )r)  r:  r  	self_rankZweight_sizesZweight_rankr  r  r  r     s"    

r   z
aten::siluc                 C   s   |  d||  d|S )NrA  r  r.  r/  r  r  r  r     s    r   z
aten::mishc                 C   s   |  d||  d|  d|S )NrA  r  Softplusr.  r/  r  r  r  r     s    r   c              
   O   s  | dd}| dtjj}t|}tj|d }t|d  oT|du pTtj	|k }|r|D ]F}	|	
 r^tj|	}
|
|kr^td| d|  d|
  |	q^t|D ]2\}}	|	
 rt|	s| jd|	| d	||< q| 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 r^  r_  )popr   rc  rg  r5  rd  r   rf  r   export_onnx_opset_versionZisCompleteTensorr   r\  Zscalar_name	enumerater&  rh  )r)  Zop_namer  r  r%  r&  inputsZdtype_0Zrequire_castr0  Zinput_scalar_typer|  r:  r  r  r  _op_with_optional_float_cast  s>    r+  z
aten::reluc                 C   s   t | d|ddS )NRelu   r%  r+  r/  r  r  r  r   D  s    r   zaten::relu6c                 C   s   t | d|dd}t| |dS )Nr,  r-  r.     )r+  r.   )r)  r0  r   r  r  r  r   K  s    r   z
aten::ceilc                 C   s   |  d|S )NCeilr.  r/  r  r  r  r-   S  s    r-   zaten::floorc                 C   s   |  d|S )Nrk  r.  r/  r  r  r  rT   Y  s    rT   z	aten::lenc                 C   s.   t | || jdtdgd}t| |dgS NrT  r   rU  )r   r&  rV  r  r   r  )r)  r:  Zsz_0r  r  r  _len_  s    r3  zaten::thresholdc                 C   sD   t |dkrt dd|S t |dkr8t dd|S | d|S )Nr   r   znon-zero thresholdznon-zero valuer,  )r   rE  r  r&  )r)  r:  r   rW  r  r  r  r   f  s
    r   zaten::leaky_relur)  r0  Znegative_slopeZinplacec                 C   s   | j d||dS )N	LeakyRelur  r.  r4  r  r  r  rs   r  s    rs   z	aten::gluc                 C   sP   t ||}|d ur$|d dks$J | jd||dd\}}| d|| d|S )Nr  r   r  )r3  r   rA  r  )r   r  r&  )r)  r0  rB   r   firstsecondr  r  r  r]     s
    r]   zaten::softmaxc              
   C   sb  t |}|d ur|dk r"|| }||d k}|rptt|}|d ||  ||< |d< | jd||d}|d }| jd||d}|r|  dkrt |d	d
}| jd|t	|
 d}|r| jd||d}|S | d|| jd||gdd}| d|}	t j| |	|gd}
| d|	|
}|r^|  dkr^t |d	d
}| jd|t	|
 d}|S )Nr   r@  r  r  r  ZSoftmaxr  r%  r|  rm  r^  r_  rI  	ReduceMaxr  Expr  r]  )r   r~  r5  r  r&  r  r  r  r   rc  rh  _reducesum_helper)r)  r0  rB   rm  	input_dimis_transpose_requiredr  r   parsed_dtyperM   r  r  r  r  r     s>    
r   zaten::softplusc                 C   s@   t |d}|dkr4| d| d| d|||S | d|S )NrQ  r@  r]  r$  rA  )r   r  r&  )r)  r:  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 sBtdd D rPt 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   s   g | ]}|d u qS r  r  r  r|  r  r  r  r        z)get_pool_ceil_padding.<locals>.<listcomp>r\   input size not accessiblec              	      sB   g | ]:}t t | d |   |  t|  d qS r  r@  )r  mathr-   rw  r?  )rB   kernel_sizepaddingstrider  r  r    s   0r   c                    sD   g | ]<} | d  |  | |  kr8 | d  n | qS r@  r  r?  )ceiled_output_dimrB   rE  rF  r  r  r    s   "c                    sP   g | ]H}| d krdn2| | d|    | d  |  d    qS r@  r   r  r  r?  )rH  rB   rD  rE  rF  r  r  r    s   
*c                    sd   g | ]\}| d |    | krT|  | d k rDt | q^t  | d n
t | qS rB  r  r?  )rD  rE  padding_ceilr  r  r    s   )r   r"  rN  anyr  r  )r0  rD  rF  rE  sizesr  )rH  rB   rD  rE  rK  rF  r  r\     s&    


r\   zaten::max_pool1dZ
max_pool1dr@  )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 )NTFrP  r  r|  c                    s4  t |dhkr t d|S |s(|}t|}|rdt||||}|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 ddd}t	| |
|}
|	|
fS | jd|fddi|}	|	S d S )Nr@  dilationc                 s   s   | ]\}}|| V  qd S r  r  r  ar  r  r  r  	<genexpr>+  r@  z1_max_pool.<locals>.symbolic_fn.<locals>.<genexpr>r  )kernel_shape_ipads_i	strides_iMaxPoolr   c                 S   s   g | ]}d qS rG  r  r  _r  r  r  r  F  r@  z2_max_pool.<locals>.symbolic_fn.<locals>.<listcomp>c                 S   s   g | ]}d qS rG  r  rX  r  r  r  r  G  r@  )r   rT  rV  c                 S   s   g | ]}d | qS )r  r  r?  r  r  r  r  M  r@  r   r  )
setr   r  r  r\   zipr&  r  r  r   )r)  r0  rD  rF  rE  rP  	ceil_moderK  r  rr  rY  Zflattened_indicesrX  r  ndimsrN  tuple_fnr  r  symbolic_fn   sB    
z_max_pool.<locals>.symbolic_fn)r   r  r  r   r  )r  r`  r_  rN  ra  r  r^  r  	_max_pool  s
    4rb  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	tjtt tt t	ttt f ttd fdd}|S )
NTrP  r  r|  r  )r0  rD  rF  rE  r\  count_include_padc              	      s   |s|}t |||| }t|ts*J |}|r\t| d|d| d dddd}dt| }|rt||||}	|td	d
 t|	|D  }n|d }| jd||||d}
|
S )NPad)r   r   r  constantr  r?  rU  mode_sZvalue_fr%  r   c                 s   s   | ]\}}|| V  qd S r  r  rQ  r  r  r  rS    s   z1_avg_pool.<locals>.symbolic_fn.<locals>.<genexpr>AveragePool)rT  rV  rU  )	r   Z_avgpool_helperr4  r  r+  rN  r\   r[  r&  )r)  r0  rD  rF  rE  r\  rc  Zdivisor_overrideZadjusted_paddingrK  outputr  r`  r  r  ra    s@    
	
z_avg_pool.<locals>.symbolic_fn)N)
r   r  r  r   r  r   Valuer   r  r   )r  r`  ra  r  rk  r  	_avg_poolt  s    	 1rm  zaten::adaptive_avg_pool1dZadaptive_avg_pool1dri  zaten::adaptive_avg_pool2dZadaptive_avg_pool2dzaten::adaptive_avg_pool3dZadaptive_avg_pool3dzaten::adaptive_max_pool1dZadaptive_max_pool1drW  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y2   t d| Y S 0 dgt krZdkrZ| d|S t |}z|dd   W n ty   d  Y n0  d u stdd  D rֈdgt kr| 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.r@  ri  ZGlobalAveragePoolr  c                 S   s   g | ]}|d u qS r  r  r?  r  r  r  r  !  r@  z7_adaptive_pool.<locals>.symbolic_fn.<locals>.<listcomp>ZGlobalMaxPoolrA  c                    s   g | ]} | |  qS r  r  r?  rB   output_sizer  r  r  (  r@  r   z-output size that are not factor of input sizec                    s    g | ]}t  | |  qS r  rJ  r?  rn  r  r  r  /  r@  rW  rh  rG  F)rT  rV  )
r   
_parse_arg	Exceptionr  rN  r&  r"  rL  r  r  )r)  r0  ro  Zoutput_size_valuerM  rs  krj  r  r  r`  typern  r  ra    s@    



$z#_adaptive_pool.<locals>.symbolic_fn)r   r  r   r  )r  rt  r`  r  ra  r  rs  r  _adaptive_pool  s    A
1ru  rB   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  )r5  rN  )rB   r   paddingsr  r  r  _prepare_onnx_paddings9  s    &ry  c              
   C   sf   t | d}t |rbt |rbt |}zdd |D }W n$ ty`   t dddd|  Y S 0 |S )Nr  c                 S   s   g | ]}t |d dqS )r|  rE  )r   r  )r  rP  r  r  r  r  Q  s   z)_convert_padding_node.<locals>.<listcomp>rd  r  r?  z)The sizes of the padding must be constant)r   r  rB  r  r  rq  rD  )r0  rE  
input_listr  r  r  _convert_padding_nodeK  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 0 t|}tt ||}t| d||||ddS )	Nre  rQ  rW  rd  r  r?  z*The value for the padding must be constantrf  )r   r  rq  rD  r{  ry  r~  r+  )r)  r0  rE  rW  r  rx  r  r  r  r2   ]  s    

r2   )r)  r0  r   c              	   C   s\  t |}t|d dksJ t|d }|}t|D ] }|d| d   }|d| d   }t|}	g }
|dkrtj| |d| g| g|	d|  gd}|
| |dk s|dk rtd| }td|  }tj| |d| g|g|gd}|
| n
|
| |dkr:tj| |d| gdg|gd}|
| | j	dg|
R dd| i}q4|S )Nr  r   r@  r  r2  r3  )
r{  rN  r  r   r"  r  r   builtinsr   r&  )r)  r0  r   rE  r  curidxZpad_rZpad_lr   r  leftstartendZmiddlerightr  r  r  _pad_circularq  sB    




r  zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C   s0   d}t |}tt||}t| d|||ddS )Nreflectrd  r?  rU  rg  r%  r{  ry  r   r~  r+  r)  r0  rE  r  rx  r  r  r  r     s    r   zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C   s0   d}t |}tt||}t| d|||ddS )NZedgerd  r?  r  r  r  r  r  r  r     s    r   z	aten::padr)  r0  r   r  rW  c                 C   st   t |d}|dkr t| ||S |dkr4t| ||S |dkrJt| |||S |dkr^t| ||S td| |d S )NrX  Z	replicater  re  ZcircularzUnrecognized padding mode )r   rp  r   r   r2   r  r   r\  r  r  r  r  r     s    	r   zaten::upsample_nearest1dZupsample_nearest1dZnearestzaten::upsample_nearest2dZupsample_nearest2dr  zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1drz   zaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3d)r  rB   interpolate_modec                    s    fdd}|S )Nc                    sb   t | |\}}t  t |}|r8t d|S |d u rPt | || }| jd||dS )Nzalign_corners == TrueUpsamplerg  )r   Z_get_interpolate_attributesZ_interpolate_warningrF  r  Z_interpolate_size_to_scalesr&  )r)  r0  ro  r  scalesalign_cornersrB   r  r  r  r  ra    s    

z!_interpolate.<locals>.symbolic_fnr  )r  rB   r  ra  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&  )	r)  r0  r   Zscale_factorr  r  Zrecompute_scale_factorZ	antialiasr  r  r  r  __interpolate
  s    r  zaten::bitwise_notc                 C   s"   t |std|| d|S NzOONNX export does NOT support exporting bitwise Not for non-boolean input valuesro  r   rK  r   r\  r&  r/  r  r  r  r&     s    
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  rL  r  r  r  r'   (  s    

r'   c                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc                    s,   t  d  } | || |d|| |dS )NZ_cast_F)r  )r)  r0  r=  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  	decorator<  s    z/wrap_logical_op_with_cast_to.<locals>.decoratorr  )r  r  r  r  r  r  :  s    r  )r"  returnc                    s   t   fdd}|S )Nc                    s   |  d | ||S )Nro  r.  r)  r0  r=  r!  r  r  wrap_with_notI  s    z4wrap_logical_op_with_negation.<locals>.wrap_with_notr  )r"  r  r  r!  r  r  G  s    r  zaten::__not_c                 C   s"   t |std|| d|S r  r  r{  r  r  r  __not_P  s    
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rfdkrn nN|
d|
d  krdkrn n*| jdtj|d|dktjddS | d||S )	NrT  Trl  rU  r  rW  rX  rp  )r4  rt  r   DeviceObjTyper&  rV  r   boolr  r  kindOfrX  )r)  r:  r=  Z	self_nodeZ
other_noder  r  r  rK   \  s     
 $rK   zaten::nec                 C   s   t | ||S r  )rK   rL  r  r  r  r   x  s    r   zaten::gtc                 C   s   t | ||S r  _gt_implr  r  r  r  r_     s    r_   c                 C   sJ   t |r<t |r<| jd|tjjd}| jd|tjjd}| d||S )Nr^  r_  ZGreaterr   rK  r&  r`  ra  INT32r  r  r  r  r    s    r  zaten::ltc                 C   s   t | ||S r  _lt_implr  r  r  r  r     s    r   c                 C   sJ   t |r<t |r<| jd|tjjd}| jd|tjjd}| d||S )Nr^  r_  Lessr  r  r  r  r  r    s    r  zaten::gec                 C   s   t | ||S r  r  r  r  r  r  rZ     s    rZ   zaten::lec                 C   s   t | ||S r  r  r  r  r  r  rr     s    rr   zaten::__and_c                 C   s:   t |std|t |s,td|| d||S )NzOONNX export does NOT support exporting bitwise AND for non-boolean input valuesrJ  r  r  r  r  r  __and_  s    

r  zaten::__or_c                 C   s:   t |std|t |s,td|| d||S )NzNONNX export does NOT support exporting bitwise OR for non-boolean input valuesr  r  r  r  r  r  __or_  s    

r  zaten::__xor_c                 C   s:   t |std|t |s,td|| d||S )NzOONNX export does NOT support exporting bitwise XOR for non-boolean input valuesrn  r  r  r  r  r  __xor_  s    

r  zaten::logical_andZBoolc                 C   s   |  d||S )NrJ  r.  r  r  r  r  r     s    r   zaten::logical_orc                 C   s   |  d||S )Nr  r.  r  r  r  r  r     s    r   zaten::logical_xorc                 C   s   |  d||S )Nrn  r.  r  r  r  r  r     s    r   zaten::__rshift_c                 C   s   t j|}t j|t jj|kr6| jd|| d}| jdtjdtjdd}t	
|sn| jd|tjjd}| d||}| jd|| d}| d||}|S )	Nr^  r_  rT  r  rl  rU  Powr]  r   rc  rd  re  r&  rh  rV  r   float32r   rf  r`  ra  rg  )r)  r:  r=  r  twotwo_powrshiftr  r  r  	__rshift_  s*    
r  zaten::__lshift_c                 C   s   t j|}t j|t jj|kr6| jd|| d}| jdtjdtjdd}t	
|sn| jd|tjjd}| d||}| jd|| d}| d||}|S )	Nr^  r_  rT  r  rl  rU  r  rA  r  )r)  r:  r=  r  r  r  lshiftr  r  r  	__lshift_	  s*    
r  zaten::wherec              	   C   s`   t |s| jd|tjjd}|d u rPt| |}t | || jdt	dd|S | d|||S )Nr^  r_  rT  r@  rU  Where)
r   rK  r&  r`  ra  BOOLr   Z_unbind_helperrV  r   )r)  	conditionr:  r=  r  r  r  r  r
  5	  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	}|r|  d
krt |dd}| jd|t	
| d}|r| jd||d}|S )NrB   fONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.r   r@  r  r  r  Z
LogSoftmaxr  r%  r|  rm  r^  r_  )r   r~  r  r5  r  r&  r  r  r  r   rc  rh  )	r)  r0  rB   rm  r<  r=  r  Z	return_opr>  r  r  r  r}   D	  s.    
r}   zaten::_log_softmaxc                 C   s>   |r2t j|t jjt jjkr2| jd|tjjd}t	| ||S r  )
r   rc  rd  re  HALFr&  r`  ra  rg  r}   )r)  r0  rB   Zhalf_to_floatr  r  r  _log_softmaxf	  s    r  zaten::_convolutionc                 C   s&  t |}z|dd  }W n ty0   d }Y n0 |d u sLtdd |D rXtd|||g}t |st |dkr|| |dd  ||| ||	d}tdd |D r|sJ t	|t	|ksJ ||d	< | j
|rd
ndg|R i |}t |st |dkr| 
d||S |S d S )Nr  c                 S   s   g | ]}|d u qS r  r  r?  r  r  r  r  	  r@  z _convolution.<locals>.<listcomp>zDUnsupported: ONNX export of convolution for kernel of unknown shape.r@  )rT  rV  rU  Zdilations_iZgroup_ic                 s   s   | ]}|d kV  qdS r}  r  )r  or  r  r  rS  	  r@  z_convolution.<locals>.<genexpr>Zoutput_padding_iZConvTransposeZConvr>  )r   r"  rq  rL  r   r\  r  r~  r   rN  r&  )r)  r0  r  biasrF  rE  rP  
transposedoutput_paddinggroupsZ	benchmarkZdeterministiccudnn_enabledZ
allow_tf32Zweight_sizeZkernel_shaper  r  r*  r  r  r  _convolutionu	  sB    




 r  zaten::convolutionc
           
      C   s"   t | |||||||||	d d d d S r  r  )
r)  r0  r  r  rF  rE  rP  r  r  r  r  r  r  r<   	  s     r<   zaten::conv1dc                 C   s"   t | ||||||dd|d d d d S NFr  r  r)  r0  r  r  rF  rE  rP  r  r  r  r  r8   	  s     r8   zaten::conv2dc                 C   s"   t | ||||||dd|d d d d S r  r  r  r  r  r  r9   	  s     r9   zaten::conv3dc                 C   s"   t | ||||||dd|d d d d S r  r  r  r  r  r  r:   
  s     r:   zaten::conv_transpose1dc	           	      C   s"   t | ||||||d||d d d d S NTr  	r)  r0  r  r  rF  rE  r  r  rP  r  r  r  r5   &
  s     r5   zaten::conv_transpose2dc	           	      C   s"   t | ||||||d||d d d d S r  r  r  r  r  r  r6   F
  s     r6   zaten::conv_transpose3dc	           	      C   s"   t | ||||||d||d d d d S r  r  r  r  r  r  r7   f
  s     r7   zaten::batch_normc
                 C   s   t |d t rDt |||||gsDtjdk rDt dddd|S t | |||||\}}}}| j	d||||||d| |sdndd	}
|s|
S |
\}}}}}|
|  |
|  |d	|   |d	|   |S d S )
Nr$      ZBatchNormalizationr  zaAll input tensors must have the same `dtype`. Turn off Autocast or export using opset version 15.r@  r  )	epsilon_fZ
momentum_fr   zbatch_norm_dead_output-)r   check_training_moderV  Zis_autocast_enabledZargs_have_same_dtyper   r(  rD  Z_batchnorm_helperr&  r'  rt  ZsetDebugNameZ	debugName)r)  r0  r  r  running_meanrunning_vartrainingmomentumepsr  ri  resZnew_running_meanZnew_running_varZ
saved_meanZ	saved_varr  r  r  r$   
  sL    	
r$   zaten::native_layer_norm)r)  r0  normalized_shaper  r  r  r  c                 C   sv  dd t t|ddD }t| d}t| |}| jd||d}	t| ||	}
tj|
tjj	k}|rtj|}| jd|
t|
 d	}
| jdt| |
||d}t| | d
||}| d|
|}|rtj|}| jd|t|
 d	}|d u st|st| ||}|d u s4t|s4t| ||}|rb| jd|t|
 d	}| d|}n
t| |}||	|fS )Nc                 S   s   g | ]
}| qS r  r  r?  r  r  r  r  
  r@  z%native_layer_norm.<locals>.<listcomp>r   r         @r  r  r^  r_  r>  r]  rz  )r  rN  r   Z_generate_wrapped_numberr&  r   r   rc  rd  r  rh  r   r   r  r   r   r   )r)  r0  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   
  sB    

r   zaten::layer_norm)r)  r0  r  r  r  r  cudnn_enabler  c           	   	   C   s<   t  r | jd||||||dS t| |||||\}}}|S )Nrq   )Znormalized_shape_ieps_fZcudnn_enable_i)r   r  r  r   )	r)  r0  r  r  r  r  r  r  rY  r  r  r  rq   
  s    	rq   zaten::instance_norm)r)  use_input_statsr  r  r  c
                 C   s,  t |d t |d}
|d u s*t |rl|
d u r>td|tjdg|
 tj	
| d}| jd|d}|d u s~t |r|
d u rtd|tjdg|
 tj	
| d}| jd|d}|d u st |s|d u st |r| jd	||||d
S t |}| }|d }|d u r(t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 d S )Nrk   r@  zCUnsupported: ONNX export of instance_norm for unknown channel size.rR  rl  rT  rU  r  InstanceNormalizationr  r   zJUnsupported: ONNX export of instance_norm training for unknown batch size.ZReshape)r   r  r  r  r   r\  rV  r   r   rc  rd  rm  r&  r"  copyr   rq  r  r$   r	  )r)  r0  r  r  r  r  r  r  r  r  channel_sizeweight_value
bias_value
input_sizeZinput_size_reshaper*  cweight_bias_Zrunning_mean_Zrunning_var_input_reshapedri  r  r  r  rk     s    

rk   zaten::unfoldc                    s   t  rjd ||dS t }z|  }W n tyH   d }Y n0 |d urt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 d S )Nr   )Zdimension_iZsize_iZstep_ir   r@  c              	      s*   g | ]"\}}t j g|g|gd qS )r  r   r  )r  lowhi)	dimensionr)  r0  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  r)  r  r  r  r    s   r2  r3  ZUnfoldrA  )r   r  r  r"  rq  r  r[  rN  r5  r   r'  r&  r  )r)  r0  r  r   steprM  ZsizedimZlow_indicesZ
hi_indicesr   r  r  r  )r  r)  r0  r  r  r   {  s.    

r   z	aten::eluc                 C   sJ   |r|dkrt dd|S |r4|dkr4t dd|S | jd|t |dS )NrR  r  zdoes not support scale in Eluinput_scalez#does not support input_scale in EluElur6  )r   r  r&  rE  )r)  r0  rH  r  r  r  r  r  rF     s    rF   z
aten::seluc                 C   s   |  d|S )NZSelur.  r/  r  r  r  r     s    r   zaten::index_selectc                 C   s   t | |||S r  )r   _select_helper)r)  r:  rB   rj   r  r  r  ri     s    ri   zaten::index_putc                 C   s   t |rt |}n|g}t  rH|g| ||g }| jdg|R  S t |d}t|dkrt|rpt| ||S |S t ddd| d S )Nrh   r  r   r  r?  )	r   r  r  r  r  rp  rN  r   r  )r)  r:  Zindices_list_valuevalues
accumulateZindices_listr  r  r  r  rh     s    
rh   zaten::index_fillc           	      C   sr   t |d}t  r*| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t| ||||S )Nr|  rg   Z
int_Scalar)r  r  )	r   rp  r  r  _index_fill_reshape_helperrF  r  rO   r   )	r)  r:  rB   rj   rW  	dim_valueexpanded_index_shapeexpanded_indexZexpanded_valuer  r  r  rg     s"    	
rg   zaten::index_copyc                 C   sL   t |d}t  r(| jd||||dS t | |||\}}t| ||||S )Nr|  rf   r  )r   rp  r  r  r  r   )r)  r:  rB   rj   sourcer  r  r  r  r  r  rf     s    rf   zaten::bucketizec                 C   s   t jj}|rt jj}| jd| d|| d|dd}t|}|d usLJ ttd|d }t	| t
| |||d }	|rt| ||	}
nt| ||	}
| jd|
|d}tj| |dgddS )	Nr2  r-  r   r  r@  r^  r_  r  )r`  ra  rb  r  r&  r   r~  r5  r  rO   r  rZ   r_   r;  )r)  r:  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   sj   t |}t |}||kr(|d ur(|S |d urD| jd|| dS t  rZ| d||S td|d S )Nr^  r_  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&  rh  r  r  r   r\  )r)  r:  r=  
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 )Nr>   )r  r  r   r  rT  rU  )r   r  r  r;  r   r   r   r&  rV  r   rC   )	r)  x1x2rB   r  r?   Zx1_l2Zx2_l2Zdiv_tensr  r  r  r>   <  s    &r>   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 )NrT  rU  r@  rl  r  r|  r  )r   rB  r&  rV  r   rC   rw  r   r;  r   r   rp  )r)  Zinput1Zinput2pr  r  Zinv_pZ	summationr  r  r  r   Q  s    


r   zaten::clonec                 C   s   |S r  r  )r)  r0  Zunused_memory_formatr  r  r  r1   d  s    r1   z	aten::absc                 C   s   |  d|S )NAbsr.  r{  r  r  r  r   k  s    r   z	aten::logc                 C   s   |  d|S )NLogr.  r{  r  r  r  r~   q  s    r~   zaten::log1pc              	   C   s    t | t| ttd||S )Nr@  )r~   r   r   r  rV  r   r{  r  r  r  r   w  s    r   zaten::log10c              	   C   s*   d}|  dt| || j dt|gdS )NgUk@r]  rT  rU  r&  r~   rV  r   )r)  r:  Z_ln10r  r  r  r   }  s    r   z	aten::powc                 C   sb   t j|}t|s2t jj}| jd|| d}t|sP| jd|| d}| d||}|S )Nr^  r_  r  )r   rc  rd  r   rf  rg  r&  rh  )r)  r:  exponentZf_dtyper   r  r  r  r     s    

r   zaten::clampc              	   C   s|   t |rt| ||S t |r,t| ||S t |rdt |rdt| d|t |dt |dddS t| t| |||S d S )NCliprQ     min_fmax_fr%  )r   r  r.   r/   r  r+  rp  )r)  r:  r   r   r  r  r  r0     s    



	r0   zaten::clamp_minc                 C   sZ   t |r$t| d|t |dddS tj|}| jd|| d}t| d||ddS d S )	Nr  rQ  r  )r  r%  r^  r_  Maxr.  	r   r  r+  rp  r   rc  rd  r&  rh  )r)  r:  r   rm  r  r  r  r/     s    
r/   zaten::clamp_maxc                 C   sZ   t |r$t| d|t |dddS tj|}| jd|| d}t| d||ddS d S )	Nr  rQ  r  )r  r%  r^  r_  Minr.  r  )r)  r:  r   rm  r  r  r  r.     s    
r.   z	aten::maxc                 C   s   |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 d S )Nr9  r   r  r   r  r.  r|  rB   r  r  ArgMaxr3  r  r&  r+  r   r  )r)  r:  dim_or_yr  rB   r   r  r  r  r  r     s    r   zaten::maximumc                 C   s   t | ||dS N)r  )r   r  r  r  r  r     s    r   z	aten::minc                 C   s   |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 d S )N	ReduceMinr   r  r  r  r.  r|  rB   r  r  ArgMinr  r  )r)  r:  r  r  rB   r   r  r  r  r  r     s    r   zaten::minimumc                 C   s   t | ||dS r  )r   r  r  r  r  r     s    r   z
aten::amaxc                 C   s   | j d|||dS )Nr9  r  r.  r)  r:  rB   r  r  r  r  r     s    r   z
aten::aminc                 C   s   | j d|||dS )Nr	  r  r.  r  r  r  r  r     s    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|  rB   r  r	  r9  )r   r  r  r&  )r)  r:  rB   r  Zreduce_kwargsr  r  r  r     s    

r   z	aten::expc                 C   s   |  d|S )Nr:  r.  r{  r  r  r  rM     s    rM   zaten::dropout_zaten::dropoutc                 C   s.   t |d |s|S | jd||dd\}}|S )NrE   ZDropoutr  )Zratio_fr   )r   r  r&  )r)  r0  r  trainr]  rY  r  r  r  rE   #  s
    rE   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 )NrP  r  r  c                    s   |rt  d|S |S )Nztraining mode)r   r  )r)  r0  r  r  r  r  r  feature_dropoutD  s    z-_unsupported_dropout.<locals>.feature_dropoutr   r  r   r  )r  r  r  r  r  _unsupported_dropout0  s    r  z
aten::normc                 C   s@   |dkrt d}n|dkr$t d}ntd||| |||dS )Nr@  ZReduceL1r  ZReduceL2z)ONNX export only p-norms with p of 1 or 2)rB   r  )r  r   r\  )r)  r:  r  rB   r  rQ  r  r  r  r   O  s    

r   zaten::conv_tbcc              	   C   sx   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 d S )	Nr4   )Zpad_ir  )r@  r  r   r  )r  r@  r   r@  )r  r   r@  )r   r  r  r&  r8   )r)  r0  r  r  r   convr  r  r  r4   ^  s    r4   zaten::_uniquec                 C   s,   t  r| jd|||ddS t d|S d S )N_uniquer  )sorted_ireturn_inverse_ir   )r   r  r  r  )r)  r0  sortedreturn_inverser  r  r  r  p  s    r  zaten::_unique2c                 C   s2   t  r| jd||||ddS t ddd| d S )N_unique2rO  )r  r  Zreturn_counts_ir   r  r?  )r   r  r  r  )r)  r0  r  r  Zreturn_countsr  r  r  r    s    	r  zaten::_cast_Bytez2.0z
the futurez8Avoid using this function and create a Cast node insteadc                 C   s   | j d|tjjdS r  )r&  r`  ra  r  r)  r0  Znon_blockingr  r  r  
_cast_Byte  s    r  zaten::_cast_Charc                 C   s   | j d|tjjdS r  )r&  r`  ra  r  r  r  r  r  
_cast_Char  s    r  zaten::_cast_Shortc                 C   s   | j d|tjjdS r  )r&  r`  ra  r  r  r  r  r  _cast_Short  s    r  zaten::_cast_Intc                 C   s   | j d|tjjdS r  )r&  r`  ra  r  r  r  r  r  	_cast_Int  s    r  zaten::_cast_Longc                 C   s   | j d|tjjdS r  )r&  r`  ra  rb  r  r  r  r  
_cast_Long  s    r  zaten::_cast_Halfc                 C   s   | j d|tjjdS r  )r&  r`  ra  ZFLOAT16r  r  r  r  
_cast_Half  s    r  zaten::_cast_Floatc                 C   s   | j d|tjjdS r  )r&  r`  ra  rg  r  r  r  r  _cast_Float  s    r  zaten::_cast_Doublec                 C   s   | j d|tjjdS r  )r&  r`  ra  ry  r  r  r  r  _cast_Double  s    r  zaten::_cast_Boolc                 C   s   | j d|tjjdS r  )r&  r`  ra  r  r  r  r  r  
_cast_Bool  s    r   zaten::emptyc                 C   s   t | |||||S r  )r  )r)  rM  rm  layoutdevice
pin_memorymemory_formatr  r  r  rJ     s    rJ   zaten::empty_likec                 C   s   t | |||||S r  )r  )r)  r0  rm  r!  r"  r#  r$  r  r  r  rI     s    rI   zaten::new_emptyc                 C   s0   t |}|d u r|d ur|}t| |||||S r  )r   r  rJ   r)  r:  rM  rm  r!  r"  r#  r  r  r  r  r     s    
r   zaten::scalar_tensorc                 G   s<   t |dd}|d u rtjj}| jd|t| d}|S )Nr|  rm  r^  r_  r   r  r   rc  rg  r&  rh  )r)  Zscalarrm  optionsr  r  r  r     s
    r   zaten::tensorc                 C   s
  t |dd}t |r|d u r6tjt |d }t }t |D ]L}| jdt	
dgd}t | ||}| jd|t| d}|| qF| jd	g|R d
diS |d u rtj|}t |rt |st |r| jd|ddd}| jd|t| dS )Nr|  rm  r   rT  r@  rU  r^  r_  r2  r3  ZConcatFromSequence)r3  Z
new_axis_i)r   r  r  r   rc  rd  r  r5  r&  rV  r  r8  rh  r   Z_is_listrC  Z_is_scalar_list)r)  datarm  r"  requires_gradrz  r   Zshape_referencer  r  r  r   '  s,    

r   zaten::as_tensorc                 C   s   t | |||S r  )r   )r)  r(  rm  r"  r  r  r  r    D  s    r    zaten::zerosc                 C   sz   |d u rt jj}n
t |}t|d}t|trZt|dkrZ| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   rT  rU  ConstantOfShaperl  r   rc  rg  r   r  r4  r5  rN  r&  rV  r   r   rq  rm  r)  rM  rm  r!  r"  r#  rj  sizes_r  r  r  r  J  s    

r  zaten::zeros_likec           	      C   sH   |  d|}|d u rtjj}n
t|}| j d|tjdg| ddS )Nr-  r*  r   rl  rU  r&  r   rc  rg  rV  r   rm  	r)  r0  rm  r!  r"  r#  r$  r6  rj  r  r  r  r  ]  s    

r  zaten::new_zerosc                 C   s0   t |}|d u r|d ur|}t| |||||S r  )r   r  r  r%  r  r  r  r   u  s    
r   z
aten::zeroc                 C   s   t |}t| ||S r  )r   r  r  )r)  r:  r  r  r  r  r    s    
r  z
aten::onesc                 C   sz   |d u rt jj}n
t |}t|d}t|trZt|dkrZ| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   rT  rU  r*  r@  rl  r+  r,  r  r  r  r     s    

r   zaten::ones_likec           	      C   sH   |  d|}|d u rtjj}n
t|}| j d|tjdg| ddS )Nr-  r*  r@  rl  rU  r.  r/  r  r  r  r     s    

r   zaten::new_onesc                 C   s0   t |}|d u r|d ur|}t| |||||S r  )r   r  r   r%  r  r  r  r     s    
r   z
aten::fullc              	   C   s   t |d}t |rX|d u r&tjjn|}t| ||||}t| ||| jdt	
ddS t |dd}|d u rxtjj}	n
t|}	t |d}
t|
trt|
dkr| jdt	
g t	jd}| jd	||d|	 dS d S )
Nr   rT  r@  rU  r|  rm  r  r   r*  )r   r  rB  r   rc  rg  r  r   r&  rV  r   r  r4  r5  rN  r   rq  r	  rm  )r)  rM  rW  rm  r!  r"  r#  const_valuetmprj  r-  r  r  r  rX     s"    


rX   zaten::full_likec              	   C   s   t |d}t |dd}|d u r,tjj}n
t|}t |rt| ||||}	| jd||	 d}t
| |	|| jdtddS | d	|}
| jd
|
tj|g| ddS d S )NrQ  r|  rm  r^  r_  rT  r@  rU  r-  r*  rl  )r   r  r  r   rc  rg  rB  r  r&  rh  r   rV  r   rm  )r)  r0  
fill_valuerm  r!  r"  r#  r$  rj  r1  r6  r  r  r  rW     s    


rW   zaten::new_fullc           	      C   s2   t |}|d u r|d ur|}t| ||||||S r  )r   r  rX   )	r)  r:  r   r2  rm  r!  r"  r#  r  r  r  r  r     s    
r   	aten::eyec                 G   s   t |dkrX|\}}}}}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   r2  r  ZEyeLiker0  r3  r  r  )rN  r   r  r&  r  r  )r)  r  r*  rm  r!  r"  r#  r   r6  r   mr  r  r  rP     s"    rP   aten::slicec                 G   s2  t |dkrr|\}}}}t|d}|dkr:td||  dkoXt| t	j
}|  dkoxt| t	j
}|  dk}	|  dk}
|s|	r|s|
r|  dkrtjtjjkrtd|nBt| |dg}t| |dg}t| |dg}| d	||||S nT|r&dn
t|d}|r>tjn
t|d}t|d}tj| ||g|g|gd
S nt |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|  r@  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  rO  r5  r  r  )rN  r   rp  r   r\  r  r  r4  rt  r   ZNoneTyper   operator_export_typer`  ZOperatorExportTypesZONNXr  r&  r	   r  r  r  )r)  r:  r  rB   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::hardtanhr)  r:  Zmin_valZmax_valc                 C   s   t | d|||ddS )Nr  r  r  r/  r7  r  r  r  rd   j  s    rd   zaten::hardswishc                 C   s   t | |}| d||S r  )rb   r&  )r)  r:  Zhsr  r  r  rc   t  s    
rc   zaten::hardsigmoidc                 C   s   | j d|ddS )NHardSigmoidgUUUUUU?r6  r.  r{  r  r  r  rb   }  s    rb   zaten::tanhshrinkc                 C   s   |  d|t| |S )NrI  )r&  r   r{  r  r  r  r     s    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 NrT  rl  rU  r  r   )r   rc  rd  rg  r&  rV  r   rm  r   r_   r   r   )r)  r:  lambdrj  lambd_opr  r  r  r  ra     s"    "ra   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 r9  )r   rc  rd  rg  r&  rV  r   rm  r_   r   r   r   r   )	r)  r:  r:  rj  r;  Zgt_condZgt_outZlt_condZlt_outr  r  r  r     s8    
	
	r   zaten::aliasc                 C   s   |S r  r  r{  r  r  r  r     s    r   zaten::unsqueezec                 C   s~   |dk rlt |}|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 r  r  r  r@  r  r  r  r  r  )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yB   d }Y n0 |d u rZt dd|S | jd|||ddS )NZSortz'Out parameter is not supported for sortrA  TopKr  Zk_ir3  r   )r   r  r"  rq  r&  )r)  r:  rB   Z	decendingri  Z
self_sizesr   r  r  r  r     s    

r   zaten::numelc                 C   s   |  d|}| j d|ddS )Nr-  r  r   r  r.  r9  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&  )r)  r:  rr  rB   Zlargestr  ri  r  r  r  r     s    r   zprim::convert_element_typec                 G   s,   t |d dd}| jd|t| dS )Nr   r|  rm  r^  r_  )r   r  r&  r   rc  rh  )r)  r:  r  rm  r  r  r  r;     s    r;   zaten::toc                 G   s  t jdd }||r|S t|dkr|d }t|d r|d   dkrt|d  d}t|t	j
rt|jdkr| }t|}n|}t|st|t	j
rtj|d }| jd|| dS | jd|t| dS nt|d	kr$t|d
 dd}| jd|t| dS t|dkr^t|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rL| d   dkpJ| d  tj pJt| d  tj	S t | dkrrt
| d dd}|d u S t | dv rt
| d dd}|d u S d	S )
Nr  r   prim::devicer  r@  r|  rm  )r0     F)rN  r  r  rt  isSubtypeOfr   ListTypeofIntsr4  r  r   r  )r  rm  r  r  r  is_aten_to_device_only   s    z"to.<locals>.is_aten_to_device_onlyr  r   r  rW  r^  r_  r  r@  r|  rm  r0  r?  zUnknown aten::to signature)r   r  rN  r   rB  r  r  r  r4  rV  r  r6  ro   r  r   rc  rd  r&  rh  r  r  )r)  r:  r  rC  rm  Ztvalr  r  r  r     sD    

r   zaten::repeatc                 C   s0   t jj}t| ||}| d||}| d||S )Nr  ZTile)r   rc  rb  r   r&  )r)  r:  repeatsrm  Zshape_r  r  r  r   j  s    r   zaten::repeat_interleavec              
   C   s  |}t |r4t | || jdtdgd}d}n
t |}t |}t |}t |}|d u rpt	
d||d u rt	
d||d u rt	
d|| }	t|D ] \}
}|d u rd\||
< |	|
< q|dks|d	krT|d d	krTt |s
| jdt|d}|| dkr*t d
ddd|S || }t| || jdt|gdd }nz|d	kr|| dkr~t 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 ]\}
}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 )NrT  r  rU  r   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  r@  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  r@  r2  r3  Z	allowzero)r   r  r8  r&  rV  r   rF  r~  r"  r   r\  r  r)  
_is_tensorr  rD  rO   r5  Z_repeat_interleave_split_helperr  r   )r)  r:  rD  rB   ro  r0  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  s    




 

r   zaten::pixel_shufflec           	      C   s  t |}t|dkr$t dd|S tdd |dd  D rt 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 d S )Nr  r   only support 4d inputc                 s   s   | ]}|d u V  qd S r  r  r?  r  r  r  rS    r@  z pixel_shuffle.<locals>.<genexpr>r@  r  rO  rT  r   r  rU  rF  r  )r   r@  r  r  r  rO  r  )r   r   r  r@  r   r   )r   r   r   r   r  r@  r  r   r"  rN  r  rL  r8  r  r&  rV  r   r  )	r)  r:  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 rt 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 d S )Nr  r   rH  c                 s   s   | ]}|d u V  qd S r  r  r?  r  r  r  rS  /  r@  z"pixel_unshuffle.<locals>.<genexpr>r@  rO  rT  r   r  rU  rF  r  )r   r@  rO  r  r  r  r  )r   r  r@  r@  r   r   r  rI  )
r)  r:  Zdownscale_factorr  rL  rM  rK  Zfinal_reshaperN  rJ  r  r  r  r   &  sx    




r   c           *   
      s  t d d d d d  g d}ttdd |D |}|rFd	nd
dkrxt  d|	  krxtdd|S t  d|	  ksJ  fddtdt D |
r̈jd|g dd}|r|rtdd|S 	dr|d	d  
  }d d }t|dd u r2tdd|S |	 }|}g }dksTdkrZ|}ndkrp|\}}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 ]\}|rVd	kr4||\}}}n||\}}t}||d f}nd	kr|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rD|%||g|R   |rNi nd$d%i}&dkr|	rp||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r|(njd"g|R d/di}dksdkr||fS dkrdkr|)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. )r,  r  r  ZAffiner5  ZThresholdedReluZ
ScaledTanhr8  r  ZSoftsignr$  c                 S   s   g | ]}|  qS r  )lower)r  Zact_funr  r  r  r    r@  z _generic_rnn.<locals>.<listcomp>r  r  LSTMr@  zLSTMs with projectionsc                    s   g | ]} ||  qS r  r  r?  )all_weightsweights_per_layerr  r  r    s   r   r  rI  r  zRNN/GRU/LSTMzdropout in training modeRNNzunknown hidden sizeGRU))r@  r  r   r@  )r  rO  )rU  )rO  r  )r@  rO  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r)  r*  wr  r  r    s   z8_generic_rnn.<locals>.reform_weights.<locals>.<listcomp>r2  r3  r   r.  )r)  rY  r*  Z	intervalsZslicesr  rX  r  reform_weights  s    z$_generic_rnn.<locals>.reform_weightsc                    s`   |  }dkr|\}}n,dks*dkrF fdd|D \}}t  fdd||fD S )NrS  rT  rP  c                 3   s   | ]} |V  qd S r  r  r  rY  r)  hidden_sizereform_permutationrZ  r  r  rS    s   zB_generic_rnn.<locals>.transform_weights_no_bias.<locals>.<genexpr>c                 3   s   | ]}t  |d gV  qdS r}  r  r  rV  r+  r  r  rS    s   )r  )layer_indexweights	weight_ih	weight_hhr)  r]  layer_weightsr^  rZ  variantr  r  transform_weights_no_bias  s    

z/_generic_rnn.<locals>.transform_weights_no_biasc                    s|   |  }dkr|\}}}}n0dks.dkrN fdd|D \}}}} j d||dd}t fd	d|||fD S )
NrS  rT  rP  c                 3   s   | ]} |V  qd S r  r  r[  r\  r  r  rS    s   z:_generic_rnn.<locals>.transform_weights.<locals>.<genexpr>r2  r   r  c                 3   s   | ]}t  |d gV  qdS r}  r  r_  r+  r  r  rS    s   )r&  r  )r`  ra  rb  rc  Zbias_ihZbias_hhbias_concatrd  r  r  transform_weights  s    z'_generic_rnn.<locals>.transform_weightsc                    s&   dkr| S t j | dg|g|gdS )Nr@  r   r  r  )rV  r  r  )r)  
num_layersr  r  retrieve_state  s    z$_generic_rnn.<locals>.retrieve_stater2  r  Zdirection_sbidirectional)r   hidden_size_iZactivations_s)r   rm  Zlinear_before_reset_irO  )r   rm  )r   r  r@  rO  rT  )r   r   r  rU  rF  r3  )r  r  dictr[  rN  r   r  r  r&  
startswithrO  r  r  r   r  r   r8  rV  r  r  )*r)  rf  r0  Zinitial_statesrQ  
has_biasesrj  rE   r  rl  batch_firstbatch_sizesZonnxActivationsZvariantToOnnxActivationMapZnonlinearityw_hhZunidirectionalZprev_outputh_outsZh0Zc0c_outsZsequence_lensrg  ri  rk  r|  rb  rc  rh  Zstate_indicesZweight_ih_fZweight_hh_fZbias_fZweight_ih_bZweight_hh_bZbias_br*  extra_kwargsZ
activationZh_outZc_outr  )	rQ  r)  r]  re  rj  r^  rZ  rf  rR  r  _generic_rnnl  s   






	








&
&rw  c
                 C   s2   t |t | }
}t| d||
|||||||	S )NrP  r   r  rw  )r)  r0  hidden_vweight_vrp  rj  rE   r  rl  rq  hiddenr  r  r  r  
_lstm_fullS  s$    r|  c
                 C   s4   t |t | }
}t| d||
||||||	|dS )NrP  rr  rx  )r)  r0  rr  ry  rz  rp  rj  rE   r  rl  r{  r  r  r  r  _lstm_packeds  s$    r~  z
aten::lstmc                 G   s2   t |d rt| g|R  S t| g|R  S d S NrO  )r   rC  r~  r|  r)  r  r  r  r  r     s    r   zaten::lstm_cellc                    s   t  |dg}t |} fdd|D }t |rB||||fn||f}t |rXd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 rh  r  r_  r+  r  r  r    r@  zlstm_cell.<locals>.<listcomp>TFrP  r@  )rj  rE   r  rl  rq  )r   r  r  rG  rw  r  )r)  r:  r{  Zw_ihrs  Zb_ihZb_hhr0  r  rp  rY  rt  ru  r  r+  r  r     s0    
r   z	aten::grurT  Zgruzaten::rnn_tanhZRNN_TANHZrnn_tanhzaten::rnn_reluZRNN_RELUZrnn_relur  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 )
NrP  r|  rQ  c
                    s&   t |}
t|  |||
||||||	S r  rx  )r)  r0  r{  rz  rp  rj  rE   r  rl  rq  r  r  r  r  	_rnn_full  s    
z"_one_hidden_rnn.<locals>._rnn_fullc
                    s(   t |}
t|  |||
|||||	|dS )Nr}  rx  )r)  r0  rr  r{  rz  rp  rj  rE   r  rl  r  r  r  r  _rnn_packed  s    
z$_one_hidden_rnn.<locals>._rnn_packedc                    s2   t |d r| g|R  S  | g|R  S d S r  )r   rC  r  )r  r  r  r  r    s    z!_one_hidden_rnn.<locals>.symbolicr  )r  r  r  )r  r  r  r  _one_hidden_rnn  s    r  zaten::_dim_arangec                 C   sX   |  d|}| j d|| j dt|ddd}t rB|  d|S t| |dd d d S d S )	Nr-  r  rT  rU  r   r  z_caffe2::Ranger  )r&  rV  r   r   r  r   )r)  likerB   Z
like_shapestopr  r  r  _dim_arange  s    r  zaten::detachc                 C   s   |S r  r  r/  r  r  r  rA     s    rA   zaten::contiguousc                 C   s   |dkrt d||S )Nr  z-onnx memory_format support is not implemented)r   r\  )r)  r0  r$  r  r  r  r3     s
    r3   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rh| j d|tjjd}| j d||dd	S )
Nr  rI  r  z*'lengths' must be a Tensor for ONNX exportr^  r_  zprim::PackPaddedr  r   )r&  rt  r@  rV  r   Z
TensorTypegetr   r\  r   rc  rd  re  r  r`  ra  r  )r)  r0  lengthsrq  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  rI  r  r.  )r)  r(  rr  rq  Zpadding_valuetotal_lengthr  r  r  r  _pad_packed_sequence=  s    r  zaten::randnc                 G   s   t |dd}|d u r tjj}n
t|}t |d}t |rr| jd|tj	dgtj
dd}| jd|| d	S | jd
|| dS )Nr|  rm  r  r*  r   rl  rU  RandomNormalLikedtype_iZRandomNormalshape_ir  r   r  r   rc  rg  r  rB  r&  rV  r   rw  rh  r)  shapesrm  r'  rj  r6  Zshape_constr  r  r  r   Q  s*    


r   z
aten::randc                 G   s   t |dd}|d u r tjj}n
t|}t |d}t |rr| jd|tj	dgtj
dd}| jd|| d	S | jd
|| dS )Nr|  rm  r  r*  r   rl  rU  RandomUniformLiker  ZRandomUniformr  r  r  r  r  r  r   l  s*    


r   zaten::randn_likec                 C   s>   t |dd}|d u r tjj}n
t|}| jd|| dS )Nr|  rm  r  r  r&  )r)  r:  rm  r!  r"  r#  r$  rj  r  r  r  r     s
    

r   zaten::rand_likec                 C   s8   t |dd}|d u rtjj}| jd|t| dS )Nr|  rm  r  r  r&  )r)  r:  rm  r!  r"  r#  r$  r  r  r  r     s    r   zaten::rreluc                 C   s@   |s || d }| j d||dS | j d|||d}|  d||S )Nr  r5  r6  r  )high_flow_fr!  r.  )r)  r0  rO  upperr  r  Zsloper  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rlt dd|S | jd|dd| d}|d urt |s|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  rR  r  )r  r  r  r  r^  r_  )	r   r  r  r   rc  rd  re  r&  rh  )	r)  r0  r  r  ri  rm  ZrandsZprobrj  r  r  r  r%     s2    r%   zaten::log_sigmoidc                 C   s   |  d|}|  d|S )Nr  r  r.  )r)  r0  r  r  r  r  r|     s    r|   z	aten::erfc                 C   s   |  d|S )NErfr.  r/  r  r  r  rL     s    rL   zaten::flattenc                 C   s   t |}|d u r t dd|S |dk r0|| }|dkrT||d krT| jd||dS |dkr|||d kr|| jd||d dS t | ||||S )NrB   r  r   r@  Flattenr  r  )r   r~  r  r&  Z_flatten_helper)r)  r0  Z	start_dimZend_dimrB   r  r  r  rR     s    
rR   zaten::nonzeroc                 C   s   t | | d|S )z/Emitted from `torch.nonzero(x, as_tuple=False)`ZNonZero)r   r&  r/  r  r  r  r     s    r   zaten::nonzero_numpyc                 C   s   t | t| |d|dS )Nr@  )r  )r   r   )r)  r0  r  r  r  r  r   	  s    r   zaten::isnanc                 C   s   |  d|}|S )NZIsNaNr.  )r)  r0  rj  r  r  r  rn     s    rn   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 )Nr@  r   rM  r|  r^  r_  r  rT  rl  rU  )rN  r   rp  r&  r`  ra  rb  r;  r_   rV  r   long)r)  r  r0  rB   r  Z	input_sumr  r  r  _any  s    

r  z	aten::allc              	   G   sP   |  d|d }t|dkr.|  dt| |S |  dt| ||d |d S d S )Nro  r   r@  r  )r&  rN  r  )r)  r  r0  r  r  r  _all+  s    r  zaten::narrowc                 C   s   t j| ||g|g|| gdS )Nr  r  )r)  r0  rB   r  lengthr  r  r  r   7  s    r   zaten::argmaxr)  r0  rB   r  c                 C   s   t | |||dS )Nr  r   Z_argmin_argmax_helperr  r  r  r  r   @  s    	r   zaten::argminc                 C   s   t | |||dS )Nr
  r  r  r  r  r  r   L  s    	r   zaten::scatterc                 C   s   t j|t jj}t|}t|r:| jd||||dS t j|}||krb| jd|| d}| jd||t	| |||dS d S )NZScatterr  r^  r_  )
r   rc  rd  re  r   rF  rB  r&  rh  rN   )r)  r:  rB   rj   srcZsrc_typer  r  r  r  r   X  s    

r   zaten::scatter_addc                 C   sz   t |}|d u r t dd|S t j|dd}|rP| jdtj|| dd}nt| ||}t 	| ||||}t
| ||S )Nr   r  F)Zallow_nonstaticrT  rl  rU  )r   r  r  r"  r&  rV  r  rm  r  Z_scatter_helperr   )r)  r:  rB   rj   r  rj  rM  Zto_addr  r  r  r   k  s    
r   z
aten::log2c              	   C   s(   d}|  dt| || j dt|dS )Ng9B.?r]  rT  rU  r  )r)  r:  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 NrT  r@  rU  r   )r   rf  r&  rV  
BoolTensorr{  r  r  r  rl     s    
rl   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&  rV  r  rK   rL  r  r  r  __is_  s
    

r  zaten::__isnot_c                 C   s   t | ||S r  )r  rL  r  r  r  __isnot_  s    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 rZ| j d|tjjd}| j d|||dd	S )
NrT  r   r@  rU  r^  r_  OneHotr  r  )r&  rV  r  r   rc  rd  re  r  r  r  r  r`  ra  rb  )r)  r:  Znum_classesr  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|  rY   zsparse_grad == TruerT  r   r@  rU  r^  r  r  r_  rA  r  )r   r  r  r   rc  rd  r&  rV  r  r   rh  r  r;  )	r)  r:  rB   rj   Zsparse_gradrj  r  depthr   r  r  r  rY     s    rY   c              	   C   s:  |d u r(| j d|dd}|}t| |}nb| j d|||d}| j d||dd}|  d|}| j d|| j dt|d	dd
}| j d|dd}|  d||}	|  d|	|	}
|d u rdn|}| j d|
||d}|d u rd}|dkr2| j d|tjjd}| j dtj|tjdd	}|  d||}|  d||  d||}||fS )Nr  r   r  r  r@  r-  r  rT  rU  r  r  rI  rA  r^  r_  rl  r]  )r&  r   rV  r   r`  ra  rg  rw  )r)  r0  rB   Z
correctionr  r  Zt_meanZnum_elementsZredudced_dimsZsub_vZsqr_subZkeepdim_meanr  rt  r   r  r  r  	_var_mean  s8    

r  z	aten::stdc                 G   s"   t | |g|R  \}}| d|S Nr  r  r&  r)  r0  r  r  rY  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   s6   t |dkr t| |d |d d S t| |g|R  S d S )Nr@  r   )rN  r  )r)  r0  r  r  r  r  r    s    r  zaten::std_meanc                 G   s&   t | |g|R  \}}| d||fS r  r  )r)  r0  r  r  r  r  r  r  r     s    r   zaten::logsumexpc                 C   s   | j d|||dS )NZReduceLogSumExpr  r.  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sRt|dkrt|dkrdd }n||d }t j |d	 |d
\}}}}t  |d	g}||}t  t	 t
 ||d d dg}	 jd|	t| dS t|dkst|dkrt|dkrd }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r||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  rl  r  r  r  _get_arange_dtype  s    z!arange.<locals>._get_arange_dtypec                    s.   t | r* jd d| tjj d} | S )Nr^  r1  r_  )r   rf  r&  r   rc  rb  rh  )range_tensorr+  r  r  _float_step_convert  s    


z#arange.<locals>._float_step_convertr  r  r@  r   )r  rm  r^  r_  r  r?  rO  )r  r  r  rm  r]  rI  r>  rA  r0  )r  r  rm  r  r  r  )r   r  r  r   r  rN  Z_arange_cast_helperr  r  r   r   r&  r   rc  rh  r  )
r)  r  r  r  rm  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 )NrT  r@  rl  rU  )
r   Z_arange_helperrC   r   r&  rV  r   rq  r   r   )
r)  r  r  Zstepsrm  r!  r"  r#  r  r  r  r  r  r{   c  s    
 r{   z
aten::liftc                 C   s   |S r  r  r{  r  r  r  ru   q  s    ru   zaten::masked_fillc                 C   s6   | j d|tjjd}t|}|  d|t|||S )Nr^  r_  r  )r&  r`  ra  r  r   rF  r  r)  r:  maskrW  r  r  r  r   x  s    
r   zaten::masked_fill_c                 C   s   t | |||S r  )r   r  r  r  r  r     s    r   aten::indexc                    s6  t  rjd|ddS t |r0t |}n|g}tjfddfdd|D }t|dkrt jd	|d	 d
dS dd t	|D  t d	krS t dkrt
 d	 | d	  S t }|d u rt 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r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 d S )#Nrj   r  )r  c                    sh   t | sdtj| tjjtjjks.t | rd jdk rDt	
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.r@  )r   r  r   rc  rd  re  r  rK  r  r   r\  r  r  r  r   )rj   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>r@  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  rT  rU  r   r  )r&  rV  r  r  rB   )r)  shape_tensorr  r  r    s   r  c                    s   g | ]}| vr|qS r  r  r?  )adv_idx_indicesr  r  r    r@  r  r  r  r  r  rA  r>  rT  rU  c                    s   g | ]}| vr| qS r  r  r?  r  dim_tensor_listr  r  r    s   r2  r3  c                    s   g | ]} | qS r  r  r?  )r  r  r  r    r@  c                    s   g | ]}| vr| qS r  r  r?  r  r  r  r    s   c                    s   g | ]}| vr| qS r  r  r?  r  r  r  r  &  s   )r   r  r  r  r  r   r  rN  r  r)  ri   r~  r  r  r  r   r(  r1  r  r&  r5  rV  r  r8  )r)  r:  rj   r  r  Zadv_idx_countZcum_adv_indexZ
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  r)  r:  r  r  r  rj     s    

	


	rj   zaten::linalg_norm)r)  r:  ordrB   r  rm  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rrt |d}qd	dg}n8t	|dkrt |r| jdtdgd}t |d}|rt
| |||||S t| |||||S )
Nr  rT  r  rU  rB   (Input rank must be known at export time.r@  rQ  r   )r   r  r8  r&  rV  r  r~  r  rp  rN  ry   rw   )r)  r:  r  rB   r  rm  	ord_valueself_dimr  r  r  rx   1  s(    



rx   zaten::linalg_vector_normc                 C   s   |d u rt | |dg}d}|tjkrB| jd| d|||d}n|tj krj| jd| d|||d}n|dkrt 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  Fr9  r  r  r	  r   ry   r  r?  zord=0 not supportedrT  rl  rU  r  r]  r@  )
r   r8  rC  infr&  rD  rV  r   r  r;  )r)  r:  r  rB   r  rm  resultZord_opr  r  r  ry   U  s2    

	ry   zaten::linalg_matrix_normc              	   C   s  t |d}|dkr"t| |||S |dkr8t dd|S t |d}|d u rZt| |||S |dksj|dkrxt dd	|S t |}|d u rt dd
|S |d dk r|d  |7  < |d dk r|d  |7  < |tjks|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\}	}
n*t| || jdt
|d gd|d\}	}
|	S d S )NrX  ZfroZnuczlinalg.matrix_normzord==nucrQ  r  rw  zord==2r  r   r@  r  r  rT  rU  )r  r  )r   rp  rV   r  r~  rC  r  r;  r&  r   rV  r  r   )r)  r:  r  rB   r  rm  r  r  r  r  r  r  r  r  rw   ~  sP    


rw   zaten::linalg_crossr  c                 C   s   t | |||S r  )r?   )r)  r0  r=  rB   r  r  r  rv     s    rv   zaten::frobenius_normc                 C   s,   |  d||}tj| |||d}|  d|S )NrA  r  r  )r&  r   r;  )r)  r:  rB   r  ZsqrZsumsqrr  r  r  rV     s    rV   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 multinomialr@  zGreplacement=False when num_samples > 1 is not supported for multinomial)r  Zsample_size_i)r   r  r  r~   r&  r`  ra  rb  )r)  r0  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   rc  rd  r   r   r&  rh  r   )
r)  r:  Zbatch1Zbatch2r  rH  rj  Z	batch_mulZmul_aZmul_br  r  r  r#     s    r#   zaten::meshgrid)r)  indexingc                    s<  |d u rd}n|dvr(t d| ||dkrJ|d |d  |d< |d<  fddt|D } fd	d|D } jd
g|R ddi}g }t|D ]l\}} jdtjdtjddgt	| }	|| |	|< t
 | jd
g|	R ddi}
| d|
| q|dkr*|d |d  |d< |d<  jdg|R  S )Nij>   r  xyzUnsupported indexing: r  r@  r   c                    s,   g | ]$}t  | jd tdgdqS )rT  r  rU  )r   r8  r&  rV  r  r  r+  r  r  r    s   zmeshgrid.<locals>.<listcomp>c                    s   g | ]}  d |qS )r-  r.  r  r+  r  r  r  
  r@  r2  r3  rT  rl  rU  r  prim::ListConstruct)r   r\  r   r  r&  r)  rV  r   rq  rN  r7  r   )r)  r  r  r  Ztensors_shapeZ	out_shaperi  r|  r   r  Z
t_reshapedr  r+  r  r     s0    

 
r   zaten::remainderc                 C   s(   t | ||}| d||}| d||S )NrA  rI  )rZ  r&  )r)  r0  r=  rC   Zquor  r  r  r     s    r   z
aten::gelu)r)  r:  approximatec                 C   s&  |dkrt 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 d S )Nr   r  gHm?rl  rR        ?r  g;f?r  r]  rT  r@  rU  )	rC  r   pirV  r   rx  r   r   r&  )r)  r:  r  ZkBetaZkKappar  kappart  ZhalfZ	self_cubeinnerZ_sqrt2rL   Zerf_plusoner  r  r  r[   !  s(    $"
r[   zaten::group_normc              
   C   s  t  r | jd||||||dS t |d}|d urD|| dksDJ t |}|d u rdt 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"|  rLtj
d	gtj| d
}| jd|d}|d u sd|  rtj
dgtj| d
}| jd|d}ttd|d }t| t| |t | ||t | ||S )Nr^   )Znum_groups_ir  Zcudnn_enabled_ir@  r   zunknown input rankr  rT  rU  rR  rl  r  r  r  r-  )r   r  r  r  r~  r  r8  r&  rV  r  r   r   rc  rd  rm  r  
mustBeNoner5  r  r   r   r  )r)  r0  Z
num_groupsr  r  r  r  r  Z
input_rankr6  r  r  r  Znorm_reshapedr   r  r  r  r  r  r  r^   >  sl    



r^   zaten::_weight_normc                 C   s   t |}|d urttt|}|d urH|dk r6||7 }|dkrH|| t| |d|d}| d||}| d||S t  r| jd|||dS t	
d|d S )	Nr  r  r@  r]  rA  _weight_normr  zDUnsupported: ONNX export of _weight_norm for tensor of unknown rank.)r   r~  r5  r  remover   r&  r  r  r   r\  )r)  rz  Zweight_grB   r  r  Znorm_vrC   r  r  r  r    s"    

r  z	aten::dimc                 C   s   |  d|}|  d|S )zFImplement the dim functionality available for a pytorch tensor in ONNXr-  Sizer.  r9  r  r  r  rB     s    rB   zaten::__contains_c                 C   sd   t |}tdd |D rTt |rT| jdtt | ddd |D v dS t	
d|d S )	Nc                 S   s   g | ]}t |qS r  )r   r  r_  r  r  r  r    r@  z__contains_.<locals>.<listcomp>rT  rW  c                 s   s   | ]}t | d V  qdS )rW  N)r   r  r  r_  r  r  r  rS    r@  z__contains_.<locals>.<genexpr>rU  zJUnsupported: ONNX export of __contains__ for non-constant list or element.)r   r  r  r  r&  rV  r   r  r  r   r\  )r)  r:  elementZunpacked_listr  r  r  __contains_  s$    
r  zaten::__getitem_c                 C   s    t | || jdtdgd|S r2  )r   r&  rV  r   )r)  r:  r|  r  r  r  
__getitem_  s    r  z
aten::itemc                 C   s   |S r  r  r{  r  r  r  ro     s    ro   z
aten::takec              
   C   sD   t | || jdtjdgtjdd}t| |d|}t| ||}|S )NrT  r  rl  rU  r   )r   r8  r&  rV  r   rq  ri   r   )r)  r:  rj   Zself_flattenedri  r  r  r  r     s    r   c                 C   s&   t | ||}t| |}t| ||}|S r  )r   rM   r   )r)  r0  targetdiff_Zexp_rj  r  r  r  _kl_div_log_target_impl  s    
r  c           	      C   sZ   t | |}t| ||}t| ||}t| |}t| || jdtdd}t| |||}|S r2  )	r~   r   r   r  r_   r&  rV  r   r
  )	r)  r0  r  Zlog_r  Z
output_posZzeros_Zmask_rj  r  r  r  _kl_div_non_log_target_impl  s    

r  zaten::kl_divc                 C   sj   |rt | ||}nt| ||}|dkr*|S |dkrB| jd|ddS |dkrZtj| |ddS td|S d S )Nr   r@  r  r  r  z4kl_div with reduction other than none, mean, or sum.)r  r  r&  r   r;  r  )r)  r0  r  	reductionZ
log_targetrj  r  r  r  rp     s    rp   zaten::mse_lossc                 C   sh   t | t| ||t| ||}|dkr(|S |dkr@| jd|ddS |dkrXtj| |ddS td|S d S )Nr   r@  r  r  r  z6mse_loss with reduction other than none, mean, or sum.)r   r   r&  r   r;  r  )r)  r0  r  r  rj  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 |stjdgtj	d}t
t||D ]6\}\}	}
dg| }d||< |t|	||
  }qd|r|| }| d|| jd|dS d }t
|D ]\}}
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 rr|}q| d||}q|r| d|| dt|g}| d||S d S )Nr  rT  r  rl  rU  r   r@  r  r  rA  r>  )r   r  rN  r8  r&  rV  r   rq  rB  r  r)  r[  r   r	  r   )r)  r:  rM  stridesoffsetr  Zself_1dindr|  r   rF  Zr_sizeZtmp_indr  r  r  r     sL    



r   zaten::__derive_indexc              	   C   s   |  d||  d||S )Nr>  rA  r.  )r)  rj   r  r  r  r  r  __derive_indexB  s    r  zaten::__range_lengthc                 C   s6   |  d||}|  dt| ||}| j d|tjjdS )NrI  r1  r^  r_  )r&  r   r`  ra  rb  )r)  lor  r  r   rC   r  r  r  __range_lengthH  s    r  zaten::linearc                 C   s   t |}t| |}|dkrp|  sp| jdtjdtjdd}| jdtjdtjdd}t	| |||||}n$t
| ||}|  st| ||}|S )Nr  rT  r@  rl  rU  )r   r~  r   r  r  r&  rV  r   rq  r   r   r   )r)  r0  r  r  r  rH  r  rj  r  r  r  rz   X  s    

zaten::hann_window)r)  rm  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 rt| || jdt jdt jdd}t| ||}| jdt| t| ||	 d}|S )	Nr  r^  r_  rT  rl  rU  Fr@  )rV  rv  rl   rw  r   rc  Z
from_dtyper   r&  r`  ra  rg  r   r   rC  r  r   r  rC   r   r   rh  )r)  Zwindow_lengthZperiodicrm  r!  r"  r#  r)  Zdtype_rj  Zn_arrayrj  r  r  r  r`   i  s,    

r`   zaten::mvc                 C   s   t | ||S r  r   )r)  r:  Zvecr  r  r  r     s    r   z	aten::dotc                 C   s   t | ||S r  r  rL  r  r  r  rD     s    rD   zaten::movedimc           
      C   s   | d}| d}| | ks(J ||k r8|S t|}|d usNJ tt|}| }| }t|	 |	 D ] \}}	|||	< d||< d||	< q|dd |D }dd |D }t||D ]\}}	|||	< q| j
d||dS )Nr  c                 S   s   g | ]}|d kr|qS r  r  r  r  r  r  r    r@  zmovedim.<locals>.<listcomp>c                 S   s   g | ]}|d kr|qS r  r  r  r  r  r  r    r@  r  r  )r	  r   r  r   r~  r5  r  r  r[  tolistr&  )
r)  r:  r  Zdestinationr#  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   rc  rd  rg  rW   )r)  r:  rW  rj  r  r  r  rQ     s    rQ   zaten::index_addc                    s  t d |r0tt|dkr0tdd|S t d  d u rPtd|t	|}t	|}|d u st|d u rtd|||kr|| }t
|D ]}	t| |t	|g}qt| }
t| }|
d ur|d ur|
|krtd|tt
|}d	d
 t
|D } fdd
t
|D }tj| ||||d}t| ||}t
 D ]}	t| |dg}qLt
|  d D ]}	t| |t	|g}qtt| | t| |||S )NzyWarning: ONNX export does not support duplicated values in 'index' field, this will cause the ONNX model to be incorrect.r@  re   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   s   g | ]}d qS rh  r  r?  r  r  r  r    r@  zindex_add.<locals>.<listcomp>c                    s   g | ]}| krt jnd qS rG  )sysmaxsizer?  rv  r  r  r     r@  r  r   )r  r  r   rE  rF  r  r  r   r\  r~  r  r  r  r5  r  rN   r   )r)  r:  rB   rj   r=  rH  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  rv  r  re     s\    


re   z
aten::rollc                 C   s   t |t |ksJ |}tt |D ]}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   r2  r3  )rN  r  r   r  r  r  r   r&  )r)  r:  Zshiftsr  r  r|  r  r6  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  r@  )r   Z_get_dim_for_crossr   r   r   )r)  r0  r=  rB   Zroll_x_1Zroll_y_1Zroll_x_2Zroll_y_2r  r  r  r?   (  s    r?   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 )Nr@  r  gư>F)r  r  )r   r~  r  r   )r)  r  r  r  Zcompute_moder  Zbroadcasted_x1Zbroadcasted_x2r  r  r  r,   <  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 )	NrI  r  rT  r  rU  r>  rA  rR  )r&  r
  rV  r   )r)  r:  r  r  diffr  r  r  rt   T  s    rt   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  )rN   r  r)  Zt_with_final_shaper  r  r  u  r@  z%broadcast_tensors.<locals>.<listcomp>r  )r   r  r  r   r&  )r)  r:  Zall_tensorsr   Zt_listr  r  r  r)   j  s    
r)   zaten::is_pinnedc                 C   s   d S r  r  )r)  r:  r"  r  r  r  rm   y  s    rm   prim::ConstantSplitc                 C   s^   t ||}|d u r"t dd|S |g||  }|| }|rF|| | jd|||t|dS )Nr  r  r  r	  )r   r  r  r   r&  rN  )r)  r:  r  rB   r   r  r  r  r  r  r     s    
r   prim::ConstantChunkc                 C   s@   t ||}|d u r"t dd|S || d | }t| |||S )Nr  r  r@  )r   r  r  r   )r)  r:  r
  rB   r   r  r  r  r  r     s    r   zprim::shapec                 C   s   |  d|S r,  r.  r{  r  r  r  r     s    r   z	prim::maxc                 C   s   t | d||ddS )Nr   r  r.  r/  rL  r  r  r  r     s    r   z	prim::minc                 C   sB   |s6t |r,t| || jdtdgd}t| |S t| ||S r2  )r   r  r   r&  rV  r   r   rL  r  r  r  r     s
    

r   z
prim::datac                 C   s   |S r  r  r{  r  r  r  r     s    r   zprim::layoutc                 C   s   | j dtddS r2  r  r{  r  r  r  r     s    r   r  c                 O   s   d S r  r  r)  r*  r  r  r  r  r     s    r   zprim::ListUnpack)r)  r  c                 O   s2   t |dkr.|d   dkr.t|d S d S )Nr@  r   r  )rN  r  r  r   r  r  r  r  r  r     s     r   zprim::TupleConstructc                 O   s   d S r  r  r  r  r  r  r     s    r   zprim::Uninitializedc                 O   s   d S r  r  r  r  r  r  r     s    r   zprim::unchecked_castc                 C   s   |S r  r  r{  r  r  r  r     s    r   zprim::dtypec                 C   s.   t |}|d u rtjj}| jdt|dS rS  )r   r  r   rc  rg  r&  rV  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|  r@  r  zdim_val > 1)r   r  r  )r)  r0  Zdim_valZelem_ty_valrB   r  r  r  r     s    r   r>  c                 O   s>   | j   }t|tjrd S tdd|  d| j  S )Nr>  z,output type should be 'DeviceObjType', not '')	original_noderj  rt  r4  r   r  r   r  r  )r)  r*  r  output_typer  r  r  r     s    r   z
prim::Loopc                 O   s"  | j }| j}| j}tj}tj}t| }tj	| dg|R |
 t|d\}	}
}t||
D ]\}}t| D ]l\}}|dkr|t|k r|||   |dkrr|d t|k rrt| tjsr|||d    qrtj||j||d q^tj||}tjrtj||| |S )NZLoopr   Zn_blocksr   r@  F)r  envparams_dictr   r6  r(  r  blocksr   add_op_with_blocksoutputsSizerN  r[  r)  r*  r'  rt  r4  r   r(  rV  _jit_pass_onnx_blockblock%_jit_pass_fixup_onnx_controlflow_nodeonnx_shape_inference(_jit_pass_onnx_node_shape_type_inference)r)  r*  attrsr  r  r  r6  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     sN    r   zprim::Ifc                 O   s  | j }| j}| j}| j}tj}tj}|d   dk}	|	rt	
|d  d }
t|
trht|
nt|
}|rxdnd}t| | }tj||||d}t| }t| }g }tt|D ]B}|| |vrtd||  d|| |||  }|| q|S t| }tj| dg|R | t|d	\}}}t||D ] \}}tj||j||d
 qPtj||}tj rtj!||| |S d S )Nr   r  rW  r@  TzThe sub block ATen output z is not in env.Ifr  F)"r  r  r  r  r   r6  r(  r  r  r   r  r  r4  r5  r  r  r  rV  r   r  r   r  rN  r   r\  r   r  r   r  r  r[  r  r  r  )r)  r*  r  r*  r  r  r  r6  r  Z	static_ifZ
input_flagr0  Z	block_idxZ	current_bZif_output_listZcurrent_b_listZfinal_b_listr~  Zonnx_br  r  r  r  r  r   r  r  r  r  r   G  sp    r   r%  c                    s.   j }| rd S t|  tjr*d S |ddkrN jdt	
|ddS |ddkrr jdt	
|ddS |  tj s|  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| d S )NrW  r   rT  rU  rX  Zvalue_sc                    s   g | ]} j d |dqS )rT  r  r.  )r  rX  r+  r  r  r    s   z!prim_constant.<locals>.<listcomp>r  z"Unsupported prim::Constant kind: 'z'. Please send a bug report at .)r  r  r4  rj  rt  r   r  r  r&  r   r  r@  rA  rB  ZofFloatsrV  r   Z	ofStringsr   r\  r	   ZPYTORCH_GITHUB_ISSUES_URL)r)  r*  r  r  Zstr_constantsr  r+  r  r     s8    

r   
prim::type)r)  device_valuec                 O   sJ   |   dkr<t|   }|d ur<| jdt|dS tdd|S )Nr>  rT  r  r  z,Device type cannot be statically determined.)	r  r  r   Zget_device_from_valuer0  r&  r  r   r  )r)  r  r  r  r"  r  r  r  r     s    r   zonnx::Placeholderc                 O   s"   | j }| j}| j}tj|||S r  )r  r  r  rV  r   Z'_jit_onnx_convert_pattern_from_subblock)r)  r*  r  r  r  r  r  r  r  r     s    r   zaten::resolve_conjzaten::resolve_negr/  c                 C   s   |S r  r  r/  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  r/  r  r  r  r    s    	
r  )N)N)N)rR  )T)T)N)N)N)N)N)N)r   N)N)F)N)N)NNN)N)N)FF)NN)NN)FN)NNNFN)F)NNF)NN)F)NNNFN)F)F)NNNFN)F)F)NNNFN)F)N)N)NN)NN)NNFN)NNFN)NNN)N)F)r  )NF)FN)N)r  )N)TNNNNF)N)N)r  r  )N)N(s  __doc__r|  r  rC  r  r  typingr   r   r   r   r   r   rV  Ztorch._C._onnxr   Z_onnxr`  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  ZGraphContextr1  r7  r  r   r   r   r   r   r   rC   r  r   rO  r[  rZ  rS   rU   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  r@   r  r  r   r   rO   rN   rH   rG   r   r   r   r	  r  r   r   r  r   r   r   r   r   r   r   r   r   r+  r   r   r-   rT   r3  r   rl  rw  rs   r]   r   r   r\   nnmodulesutilsZ_singleZ_pairZ_triplerb  r   r   r   rm  ru  r  ry  r{  r2   r  r   r   r   r  r  r&   r'   r  r  r  rK   r   r_   r  r   r  rZ   rr   r  r  r  r   r   r   r  r  r
  r}   r  r  r<   r8   r9   r:   r5   r6   r7   r$   r   rq   rk   r   rF   r   ri   rh   rg   rf   r*   r   r>   r   r1   r   r~   r   r   r   r0   r/   r.   r   r   r   r   r   r   r   rM   rE   r  r   r4   r  r  
deprecatedr  r  r  r  r  r  r  r  r   rJ   rI   r   r   r   r    r  r  r   r  r   r   r   rX   rW   r   rP   r   rd   rc   rb   r   ra   r   r   r  r   r   r   r;   r   r   r   r   r   rw  r|  r~  r   r   r  r  rA   r3   r  r  r   r   r   r   r   r%   r|   rL   rR   r   r   rn   r  r  r   r   r   r   r   r   rl   r  r  r   rY   r  r   r  r  r   r   r   r{   ru   r   r   rj   rx   ry   rw   rv   rV   r   r#   r   r   r[   r^   r  rB   r  r  ro   r   r  r  rp   r   r   r  r  rz   r`   r   rD   r   rQ   re   r   r?   r,   rt   r)   rm   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
&	


!
>6	

	>+			;



8			


7 +		&







C7:_$
#



	

      	    	    	    	H&


 Kh
F
C  gC

      
		 "Q *
!
&;  
(
*E	
",	     & 
E  
$2$W" "	