U
    <cnh                    @   s @  d 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 d	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd gZ 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(dej*dddZ0e$dej(dej*dddZ1e$dej(dej*dddʄZ2e$dej(ej*dddZ3e$dej(ej*ddd7Z4e$d e5d!d!d!d"ej(dej*dd$dZ6e5d!d!d%ej(ej*dd&d'Z7ej(ej*dd(d)Z8ej(ej*dd*d+Z9e$d,ej(ej*dd-dGZ:e$d.ej(ej*dd/dIZ;e$d0ej(ej*dd1dZ<e$d2ej(ej*dd3dZ=e$d4e5d!d5ej(ej*dd6d Z>e$d7e5d!d5ej(ej*dd8d߄Z?e$d9ej(ej*dd:d;Z@e$d<ej(ej*dd=dZAe$d>ej(ej*dd?dZBe$d@ej(ej*ddAd~ZCe$dBe5d!d!d!ddej(ej*ddCdZDe$dDej(ej*ddEdZEe$dFej(ej*ddGd܄ZFe$dHej(ej*ddIdɄZGe$dJej-ddKdLdMej(ej*ddNdZHe$dOej(ej*ddPdӄZIe$dQej(ej*ddRd1ZJe$dSej(ej*ddTdZKe$dUej(ej*ddVdZLe$dWej(ej*ddXd
ZMe$dYej(ej*ddZdZNe$d[ej-dd\ddMej(ej*dd]dЄZOe$d^ej(ej*dd_dфZPe-dej(ej*dd`daZQej(ej*ddbdcZRej(ddddeZSej(dfd ZTe$dge%dhdigdje$dke%dldmgdje$dne%dodpdqdrgdjej(de&e&eUdsdtduZVe$dve5d!d5dwej(ej*ddxd4ZWe$dyej(ej*ddzd{ZXe$d|ej(ej*dd}d~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ddCZ\e$de-ddej(ej*dddBZ]e$de-de5d!d!d5dd!ej(ej*ddd<Z^e$de-de5d!d!d!d5d5d5d!d5d5	ej(ej*ddd;Z_e$dej(dej*dddԄZ`e$de-de5d!d5d5ej(ej*dddZae$de5d!d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5d!d5d5d5ej(dej*dddZee$de5d!d!d5d5ej(dej*dddۄZfe$dej(dej*dddZge$de5d!dd5d5ej(dej*dddڄZhe$dej(dej*dddZie$de5d!d5d5ej(dej*dddZje$de-de5d!d5d!ej(ej*ddd΄Zke$dej(ej*ddd݄Zle$dej(de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dd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ddHZue$dej(ej*dddZve$de5d!ddej(ej*dddZwe$de-de5d!d"dej(dej*ejxeyeUdddgZze$de5d!d5ej(ej*dddQZ{e$dÃe5d!d5dwej(d ej*dddքZ|e$dŃej(ej*dddׄZ}e$dǃej(ddP Z~e$de%dejjjjdːdqd̍e'dʃgdje$de%dejjjjdϐdqd̍e'd΃gdje$de%dejjjjdҐdqd̍e'dуgdjej(dӐdԄ Ze$dՃedejjjjdːdd̍Ze$dփedejjjjdϐdd̍Ze$d׃edejjjjdҐdd̍Ze$de%dejjjje'dكgdje$de%dejjjje'dۃgdje$de%dejjjje'd݃gdjej(dސd߄ Ze$de%ddejjjje'dgdje$de%ddejjjje'dgdje$de%ddejjjje'dgdje$de%ddejjjjee'dgdje$de%ddejjjjee'dgdje$de%ddejjjjee'dgdjej(dddZej(edddZej(dd Ze$dej(ej*ddd'Ze$dej(ej*dddZe$de$de$dej(ej*dddZe$de$de$d ej(ej*dddĄZe$dej(ej*dddZe$de%ddҐde'dgdje$de%dd	de'dgdje$d
e%ddde'dgdje$de%dddne'dgdje$de%dd	dne'dgdje$de%dddne'dgdjej(e&ee&dddZe$dej(ej*dddZe$dej(ej*dddZej(dd Zej(eedddZe$dej(ej*ddd Ze$d!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&dS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.dNZe$d/e-ddeej(ej*dd0dfZe$d1ej(ej*dd2d3Ze$d4ej(ej*dd5d6Ze$d7ej(ej*dd8d9Ze$d:ed;ej(ej*dd<dvZe$d=ed;ej(ej*dd>dwZe$d?ed;ej(ej*dd@dxZe$dAej(ej*ddBdCZe$dDej(ej*ddEdFZe$dGe5d!d!d!d5ej(dej*ddHdZe$dIe5d!d5dwej(dej*ddJdqZe$dKe5d!d5d5ej(ej*ddLdMZe$dNe5d!d!d!dddd5dd5d5d5d5d5ej(dej*ddOdPZe$dQe5d!d!d!dddd5dd5	ej(ej*ddRd0Ze$dSe5d!d!d!dddd5ej(ej*ddTd-Ze$dUe5d!d!d!dddd5ej(ej*ddVd.Ze$dWe5d!d!d!dddd5ej(ej*ddXd/Ze$dYe5d!d!d!dddd5dej(ej*ddZd*Ze$d[e5d!d!d!dddd5dej(ej*dd\d+Ze$d]e5d!d!d!dddd5dej(ej*dd^d,Ze$d_e5d!d!d!d!d!d5d"d"d5	ej(ej*dd`dZe$dae-ddqdqdqe5d!dd!d!d"ej(ej*ejxe	e ejxejxeye
ejxejxejxf dbdcdZe$dde-ddqdqdqe5d!dd!d!d"dej(ej*ejxe	e ejxejxeyeUejxdedfdeZe$dge5d!d!d!d!d!dd"d"d	ej(ej*eUeeeUdhdid_Ze$dje5d!d5d5d5ej(ej*ddkdZe$dle-de5d!dddej(ej*ddmd:Ze$dne-dej(ej*ddodτZe$dpe5d!d5d!ej(ej*ddqd]Ze$drej(ej*ddsd\Ze$dtej(ej*ddud[Ze$dvej(ej*ddwdZZe$dxe5d!d!ddej(dej*ddydZe$dzej(ej*dd{dZe$d|e5d!d!d5d"ej(ej*dd}d2Ze$d~ej(ej*dddZe$dej(ej*ddd&Ze$dej(ej*ddd	Ze$dej(ej*dddrZe$dej(ej*dddtZe$dej(ej*dddsZe$dej(ej*dddZe$dej(ej*ddd%Ze$de5d!d!ej(ej*ddd$Ze$de5d!d!ej(ej*ddd#Ze$dej(dej*dddZe$de-ddej(ej*dddZe$dej(dej*dddZe$de-ddej(ej*dddZe$de-de5d!dd5ej(ej*dddZe$de-de5d!dd5ej(ej*dddZe$de-de5d!d!d5ej(ej*dddZe$dej(ej*dddAZe$de$de5d!d"d5ej(ej*ddd9Ze$de%dgdje$de%dgdje$de%dgdje$de%dgdje$de%dgdje$de%dgdjej(e&dddZe$de5d!ddd5ej(ej*dddZe$de5d!d!d!d5ej(ej*ddd)Ze$de5d!d5d5ej(ej*dddZe$de5d!d5d5d5ej(ej*dddZej(dd ZڐdD ]PZېdeۛ Ze$deܛ e5d!d5e"eejݠeۡߡ e e< %qe$de5d!d5d!d!d!d!ej(dej*ddd>Ze$de5d!d5d!d!d!d!ej(d	ej*ddd=Ze$dej(d
ej*dddZe$dej(ej*ddd˄Ze$dăej(dej*dddZe$dƃej(dej*dddZe$dȃe5d!d5d!d!d!ej(dej*ddɐd Ze$dʃe5d!d5d!d!d!d!ej(dej*dddZe$d̃ej(dej*dddZe$d΃e5d!d5d!d!d!ej(dej*dddZe$dЃe5d!d5d!d!d!d!ej(dej*dddZe$d҃ej(dej*dddZe$dԃej(dej*dddLZe$dփej(dej*dddKZe$d؃ej(dej*dddZe$dڃej(ej*dddDZe$d܃ej(ej*dddՄZe$dރe-de5d!d"d"ej(ej*ejxeyeydߜddXZe$de-de5d!ej(ej*dddWZe$dej-dd\ddMe5d!ej(ej*dddVZe$de5d!ej(ej*dddZe$de5d!d"ej(ej*dddUZe$de5d!d"ej(ej*ddd؄Ze$dej(ej*dddZe$de5d!d5ej(ej*dddZe$de5d!d5d5dwej(dej*dddلZe$dej(ej*dddZe$de5d!d5d5d5d5dwej(dej*dddZe$dej(ej*dddZe$dej(ej*dddÄZe$dej(dej*dddZe$de5d!d5ej(ej*dddZ e$de5d!d5ej(ej*dddZej(dej*ddd Ze5d!d!d!d5d5d"d5d5d5	ej(ej*dddZe5d!d!d!d!d5d5d"d5d5	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dzZe$d	e%d
e'dgdje$de%de'dgdje$de%de'dgdje&dddZe$de5d!d5ej(ej*dddZe$dej(ej*ddd5Z	e$de5d!d5ej(ej*ddd(Z
e$de5d!d!d5ej(ej*dddZe$de5d!d!d5d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(dej*dd'dZe$d(ej(dej*dd)dZe$d*e5d!d"d"d5dwej(ej*dd+dȄZe$d,ej(dej*dd-dZe$d.e5d!ej(ej*dd/dpZe$d0e5d!ej(ej*dd1d@Ze$d2e-ddqdqe5d!d5d5ej(ej*dd3dFZe$d4e5d!ej(ej*dd5dZe$d6ej(dej*dd7dZe$d8e5d!ej(ej*dd9dbZe$d:ej(ej*dd;d<Ze$d=ej(ej*dd>d?Ze$d@e5d!d5d5d5ej(ej*ddAdZe$dBe5d!d!dej(ej*ejjxejjxeUdCdDdZe$dEe5d!d!dej(ej*ejjxejjxeUdCdFdZe$dGe5d!d5d!d!ej(ej*ddHd̈́Ze$dIe5d!d5d!d!ej(ej*ddJd̄Ze$dKej(ej*ddLduZ e$dMej(ej*ddNd`Z!e$dOej(ej*ddPdQZ"e$dReej(ej*ddSdTZ#e$dUej(ej*ddVdZ$e$dWe5d!d5d!d!ej(dej*ddXdMZ%e5d!dd5d5ej(ej*ddYdZ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$daej(ej*ddbdZ*e$dce5d!dd5ej(ej*ddddyZ+e$deej(ej*ddfdZ,e$dgej(ej*ddhdoZ-e$diej(ej*ddjdiZ.e$dkej(ej*ddld}Z/e$dmej(ej*ddnd^Z0e$doe5d!d!ddd!ej(ej*ejjxejjxee	e  eUejjxdpdqdlZ1e$dre5d!d"ddd!ej(ej*ejjxeyee	e  eUejjxdpdsdmZ2e$dte5d!d!ddd!ej(ej*ejjxejjxee eUejjxdpdudkZ3e$dve5d!d!d5ej(dej*ddxdjZ4e$dye5d!ddej(d ej*ddzdJZ5e$d{e5d!d5dd!ej(d!ej*dd|dZ6e$d}ej(ej*dd~dZ7e$de5d!d%ej(d"ej*ee& dddZ8e$dej(ej*dddZ9e$de5d!d%ej(d#ej*ejjxe&dddOZ:e$de-ddqdqdqe5d!d5d!d!d"d5ej(ej*dddRZ;e$de5d!d!d5ej(ej*dddZ<e$dej(ej*ddd6Z=e$dej(ej*dddZ>e$dej(ej*dddcZ?e$dej(ej*dddZ@ej(ej*dddZAej(ej*dddZBe$de5d!d!d5dej(ej*ddddZCe$de-de5d!d!dd5ej(d$ej*ddd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ddnZGe$de5d!dd5d!d!d!d!ej(d%ej*ee dddTZHe$dej(ej*dddZIe$dej(ej*ddd8ZJe$de5d!ddej(ej*dddZKe$de5d!d!ej(ej*dddEZLe$dej(d&ej*dddYZMe$de5d!ddej(ej*dddǄZNe$de5d!d!d5ej(d'ej*ddd3ZOe$dej(d(ej*ddd!ZPe$dej(ej*dddhZQe$dej(ej*dddZRe$dd)ej*ddda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j(ej*dddZWe$dȃej(d*ej*dddZXe$dʃej(ej*dddZYe$d̃ej*dddZZe$d΃ej(ej*dddZ[e$dЃej(ej*eeejx  dќddZ\e$dӃej(ej*dddZ]e$dՃej(ej*dddZ^e$d׃ej(ej*dddZ_e$dكej(ej*dddZ`e$dۃej(ej*dddZae$d݃ej(ej*ddќddZbe$d߃ej(ej*eejx dќddZce$dej(ej*eejx dќddZde$dej(ej*dddZee$dej(ej*ejxdddZfe$dej(ej*dddZge$de$dej(ej*ejxdddZhe$de$dej(ej*ejxdddZidS (+  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_patch_torch_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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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matmulmax_pool1d_with_indicesmax_pool2d_with_indicesmax_pool3d_with_indicesmaxmaximummeshgridminminimummishmmmovedim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zerosl    	   )opsetc                     s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                    s
   |  S N fnargskwargsr  >/tmp/pip-unpacked-wheel-gikjz4vx/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  6  s    
zaten::_shape_as_tensorr$  c                 C   s   |  d|S NShaper!  r$  inputr  r  r  _shape_as_tensor>  s    r,  zaten::_reshape_from_tensorc                 C   s*   t |tr| jd|ddi}t| ||S )NConcataxis_ir   )r-  )
isinstancelistr!  r   )r$  r+  shaper  r  r  _reshape_from_tensorD  s    
r2  zaten::reshapeTc                 C   s   t | ||S r  )r   _reshape_helperr$  selfr1  r  r  r  r   L  s    zaten::reshape_asc                 C   s   |  d|}t| ||S r'  r!  r   r$  r5  otherr1  r  r  r  r   S  s    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$  r5  r8  alphar  r  r  r   [  s        z	aten::subc                 C   s4   |r&t t |dkr&| d||}| d||S )Nr;  r<  Sub)r   r@  rA  r!  rB  r  r  r  r   g  s    z
aten::rsubc                 C   s   t | |||dS )N)rC  )r   rB  r  r  r  r   o  s    z	aten::mulc                 C   s4   t |r"t |r"| d||S | d||S d S )NAndr<  )r   _is_boolr!  r$  r5  r8  r  r  r  r   u  s    z	aten::divc                 G   s.   t |dkrt| ||S t| ||f| S d S Nr   )lenr   _div_rounding_mode)r$  r5  r8  r  r  r  r  rA     s    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$  r5  Ztensor1Ztensor2valueZ
value_tensr  r  r  r     s    sc                 C   sT   |d krt | ||S |dkr(t| ||S |dkr<t| ||S td| d|d S )NrR   trunczUnsupported rounding mode: "z$". Expected None, "floor" or "trunc")r   _floor_divide_trunc_divider   SymbolicValueError)r$  r5  r8  Zrounding_moder  r  r  rJ    s    
rJ  c                 C   s   |  d||}| j d|tjjd}|  }|d k	rt|sp|  d k	rpt|rp| j d|tjjd}q| j d|t	j
| d}n| j d|tjjd}|S )NDivCastto_i)r!  _C_onnxTensorProtoDataTypeINT64type
scalarTyper   _is_fpFLOATr   JitScalarType	from_name	onnx_type)r$  r5  r8  outscalar_typer  r  r  rU    s$    rU  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FloorrW  rN  r   dtyperO  XorrD  r<  rE  NotEqualr;  )r   r`  r   r!  rP  r   int64Z
_lt_helper)r$  r5  r8  re  rA   ZzeronegativemodZ
fixup_maskonefixupr  r  r  rT    s     rT  zaten::floor_dividec                 C   s   t | ||S r  )rU  rG  r  r  r  rQ     s    zaten::floordivc                 C   s   t | ||S r  )rQ   rG  r  r  r  rS     s    zaten::true_dividec                 C   s   t |st |r"| d||S t }tjj}|tjksJ|tj	ksJt
t tj	k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
    rW  rX  rY  )r   r`  r!  rP  get_default_dtyper[  r\  ra  floatdoubleAssertionErrorZDOUBLE)r$  r5  r8  rf  Zonnx_scalar_typer  r  r  r     s    zaten::reciprocalc                 C   s*   t |s| jd|tjjd}| d|S )NrX  rY  Z
Reciprocal)r   r`  r!  r[  r\  ra  r$  r5  r  r  r  r     s    
z	aten::catic                 C   s   t |}| jd|d|iS )Nr-  r.  )r-  r   _unpack_listr!  )r$  tensor_listr@   tensorsr  r  r  r*     s    
zaten::stackc                    s.    fddt |D }jd|d iS )Nc                    s   g | ]}t | gqS r  r   _unsqueeze_helper.0r   r@   r$  r  r  
<listcomp>  s   zstack.<locals>.<listcomp>r-  r.  )r-  rx  )r$  rz  r@   Z
unsqueezedr  r  r  r     s    z
aten::listc                 C   s   |S r  r  rv  r  r  r  _list"  s    r  zaten::mmc                 C   s,   | j dtdgd}| j d|||dddS )NrN  r;  rO  Gemm        rM  Zbeta_falpha_f)r!  rP  r   )r$  r5  r8  Cr  r  r  r   (  s    z	aten::bmmc                 C   s   |  d||S NMatMulr)  rG  r  r  r  r'   1  s    zaten::matmulc                 C   s   |  d||S r  r)  rG  r  r  r  r   7  s    zaten::addmmc              	   C   sT  d }t |}t |}t |}	|d k	r0|}n|d k	r>|}n|	d k	rJ|	}t |}
t |}dd }|d k	r2||
ds||dr2tj|}| 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 k	o| |kS r  r  )rK  ur  r  r  is_not_none_andO  s    zaddmm.<locals>.is_not_none_and   r  r;  rN  rh  rO  r<  r9  r  r  )r   _try_get_scalar_type_get_tensor_rankr   rb  rc  r!  r@  rP  r   ri  )r$  r5  Zmat1Zmat2betarC  ri  
self_dtypeZ
mat1_dtypeZ
mat2_dtypeZ	mat1_rankZ	mat2_rankr  rf  Zres1Zres2r  r  r  r   =  s^    







 
 z	aten::negc                 C   s   |  d|S )NZNegr)  rv  r  r  r  r   w  s    z
aten::sqrtc                 C   s   |  d|S NSqrtr)  rv  r  r  r  r   }  s    zaten::rsqrtc                 C   s"   |  dttd|t| |S )NrW  r;  )r!  r   _if_scalar_type_asrP  r   r   rv  r  r  r  r     s
      z
aten::tanhg      ?   )scaleZ
zero_pointc                 C   s   |  d|S )NTanhr)  rv  r  r  r  r     s    z	aten::sinc                 C   s   |  d|S )NZSinr)  rv  r  r  r  r     s    z	aten::cosc                 C   s   |  d|S )NZCosr)  rv  r  r  r  r;     s    z	aten::tanc                 C   s   |  d|S )NZTanr)  rv  r  r  r  r     s    z
aten::asinc                 C   s   |  d|S )NZAsinr)  rv  r  r  r  r!     s    z
aten::acosc                 C   s   |  d|S )NZAcosr)  rv  r  r  r  r     s    z
aten::atanc                 C   s   |  d|S )NZAtanr)  rv  r  r  r  r"     s    zaten::sigmoidg      p?c                 C   s   |  d|S )NSigmoidr)  rv  r  r  r  r     s    z
aten::signc                 C   s   |  d|S )NZSignr)  rv  r  r  r  r     s    c                 C   sP   t |t |kstt |dkr<|d dkr<|d tkr<|S | jd||||dS )Nr;  r   ZSlice)axes_iZstarts_iZends_i)rI  ru  
_INT64_MAXr!  )r$  r+  axesstartsendsr  r  r  _slice  s    $r  c                 C   s6   |   }|d k	r2t|s2|dks2t| |d}|S )NLongF)r^  r_  r   r`  
_cast_Longr$  r5  ri  r  r  r  _maybe_cast_reduce_op_input  s
    r  c                    s   t jd fdd	}|S )Nc                    sn   t | |}|d kr t| |S  r(dnd}t||dt|dd }} rR|n|g}| j|||dS d S )Nisrw  r@   keepdimr  
keepdims_i)r  r   Z_handle_reduce_dim_none
_get_constr!  )r$  r5  r@   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                    s`    | f| }|D ],}|j }t|t|kr|| f|   S qtd j dt| dS )Naten::with 
 arguments)Z_arg_descriptorsrI  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    
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 )
NTrK  nonec                    sb   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |S Nonnx::Constantrw  ri  rX  rY  r   	nodekindr   r  r!  r   rb  rd  r  r  r  r  r  r  reduce_nodim  s      z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr  rw  c                    sf   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |||S r  r  )r$  r5  r@   r  ri  r  r  r  
reduce_dim  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  reduce  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>   ri  dim_ir  r:  )r   is_caffe2_aten_fallbackr  r  r  at_onnx_opset_unsupported)r$  r+  r@   ri  r  r  r  r>   ,  s
    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$  r5  	generatorr  r  r  r  8  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  D  s    
  r  zaten::tc                 C   s   | j d|ddS )N	Transpose)r;  r   Zperm_ir)  rv  r  r  r  r   Q  s    zaten::numpy_Tc                 C   s8   t |}|d k	sttttd|}| jd||dS Nr   r  r  )r   r  ru  r0  reversedranger!  )r$  r+  ndimpermr  r  r  r   W  s    
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  rN  rO  r   rl  Expand)r   _maybe_get_constr=  r!  rP  
LongTensor_is_packed_listr3  r   r   r   rb  r]  r   r   r  )r$  r5  r   Zimplicitri  r   Zneg_onesr  r  r  rM   a  s    

 
 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   rN  rO  r(  r  )r   r  r/  rP  Tensorri  r   rt  r  r@   equalr  r   rL   r  r!  )r$  r5  r8  Zself_t	orig_typedimsdr1  r  r  r  rL   v  s    
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   rV  warningswarnr!  )r$  weightindicespadding_idxscale_grad_by_freqsparser  r  r  rF     s    
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_weightsrE      )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  rE     s$    
z
aten::sizec                 C   sh   |d kr|  d|S t|ddk rZt|}|d k	rZt|d| }| j dt|d}t| ||S )Nr(  rw  r   rN  rO  )r!  r   r  r  rP  r   Z_size_helperr$  r5  r@   rankr  r  r  r     s    
zaten::transposec                 C   s   ||kr|S t |}|d k	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  r0  r  r!  r  r  r   rV  )r$  r5  Zdim0Zdim1r  r  r  r  r  r     s    
zaten::permuter  c                 C   s*   |t tdt|kr|S | jd||dS r  )r0  r  rI  r!  )r$  r5  r  r  r  r  r     s    z
aten::viewc                 C   s   t | ||S r  )r   )r$  r5  r   r  r  r  r    s    zaten::view_asc                 C   s   |  d|}t| ||S r'  r6  r7  r  r  r  r    s    zaten::unsafe_chunkc           	      C   s   |d krt dddd|S t ||}|d k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_ir.  r  )r   r?  _get_tensor_dim_sizer  r  r!  )	r$  r5  chunksr@   _outputsr   
split_sizesplitsleftoverr  r  r  r     s*          
zaten::splitc           
      C   s   t ||st dddd|S t | d}| dkrJt| ||||S t |dd}t ||}|d kr|d k	r~|| }nt dddd	|S |g||  }|| }	|	r|	|	 | j
d
||||dS )Nr   r  r:  r  rQ  r   rw  r   z$Unknown dimension size not supportedr  r  )r   _is_split_staticr?  	_node_getr  r@   r   r  r  r  r!  )
r$  r5  split_size_or_sizesr@   r  Z	split_valr   r   r  r  r  r  r  r     s8        
    
zaten::unsafe_splitc                 C   s   t | ||||S r  )r   )r$  r5  r  r@   r  r  r  r  r   7  s    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  r?  r!  r$  r5  Zsplit_sizesr@   r  r  r  r  r   ?  s        zaten::unsafe_split_with_sizesc                 C   s   t | ||||S r  )r   r  r  r  r  r   J  s    zaten::unbindc                    s^   |d k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  re  r  r  r  r  ]  s    zunbind.<locals>.<listcomp>)r   r?  r!  )r$  r5  r@   r  r  Zsqueezed_outputsr  r  r  r   R  s        zaten::selectc                 C   sr   t |}t |s\|dk r\|dkr*t}n|d }t j| ||g|g|gd}t | ||gS | jd|||dS d S )Nr   r  r;  r  r  r  r  r.  )r   rA  r=  r  _slice_helperr  r!  )r$  r5  r@   rh   Z	end_indexZ
slice_noder  r  r  r   c  s    
    zaten::squarec                 C   s   |  d||S Nr<  r)  rv  r  r  r  r   w  s    zaten::squeezec                 C   sJ  |d kr|  d|S t|dd}|dk rt|}|d k	rxtdt| d d d t||  d	 d
  ||7 }ntdd|S t||}|d k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Squeezerw  r@   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$  r5  r@   Zsqueeze_dimr  dim_sizer  r  r  r   }  s    



  
zaten::preluc              	   C   s   t |}t |}t|}|d k	rp|dkrJt | |ttd|d }n&|dkrp|dgkrpt | |dg}d}|d k	r|d k	r||kstd| d| | 	d||S )Nr  r;  r   z)rank(x) should be >= rank(slope) but got z < PRelu)
r   r  _get_tensor_sizesrI  r}  r0  r  r  ru  r!  )r$  r5  r  	self_rankZweight_sizesZweight_rankr  r  r  r     s&    

  z
aten::siluc                 C   s   |  d||  d|S )Nr<  r  r)  r*  r  r  r  r     s    z
aten::mishc                 C   s   |  d||  d|  d|S )Nr<  r  Softplusr)  r*  r  r  r  r     s    c              
   O   s  | dd}| dd}t|}|d   }t|d  oP|dkpPtj|k }|r|D ]B}	|	 rZ|	  |krZt	
d| d| d|	   |	qZt|D ]:\}
}	|	 rt|	s| jd	|	tj| d
||
< q| j|f||}|r| jd	|tj| 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, "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_tFloatr   z
Inputs of z must have same dtype. Got z and rX  rY  )popr0  r^  r_  r   r`  r   export_onnx_opset_versionZisCompleteTensorr   rV  	enumerater!  r   rb  rc  rd  )r$  Zop_namer  r  r  r  inputsZdtype_0Zrequire_castr+  rw  r5  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     s    zaten::relu6c                 C   s   t | d|dd}t| |dS )Nr!  r"  r#     )r   r-   )r$  r+  r   r  r  r  r     s    z
aten::ceilc                 C   s   |  d|S )NCeilr)  r*  r  r  r  r,   '  s    zaten::floorc                 C   s   |  d|S )Nrg  r)  r*  r  r  r  rR   -  s    z	aten::lenc                 C   s.   t | || jdtdgd}t| |dgS NrN  r   rO  )r   r!  rP  r  r   r  )r$  r5  Zsz_0r  r  r  _len3  s    r(  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   r@  r  r!  )r$  r5  r   rQ  r  r  r  r   :  s
    zaten::leaky_relur$  r+  Znegative_slopeZinplacec                 C   s   | j d||dS )N	LeakyRelur  r)  r)  r  r  r  rq   F  s    z	aten::gluc                 C   sP   t ||}|d k	r$|d dks$t| jd||dd\}}| d|| d|S )Nr  r   r  )r.  r  r<  r  )r   r  ru  r!  )r$  r+  r@   r  firstsecondr  r  r  r[   T  s
    zaten::softmaxc              
   C   sb  t |}|d k	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   rw  ri  rX  rY  rD  	ReduceMaxr  Expr  rW  )r   r  r0  r  r!  r  r  r  r   rb  rd  _reducesum_helper)r$  r+  r@   ri  	input_dimis_transpose_requiredr  r   parsed_dtyperK   r  r  r  r  r   `  sB    
  zaten::softplusc                 C   s@   t |d}|dkr4| d| d| d|||S | d|S )NrL  r;  rW  r  r<  )r   r  r!  )r$  r5  r  r   Z
beta_constr  r  r  r     s     zaten::get_pool_ceil_paddingc                    s   t | }|d k	r$|t d  nd d k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 kqS r  r  r  rw  r  r  r  r    s     z)get_pool_ceil_padding.<locals>.<listcomp>rZ   input size not accessiblec              	      sB   g | ]:}t t | d |   |  t|  d qS r  r;  )r  mathr,   rs  r4  )r@   kernel_sizepaddingstrider  r  r    s   0r   c                    sD   g | ]<} | d  |  | |  kr8 | d  n | qS r;  r  r4  )ceiled_output_dimr@   r9  r:  r  r  r    s   "c                    sP   g | ]H}| d krdn2| | d|    | d  |  d    qS )r;  r   r  r  r4  )r<  r@   r8  r9  r:  r  r  r    s   
*c                    sd   g | ]\}| d |    | krT|  | d k rDt | q^t  | d n
t | qS r6  r  r4  )r8  r9  padding_ceilr  r  r    s   )r   r  rI  anyr  r  )r+  r8  r:  r9  sizesr  )r<  r@   r8  r9  r>  r:  r  rZ     s*    
  

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 )NTFrK  r  rw  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>  s     z1_max_pool.<locals>.symbolic_fn.<locals>.<genexpr>r  )kernel_shape_ipads_i	strides_iMaxPoolr  c                 S   s   g | ]}d qS r;  r  r  _r  r  r  r    s     z2_max_pool.<locals>.symbolic_fn.<locals>.<listcomp>c                 S   s   g | ]}d qS r;  r  rK  r  r  r  r    s     )r  rG  rI  c                 S   s   g | ]}d | qS )r  r  r4  r  r  r  r  !  s     r   r  )
setr   r  tuplerZ   zipr!  r  r
  r   )r$  r+  r8  r:  r9  rC  	ceil_moder>  r  rr  rL  Zflattened_indicesrR  r  ndimsrA  tuple_fnr  r  symbolic_fn  sB    
z_max_pool.<locals>.symbolic_fn)r   r  r  r   r  )r  rT  rS  rA  rU  r  rR  r  	_max_pool  s
    4rV  zaten::max_pool1d_with_indiceszaten::max_pool2d_with_indiceszaten::max_pool3d_with_indicesz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 )
NTrK  r  rw  r  )r+  r8  r:  r9  rP  count_include_padc                    s   |s|}t |||| }t|ts*t|}|rZ| j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  )rH  mode_svalue_fr   c                 s   s   | ]\}}|| V  qd S r  r  rD  r  r  r  rF  ~  s    z1_avg_pool.<locals>.symbolic_fn.<locals>.<genexpr>AveragePool)rG  rI  rH  )	r   Z_avgpool_helperr/  rN  ru  r!  rI  rZ   rO  )r$  r+  r8  r:  r9  rP  rW  Zdivisor_overrideZadjusted_paddingr>  outputr  rT  r  r  rU  _  sF         

z_avg_pool.<locals>.symbolic_fn)N)
r   r  r  r   r  r   Valuer   r  r   )r  rT  rU  r  r_  r  	_avg_poolH  s    	 *ra  zaten::adaptive_avg_pool1dZadaptive_avg_pool1dr]  zaten::adaptive_avg_pool2dZadaptive_avg_pool2dzaten::adaptive_avg_pool3dZadaptive_avg_pool3dzaten::adaptive_max_pool1dZadaptive_max_pool1drJ  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k
r4   t d| Y S X dgt kr\dkr\| d|S t |}z|dd   W n tk
r   d  Y nX  d k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r0| 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;  r]  ZGlobalAveragePoolr  c                 S   s   g | ]}|d kqS r  r  r4  r  r  r  r    s     z7_adaptive_pool.<locals>.symbolic_fn.<locals>.<listcomp>ZGlobalMaxPoolr5  c                    s   g | ]} | |  qS r  r  r4  r@   output_sizer  r  r    s     r   z-output size that are not factor of input sizec                    s    g | ]}t  | |  qS r  r=  r4  rb  r  r  r    s     rJ  r\  r;  F)rG  rI  )
r   
_parse_arg	Exceptionr  rI  r!  r  r?  r  r  )r$  r+  rc  Zoutput_size_valuer@  ro  kr^  r  r  rT  r^  rb  r  rU    sJ     


    
$z#_adaptive_pool.<locals>.symbolic_fn)r   r  r   r  )r  r^  rT  r  rU  r  rg  r  _adaptive_pool  s    A
1rh  r@   c                 C   sF   t |dd dg| d t|   }|ddd |ddd  }|S )zGenerate paddings in ONNX order based on pad in pytorch.
    Args:
        dim: the dimension of the tensor.
        pad: the paddings in pytorch.
            The order is dim_n_begin, dim_n_end, dim_n-1_begin, dim_n-1_end, ...
    Nr   r  r  )r0  rI  )r@   r   paddingsr  r  r  _prepare_onnx_paddings  s    &rl  c              
   C   sh   t | d}t |rdt |rdt |}zdd |D }W n& tk
rb   t dddd|  Y S X |S )Nr  c                 S   s   g | ]}t |d dqS )rw  r9  )r   r  )r  rK  r  r  r  r    s    z)_convert_padding_node.<locals>.<listcomp>rX  r  r:  z)The sizes of the padding must be constant)r   r  r=  r  ry  re  r?  )r+  r9  
input_listr  r  r  _convert_padding_node  s     

    
rn  zaten::constant_pad_ndc              
   C   sl   d}zt |dd}W n& tk
r<   t dddd| Y S X t|}tt ||}t| d||||ddS )	NrY  rL  rQ  rX  r  r:  z*The value for the padding must be constant)rH  rZ  r[  r  )r   r  re  r?  rn  rl  r  r   )r$  r+  r9  rQ  r  rk  r  r  r  r1   *  s,        
      zaten::_pad_circularc              
   C   sB  t |}t|d dkstt|d }|}t|D ]}|d| d   }|d| d   }g }	|dkrtj| |d| g|d  gdgd}
|	|
 |dk s|dk rtj| |d| gtd| gdtd|   gd}|	| n
|	| |dkr$tj| |d| gdg|gd}|	| | jd|	dd| i}q4|S )	Nr  r   r;  r  r  r-  r.  )r-  )	rn  rI  ru  r  r   r
  r  r   r!  )r$  r+  r   r9  r  curidxZpad_lZpad_rr{  leftZmiddlerightr  r  r  _pad_circular>  sL       
 


    
rs  zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C   s0   d}t |}tt||}t| d|||ddS )NreflectrX  r:  rH  rZ  r  rn  rl  r   r  r   r$  r+  r9  r  rk  r  r  r  r   h  s         zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C   s0   d}t |}tt||}t| d|||ddS )NZedgerX  r:  ru  rv  rw  r  r  r  r   u  s         z	aten::padc                 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 )NrR  Z	replicatert  rY  ZcircularzUnrecognized padding mode )r   rd  r   r   r1   rs  r   rV  )r$  r+  r   r  rQ  r  r  r  r     s    zaten::upsample_nearest1dZupsample_nearest1dZnearestzaten::upsample_nearest2dZupsample_nearest2dr  zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dzaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3d)r  r@   interpolate_modec                    s    fdd}|S )Nc                    sb   t | |\}}t  t |}|r8t d|S |d krPt | || }| jd||dS )Nzalign_corners == TrueUpsamplerZ  )r   Z_get_interpolate_attributesZ_interpolate_warningrA  r  Z_interpolate_size_to_scalesr!  )r$  r+  rc  r  scalesalign_cornersr@   ry  r  r  r  rU    s"      

   z!_interpolate.<locals>.symbolic_fnr  )r  r@   ry  rU  r  r~  r  _interpolate  s    ,r  zaten::__interpolatec           	      C   s*   t | |||||\}}| jd|||dS )Nrz  r{  )r   Z _interpolate_get_scales_and_moder!  )	r$  r+  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 valuesrk  r   rF  r   rV  r!  r*  r  r  r  r&     s    
c                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc                    s,   t  d  } | || |d|| |dS )N_cast_F)r  )r$  r+  r8  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  returnc                    s   t   fdd}|S )Nc                    s   |  d | ||S )Nrk  r)  r$  r+  r8  r  r  r  wrap_with_not  s    z4wrap_logical_op_with_negation.<locals>.wrap_with_notr  )r  r  r  r  r  r    s    zaten::__not_c                 C   s"   t |std|| d|S r  r  rv  r  r  r  __not_  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 )	NrN  Trh  rO  r  rQ  rR  rl  )r/  r^  r   DeviceObjTyper!  rP  r   boolr  r  kindOfrR  )r$  r5  r8  Z	self_nodeZ
other_noder  r  r  rI     s"      $zaten::nec                 C   s   t | ||S r  )rI   rG  r  r  r  r   +  s    zaten::gtc                 C   s   t | ||S r  _gt_implr  r  r  r  r]   3  s    c                 C   sj   |   d k	r\t|r\|   d k	r\t|r\| jd|tjjd}| jd|tjjd}| d||S )NrX  rY  ZGreaterr^  r_  r   rF  r!  r[  r\  INT32r  r  r  r  r  :  s    r  zaten::ltc                 C   s   t | ||S r  _lt_implr  r  r  r  r   G  s    c                 C   sj   |   d k	r\t|r\|   d k	r\t|r\| jd|tjjd}| jd|tjjd}| d||S )NrX  rY  Lessr  r  r  r  r  r  N  s    r  zaten::gec                 C   s   t | ||S r  r  r  r  r  r  rX   [  s    zaten::lec                 C   s   t | ||S r  r  r  r  r  r  rp   c  s    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 valuesrE  r  r  r  r  r  __and_k  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 valuesOrr  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 valuesrj  r  r  r  r  r  __xor_  s    

r  zaten::logical_andBoolc                 C   s   |  d||S )NrE  r)  r  r  r  r  r     s    zaten::logical_orc                 C   s   |  d||S )Nr  r)  r  r  r  r  r     s    zaten::logical_xorc                 C   s   |  d||S )Nrj  r)  r  r  r  r  r     s    zaten::__rshift_c                 C   s   |   |   kr<| jd|tj|    d}| jdtjdtj	dd}t
|st| jd|tjjd}| d||}| jd|tj|    d}| d||}|S )	NrX  rY  rN  r  rh  rO  PowrW  r^  r_  r!  r   rb  rc  rd  rP  r   float32r   r`  r[  r\  ra  )r$  r5  r8  twotwo_powrshiftr  r  r  	__rshift_  s&    

r  zaten::__lshift_c                 C   s   |   |   kr<| jd|tj|    d}| jdtjdtj	dd}t
|st| jd|tjjd}| d||}| jd|tj|    d}| d||}|S )	NrX  rY  rN  r  rh  rO  r  r<  r  )r$  r5  r8  r  r  lshiftr  r  r  	__lshift_  s&    

r  zaten::wherec              	   C   s`   t |s| jd|tjjd}|d krPt| |}t | || jdt	dd|S | d|||S )NrX  rY  rN  r;  rO  Where)
r   rF  r!  r[  r\  ZBOOLr   Z_unbind_helperrP  r   )r$  	conditionr5  r8  r  r  r  r  r    s    

   zaten::log_softmaxc           	      C   s   t |}|d k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 )Nr@   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   rw  ri  rX  rY  )r   r  r  r0  r  r!  r  r  r  r   rb  rd  )	r$  r+  r@   ri  r1  r2  r  Z	return_opr3  r  r  r  r{     s2    
  zaten::_log_softmaxc                 C   s4   |r(|   dkr(| jd|tjjd}t| ||S )NHalfrX  rY  )r^  r_  r!  r[  r\  ra  r{   )r$  r+  r@   Zhalf_to_floatr  r  r  _log_softmax	  s    r  zaten::_convolutionc                 C   s"  t |}z|dd  }W n tk
r2   d }Y nX |d ksNtdd |D rZtd|||g}t |st |dkr|| |dd  ||| ||	d}tdd |D r|st	t
|t
|kst	||d	< | j|rd
ndf||}t |st |dkr| d||S |S d S )Nr  c                 S   s   g | ]}|d kqS r  r  r4  r  r  r  r  E	  s     z _convolution.<locals>.<listcomp>zDUnsupported: ONNX export of convolution for kernel of unknown shape.r;  )rG  rI  rH  Zdilations_iZgroup_ic                 s   s   | ]}|d kV  qdS r   Nr  )r  or  r  r  rF  ]	  s     z_convolution.<locals>.<genexpr>Zoutput_padding_iZConvTransposeZConvr9  )r   r  re  r?  r   rV  r  r  r  ru  rI  r!  )r$  r+  r  biasr:  r9  rC  
transposedoutput_paddinggroupsZ	benchmarkZdeterministiccudnn_enabledZ
allow_tf32Zweight_sizeZkernel_shaper  r  r%  r  r  r  _convolution(	  sB    




r  zaten::convolutionc
           
      C   s"   t | |||||||||	d d d d S r  r  )
r$  r+  r  r  r:  r9  rC  r  r  r  r  r  r  r:   p	  s     zaten::conv1dc                 C   s"   t | ||||||dd|d d d d S NFr  r  r$  r+  r  r  r:  r9  rC  r  r  r  r  r7   	  s     zaten::conv2dc                 C   s"   t | ||||||dd|d d d d S r  r  r  r  r  r  r8   	  s     zaten::conv3dc                 C   s"   t | ||||||dd|d d d d S r  r  r  r  r  r  r9   	  s     zaten::conv_transpose1dc	           	      C   s"   t | ||||||d||d d d d S NTr  	r$  r+  r  r  r:  r9  r  r  rC  r  r  r  r4   	  s     zaten::conv_transpose2dc	           	      C   s"   t | ||||||d||d d d d S r  r  r  r  r  r  r5   	  s     zaten::conv_transpose3dc	           	      C   s"   t | ||||||d||d d d d S r  r  r  r  r  r  r6   
  s     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;  rx  )	epsilon_fZ
momentum_fr  zbatch_norm_dead_output-)r   check_training_moderP  Zis_autocast_enabledZargs_have_same_dtyper   r  r?  Z_batchnorm_helperr!  r"  r^  ZsetDebugNameZ	debugName)r$  r+  r  r  running_meanrunning_vartrainingmomentumepsr  re  resZnew_running_meanZnew_running_varZ
saved_meanZ	saved_varr  r  r  r$   9
  sV    	     
zaten::native_layer_norm)r$  r+  normalized_shaper  r  r  r  c                 C   s   dd t t|ddD }t| d}t| |}| jd||d}	t| ||	}
| jdt| |
||d}t| t| ||}| d|
|}|d kst	|st
| ||}|d kst	|st| ||}t| |}||	|fS )	Nc                 S   s   g | ]
}| qS r  r  r4  r  r  r  r  
  s     z%native_layer_norm.<locals>.<listcomp>r   r         @r  r  rW  )r  rI  r   Z_generate_wrapped_numberr!  r   r   r   r   r  r   r   )r$  r+  r  r  r  r  r  Ztwo_cstZeps_cstr  	numeratorZvariancedenominator
normalizedZrdenominatorr  r  r  r   s
  s    
zaten::layer_norm)r$  r+  r  r  r  r  cudnn_enabler  c           	   	   C   s<   t  r | jd||||||dS t| |||||\}}}|S )Nro   )Znormalized_shape_ieps_fZcudnn_enable_i)r   r  r  r   )	r$  r+  r  r  r  r  r  r  rL  r  r  r  ro   
  s    	zaten::instance_norm)r$  use_input_statsr  r  r  c
                 C   s>  t |d t |d}
|d ks*t |rt|
d kr>td|tjdg|
 tj	
|   d}| jd|d}|d kst |r|
d krtd|tjdg|
 tj	
|   d}| jd|d}|d kst |s|d kst |r
| jd	||||d
S t |}| }|d }|d k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 )Nri   r;  zCUnsupported: ONNX export of instance_norm for unknown channel size.rM  rh  rN  rO  r  InstanceNormalizationr  r   zJUnsupported: ONNX export of instance_norm training for unknown batch size.ZReshape)r   r  r  r  r   rV  rP  r   r   rb  rc  r^  r_  ri  r!  r  copyr   rm  r  r$   r  )r$  r+  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_reshapedre  r  r  r  ri   
  s    



    zaten::unfoldc                    s   t  rjd ||dS t }z|  }W n tk
rJ   d }Y nX |d k	rtd||}t||d |} fddt||D }	t|}
ttd|
	
   fdd|	D }jd|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$  r+  r  r  r  (  s       zunfold.<locals>.<listcomp>c              
      s(   g | ] }t jd |d gqS )r  r  )r   r}  r!  r~  )r  r$  r  r  r  r  1  s     r-  r.  ZUnfoldr5  )r-  )r   r  r  r  re  r  rO  rI  r0  r  r  r!  r  )r$  r+  r  r   stepr@  ZsizedimZlow_indicesZ
hi_indicesr   r  r   r  )r  r$  r+  r  r  r     s2    

  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 )NrM  r  zdoes not support scale in Eluinput_scalez#does not support input_scale in EluElur+  )r   r  r!  r@  )r$  r+  rC  r  r  r  r  r  rD   >  s        z
aten::seluc                 C   s   |  d|S )NZSelur)  r*  r  r  r  r   O  s    zaten::index_selectc                 C   s   t | |||S r  )r   _select_helper)r$  r5  r@   rh   r  r  r  rg   V  s    zaten::index_putc                 C   s   t |rt |}n|g}t  rD|g| ||g }| jd| S t |d}t|dkrp|rlt| ||S |S t ddd| d S )Nrf   r  r   r  r:  )rf   )	r   r  ry  r  r  rd  rI  r   r  )r$  r5  Zindices_list_valuevalues
accumulateZindices_listr  r  r  r  rf   `  s    
zaten::index_fillc           	      C   sr   t |d}t  r*| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t| ||||S )Nrw  re   Z
int_Scalar)r  r  )	r   rd  r  r  _index_fill_reshape_helperrA  r  rM   r   )	r$  r5  r@   rh   rQ  	dim_valueexpanded_index_shapeexpanded_indexZexpanded_valuer  r  r  re   t  s(    	   
zaten::index_copyc                 C   sL   t |d}t  r(| jd||||dS t | |||\}}t| ||||S )Nrw  rd   r  )r   rd  r  r  r  r   )r$  r5  r@   rh   sourcer  r  r  r  r  r  rd     s       zaten::bucketizec                 C   s   t jj}|rt jj}| jd| d|| d|dd}t|}|d k	sLttt	d|d }t
| t| |||d }	|rt| ||	}
nt| ||	}
| jd|
|d}tj| |dgddS )	Nr-  r(  r   r	  r;  rX  rY  r  )r[  r\  r]  r  r!  r   r  ru  r0  r  rM   r}  rX   r]   r0  )r$  r5  Z
boundariesZ	out_int32rr  Zout_type	new_shapeZtensor_rankZunsqueeze_axesZexpanded_boundariescondZcond_outr  r  r  r)     s$    "

zaten::type_asc                 C   sr   t |}t |}||kr(|d k	r(|S |d k	rL| jd|tj| dS t  rb| d||S t	
d|d S )NrX  rY  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!  r   rb  rc  rd  r  r  r   rV  )r$  r5  r8  r  Zother_dtyper  r  r  r     s     

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  rN  rO  )r   r  r  r0  r   r   r   r!  rP  r   rA   )	r$  x1x2r@   r  r=   Zx1_l2Zx2_l2Zdiv_tensr  r  r  r<     s4     
   
   
    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 )NrN  rO  r;  rh  r  rw  r  )r   r=  r!  rP  r   rA   rs  r   r0  r   r   rd  )r$  Zinput1Zinput2pr  r  Zinv_pZ	summationr  r  r  r     s    


zaten::clonec                 C   s   |S r  r  )r$  r+  Zunused_memory_formatr  r  r  r0      s    z	aten::absc                 C   s   |  d|S )NAbsr)  rv  r  r  r  r     s    z	aten::logc                 C   s   |  d|S )NLogr)  rv  r  r  r  r|     s    zaten::log1pc              	   C   s    t | t| ttd||S )Nr;  )r|   r   r   r  rP  r   rv  r  r  r  r~     s    zaten::log10c              	   C   s*   d}|  dt| || j dt|gdS )NgUk@rW  rN  rO  r!  r|   rP  r   )r$  r5  Z_ln10r  r  r  r}     s    z	aten::powc                 C   sr   |    }}t|s:d}| jd|tj| d}t|s`| jd|tj| d}| d||}|S )Nr  rX  rY  r  )	r^  r_  r   r`  r!  r   rb  rc  rd  )r$  r5  exponentZf_dtyper  r   r  r  r  r      s     
  
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CliprL     min_fmax_fr  )r   r  r-   r.   _is_constantr   rd  )r$  r5  r   r   r  r  r  r/   3  s    



	zaten::clamp_minc                 C   sb   t |r$t| d|t |dddS |  }| jd|tj	|
 d}t| d||ddS d S )	Nr  rL  r  )r  r  rX  rY  Maxr#  r   r  r   rd  r^  r_  r!  r   rb  rc  rd  )r$  r5  r   ri  r  r  r  r.   J  s    
   
   zaten::clamp_maxc                 C   sb   t |r$t| d|t |dddS |  }| jd|tj	|
 d}t| d||ddS d S )	Nr  rL  r  )r  r  rX  rY  Minr#  r  )r$  r5  r   ri  r  r  r  r-   Z  s    
   
   z	aten::maxc                 C   s   |d kr |d kr | j d|ddS |d kr:t| d||ddS t|dd}t|dd	}| j d||g|d
}| j d|||d}||fS d S )Nr.  r   r  r  r  r#  rw  r@   r  r  ArgMaxr.  r  r!  r   r   r  )r$  r5  dim_or_yr  r@   r   r  r  r  r  r   j  s    zaten::maximumc                 C   s   t | ||dS N)r  )r   r  r  r  r  r     s    z	aten::minc                 C   s   |d kr |d kr | j d|ddS |d k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#  rw  r@   r  r  ArgMinr  r  )r$  r5  r  r  r@   r   r  r  r  r  r     s    zaten::minimumc                 C   s   t | ||dS r  )r   r  r  r  r  r     s    z
aten::amaxc                 C   s   | j d|||dS )Nr.  r  r)  r$  r5  r@   r  r  r  r  r     s    z
aten::aminc                 C   s   | j d|||dS )Nr  r  r)  r  r  r  r  r     s    zaten::aminmaxc                 C   sJ   d|i}t |s*t |dd}|g|d< | jd|f|| jd|f|fS )Nr  rw  r@   r  r  r.  )r   r  r  r!  )r$  r5  r@   r  Zreduce_kwargsr  r  r  r     s    

 z	aten::expc                 C   s   |  d|S )Nr/  r)  rv  r  r  r  rK     s    zaten::dropout_zaten::dropoutc                 C   s.   t |d |s|S | jd||dd\}}|S )NrC   ZDropoutr  )Zratio_fr  )r   r  r!  )r$  r+  r  trainrQ  rL  r  r  r  rC     s
    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 )NrK  r  r  c                    s   |rt  d|S |S )Nztraining mode)r   r  )r$  r+  r  r  r  r  r  feature_dropout  s    z-_unsupported_dropout.<locals>.feature_dropoutr   r  r   r  )r  r  r  r  r  _unsupported_dropout  s    r   z
aten::normc                 C   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)r@   r  )r  r   rV  )r$  r5  r  r@   r  rL  r  r  r  r     s    

 zaten::conv_tbcc              	   C   s~   t  r| jd||||dS | jd|dddgd}| jd|dddgd}t| |||dg|gdgd}| jd|dddgdS d S )Nr3   )Zpad_ir  r;  r  r   r  )r   r  r  r!  r7   )r$  r+  r  r  r   convr  r  r  r3      s    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$  r+  sortedreturn_inverser  r  r  r    s    r  zaten::_unique2c                 C   s2   t  r| jd||||ddS t ddd| d S )N_unique2rB  )r  r  Zreturn_counts_ir  r  r:  )r   r  r  r  )r$  r+  r  r  Zreturn_countsr  r  r  r  "  s    	r  c                 C   s   |j d|| dS )z&Template for creating a cast function.rX  rY  r)  )rZ  r$  r+  Znon_blockingr  r  r  _cast_func_template3  s    r  )ByteCharShortIntr  r  r  DoubleZComplexFloatZComplexDoubler  ZBFloat16r  r  zaten::emptyc                 C   s   t | |||||S r  )r
  )r$  r@  ri  layoutdevice
pin_memorymemory_formatr  r  r  rH   b  s    zaten::empty_likec                 C   s   t | |||||S r  )r	  )r$  r+  ri  r  r  r  r  r  r  r  rG   q  s    zaten::new_emptyc                 C   s<   t |}|d kr*|d k	r*|}tj|}t| |||||S r  )r   r  r   rb  rc  rH   r$  r5  r@  ri  r  r  r  r  r  r  r  r     s
    
zaten::scalar_tensorc                 G   s<   t |dd}|d krtjj}| jd|t| d}|S )Nrw  ri  rX  rY  r   r  r   rb  ra  r!  rd  )r$  Zscalarri  optionsr  r  r  r     s
    zaten::tensorc           	      C   s"  t |dd}t |r|d krBt |d   }tj|}t	 }t |D ]L}| j
dtdgd}t | ||}| j
d|t| d}|| qR| j
d|d
diS |d kr|  }tj|}t |rt |st |r| j
d|ddd}| j
d|t| dS )Nrw  ri  r   rN  r;  rO  rX  rY  r-  r.  ZConcatFromSequence)r.  Z
new_axis_i)r-  )r   r  r  ry  r^  r_  r   rb  rc  r0  r!  rP  r  r3  rd  r  Z_is_listr>  Z_is_scalar_list)	r$  datari  r  requires_gradscalar_namerm  r   Zshape_referencer  r  r  r     s,    
zaten::as_tensorc                 C   s   t | |||S r  )r   )r$  r  ri  r  r  r  r  r      s    zaten::zerosc                 C   sz   |d k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   rN  rO  ConstantOfShaperh  r   rb  ra  r   r  r/  r0  rI  r!  rP  r   r   rm  ri  r$  r@  ri  r  r  r  rf  sizes_r  r  r  r
    s    

zaten::zeros_likec           	      C   sH   |  d|}|d krtjj}n
t|}| j d|tjdg| ddS )Nr(  r  r   rh  rO  r!  r   rb  ra  rP  r   ri  	r$  r+  ri  r  r  r  r  r1  rf  r  r  r  r	    s    

zaten::new_zerosc                 C   s8   t |}|d kr&|d k	r&tj|}t| |||||S r  )r   r  r   rb  rc  r
  r  r  r  r  r     s    
z
aten::onesc                 C   sz   |d k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   rN  rO  r  r;  rh  r  r  r  r  r  r     s    

zaten::ones_likec           	      C   sH   |  d|}|d krtjj}n
t|}| j d|tjdg| ddS )Nr(  r  r;  rh  rO  r  r  r  r  r  r     s    

zaten::new_onesc                 C   s<   t |}|d kr*|d k	r*|}tj|}t| |||||S r  )r   r  r   rb  rc  r   r  r  r  r  r     s
    
z
aten::fullc              	   C   s   t |d}t |rX|d kr&tjjn|}t| ||||}t| ||| jdt	
ddS t |dd}|d k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   rN  r;  rO  rw  ri  r  r   r  )r   r  r=  r   rb  ra  r
  r   r!  rP  r   r  r/  r0  rI  r   rm  r  ri  )r$  r@  rQ  ri  r  r  r  const_valuetmprf  r  r  r  r  rV   %  s"    


zaten::full_likec              	   C   s   t |d}t |dd}|d k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 )NrL  rw  ri  rX  rY  rN  r;  rO  r(  r  rh  )r   r  r  r   rb  ra  r=  r	  r!  rd  r   rP  r   ri  )r$  r+  
fill_valueri  r  r  r  r  rf  r  r1  r  r  r  rU   ?  s    


zaten::new_fullc           	      C   s>   t |}|d kr*|d k	r*|}tj|}t| ||||||S r  )r   r  r   rb  rc  rV   )	r$  r5  r   r   ri  r  r  r  r  r  r  r  r   ^  s
    
	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 )
Nrx  r   r-  r	  ZEyeLiker%  r!  r  r  )rI  r   r}  r!  r
  r  )r$  r  r%  ri  r  r  r  r  r1  r   mr  r  r  rN   q  s"    aten::slicec                 G   s.  t |dkrp|\}}}}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 nR|r&dn
t|d}|r<t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n
t|d}tj| ||g|g|gd
S tddt | dS )Nr  rw  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  rB  r#  r  r  )rI  r   rd  r   rV  r  r  r/  r^  r   ZNoneTyper   operator_export_typer[  ZOperatorExportTypesZONNXr}  r!  r  r
  r  )r$  r5  r  r@   startendr  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          
      zaten::hardtanhr$  r5  Zmin_valZmax_valc                 C   s   t | d|||ddS )Nr  r  r  r$  r'  r  r  r  rb     s         zaten::hardswishc                 C   s   t | |}| d||S r  )r`   r!  )r$  r5  Zhsr  r  r  ra     s    
zaten::hardsigmoidc                 C   s   | j d|ddS )NHardSigmoidgUUUUUU?r+  r)  rv  r  r  r  r`     s    zaten::tanhshrinkc                 C   s   |  d|t| |S )NrD  )r!  r   rv  r  r  r  r     s    zaten::hardshrinkc                 C   s   |   }|d krtjj}ntj|}| jdtj||	 dd}t
| t| ||t| |t| |}| d||| jdtjd|	 ddS NrN  rh  rO  r  r   )r^  r_  r   rb  ra  rc  r!  rP  r   ri  r   r]   r   r   )r$  r5  lambdri  rf  lambd_opr  r  r  r  r_     s$    
"zaten::softshrinkc           
      C   s   |   }|d krtjj}ntj|}| jdtj||	 dd}t
| ||}| d|t| ||| jdtjd|	 dd}t| |t| |}| d|t| ||| jdtjd|	 dd}	t| ||	S r)  )r^  r_  r   rb  ra  rc  r!  rP  r   ri  r]   r   r   r   r   )
r$  r5  r*  ri  rf  r+  Zgt_condZgt_outZlt_condZlt_outr  r  r  r   
  s:    

	
	zaten::aliasc                 C   s   |S r  r  rv  r  r  r  r   .  s    zaten::unsqueezec                 C   s~   |dk rlt |}|d k	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   4  s6    

  z
aten::sortc                 C   sp   |d k	rt dd| t |}z|| }W n tk
rD   d }Y nX |d kr\t dd|S | jd|||ddS )NZSortz'Out parameter is not supported for sortr5  TopKr  Zk_ir.  r  )r   r  r  re  r!  )r$  r5  r@   Z	decendingre  Z
self_sizesr  r  r  r  r   O  s      

zaten::numelc                 C   s   |  d|}| j d|ddS )Nr(  r  r   r  r)  r4  r  r  r  r   f  s    z
aten::topkc                 C   s<   |d k	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$  r5  rf  r@   largestr  re  r  r  r  r   m  s      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
r|d   }| jd|tj| dS | jd|t| dS nt|d	kr,t|d
 dd}| jd|t| dS t|dkrft|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 kS t | dkrt
| d dd}|d kS d	S )
Nr  r   prim::devicerx  r;  rw  ri  )r%     F)rI  r  r  r^  isSubtypeOfr   ListTypeofIntsr/  r  r   r  )r  ri  r  r  r  is_aten_to_device_only  s    z"to.<locals>.is_aten_to_device_onlyr  r   r  rQ  rX  rY  rx  r;  rw  ri  r%  r0  zUnknown aten::to signature)r   r  rI  r   r=  r  r  r  r/  rP  r  r1  rm   r  r^  r_  r!  r   rb  rc  rd  r  r  )r$  r5  r  r4  ri  Ztvalr  r  r  r   |  sD    

zaten::repeatc                 C   s0   t jj}t| ||}| d||}| d||S )Nr  ZTile)r   rb  r]  r   r!  )r$  r5  repeatsri  Zshape_r  r  r  r     s    zaten::repeat_interleavec              
   C   s  |}t |r4t | || jdtdgd}d}n
t |}t |}t |}t |}|d krpt	
d||d krt	
d||d krt	
d|| }	t|D ] \}
}|d k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 krt d
ddd|S |d || kst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|ddi}t| ||d }t j| || jdt|ddd}|| q| jd|d|iS )NrN  r  rO  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;  r-  r.  Z	allowzero)r-  )r-  )r   r  r3  r!  rP  r   rA  r  r  r   rV  r  r  
_is_tensorr  r?  rM   ru  r0  Z_repeat_interleave_split_helperr   r  )r$  r5  r5  r@   rc  r+  Zrepeats_dimZrepeats_sizesZinput_sizesZinput_sizes_temprp  r  ZrepsZfinal_splitsZr_splitsZi_splitsZr_splitZi_splitZr_concatr  r  r  r     s    
  



    

zaten::pixel_shufflec           	      C   s  t |}t|dkr$t dd|S tdd |dd  D rt j| t | |ddg| jd	t	d
d||d
d
gdd
d}| jd|d
dddddgd}t j| || jd	t	d
d
ddd
d
gdd
d}t j| || jd	t	d
d
d
d
ddgdd
d}t 
| |ddgS |d | | }t j| || jd	t	d||||d |d gdd
d}| jd|d
dddddg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 kV  qd S r  r  r4  r  r  r  rF  E  s     z pixel_shuffle.<locals>.<genexpr>r;  r  rB  rN  r   r  rO  r7  r  rx  r  r   r  rI  r  r?  r3  r}  r!  rP  r   r  )	r$  r5  Zupscale_factorr  
after_viewafter_transpose	reshape_h	reshape_woutput_channelr  r  r  r   <  s    
  	

zaten::pixel_unshufflec           
      C   s  t |}t|dkr$t dd|S tdd |dd  D rt 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|d	dddddgd}t j| || jdt	d	d
ddd	d	gdd	d}t 
| |ddgS |d | | }t j| || jdt	d
|d |d | ||d | |gdd	d}	| jd|	d	dddddgd}t j| || jdt	d
||d | |d | gdd	dS d S )Nr  r   r9  c                 s   s   | ]}|d kV  qd S r  r  r4  r  r  r  rF    s     z"pixel_unshuffle.<locals>.<genexpr>r;  rB  rN  r   r  rO  r7  r  rx  r  r  r:  )
r$  r5  Zdownscale_factorr  r=  r>  r<  Zfinal_reshaper?  r;  r  r  r  r     s|    
  



c           *         s  t d d d d d  dddd	d
ddddddg}ttdd |D |}|rXdnddkrt  d|	  krtdd|S t  d|	  kst fddtdt D |
rj	d|dddgd}|r|rtdd|S 
dr|dd    }d d }t|dd krFtdd|S |	 }|}g }dkshd krn|}ndkr|\}}g }|d krtn|}d krd!d"d#gndkrd"d$d%gtjd&d' tjfd(d)}tjfd*d+}tjfd,d-}tD ]R}|rndkrL||\}}}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}%|%||f|  dkrX|%||f|  |rbi nd0d1i}&dkr|	r||g}'n|g}'j	d;|%d|'d2|&\}}(nVd kr؈j	d<|%ddd3|&\}}(n*dkrj	d=|%d4d5|&\}}(})|	rJj	d|dddd4gd}tj|j	d6tddd7gd8dd9}nt|dg}||( dkr&||) q&|
rj	d|dddgd}dkr|(nj	d>|d:di}dksΈd kr||fS dkrdkr|)nj	d?|d:di}|||fS d S )@NzVExporting 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Affiner*  ZThresholdedReluZ
ScaledTanhr(  r  ZSoftsignr  c                 S   s   g | ]}|  qS r  )lower)r  Zact_funr  r  r  r    s     z _generic_rnn.<locals>.<listcomp>r  r  LSTMr;  zLSTMs with projectionsc                    s   g | ]} ||  qS r  r  r4  )all_weightsweights_per_layerr  r  r    s   r   r  r  zRNN/GRU/LSTMzdropout in training modeRNNzunknown hidden sizeGRU)r;  r  )r   r;  )r  rB  )rB  r  )r;  rB  c                    s*    fdd|D } j d|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>r-  r.  r   )r-  r)  )r$  rI  r%  Z	intervalsZslicesr  rH  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 )NrD  rE  rA  c                 3   s   | ]} |V  qd S r  r  r  rI  r$  hidden_sizereform_permutationrJ  r  r  rF  7  s    zB_generic_rnn.<locals>.transform_weights_no_bias.<locals>.<genexpr>c                 3   s   | ]}t  |d gV  qdS r  r|  r  rF  r&  r  r  rF  :  s    )rN  )layer_indexweights	weight_ih	weight_hhr$  rM  layer_weightsrN  rJ  variantr  r  transform_weights_no_bias1  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 )
NrD  rE  rA  c                 3   s   | ]} |V  qd S r  r  rK  rL  r  r  rF  D  s    z:_generic_rnn.<locals>.transform_weights.<locals>.<genexpr>r-  r   r	  c                 3   s   | ]}t  |d gV  qdS r  r|  rO  r&  r  r  rF  H  s   )r!  rN  )rP  rQ  rR  rS  Zbias_ihZbias_hhbias_concatrT  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  )rF  r%  r&  )r$  
num_layersr  r  retrieve_stateM  s        z$_generic_rnn.<locals>.retrieve_stater-  r	  Zdirection_sbidirectional)r  hidden_size_iZactivations_s)r  r]  Zlinear_before_reset_irB  )r  r]  rN  r  rO  r7  r.  )rD  )rE  )rA  )r-  )r-  )r  r  dictrO  rI  r   r  ru  r  r!  
startswithr@  r  r  r   r  r  r3  rP  r  r  )*r$  rV  r+  Zinitial_statesrB  
has_biasesrZ  rC   r  r\  batch_firstbatch_sizesZonnxActivationsZvariantToOnnxActivationMapZnonlinearityw_hhZunidirectionalZprev_outputh_outsZh0Zc0c_outsZsequence_lensrW  rY  r[  rw  rR  rS  rX  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  )	rB  r$  rM  rU  rZ  rN  rJ  rV  rC  r  _generic_rnn  s:     
  




	




 
 
  

"
"rg  c
                 C   s2   t |t | }
}t| d||
|||||||	S )NrA  r   ry  rg  )r$  r+  hidden_vweight_vr`  rZ  rC   r  r\  ra  hiddenr  r  r  r  
_lstm_full  s$    rl  c
                 C   s4   t |t | }
}t| d||
||||||	|dS )NrA  rb  rh  )r$  r+  rb  ri  rj  r`  rZ  rC   r  r\  rk  r  r  r  r  _lstm_packed  s$    rn  z
aten::lstmc                 G   s.   t |d rt| f| S t| f| S d S NrB  )r   r>  rn  rl  r$  r  r  r  r  r     s    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 r\  r|  rO  r&  r  r  r     s     zlstm_cell.<locals>.<listcomp>TFrA  r;  )rZ  rC   r  r\  ra  )r   r}  ry  r8  rg  r  )r$  r5  rk  Zw_ihrc  Zb_ihZb_hhr+  r  r`  rL  rd  re  r  r&  r  r     s4    
  z	aten::grurE  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 )
NrK  rw  rL  c
                    s&   t |}
t|  |||
||||||	S r  rh  )r$  r+  rk  rj  r`  rZ  rC   r  r\  ra  r  rq  r  r  	_rnn_full  s    
z"_one_hidden_rnn.<locals>._rnn_fullc
                    s(   t |}
t|  |||
|||||	|dS )Nrm  rh  )r$  r+  rb  rk  rj  r`  rZ  rC   r  r\  r  rq  r  r  _rnn_packed<  s    
z$_one_hidden_rnn.<locals>._rnn_packedc                    s.   t |d r| f| S  | f| S d S ro  )r   r>  rp  )rr  rs  r  r  r  X  s    z!_one_hidden_rnn.<locals>.symbolicr  )r  r  r  )rr  rs  r  r  _one_hidden_rnn  s    rt  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  rN  rO  r   r	  z_caffe2::Ranger  )r!  rP  r   r   r  r   )r$  liker@   Z
like_shapestopr  r  r  _dim_arangea  s       rw  zaten::detachc                 C   s   |S r  r  r*  r  r  r  r?   p  s    zaten::contiguousc                 C   s   |dkrt d||S )Nr  z-onnx memory_format support is not implemented)r   rV  )r$  r+  r  r  r  r  r2   w  s     zaten::_pack_padded_sequencec                 C   sj   |r| j d|dddgd}| tjj s<td|| 	 dkrXt
| |d}| j d	||dd
S )Nr  r;  r   r  r  z*'lengths' must be a Tensor for ONNX exportr  Fzprim::PackPaddedr  )r!  r^  r1  rP  r   Z
TensorTypegetr   rV  r_  Z	_cast_Int)r$  r+  lengthsra  r  r  r  _pack_padded_sequence  s     r{  zaten::_pad_packed_sequencec                 C   s8   | j d||dd\}}|r0| j d|dddgd}||fS )Nzprim::PadPackedr  rx  r  r;  r   r  r)  )r$  r  rb  ra  Zpadding_valuetotal_lengthrz  r  r  r  _pad_packed_sequence  s    r}  zaten::randnc                 G   s   t |dd}|d k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 )Nrw  ri  r  r  r   rh  rO  RandomNormalLikedtype_iZRandomNormalshape_ir  r   r  r   rb  ra  r  r=  r!  rP  r   rs  rd  r$  shapesri  r  rf  r1  Zshape_constr  r  r  r     s*    


z
aten::randc                 G   s   t |dd}|d k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 )Nrw  ri  r  r  r   rh  rO  RandomUniformLiker  ZRandomUniformr  r  r  r  r  r  r     s*    


zaten::randn_likec                 C   s>   t |dd}|d kr tjj}n
t|}| jd|| dS )Nrw  ri  r~  r  r  )r$  r5  ri  r  r  r  r  rf  r  r  r  r     s
    

zaten::rand_likec                 C   s8   t |dd}|d krtjj}| jd|t| dS )Nrw  ri  r  r  r  )r$  r5  ri  r  r  r  r  r  r  r  r     s      zaten::rreluc                 C   s@   |s || d }| j d||dS | j d|||d}|  d||S )Nr  r*  r+  r  )high_flow_fr  r)  )r$  r+  r@  upperr  r  Zsloper  r  r  r  r     s
    zaten::bernoullic                 C   s   |d k	rt dd| |d k	r6t |s6t dd| t |}|d krVt dd|S | jd|ddtj| d}| d	||}| jd
|tj| dS )NZ	Bernoulliz,out parameter is not supported for bernoulliz(generator is not supported for bernoulliinput dtype not accessibler  rM  r  )r  r  r  r  rX  rY  )	r   r  r  r  r!  r   rb  rc  rd  )r$  r+  r  re  ri  r  r^  r  r  r  r%     s@        
    zaten::log_sigmoidc                 C   s   |  d|}|  d|S )Nr  r  r)  )r$  r+  r  r  r  r  rz   0  s    z	aten::erfc                 C   s   |  d|S )NErfr)  r*  r  r  r  rJ   8  s    zaten::flattenc                 C   s   t |}|d k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 )Nr@   r  r   r;  Flattenr	  r  )r   r  r  r!  Z_flatten_helper)r$  r+  Z	start_dimZend_dimr@   r  r  r  rP   ?  s    
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   Y  s    zaten::nonzero_numpyc                 C   s   t | t| |d|dS )Nr;  )r  )r   r   )r$  r+  r  r  r  r  r   a  s    zaten::isnanc                 C   s   |  d|}|S )NZIsNaNr)  )r$  r+  r^  r  r  r  rl   h  s    z	aten::anyc              	   G   s   t |dkr|d }d\}}n$|\}}}t|dg}t|d}t| |d}tj| |||d}t| || jdtjdtj	dd	S )
Nr;  r   rH  rw  Fr  rN  rh  rO  )
rI  r   rd  r  r0  r]   r!  rP  r   long)r$  r  r+  r@   r  Z	input_sumr  r  r  _anyp  s    

   r  z	aten::allc              	   G   sP   |  d|d }t|dkr.|  dt| |S |  dt| ||d |d S d S )Nrk  r   r;  r  )r!  rI  r  )r$  r  r+  r  r  r  _all  s    r  zaten::narrowc                 C   s   t j| ||g|g|| gdS )Nr  r  )r$  r+  r@   r%  lengthr  r  r  r     s        zaten::argmaxr$  r+  r@   r  c                 C   s   t | |||dS )Nr  r   Z_argmin_argmax_helperr  r  r  r  r     s    	zaten::argminc                 C   s   t | |||dS )Nr  r  r  r  r  r  r     s    	zaten::scatterc                 C   s   |   }t|}t|r4| jd||||dS |   |krh| jd|tj|   	 d}| jd||t
| |||dS d S )NZScatterr	  rX  rY  )r^  r_  r   rA  r=  r!  r   rb  rc  rd  rL   )r$  r5  r@   rh   srcZsrc_typer  r  r  r     s    


zaten::scatter_addc           	      C   s   t |}|d kr t dd|S tj|}t j|dd}|r\| jdtj	||
 dd}nt| ||}t | ||||}t| ||S )Nr   r  F)Zallow_nonstaticrN  rh  rO  )r   r  r  r   rb  rc  r  r!  rP  r
  ri  r	  Z_scatter_helperr   )	r$  r5  r@   rh   r  r  rf  r@  Zto_addr  r  r  r     s    
  z
aten::log2c              	   C   s(   d}|  dt| || j dt|dS )Ng9B.?rW  rN  rO  r  )r$  r5  Z_ln2r  r  r  r     s    zaten::is_floating_pointc                 C   s6   t |r | jdtdgdS | jdtdgdS NrN  r;  rO  r   )r   r`  r!  rP  
BoolTensorrv  r  r  r  rj     s    
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!  rP  r  rI   rG  r  r  r  __is_  s
    

r  zaten::__isnot_c                 C   s   t | ||S r  )r  rG  r  r  r  __isnot_  s    r  zaten::one_hotc                 C   sP   | j dtddgd}|  dkr<| j d|tjjd}| j d|||d	d
S )NrN  r   r;  rO  >   r  r  r
  r	  rX  rY  OneHotr  r	  )r!  rP  r  r^  r_  r[  r\  r]  )r$  r5  Znum_classesr  r  r  r  r     s    zaten::gatherc           	   	   C   s   t |drt dd|S |  }| jdtddgd}t| || jdt|gd}| jd| jd	||||d
t	j
| d}| dt | ||d g|}t j| ||gddS )Nrw  rW   zsparse_grad == TruerN  r   r;  rO  rX  r  r	  rY  r<  r  )r   r  r  r^  r_  r!  rP  r  r   r   rb  rc  rd  r}  r0  )	r$  r5  r@   rh   Zsparse_gradri  r  depthr   r  r  r  rW     s    c              	   C   s:  |d k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 krdn|}| j d|
||d}|d k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  rN  rO  r	  r  rD  r<  rX  rY  rh  rW  )r!  r   rP  r   r[  r\  ra  rs  )r$  r+  r@   Z
correctionr  r  Zt_meanZnum_elementsZredudced_dimsZsub_vZsqr_subZkeepdim_meanr  rp  r   r  r  r  	_var_mean  s<    
  r  z	aten::stdc                 G   s    t | |f| \}}| d|S r  r  r!  r$  r+  r  r  rL  r  r  r  r   ;  s    z	aten::varc                 G   s   t | |f| \}}|S r  )r  r  r  r  r  r  B  s    zaten::var_meanc                 G   s4   t |dkr t| |d |d d S t| |f| S d S )Nr;  r   )rI  r  )r$  r+  r  r  r  r  r  I  s    zaten::std_meanc                 G   s$   t | |f| \}}| d||fS r  r  )r$  r+  r  r  r  r  r  r  r   W  s    zaten::logsumexpc                 C   s   | j d|||dS )NZReduceLogSumExpr  r)  r  r  r  r  r   ^  s    aten::arangec           
         s  t  r jd| S tjdd }tj fdd}t|dksNt|dkrt|dkr`d }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
 ||f|dd   dg|}	 jd|	t| dS t ddt| dS )Nr   c                 S   s   t | d} | S )Nrw  )r   r  rh  r  r  r  _get_arange_dtypek  s    z!arange.<locals>._get_arange_dtypec                    s.   t | r* jd d| tjj d} | S )NrX  r&  rY  )r   r`  r!  r   rb  r]  rd  )range_tensorr&  r  r  _float_step_convertp  s    


z#arange.<locals>._float_step_convertr  rx  r;  r   )r&  ri  rX  rY  r  r0  rB  )r%  r&  r  ri  rW  rD  r9  r<  r%  )r%  r&  ri  r  r  r  )r   )r   r  r  r   r  rI  Z_arange_cast_helperr}  r  r   r   r!  r   rb  rd  r  )
r$  r  r  r  ri  r&  r%  r  r  Zarange_tensorr  r&  r  r   e  s    
	                     zaten::linspacec           
      C   sT   t | |d }t| t| ||t| || jdtjdtjdd}	t| t	| ||	|S )NrN  r;  rh  rO  )
r   Z_arange_helperrA   r   r!  rP  r   rm  r   r   )
r$  r%  r&  Zstepsri  r  r  r  r  r  r  r  r  ry     s    
 z
aten::liftc                 C   s   |S r  r  rv  r  r  r  rs     s    zaten::masked_fillc                 C   s.   t | |d}t|}| d|t|||S )NFr  )Z
_cast_Boolr   rA  r!  r  )r$  r5  maskrQ  r  r  r  r     s    
aten::indexc                    s,  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 k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#|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$|dd	i}n,jd|
f fd"dt|D dd	i}t |S d S )%Nrh   r  )r  c                    s^   t | sZ|   dks$t | rZ jdk r:tdt	d t 
 t | dg} | S )Nr	  r  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^  r_  rF  r  r   rV  r  r  r  r   )rh   rv  r  r  try_mask_to_index  s    

z index.<locals>.try_mask_to_indexc                    s   g | ]} |qS r  r  )r  rp  )r  r  r  r    s     zindex.<locals>.<listcomp>r;  r   F)Zapply_reshapec                 S   s   g | ]\}}t |s|qS r  )r   r  )r  rw  rp  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  rN  rO  r   r	  )r!  rP  r  r  r@   )r$  shape_tensorr  r  r  )  s   r  c                    s   g | ]}| kr|qS r  r  r4  )adv_idx_indicesr  r  r  7  s      r  r  r	  r  r  r<  r9  rN  rO  c                    s   g | ]}| kr| qS r  r  r4  r  dim_tensor_listr  r  r  R  s     r-  r.  c                    s   g | ]} | qS r  r  r4  )r  r  r  r  d  s     c                    s   g | ]}| kr| qS r  r  r4  r  r  r  r  f  s   c                    s   g | ]}| kr| qS r  r  r4  r  r  r  r  q  s   )r-  )r-  )r   r  r  r  ry  r   r  rI  r  r  rg   r  r  r  r  r   r  r,  r  r!  r0  rP  r  r3  )r$  r5  rh   r  r  Zadv_idx_countZcum_adv_indexZ
multiplierrw  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$  r5  r  r  r  rh     s    
       

	

  

 	zaten::linalg_norm)r$  r5  ordr@   r  ri  c                 C   s   d }|d kr|t |r<t | |dg}| jdtdgd}t |}|d k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  rN  r  rO  r@   (Input rank must be known at export time.r;  rL  r   )r   r  r3  r!  rP  r  r  r  rd  rI  rw   ru   )r$  r5  r  r@   r  ri  	ord_valueself_dimr  r  r  rv   |  s,    

  

zaten::linalg_vector_normc                 C   s   |d k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  Fr.  r  r  r  r   rw   r  r:  zord=0 not supportedrN  rh  rO  r  rW  r;  )
r   r3  r7  infr!  r?  rP  r   r  r0  )r$  r5  r  r@   r  ri  resultZord_opr  r  r  rw     s@    
       	zaten::linalg_matrix_normc              	   C   s  t |d}|dkr"t| |||S |dkr8t dd|S t |d}|d krZt| |||S |dksj|dkrxt dd	|S t |}|d k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 )NrR  ZfroZnuczlinalg.matrix_normzord==nucrL  r  rj  zord==2r  r   r;  r  r  rN  rO  )r  r  )r   rd  rT   r  r  r7  r  r0  r!  r   rP  r  r   )r$  r5  r  r@   r  ri  r  r  r  r  r  r  r  r  ru     sZ    
   
  

zaten::linalg_crossr  c                 C   s   t | |||S r  )r=   )r$  r+  r8  r@   r  r  r  rt     s    zaten::frobenius_normc                 C   s,   |  d||}tj| |||d}|  d|S )Nr<  r  r  )r!  r   r0  )r$  r5  r@   r  ZsqrZsumsqrr  r  r  rT     s    zaten::multinomialc                 C   sZ   |d k	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[  r\  r]  )r$  r+  Znum_samplesreplacementr  Z	log_inputr  r  r  r     s&      
zaten::baddbmmc           
   	   C   sl   |   }t| ||}t| || jd|tj| d}t| || jd|tj| d}	t	| ||	S )NrX  rY  )
r^  r_  r   r   r!  r   rb  rc  rd  r   )
r$  r5  Zbatch1Zbatch2r  rC  ri  Z	batch_mulZmul_aZmul_br  r  r  r#   1  s"      zaten::meshgrid)r$  indexingc                    s0  |d krd}n|dkr(t d| ||dkrJ|d |d  |d< |d<  fddt|D } fd	d|D } jd|ddi}g }t|D ]h\}} jdtjdtjddgt	| }	|| |	|< t
 | jd|	ddi}
| d|
| q|dkr"|d |d  |d< |d<  jd| S )Nij>   r  xyzUnsupported indexing: r  r;  r   c                    s,   g | ]$}t  | jd tdgdqS )rN  r  rO  )r   r3  r!  rP  r  r~  r&  r  r  r  Q  s     zmeshgrid.<locals>.<listcomp>c                    s   g | ]}  d |qS )r(  r)  r~  r&  r  r  r  W  s     r-  r.  rN  rh  rO  r  prim::ListConstruct)r-  )r-  )r  )r   rV  r   ry  r!  r  rP  r   rm  rI  r2  r  )r$  rz  r  r{  Ztensors_shapeZ	out_shapere  rw  r   r  Z
t_reshapedr  r&  r  r   E  s2     

zaten::remainderc                 C   s(   t | ||}| d||}| d||S )Nr<  rD  )rT  r!  )r$  r+  r8  rA   Zquor  r  r  r   f  s    z
aten::gelu)r$  r5  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?rh  rM        ?r  g;f?r  rW  rN  r;  rO  )	r7  r   pirP  r   rt  r   r   r!  )r$  r5  r  ZkBetaZkKappar  kapparp  ZhalfZ	self_cubeinnerZ_sqrt2rJ   Zerf_plusoner  r  r  rY   n  s,    $"  
zaten::group_normc              
   C   s  t  r | jd||||||dS t |d}|d k	rD|| dksDtt |}|d k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 ks2|  rdt	jd	gtj|   d
}| jd|d}|d ks||  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  rN  rO  rM  rh  r  r  r  r(  )r   r  r  r  ru  r  r  r3  r!  rP  r  r   r   rb  rc  r^  r_  ri  r  
mustBeNoner0  r  r   r   r}  )r$  r+  Z
num_groupsr  r  r  r  r  Z
input_rankr1  r  r  r  Znorm_reshapedr   r  r  r  r  r  r  r\     s    


  
	

    

zaten::_weight_normc                 C   s   t |}|d k	rttt|}|d k	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;  rW  r<  _weight_normr  zDUnsupported: ONNX export of _weight_norm for tensor of unknown rank.)r   r  r0  r  remover   r!  r  r  r   rV  )r$  rj  Zweight_gr@   r  r  Znorm_vrA   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)  r4  r  r  r  r@     s    zaten::__getitem_c                 C   s    t | || jdtdgd|S r'  )r   r!  rP  r   )r$  r5  rw  r  r  r  
__getitem_  s    r  z
aten::itemc                 C   s   |S r  r  rv  r  r  r  rm   
  s    z
aten::takec              
   C   sD   t | || jdtjdgtjdd}t| |d|}t| ||}|S )NrN  r  rh  rO  r   )r   r3  r!  rP  r   rm  rg   r   )r$  r5  rh   Zself_flattenedre  r  r  r  r     s      c                 C   s&   t | ||}t| |}t| ||}|S r  )r   rK   r   )r$  r+  targetdiff_Zexp_r^  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 r'  )	r|   r   r   r	  r]   r!  rP  r   r  )	r$  r+  r  Zlog_r  Z
output_posZzeros_Zmask_r^  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   r0  r  )r$  r+  r  Z	reductionZ
log_targetr^  r  r  r  rn   .  s     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 krr|}q| d||}q|r| d|| dt|g}| d||S d S )Nr  rN  r  rh  rO  r   r;  r  r  r<  r9  )r   r  rI  r3  r!  rP  r   rm  r=  r  r  rO  r   r  r   )r$  r5  r@  stridesoffsetr  Zself_1dindrw  r   r:  Zr_sizeZtmp_indr  r  r  r   C  sT      


  
zaten::__derive_indexc              	   C   s   |  d||  d||S )Nr9  r<  r)  )r$  rh   r%  r  r  r  r  __derive_indexs  s    r  zaten::__range_lengthc                 C   s6   |  d||}|  dt| ||}| j d|tjjdS )NrD  r&  rX  rY  )r!  r   r[  r\  r]  )r$  lor  r  r   rA   r  r  r  __range_lengthy  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  rN  r;  rh  rO  )r   r  r   r  r  r!  rP  r   rm  r   r   r   )r$  r+  r  r  r  rC  r  r^  r  r  r  rx     s    

zaten::hann_window)r$  ri  c              	   C   s   |d k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krt| || jdt jdt jdd}t| ||}| jdt| t| ||	 d}|S )	Nr  rX  rY  rN  rh  rO  Fr;  )rP  rr  rj   rs  r   rb  Z
from_dtyper   r!  r[  r\  ra  r   r   r7  r  r   r  rA   r   r   rd  )r$  Zwindow_lengthZperiodicri  r  r  r  r  Zdtype_rf  Zn_arrayr^  r  r  r  r^     s4    

    zaten::mvc                 C   s   t | ||S r  r   )r$  r5  Zvecr  r  r  r     s    z	aten::dotc                 C   s   t | ||S r  r  rG  r  r  r  rB     s    zaten::movedimc           
      C   s   | d}| d}| | ks(t||k r8|S t|}|d k	sNt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    s      zmovedim.<locals>.<listcomp>c                 S   s   g | ]}|d kr|qS r  r  r  r  r  r  r    s      r  r  )r  r   ru  allr   r  r0  r  r  rO  tolistr!  )
r$  r5  r  Zdestinationr  r  Zsrc_dimsZdst_dimsr  dstr  r  r  r     s&    




z
aten::fillc                 C   s8   |   }|d krtjj}ntj|}t| |||S r  )r^  r_  r   rb  ra  rc  rU   )r$  r5  rQ  ri  r  r  r  rO     s
    
zaten::index_addc                    s  t d |r0tt|dkr0tdd|S t d  d krPtd|t	|}t	|}|d kst|d krtd|||kr|| }t
|D ]}	t| |t	|g}qt| }
t| }|
d k	r|d k	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;  rc   z
alpha != 1rw  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 r\  r  r4  r  r  r  r  3  s     zindex_add.<locals>.<listcomp>c                    s   g | ]}| krt jnd qS r;  )sysmaxsizer4  ri  r  r  r  4  s     r  r   )r  r  r   r@  rA  r  r  r   rV  r  r  r}  r  r0  r
  rL   r   )r$  r5  r@   rh   r8  rC  Zself_dim_rankZother_dim_rankdeltarw  Zother_dim_sizeZself_dim_sizeZnew_shape_axesZnew_shape_startsZnew_shape_endsr  r  ri  r  rc     sl    

  
      
z
aten::rollc                 C   s   t |t |kst|}tt |D ]~}g }tj| ||| g||  gtjgd}|| tj| ||| gdg||  gd}|| | jd|d|| i}q$|S )Nr  r   r-  r.  )r-  )	rI  ru  r  r   r
  r  r  r  r!  )r$  r5  Zshiftsr  r  rw  r  r1  r  r  r  r   F  s,       
 
    

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$  r+  r8  r@   Zroll_x_1Zroll_y_1Zroll_x_2Zroll_y_2r  r  r  r=   \  s    zaten::cdistr  #use_mm_for_euclid_dist_if_necessaryc                 C   sR   t |}|d k	stt | ||d g}t | ||d g}t| |||dddS )Nr;  r  gư>F)r  r  )r   r  ru  r}  r   )r$  r  r  r  Zcompute_moder  Zbroadcasted_x1Zbroadcasted_x2r  r  r  r+   p  s    
     z
aten::lerpc                 C   sx   |  d||}t| |  d|| j dtdd|  d||  d|||  d||  d||  d| j dtdd|S )	NrD  r  rN  r  rO  r9  r<  rM  )r!  r  rP  r   )r$  r5  r&  r  Zdiffr  r  r  rr     s    zaten::broadcast_tensorsc                    sP   t |}t |d |D ]}t |q fdd|D } jd| S )Nr   c                    s   g | ]}t  |qS r  )rL   r~  r$  Zt_with_final_shaper  r  r    s     z%broadcast_tensors.<locals>.<listcomp>r  )r  )r   ry  r	  r   r!  )r$  r5  Zall_tensorsr   Zt_listr  r  r  r(     s    
zaten::is_pinnedc                 C   s   d S r  r  )r$  r5  r  r  r  r  rk     s    prim::ConstantSplitc                 C   s^   t ||}|d kr"t dd|S |g||  }|| }|rF|| | jd|||t|dS )Nr  r  r  r  )r   r  r  r  r!  rI  )r$  r5  r   r@   r   r  r  r  r  r  r     s      
prim::ConstantChunkc                 C   s@   t ||}|d kr"t dd|S || d | }t| |||S )Nr  r  r;  )r   r  r  r   )r$  r5  r  r@   r  r   r  r  r  r     s      zprim::shapec                 C   s   |  d|S r'  r)  rv  r  r  r  r     s    z	prim::maxc                 C   s   t | d||ddS )Nr  r  r#  r$  rG  r  r  r  r     s    z	prim::minc                 C   sB   |s6t |r,t| || jdtdgd}t| |S t| ||S r'  )r   r  r   r!  rP  r   r   rG  r  r  r  r     s
    

z
prim::datac                 C   s   |S r  r  rv  r  r  r  r     s    zprim::layoutc                 C   s   d S r  r  rv  r  r  r  r     s    r  c                 O   s   d S r  r  r$  r  r  r  r  r  r     s    zprim::ListUnpack)r$  r  c                 O   s2   t |dkr.|d   dkr.t|d S d S )Nr;  r   r  )rI  r  r  r   ry  r  r  r  r  r     s     zprim::TupleConstructc                 O   s   d S r  r  r  r  r  r  r     s    zprim::Uninitializedc                 O   s   d S r  r  r  r  r  r  r     s    zprim::unchecked_castc                 C   s   |S r  r  rv  r  r  r  r     s    zprim::dtypec                 C   s6   t |}|d krd}tj|}| jdt|dS )Nr  rN  rO  )r   r  r   rb  rc  r!  rP  r   )r$  r5  r  rf  r  r  r  r     s
    
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.
    rw  r;  r  zdim_val > 1)r   r  r  )r$  r+  Zdim_valZelem_ty_valr@   r  r  r  r   (  s    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_noder^  r^  r/  r   r  r   r  r  )r$  r  r  output_typer  r  r  r   9  s    z
prim::Loopc                 O   s   | j }| j}| j}tj}tj}t| }tj	| df||
 t|d\}	}
}t||
D ]\}}t| D ]l\}}|dkr|t|k r|||   |dkrp|d t|k rpt| tjsp|||d    qptj||j||d q\tj||}tjrtj||| |S )NZLoopr  Zn_blocksr   r;  F)r  envparams_dictr   r$  r  rN  blocksr   add_op_with_blocksoutputsSizerI  rO  r  r  r"  r^  r/  r   r#  rP  _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  r$  opset_version
old_blocksnew_op_outputsnew_block_contextsnew_node	old_blocknew_block_contextrw  Zb_infixed_outputsr  r  r  r   G  sX         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}|| |krtd||  d|| |||  }|| q|S t| }tj| df|| t|d	\}}}t||D ] \}}tj||j||d
 qNtj||}tj rtj!||| |S d S )Nr   r  rQ  r;  TzThe sub block ATen output z is not in env.ZIfr  F)"r  r  r  r  r   r$  r  r  r  r   r  r  r/  r0  r  r  r  rP  r   r  r  r  rI  r   rV  r  rN  r   r  r  rO  r  r  r  )r$  r  r  r%  r  r  r  r$  r  Z	static_ifZ
input_flagr  Z	block_idxZ	current_bZif_output_listZcurrent_b_listZfinal_b_listrp  Zonnx_br  r  r  r  r  r  r  r  r  r  r   {  sz         r   c                 O   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d|d dtj d	| d S )
NrQ  r   rN  rO  rR  Zvalue_sz"Unsupported prim::Constant kind: 'z'. Please send a bug report at .)r  r  r/  r^  r^  r   r  r  r!  r   r  r1  r2  r3  ZofFloatsrP  r   r   rV  r	   ZPYTORCH_GITHUB_ISSUES_URL)r$  r  r  r  r  r  r  r     s,     
prim::type)r$  device_valuec                 O   sJ   |   dkr<t|   }|d k	r<| jdt|dS tdd|S )Nr/  rN  r  r  z,Device type cannot be statically determined.)	r  r  r   Zget_device_from_valuer+  r!  r  r   r  )r$  r  r  r  r  r  r  r  r     s    zonnx::Placeholderc                 O   s"   | j }| j}| j}tj|||S r  )r  r  r  rP  r   Z'_jit_onnx_convert_pattern_from_subblock)r$  r  r  r  r  r  r  r  r  r     s    zaten::resolve_conjzaten::resolve_negr*  c                 C   s   |S r  r  r*  r  r  r  r     s    	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    	
)N)N)N)rM  )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)NN)N)F)r  )NF)FN)N)r  )N)TNNNNF)N)N)r  r  )N)N(j  __doc__r  r7  r  r  typingr   r   r   r   r   r   rP  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  r  partialZonnx_symbolicZ_onnx_symbolicr  r  r  r  r  ZGraphContextr,  r2  r  r   r   r   r   r   r   rA   r  r   rJ  rU  rT  rQ   rS   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   rM   rL   rF   rE   r   r   r   r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   rR   r(  r   r`  rs  rq   r[   r   r   rZ   nnmodulesutilsZ_singleZ_pairZ_triplerV  r   r   r   ra  rh  r  rl  rn  r1   rs  r   r   r   r  r  r&   r  r  r  rI   r   r]   r  r   r  rX   rp   r  r  r  r   r   r   r  r  r  r{   r  r  r:   r7   r8   r9   r4   r5   r6   r$   r   ro   ri   r   rD   r   rg   rf   re   rd   r)   r   r<   r   r0   r   r|   r~   r}   r   r/   r.   r-   r   r   r   r   r   r   r   rK   rC   r   r   r3   r  r  r  rf  	func_namerb  rc  rd  r  rH   rG   r   r   r   r    r
  r	  r   r   r   r   rV   rU   r   rN   r   rb   ra   r`   r   r_   r   r   r   r   r   r   r   r   r   r   r   rg  rl  rn  r   r   rt  rw  r?   r2   r{  r}  r   r   r   r   r   r%   rz   rJ   rP   r   r   rl   r  r  r   r   r   r   r   r   rj   r  r  r   rW   r  r   r  r  r   r   r   ry   rs   r   rh   rv   rw   ru   rt   rT   r   r#   r   r   rY   r\   r  r@   r  rm   r   r  r  rn   r   r  r  rx   r^   r   rB   r   rO   rc   r   r=   r+   rr   r(   rk   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@     }	


"7

$&	




*!


>6

	

	>+ 
  	 
  	 
  	;



1  
	  
	  
	


7(		&

            C*"""&&&*7*c$


  #


	 

 

 
"

     
         	    
    	@
$



!K  hFC  g**  C      




		 "Q &
!
&;    &(O	

",	"     & 
E  
	"2"W 	