o
    ,i                     @  sL6  d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZ ddlZddlm  mZ ddlZddlZddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZm Z  dd	l!m"Z" g d
Z#ej$e j%ddZ&dDddZ'ej(dd Z)e&dej(dEddZ*e&dej(dEddZ+e&de,dej(dEddZ-e&de,dej(dEd d!Z.e&d"ej(dFdEd#d$Z/e&d%ej(dFdEd&d'Z0e&d(ej(dFdEd)d*Z1e&d+ej(dEd,d-Z2e&d.ej(dEd/d0Z3e&d1e4d2d2d2d3ej(dGdEd5d6Z5e4d2d2d7ej(dEd8d9Z6ej(dEd:d;Z7ej(dEd<d=Z8e&d>ej(dEd?d@Z9e&dAej(dEdBdCZ:e&dDej(dEdEdFZ;e&dGej(dEdHdIZ<e&dJe4d2dKej(dEdLdMZ=e&dNe4d2dKej(dEdOdPZ>e&dQej(dEdRdSZ?e&dTej(dEdUdVZ@e&dWej(dEdXdYZAe&dZej(dEd[d\ZBe&d]e4d2d2d2d^d^ej(dEd_d`ZCe&daej(dEdbdcZDe&ddej(dEdedfZEe&dgej(dEdhdiZFe&djej,ddkdldmej(dEdndoZGe&dpej(dEdqdrZHe&dsej(dEdtduZIe&dvej(dEdwdxZJe&dyej(dEdzd{ZKe&d|ej(dEd}d~ZLe&dej(dEddZMe&dej(dEddZNe&dej,ddddmej(dEddZOe&dej(dEddZPe,dej(dEddZQe&deRddgde&deRddgde&dejRddddgdej(dHdIddZSe&de4d2dKdej(dEddZTe&dej(dEddZUe&dej(dEddZVe&dej(dEdd^ZWe&de,dej(dEddZXe&de,dej(dEddZYe&de,dej(dEddZZe&de,ddej(dEddZ[e&de,de4d2d2dKdd2ej(dEddZ\e&de,de4d2d2d2dKdKdKd2dKdK	ej(dEddZ]e&dej,dddej(dFdEddZ^e&de,de4d2dKdKej(dEddĄZ_e&dŃe4d2dơej(dEddȄZ`e&dɃe,dej(dEdd˄Zae&d̃ej(dEdd΄Zbe&dσe4d2dKdKdKej(dFdEddфZce&d҃e4d2d2dKdKej(dFdEddԄZde&dՃej(	dFdEddׄZee&d؃e4d2ddKdKej(dFdEddڄZfe&dۃej(	dFdEdd݄Zge&dރe4d2dKdKej(dJdEddZhe&de,de4d2dKd2ej(dEddZie&dej(dEddZje&dej(dFdEddZke&dej(dEddZle&dej(dEddZme&dej(dEddZne&de,dej(dEddZoe&de,dej(dEddZpe&dej(dEddZqe&dej(dEddZre&dej(dEd dZse&de4d2d^d^ej(dEddZte&de,de4d2d3dej(	dKdLddZue&de4d2dKej(dEddZve&de4d2dKdej(dFdEddZwe&dej(dEddZxe&dej(dd Zye&dejRdejzj{j|j}ddde'dgde&dejRdejzj{j|j~ddde'dgde&d ejRd!ejzj{j|jd"dde'd!gdej(d#d$ Ze&d%ed&ejzj{j|j}dddZe&d'ed(ejzj{j|j~dddZe&d)ed*ejzj{j|jd"ddZe&d+eRd,ejzj{j|j}e'd,gde&d-eRd.ejzj{j|j~e'd.gde&d/eRd0ejzj{j|je'd0gdej(d1d2 Ze&d3eRd4d5ejzj{j|j}e'd4gde&d6eRd7d5ejzj{j|j~e'd7gde&d8eRd9d5ejzj{j|je'd9gde&d:eRd;d<ejzj{j|j}ee'd;gde&d=eRd>d<ejzj{j|j~ee'd>gde&d?eRd@d<ejzj{j|jee'd@gdej(dFdAdBZej(dMdEdFZej(dGdH Ze&dIej(dEdJdKZej(dNdMdNZe&dOe&dPe&dQej(dEdRdSZe&dTe&dUe&dVej(dEdWdXZe&dYej(dOd\dLZe&d]eRd^d"d_e'd^gde&d`eRdadbd_e'dagde&dceRddded_e'ddgde&dfeRdgd"dhe'dggde&dieRdjdbdhe'djgde&dkeRdldedhe'dlgdej(dPdndoZe&dpej(dEdqdrZe&dsej(dEdtduZe&dvej(dwdx Zej(dydz Zej(dQd~dZe&dej(dEddZe&de,ddej(dEddZe&de,ddeej(dEddZe&de,ddej(dEddZej(dEddZe&de,ddej(dEddZej(dEddZe&de,ddeej(dEddZe&de,ddeej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dedej(dEddZe&dedej(dEddZe&dedej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&de4d2d2d2dKej(dRdEddZe&de4d2dKdej(dFdEddZe&de4d2dKdKej(dEddZe&de4d2d2d2ddddKddKdKdKdKdKej(	dFdEddZe&de4d2d2d2dd7ddKej(dEddÄZe&dăe4d2d2d2ddddKddK	ej(dEdŐdƄZe&dǃe4d2d2d2dd2ddKej(dEdȐdɄZe&dʃe4d2d2d2dd2ddKej(dEdːd̄Ze&d̓e4d2d2d2dd2ddKej(dEdΐdτZe&dЃe4d2d2d2ddddKdơej(dEdѐd҄Ze&dӃe4d2d2d2ddddKdơej(dEdԐdՄZe&dփe4d2d2d2ddddKdơej(dEdאd؄Ze&dكe4d2d2d2d2d2dKd3d3dK	ej(dEdڐdۄZe&d܃e,dddde4d2dd2d2d3ej(dSddZe&de,dddde4d2dd2d2d3dej(dTddZe&de4d2d2d2d2d2dd3d3d	ej(dUddZe&de4d2dKdKdKej(dEddZe&de,de4d2d^d^d^ej(dEddZe&de,dej(dEddZe&de4d2dKd2ej(dEddZe&dej(dEddZe&dej(dEd dZe&dej(dEddZe&de4d2d2ddej(	dVdEddZe&dej(dEd	d
Ze&de4d2d2dKd3ej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&d ej(dEd!d"Ze&d#ej(dEd$d%Ze&d&e4d2d2ej(dEd'd(Ze&d)e4d2d2ej(dEd*d+Ze&d,ej(dWdEd-d.Ze&d/e,ddej(dEd0d1Ze&d2ej(dWdEd3d4Ze&d5e,ddej(dEd6d7Ze&d8e,de4d2ddKej(dEd9d:Ze&d;e,de4d2ddKej(dEd<d=Ze&d>e,de4d2d2dKej(dEd?d@Ze&dAej(dEdBdCZe&dDe&dEe4d2d3dKej(dEdFdGZe&dHeRdHgde&dIeRdIgde&dJeRdJgde&dKeRdKgde&dLeRdLgde&dMeRdMgdej(dDdNdOZe&dPe4d2d^ddKd2ej(dFdEdQdRZe&dSe4d2d2d2dKej(dEdTdUZe&dVe4d2dKdKej(dEdWdXZe&dYe4d2dKdKdKej(dEdZd[Ze&d\eאd]d^d_ej(dEd`daZe&dbeאd]d^d_ej(dEdcddZe&deeאd]d^d_ej(dEdfdgZe&dheאd]d^d_ej(dEdidjZe&dkeאd]d^d_ej(dEdldmZe&dneאd]d^d_ej(dEdodpZe&dqeאd]d^d_ej(dEdrdsZe&dteאd]d^d_ej(dEdudvZe&dweאd]d^d_ej(dEdxdyZe&dze4d2dKd2d2d2d2ej(		dXdEd{d|Ze&d}e4d2dKd2d2d2d2ej(					dYdEd~dZe&dej(	dKdEddZe&dej(dEddZe&dej(	dZdEddZe&dej(dWdEddZe&de4d2dKd2d2d2ej(dKdEddZe&de4d2dKd2d2d2d2ej(					dYdEddZe&dej(	dKdEddZe&dej(dEddZe&de4d2dKd2d2d2ej(dKdEddZe&de4d2dKd2d2d2d2ej(					dYdEddZe&dej(	dKdEddZe&dej(	dKdEddZe&dej(					dYdEddZe&dej(	dKdEddZe&dej(dEddZe&dej(dEddZe&de,de4d2d3d3ej(d[ddZe&de,de4d2ej(dEddZe&dej,ddddme4d2ej(dEddZe&de4d2ej(dEddZe&de4d2d3ej(dEddZe&de4d2d3ej(dEdÐdĄZe&dŃej(dEdƐdǄZe&dȃe4d2dKej(dEdɐdʄZe&d˃e4d2dKdKdej(dFdEd̐d̈́Ze&d΃ej(dEdϐdЄZe&dуe4d2dKdKdKdKdej(dFdEdҐdӄZe&dԃej(dEdՐdքZe&d׃ej(dEdؐdلZe&dڃej(dEdېd܄Z e&d݃ej(	dWdEdސd߄Ze&de4d2dKej(dEddZe&de4d2dKej(dEddZej(		dWdEddZe4d2d2d2dKdKd3dKdKdK	ej(dEddZe4d2d2d2d2dKdKd3dKdK	ej(dEddZe&dej(dEddZe&dej(dEddZe&deRde'dgde&deRde'dgde&deRde'dgdd\ddZ	e&de4d2dKej(dEdd Z
e&dej(dEddZe&de4d2dKej(dEddZe&de4d2d2dKej(dEdd	Ze&d
e4d2d2dKd^d2ej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dej(dEddZe&dej(				d]dEddZe&dej(				d]dEddZe&de4d2d3d3dKdej(dEd d!Ze&d"ej(dRdEd#d$Ze&d%e4d2ej(dEd&d'Ze&d(e4d2ej(dEd)d*Ze&d+e,ddde4d2dKdKej(dEd,d-Ze&d.e4d2ej(dEd/d0Ze&d1ej(dFdEd2d3Ze&d4e4d2ej(dEd5d6Ze&d7ej(dEd8d9Ze&d:ej(dEd;d<Ze&d=e4d2dKdKdKej(dEd>d?Ze&d@e4d2d2dej(d^dCdDZ e&dEe4d2d2dej(d^dFdGZ!e&dHe4d2dKd2d2ej(dEdIdJZ"e&dKe4d2dKd2d2ej(dEdLdMZ#e&dNej(dEdOdPZ$e&dQej(dEdRdSZ%e&dTej(dEdUdVZ&e&dWeej(dEdXdYZ'e&dZej(dEd[d\Z(e&d]e4d2dKd2d2ej(dKdEd^d_Z)e4d2ddKdKej(dEd`daZ*e&dbej(dEdcddZ+e&deej(dEdfdgZ,e&dhej(dEdidjZ-e&dkej(dEdldmZ.e&dne4d2ddKej(dEdodpZ/e&dqej(dEdrdsZ0e&dtej(dEdudvZ1e&dwej(dEdxdyZ2e&dzej(dEd{d|Z3e&d}ej(dEd~dZ4e&dej(dEddZ5e&de4d2d2ddd2ej(d_ddZ6e&de4d2d3ddd2ej(d`ddZ7e&de4d2d2ddd2ej(daddZ8e&de4d2d2dKej(dbdEddZ9e&de4d2ddej(dcdEddZ:e&de4d2dKdd2ej(	dXdEddZ;e&dej(dEddZ<e&de4d2d7ej(dFddddZ=e&dej(dEddZ>e&de4d2d7ej(dedfddZ?e&de,dddde4d2dKd2d2d3dKej(dEddZ@e&de4d2d2dKej(dEddZAe&dej(dEddCZBe&dej(dEddZCe&dej(dEddZDe&dej(dEddZEe&dej(dEddZFej(dEddZGej(dEddZHe&de4d2d2dKdej(dEddÄZIe&dăe4d2d2dKej(dEdŐdƄZJe&dǃe,de4d2d2ddKej(dFdEdȐdɄZKe&dʃej(dEdːd̄ZLe&d̓ej(dEdΐdτZMe&dЃej(dEdѐdhZNe&d҃e4d2ddKd2d2d2d2ej(						dgdhdԐdՄZOe&dփej(dEdאd؄ZPe&dكej(dEdڐdۄZQe&d܃e4d2d^d^ej(dEdݐdބZRe&d߃e4d2d2ej(dEddZSe&dej(dFdEddZTe&de4d2ddơej(dEddZUe&de4d2d2dKej(dFdEddZVe&dej(		didEddZWe&dej(dEddZXe&dej(dEddZYe&ddFdEddZZe&dej(dEddZ[e&dej(dEddZ\e&dej(dEd dZ]e&dej(dEddZ^e&dej(dFdEddZ_e&dej(dEd	d
Z`e&ddEddZae&dej(dEddZbe&dej(djddZce&dej(dEddZde&dej(dEddZee&dej(dEddZfe&dej(dEdd Zge&d!ej(dEd"d#Zhe&d$ej(dkd&d'Zie&d(ej(dld*d+Zje&d,ej(dld-d.Zke&d/ej(dEd0d1Zle&d2ej(dmd4d5Zme&d6ej(dEd7d8Zne&d9e&d:ej(dnd;d<Zoe&d=e&d>ej(dnd?d@Zpe&dAej(dodBdCZqdS (p  zhThis file exports ONNX ops for opset 9.

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

    If both inputs are floating, performs div as usual
    If only one input is a floating type, the other input is cast to its type
    If neither input is a floating type, both inputs are cast to the default scalar type
    rk  rl  rm  )r   ru  r'  r`  get_default_dtypero  rp  rv  floatdoubleDOUBLE)r+  r?  rD  ry  onnx_scalar_typer"  r"  r#  r    s   r  zaten::reciprocalc                 C  s*   t |s| jd|tjjd}| d|S )Nrl  rm  
Reciprocal)r   ru  r'  ro  rp  rv  r+  r?  r"  r"  r#  r     s   
r   z	aten::catic                   s   t |}g  |D ]}t |rt |dsq	 | q	t dks%J t fdd D s2J |    D ]	}| 	| q:t |}| j
dg|R d|iS )a{  Implement concatenation of pytorch tensors in ONNX along the specified `dim` dimension.

    Parameters:
        g (jit_utils.GraphContext): Graph context.
        tensor_list (List[torch.Tensor]): List of tensors to concatenate.
        dim (int): Dimension along which to concatenate the tensors.

    Returns:
        ONNX graph node representing the concatenated tensor.
    r   c                 3  sH    | ]}t  d  du pt |du pt |t  d  kV  qdS r   N)r   _get_tensor_rank.0r   nonempty_tensorsr"  r#  	<genexpr>$  s    
zcat.<locals>.<genexpr>r6  r7  )r   _unpack_list_is_constant_get_tensor_dim_sizer  rV  allnoderemoveAllInputsaddInputr'  )r+  tensor_listrE   tensorsr   r"  r  r#  r.   
  s"   

r.   zaten::stackc                   s2    fddt |D }jdg|R d iS )Nc                      g | ]
}t | gqS r"  r   _unsqueeze_helperr  rE   r+  r"  r#  
<listcomp>7      zstack.<locals>.<listcomp>r6  r7  )r   r  r'  )r+  r  rE   
unsqueezedr"  r  r#  r   3  s   r   z
aten::listc                 C     |S r  r"  r  r"  r"  r#  _list>     r  zaten::mmc                 C  s,   | j dtdgd}| j d|||dddS )Nr]  rH  r^  Gemm        r[  beta_falpha_fr'  r`  r   )r+  r?  rD  Cr"  r"  r#  r   D  s   r   z	aten::bmmc                 C     |  d||S NMatMulr1  rT  r"  r"  r#  r*   M     r*   zaten::matmulc                 C  r  r  r1  rT  r"  r"  r#  r   S  r  r   zaten::addmmr   c              	   C  sB  d }t |}t |}t |}	|d ur|}n|d ur|}n|	d ur%|	}t |}
t |}dd }|d ur||
dsA||dr| d||}|}t |}t |}|dkrm| jdtj|| dd}| d	||}|dkr| jdtjt || dd}| d	||}| d
||S | jd|||t |t |dS )Nc                 S  s   | d uo| |kS r  r"  )rY  ur"  r"  r#  is_not_none_nork  s   zaddmm.<locals>.is_not_none_nor   r  rH  r]  r{  r^  rI  rF  r  r  )r   _try_get_scalar_typer  r'  rM  r`  r   r|  )r+  r?  mat1mat2betarP  ry  self_scalar_typemat1_scalar_typemat2_scalar_type	mat1_rank	mat2_rankr  res1res2r"  r"  r#  r   Y  sX   






r   z	aten::negc                 C  r.  )NNegr1  r  r"  r"  r#  r     r5  r   z
aten::sqrtc                 C  sT   t j|t jjt jjt jjt jjt jjt jjhv r$| j	d|t
jjd}| 	d|S )Nrl  rm  Sqrt)r   rr  rs  rt  UINT8INT8INT16INTrq  r'  ro  rp  rv  r  r"  r"  r#  r     s   
r   zaten::rsqrtc                 C  s"   |  dttd|t| |S )Nrk  rH  )r'  r   _if_scalar_type_asr`  r   r   r  r"  r"  r#  r     s   r   z
aten::tanhg      ?   )scale
zero_pointc                 C  r.  )NTanhr1  r  r"  r"  r#  r        r   z	aten::sinc                 C  r.  )NSinr1  r  r"  r"  r#  r     r5  r   z	aten::cosc                 C  r.  )NCosr1  r  r"  r"  r#  r@     r5  r@   z	aten::tanc                 C  r.  )NTanr1  r  r"  r"  r#  r     r5  r   z
aten::asinc                 C  r.  )NAsinr1  r  r"  r"  r#  r"     r5  r"   z
aten::acosc                 C  r.  )NAcosr1  r  r"  r"  r#  r     r5  r   z
aten::atanc                 C  r.  )NAtanr1  r  r"  r"  r#  r#     r5  r#   zaten::atan2c              
   C  s   |  d||}|  d|}| j dtdd}| j dttjd}|  d||}|  d||  d|||  d	||}|  d
||}	|  d|	||}
|
S )Nrk  r  r]  r   r^  GreaterWhererF  rQ  Less)r'  r`  r   mathpi)r+  r?  rD  sloper#   
const_zeroconst_pi"condition_second_or_third_quadrantsecond_third_quadrantcondition_14_or_23_quadrantresultr"  r"  r#  r$     s   r$   zaten::sigmoidg      p?c                 C  r.  )a  Converts the corresponding PyTorch function into ONNX operators.

    It is not meant to be called directly by a user.

    Args:
        g (jit_utils.GraphContext): Graph context.
        self (Tensor): the input tensor.
    Returns:
        ONNX operator
    Sigmoidr1  r  r"  r"  r#  r     s   r   z
aten::signc                 C  r.  )NSignr1  r  r"  r"  r#  r     r5  r   c                 C  sR   t |t |ks
J t |dkr|d dkr|d tjkr|S | jd||||dS )NrH  r   Slice)axes_istarts_iends_i)rV  r
   	INT64_MAXr'  )r+  r3  axesstartsendsr"  r"  r#  _slice  s   &r  z	aten::sum	ReduceSumsum)decoratez
aten::mean
ReduceMeanmeanz
aten::prod
ReduceProdprodF)allow_multi_dim_supportonnx_opr  boolc                 C  r<  r  )r   _reduce_with_dtype_helper)r  r  r  r"  r"  r#  _reduce_with_dtype  s   r  zaten::cumsumnonec                 C  sJ   t  r|  dkrt dd|S | jd||dS t ddd| d S )Nr&  rC   r|  dim_ir  rG  )r   is_caffe2_aten_fallbackr  kind_unimplementedat_onnx_opset_unsupported)r+  r3  rE   r|  r"  r"  r#  rC   +  s
   rC   zaten::_sample_dirichletc                 C  8   t  rt |st dd|S | d|S t d|S )N_sample_dirichletz#We are not able to export generatorr   r  _is_noner  r  _onnx_unsupportedr+  r?  	generatorr"  r"  r#  r  7  s   
r  zaten::_standard_gammac                 C  r  )N_standard_gammaznot able to export generatorr  r  r"  r"  r#  r  C  s   
r  zaten::tc                 C  s6   t |}|d u s|dk r| d|S | jd|ddS )Nr  Identity	Transpose)rH  r   perm_i)r   r  r'  )r+  r?  rankr"  r"  r#  r   P  s   
zaten::numpy_Tc                 C  s8   t |}|d usJ tttd|}| jd||dS Nr   r
  r  )r   r  r9  reversedranger'  )r+  r3  ndimpermr"  r"  r#  r   \  s   
r   zaten::expandc              	   C  s   t |d}t |s| jdt|d}nt |r/t | t| |d| jdt	dgd}t
jj}t| ||}t| || jdt	dd}t| | d||||}| d||S )zXImplement the expand function for a pytorch tensor in ONNX according to specified `size`isr]  r^  r   r  Expandr   _maybe_get_constrJ  r'  r`  
LongTensor_is_packed_listr=  r   r   r   rr  rq  r   r   r  )r+  r?  r   implicitr|  r   neg_onesr"  r"  r#  rR   f  s   

 rR   zaten::broadcast_toc              	   C  s   t |d}t |s| jdt|d}nt |r/t | t| |d| jdt	dgd}t
jj}t| ||}t| || jdt	dd}t| | d||||}| d||S )Nr  r]  r^  r   r  r  r  r  )r+  r?  r   r|  r   r  r"  r"  r#  r,   |  s   

 r,   zaten::expand_asc                 C  s   t |d}t|tjrC|j}|tj}g }t|	 D ]%}t
|||||rB|| | jd|j|dd|d}q| d|}| d||S )Nr   r]  T)keepdimr^  r0  r  )r   r  r8  r`  Tensorr|  r   r  r  rE   equalr  r  rQ   r  r'  )r+  r?  rD  self_t	orig_typedimsdr:  r"  r"  r#  rQ     s   
rQ   zaten::embeddingbc                 C  s<   |rt jrtd||dkrt jrtd | d||S )NzUnsupported: ONNX export of embedding with scale_grad_by_freq=True for training mode. ONNX does not support scaling the gradients.r   zWarning: ONNX export of embedding with padding_idx >= 0 for training mode. ONNX does not support not updating the embedding vector at padding_idx during training.Gather)r   export_trainingr   ri  warningswarnr'  )r+  weightindicespadding_idxscale_grad_by_freqsparser"  r"  r#  rK     s   
rK   zaten::embedding_bagc
           
      C  sF   t |s
t dS t  r| jd|||d|||||	d
S t d|S )Nz%embedding_bag with per_sample_weightsrJ      )outputsscale_grad_by_freq_imode_isparse_iinclude_last_offset_ipadding_idx_i)r   r  r  r  r  )
r+  embedding_matrixr)  offsetsr+  moder,  per_sample_weightsinclude_last_offsetr*  r"  r"  r#  rJ     s$   
rJ   z
aten::size)quantize_outputc                 C  sh   |d u r
|  d|S t|ddk r-t|}|d ur-t|d| }| j dt|d}t| ||S )Nr0  r  r   r]  r^  )r'  r   r  r  r`  r   _size_helperr+  r?  rE   r  r"  r"  r#  r     s   
r   zaten::transposec                 C  s|   ||kr|S t |}|d ur*tt|}|| || ||< ||< | jd||dS t  r8| jd|d||dS td|)Nr
  r  r   int)overload_namedim0_idim1_izAUnsupported: ONNX export of transpose for tensor of unknown rank.)	r   r  r9  r  r'  r  r  r   ri  )r+  r?  dim0dim1r  r  r"  r"  r#  r     s   
r   zaten::permuter  c                 C  s*   |t tdt|kr|S | jd||dS r  )r9  r  rV  r'  )r+  r?  r!  r"  r"  r#  r     s   r   z
aten::viewc                 C  r  r  )r   )r+  r?  r   r"  r"  r#  r    r  r  zaten::view_asc                 C  rA  r/  rB  rC  r"  r"  r#  r    s   r  zaten::unsafe_chunkc           	      C  s   |d u rt dddd|S t ||}|d u rt dd|S || d | }|g||  }|| }|r8|| | jd||||dS )	Nr  r  rG  'Dynamic number of outputs not supportedunknown dimension sizerH  Splitsplit_ir7  r.  )r   rL  r  r  r  r'  )	r+  r?  chunksrE   _outputsr   
split_sizesplitsleftoverr"  r"  r#  r  $  s   

r  zaten::splitc           
      C  s   t ||st dddd|S t | d}| dkr%t| ||||S t |dd}t ||}|d u rH|d ur?|| }n	t dddd	|S |g||  }|| }	|	rZ|	|	 | j
d
||||dS )Nr   r  rG  rB  rc  r   r  rI  z$Unknown dimension size not supportedrD  rE  )r   _is_split_staticrL  	_node_getr  rE   r   
_get_constr  r  r'  )
r+  r?  split_size_or_sizesrE   rH  	split_valrI  r   rJ  rK  r"  r"  r#  r   9  s(   



r   zaten::unsafe_splitc                 C     t | ||||S r  )r   )r+  r?  rO  rE   rH  r"  r"  r#  r  U     r  zaten::split_with_sizesc                 C  s2   t ||st dddd|S | jd||||dS )Nr   r  rG  rB  rD  rE  )r   rL  rL  r'  r+  r?  split_sizesrE   rH  r"  r"  r#  r   ]  s
   
r   zaten::unsafe_split_with_sizesc                 C  rQ  r  )r   rS  r"  r"  r#  r  h  rR  r  zaten::unbindc                   s^   |d u rt dddd|S jd|dg|  |d}|dkr!|gn|} fdd	|D }|S )
Nr  r  rG  rB  rD  rH  rE  c                   r  r"  )r   _squeeze_helper)r  rx  r  r"  r#  r  {  s    zunbind.<locals>.<listcomp>)r   rL  r'  )r+  r?  rE   rH  r.  squeezed_outputsr"  r  r#  r  p  s   
r  zaten::selectc                 C  sp   t |}t |s/|dk r/|dkrtj}n|d }t j| ||g|g|gd}t | ||gS | jd|||dS )zImplement the select functionality for a pytorch tensor in ONNX.

    Selects elements from the input tensor along the specified `dim` dimension based on the `index` tensor.
    r   r  rH  r  r  r  r$  r7  )r   rN  rJ  r
   r  _slice_helperrU  r'  )r+  r?  rE   rm   	end_index
slice_noder"  r"  r#  r     s   
	r   zaten::squarec                 C  s   |  d||S NrI  r1  r  r"  r"  r#  r     r  r   zaten::squeezec                 C  sH  |d u r
|  d|S t|dd}|dk rCt|}|d ur<tdt| d d d t||  d	 d
  ||7 }ntdd|S t||}|d u rotdt| d d t| d d d d  tj	| ||gdS |dkrtdt| d d t| d d d d  |S tdt| d d  tj	| ||gdS )NSqueezer  rE   r   z'ONNX export squeeze with negative axis - might cause the onnx model to be incorrect. (Negative axis is not supported in ONNX. Axis is converted to & based on input shape at export time. CPassing an tensor of different rank in execution will be incorrect.r   %negative axis with unknown input rankz5This model contains a squeeze operation on dimension z on an input z7with unknown shape. Note that if the size of dimension z of the input zVis not 1, the ONNX model will return an error. Opset version 11 supports squeezing on zMnon-singleton dimensions, it is recommended to export this model using opset zversion 11 or higher.r  rH  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   rN  r  r&  r'  r  r  r  rU  )r+  r?  rE   squeeze_dimr  dim_sizer"  r"  r#  r     s   



r   zaten::preluc              	   C  s   t |}t |}t|}|d ur8|dkr%t | |ttd|d }n|dkr8|dgkr8t | |dg}d}|d urN|d urN||ksNJ d| d| | d||S )Nr  rH  r   z)rank(x) should be >= rank(slope) but got z < PRelu)	r   r  _get_tensor_sizesrV  r  r9  r  rU  r'  )r+  r?  r(  	self_rankweight_sizesweight_rankr"  r"  r#  r     s    


r   z
aten::siluc                 C  s   |  d||  d|S )NrI  r  r1  r2  r"  r"  r#  r     s   r   z
aten::mishc                 C  s   |  d||  d|  d|S )NrI  r  Softplusr1  r2  r"  r"  r#  r     s   r   z
aten::reluc                 C  s   t j| d|ddS )NRelu   opset_beforer   _op_with_optional_float_castr2  r"  r"  r#  r     s   r   zaten::relu6c                 C  s   t | |ddS )Nr      )r3   r2  r"  r"  r#  r     r@  r   z
aten::ceilc                 C  r.  )NCeilr1  r2  r"  r"  r#  r0     r5  r0   zaten::floorc                 C  r.  )Nrz  r1  r2  r"  r"  r#  rW     r5  rW   z	aten::lenc                 C  s.   t | || jdtdgd}t| |dgS Nr]  r   r^  )r   r'  r`  r  r   rU  )r+  r?  sz_0r"  r"  r#  _len  s   rw  zaten::thresholdc                 C  sD   t |dkrt dd|S t |dkrt dd|S | d|S )Nr   r   znon-zero thresholdznon-zero valuerm  )r   rM  r  r'  )r+  r?  r   rc  r"  r"  r#  r   &  s
   r   zaten::leaky_relur3  _C.Valuenegative_sloper  inplacec                 C  s   | j d||dS )N	LeakyRelur  r1  )r+  r3  ry  rz  r"  r"  r#  rv   2  s   rv   z	aten::gluc                 C  sP   t ||}|d ur|d dksJ | jd||dd\}}| d|| d|S )Nr  r   rD  )r7  r.  rI  r  )r   r  r'  )r+  r3  rE   rf  firstsecondr"  r"  r#  r`   @  s
   r`   zaten::softmaxc              
   C  s^  t |}|d urj|dk r|| }||d k}|r8tt|}|d || ||< |d< | jd||d}|d }| jd||d}|r^|  dkr^t |d	d
}| jd|t	|
 d}|rh| jd||d}|S | d|| jd||gdd}| d|}	t j| |	|gd}
| d|	|
}|r|  dkrt |d	d
}| jd|t	|
 d}|S )Nr   rH  r  r
  r  SoftmaxrX  r&  r  r|  rl  rm  rQ  	ReduceMaxr  
keepdims_iExprd  rk  )r   r  r9  r  r'  r  r  rN  r   rr  rw  _reducesum_helper)r+  r3  rE   r|  	input_dimis_transpose_requiredr  r   parsed_dtyperP   r  r"  r"  r#  r   L  s>   
r   zaten::softplusc                 C  s@   t |d}|dkr| d| d| d|||S | d|S )NrZ  rH  rk  rl  rI  )r   r  r'  )r+  r?  r  r   
beta_constr"  r"  r#  r     s    r   zaten::get_pool_ceil_paddingc                   s   t | }|d ur|t d  nd d u s!tdd D r(t dd| S fddtdtD   fddtdt D   fd	dtdtD fd
dtdtD S )Nc                 s      | ]}|d u V  qd S r  r"  r  r  r"  r"  r#  r        z(get_pool_ceil_padding.<locals>.<genexpr>r_   input size not accessiblec              	     sB   g | ]}t t | d |   |  t|  d qS r  rH  )r<  r  r0   r  r  )rE   kernel_sizepaddingstrider"  r#  r    s    0z)get_pool_ceil_padding.<locals>.<listcomp>r   c                   sD   g | ]} | d  |  | |  kr | d  n | qS rH  r"  r  )ceiled_output_dimrE   r  r  r"  r#  r    s    $c                   sP   g | ]$}| d krdn| | d|    | d  |  d    qS rH  r   r  r"  r  )r  rE   r  r  r  r"  r#  r    s    
c                   sd   g | ].}| d |    | kr*|  | d k r"t | nt  | d nt | qS r  r<  r  )r  r  padding_ceilr"  r#  r    s    

)r   rh  rV  anyr  r  )r3  r  r  r  sizesr"  )r  rE   r  r  r  r  r#  r_     s&   

r_   zaten::max_pool1d
max_pool1drH  )return_indiceszaten::max_pool2d
max_pool2dr  zaten::max_pool3d
max_pool3d   c              	     sD   t ddddddt ddddddtj fdd}|S )NTFrY  r  r  c                   s6  t |dhkrt d|S |s|}t|}|r2t||||}|tdd t||D  }n|d }|||d}r| jd|fddi|\}	}
| jd|dd	d
 tD dd
 tD d\}}tj| |dd
 tD t	dt	dd}t
| |
|}
|	|
fS | jd|fddi|}	|	S )NrH  dilationc                 s      | ]	\}}|| V  qd S r  r"  r  ar#  r"  r"  r#  r    s    z1_max_pool.<locals>.symbolic_fn.<locals>.<genexpr>r  )kernel_shape_ipads_i	strides_iMaxPoolr.  c                 S     g | ]}d qS r  r"  r  _r"  r"  r#  r        z2_max_pool.<locals>.symbolic_fn.<locals>.<listcomp>c                 S  r  r  r"  r  r"  r"  r#  r    r  )r.  r  r  c                 S  s   g | ]}d | qS )r  r"  r  r"  r"  r#  r        r   rW  )setr   r  tupler_   zipr'  r  rY  r9  r   )r+  r3  r  r  r  r  	ceil_moder  kwargsrr)  r  flattened_indicesre  r  ndimsr  tuple_fnr"  r#  symbolic_fn  sB   


z_max_pool.<locals>.symbolic_fnr   quantized_args
parse_argsr   beartype)r  r  r  r  r  r"  r  r#  	_max_pool  s
   4r  zaten::max_pool1d_with_indicesr   zaten::max_pool2d_with_indicesr   zaten::max_pool3d_with_indicesr   zaten::avg_pool1d
avg_pool1dzaten::avg_pool2d
avg_pool2dzaten::avg_pool3d
avg_pool3dc              
     s>   t dt dddddddtj	 dd fdd}|S )NTrY  r  r  r  r3  rx  r  Sequence[int]r  r  Union[int, Sequence[int]]r  r<  count_include_padc              	     s   |s|}t |||| }t|tsJ |}|r/t j| d|d| d dddd}dt| }|rGt||||}	|td	d
 t|	|D  }n|d }| jd||||d}
|
S )NPad)r   r   r  constantr  rG  r  mode_svalue_frp  r   c                 s  r  r  r"  r  r"  r"  r#  r  {  s    
z1_avg_pool.<locals>.symbolic_fn.<locals>.<genexpr>AveragePool)r  r  r  )	r   _avgpool_helperr8  r  rr  rV  r_   r  r'  )r+  r3  r  r  r  r  r  divisor_overrideadjusted_paddingr  outputr  r  r"  r#  r  U  s@   
	
z_avg_pool.<locals>.symbolic_fnr  )r3  rx  r  r  r  r  r  r  r  r<  r  r<  r  )r  r  r  r"  r  r#  	_avg_pool>  s   	1r  zaten::adaptive_avg_pool1dadaptive_avg_pool1dr  zaten::adaptive_avg_pool2dadaptive_avg_pool2dzaten::adaptive_avg_pool3dadaptive_avg_pool3dzaten::adaptive_max_pool1dadaptive_max_pool1dr  zaten::adaptive_max_pool2dadaptive_max_pool2dzaten::adaptive_max_pool3dadaptive_max_pool3dc                   s(   t ddtj fdd}|S )NTFc              	     s  }zt dW n ty   t d| Y S w dgt kr-dkr-| d|S t |}z|dd   W n tyE   d  Y nw  d u sStdd  D rkdgt krd| d	|d fS t d
|S  fddt	dt D }|dgt| krdgt kr| d	|d fS t d|S  fddt	dt D }dkr| |||dt  dt  dS | j|||d}|S )Nr  z4adaptive pooling, since output_size is not constant.rH  r  GlobalAveragePoolr  c                 s  r  r  r"  r  r"  r"  r#  r    r  z6_adaptive_pool.<locals>.symbolic_fn.<locals>.<genexpr>GlobalMaxPoolr  c                   s   g | ]
} | |  qS r"  r"  r  rE   output_sizer"  r#  r        z7_adaptive_pool.<locals>.symbolic_fn.<locals>.<listcomp>r   z-output size that are not factor of input sizec                   s    g | ]}t  | |  qS r"  r  r  r  r"  r#  r    s     r  r  r  F)r  r  )
r   
_parse_arg	Exceptionr  rV  r'  rh  r  r  r  )r+  r3  r  output_size_valuer  r  kr  fnr  r  typer  r#  r    sD   
$z#_adaptive_pool.<locals>.symbolic_fn)r   r  r   r  )r  r  r  r  r  r"  r  r#  _adaptive_pool  s   
A1r  rE   r<  c                 C  sF   t |dd dg| d t|   }|ddd |ddd  }|S )zGenerate paddings in ONNX order based on pad in pytorch.
    Args:
        dim: the dimension of the tensor.
        pad: the paddings in pytorch.
            The order is dim_n_begin, dim_n_end, dim_n-1_begin, dim_n-1_end, ...
    Nr   r  r  )r9  rV  )rE   r   paddingsr"  r"  r#  _prepare_onnx_paddings  s   &r  c              
   C  sh   t | d}t |r2t |r2t |}z
dd |D }W |S  ty1   t dddd|  Y S w |S )Nr  c                 S  s   g | ]	}t |d dqS )r  r  )r   rN  )r  rY  r"  r"  r#  r    s    z)_convert_padding_node.<locals>.<listcomp>r  r  rG  z)The sizes of the padding must be constant)r   r  rJ  r  r  r  rL  )r3  r  
input_listr"  r"  r#  _convert_padding_node  s   
	
r  zaten::constant_pad_ndc              
   C  sl   d}z	t |dd}W n ty   t dddd| Y S w t|}tt ||}t j| d||||ddS )	Nr  rZ  rc  r  r  rG  z*The value for the padding must be constantr  )r   rN  r  rL  r  r  r  rr  )r+  r3  r  rc  r6  r  r"  r"  r#  r5   '  s   
r5   r   c                 C  sH  t |}t|d dksJ t|d }|}t|D ]}|d| d   }|d| d   }g }	|dkrJtj| |d| g| gtjgd}
|	|
 |dk sR|dk rvt	d| }t	d|  }tj| |d| g|g|gd}|	| n|	| |dkrtj| |d| gdg|gd}|	| | j
dg|	R dd| i}q|S )Nr  r   rH  rW  r6  r7  )r  rV  r  r   rY  r
   r  r  builtinsr   r'  )r+  r3  r   r  r  curidxpad_rpad_lr  leftstartendmiddlerightr"  r"  r#  _pad_circular;  s@   


r  zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C  2   d}t |}tt||}tj| d|||ddS )Nreflectr  rG  r  r  rp  r  r  r   r  rr  r+  r3  r  r6  r  r"  r"  r#  r   e     r   zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C  r  )Nedger  rG  r  r  r  r"  r"  r#  r   r  r  r   z	aten::padr6  rc  c                 C  sp   t |d}|dkrt| ||S |dkrt| ||S |dkr%t| |||S |dkr/t| ||S td| |)Nre  	replicater  r  circularzUnrecognized padding mode )r   r  r   r   r5   r  r   ri  )r+  r3  r   r6  rc  r"  r"  r#  r     s   	zaten::upsample_nearest1dupsample_nearest1dnearestzaten::upsample_nearest2dupsample_nearest2dr-  zaten::upsample_nearest3dupsample_nearest3d   zaten::upsample_linear1dupsample_linear1dr}   zaten::upsample_bilinear2dupsample_bilinear2dzaten::upsample_trilinear3dupsample_trilinear3dinterpolate_modec                   s    fdd}|S )Nc                   sb   t | |\}}t  t |}|rt d|S |d u r(t | || }| jd||dS )Nzalign_corners == TrueUpsampler  )r   _get_interpolate_attributes_interpolate_warningrN  r  _interpolate_size_to_scalesr'  )r+  r3  r  rX  scalesalign_cornersrE   r  r  r"  r#  r    s   

z!_interpolate.<locals>.symbolic_fnr"  )r  rE   r  r  r"  r	  r#  _interpolate  s   ,r
  zaten::__interpolatec           	      C  s*   t | |||||\}}| jd|||dS )Nr  r  )r    _interpolate_get_scales_and_moder'  )	r+  r3  r   scale_factorr6  r  recompute_scale_factor	antialiasr  r"  r"  r#  __interpolate  s   r  zaten::bitwise_notc                 C  "   t |std|| d|S NzOONNX export does NOT support exporting bitwise Not for non-boolean input valuesr~  r   rS  r   ri  r'  r2  r"  r"  r#  r(        
r(   zaten::bitwise_orc                 C  s:   t |std|t |std|| d||S )NzVONNX export does NOT support exporting bitwise OR for non-boolean input values. self: zWONNX export does NOT support exporting bitwise OR for non-boolean input values. other: Orr  rT  r"  r"  r#  r)        

r)   c                   r  )Nc                   s   t   fdd}|S )Nc                   s,   t  d  } | || |d|| |dS )N_cast_F)r  )r+  r3  rD  to_cast_func)r  to_typer"  r#  wrap_with_cast  s   zGwrap_logical_op_with_cast_to.<locals>.decorator.<locals>.wrap_with_cast	functoolswraps)r  r  r  )r  r#  	decorator  s   z/wrap_logical_op_with_cast_to.<locals>.decoratorr"  )r  r  r"  r  r#  r    s   r  r   r   returnc                   s   t   fdd}|S )Nc                   s   |  d | ||S )Nr~  r1  r+  r3  rD  r  r"  r#  wrap_with_not  s   z4wrap_logical_op_with_negation.<locals>.wrap_with_notr  )r   r!  r"  r  r#  r    s   r  zaten::__not_c                 C  r  r  r  r  r"  r"  r#  __not_  r  r"  zaten::eqc                 C  s   t | tjrt | tjr| jdtjdtjddS | }| }|	 |	   kr3dkr\n n'|
d|
d  krEdkr\n n| jdtj|d|dktjddS | d||S )	Nr]  Tr{  r^  onnx::Constantrc  re  r  )r8  r  r	   DeviceObjTyper'  r`  r   r  r  r  kindOfre  )r+  r?  rD  	self_node
other_noder"  r"  r#  rN   $  s    
 $rN   zaten::nec                 C  r  r  )rN   rT  r"  r"  r#  r   @  r  r   zaten::gtc                 C  r  r  _gt_implr   r"  r"  r#  rb   H  r  rb   c                 C  J   t |rt |r| jd|tjjd}| jd|tjjd}| d||S )Nrl  rm  r  r   rS  r'  ro  rp  INT32r   r"  r"  r#  r)  O     r)  zaten::ltc                 C  r  r  _lt_implr   r"  r"  r#  r   W  r  r   c                 C  r*  )Nrl  rm  r  r+  r   r"  r"  r#  r/  ^  r-  r/  zaten::gec                 C  r  r  r.  r   r"  r"  r#  r]   f  r  r]   zaten::lec                 C  r  r  r(  r   r"  r"  r#  ru   n  r  ru   zaten::__and_c                 C  :   t |std|t |std|| d||S )NzOONNX export does NOT support exporting bitwise AND for non-boolean input valuesrR  r  r   r"  r"  r#  __and_v  r  r1  zaten::__or_c                 C  r0  )NzNONNX export does NOT support exporting bitwise OR for non-boolean input valuesr  r  r   r"  r"  r#  __or_  r  r2  zaten::__xor_c                 C  r0  )NzOONNX export does NOT support exporting bitwise XOR for non-boolean input valuesr}  r  r   r"  r"  r#  __xor_  r  r3  zaten::logical_andBoolc                 C  r  )NrR  r1  r   r"  r"  r#  r     r@  r   zaten::logical_orc                 C  r  )Nr  r1  r   r"  r"  r#  r     r@  r   zaten::logical_xorc                 C  r  )Nr}  r1  r   r"  r"  r#  r     r@  r   zaten::logical_notc                 C  s   |  d| j d|tjjdS )Nr~  rl  rm  r'  ro  rp  BOOLr2  r"  r"  r#  r     s   r   zaten::__rshift_c                 C     t j|}t j|t jj|kr| jd|| d}| jdtjdtjdd}t	
|s7| jd|tjjd}| d||}| jd|| d}| d||}|S )	Nrl  rm  r]  r  r{  r^  Powrk  r   rr  rs  rt  r'  rw  r`  r   float32r   ru  ro  rp  rv  )r+  r?  rD  r  twotwo_powrshiftr"  r"  r#  	__rshift_  (   
r>  zaten::__lshift_c                 C  r7  )	Nrl  rm  r]  r  r{  r^  r8  rI  r9  )r+  r?  rD  r  r;  r<  lshiftr"  r"  r#  	__lshift_  r?  rA  zaten::wherec              	   C  s`   t |s| jd|tjjd}|d u r(t| |}t | || jdt	dd|S | d|||S )Nrl  rm  r]  rH  r^  r  )
r   rS  r'  ro  rp  r6  r   _unbind_helperr`  r   )r+  	conditionr?  rD  rH  r"  r"  r#  r  	  s   

r  zaten::log_softmaxc           	      C  s   t |}|d u rt ddS |dk r|| }||d k}|r>tt|}|d || ||< |d< | jd||d}|d }| jd||d	}|rd|  d
krdt |dd}| jd|t	
| d}|rn| jd||d}|S )NrE   fONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.r   rH  r  r
  r  
LogSoftmaxrX  r&  r  r|  rl  rm  )r   r  r  r9  r  r'  r  r  rN  r   rr  rw  )	r+  r3  rE   r|  r  r  r  	return_opr  r"  r"  r#  r   	  s.   
r   zaten::_log_softmaxc                 C  s>   |rt j|t jjt jjkr| jd|tjjd}t	| ||S Nrl  rm  )
r   rr  rs  rt  HALFr'  ro  rp  rv  r   )r+  r3  rE   half_to_floatr"  r"  r#  _log_softmax4	  s   rJ  zaten::_convolutionc                 C  s  t |}z|dd  }W n ty   d }Y nw |d u s&tdd |D r,td|||g}t |sAt |dkrA|| |dd  ||| ||	d}tdd |D rj|s\J t	|t	|ksfJ ||d< | j
|rpd	nd
g|R i |}t |st |dkr| 
d||S |S )Nr  c                 s  r  r  r"  r  r"  r"  r#  r  `	  r  z_convolution.<locals>.<genexpr>DUnsupported: ONNX export of convolution for kernel of unknown shape.rH  )r  r  r  dilations_igroup_ic                 s  s    | ]}|d kV  qdS r  r"  )r  or"  r"  r#  r  x	  r  output_padding_iConvTransposeConvrF  )r   rh  r  r  r   ri  r  r  r  rV  r'  )r+  r3  r(  biasr  r  r  
transposedoutput_paddinggroups	benchmarkdeterministiccudnn_enabled
allow_tf32weight_sizekernel_shaperX  r  r,  r"  r"  r#  _convolutionC	  s@   



 r\  zaten::_convolution_modec                 C  s   t |}z|dd  }	W n ty   d }	Y nw |	d u s&tdd |	D r,td|||g}
t |sAt |dkrA|
| |dkrHd}n|dkrNd	}|dd  ||||d
}| j	dg|
R i |}t |syt |dkry| 	d||S |S )Nr  c                 s  r  r  r"  r  r"  r"  r#  r  	  r  z$_convolution_mode.<locals>.<genexpr>rK  rH  validVALIDsame
SAME_UPPER)r  r  
auto_pad_srL  rM  rQ  rF  )
r   rh  r  r  r   ri  r  r  r  r'  )r+  r3  r(  rR  r  r  r  rU  rZ  r[  rX  r  r,  r"  r"  r#  _convolution_mode	  s@   


rb  zaten::convolutionc
           
      C  s"   t | |||||||||	d d d d S r  r\  )
r+  r3  r(  rR  r  r  r  rS  rT  rU  r"  r"  r#  r?   	  s    r?   zaten::conv1dc           	      C  X   t |d}|dv rt| |||||||S t |d}t| ||||||dd|d d d d S Nre  )r]  r_  r  Fr"  r   r  rb  r\  	r+  r3  r(  rR  r  r  r  rU  str_paddingr"  r"  r#  r;   	  :   r;   zaten::conv2dc           	      C  rd  re  rf  rg  r"  r"  r#  r<   
  ri  r<   zaten::conv3dc           	      C  rd  re  rf  rg  r"  r"  r#  r=   :
  ri  r=   zaten::conv_transpose1dc	           	      C  "   t | ||||||d||d d d d S NTrc  	r+  r3  r(  rR  r  r  rT  rU  r  r"  r"  r#  r8   `
      r8   zaten::conv_transpose2dc	           	      C  rj  rk  rc  rl  r"  r"  r#  r9   
  rm  r9   zaten::conv_transpose3dc	           	      C  rj  rk  rc  rl  r"  r"  r#  r:   
  rm  r:   zaten::batch_normc
                 C  s   t |d t r"t |||||gs"tjdk r"t dddd|S t | |||||\}}}}| j	d||||||d| |s@dndd	}
|sH|
S |
\}}}}}|
|  |
|  |d	|   |d	|   |S )
Nr&      BatchNormalizationr  zaAll input tensors must have the same `dtype`. Turn off Autocast or export using opset version 15.rH  r  )	epsilon_f
momentum_fr.  zbatch_norm_dead_output-)r   check_training_moder`  is_autocast_enabledargs_have_same_dtyper   export_onnx_opset_versionrL  _batchnorm_helperr'  r(  r  setDebugName	debugName)r+  r3  r(  rR  running_meanrunning_vartrainingmomentumepsrX  rx  resnew_running_meannew_running_var
saved_mean	saved_varr"  r"  r#  r&   
  sJ   
	
r&   zaten::native_layer_normnormalized_shaper  r(  rR  r}  #Tuple[_C.Value, _C.Value, _C.Value]c              
   C  s  dd t t|ddD }t| d}t| |}| jdk r'| jd||d}	n| d|| jd	tj|tjd
d}	t	| ||	}
t
j|
t
jjk}|r^t
j|}| jd|
t
| d}
| jdk rp| jdt| |
||d}n| dt| |
|| jd	tj|tjd
d}t| | d||}| d|
|}|rt
j|}| jd|t
| d}|d u st|st| ||}|d u st|st| ||}|r| jd|t
| d}| d|}nt| |}||	|fS )Nc                 S  s   g | ]}| qS r"  r"  r  r"  r"  r#  r    s    z%native_layer_norm.<locals>.<listcomp>r   r         @   r  rd  r]  r{  r^  rl  rm  rF  rk  r  )r  rV  r   _generate_wrapped_numberr  r'  r`  r   longr   r   rr  rs  rH  rw  r   r   r  r   r   r   )r+  r3  r  r(  rR  r}  r  two_csteps_cstr  	numeratoris_type_half	eps_dtypevariancedenominator
normalizedinput_dtyperdenominatorr"  r"  r#  r   
  sZ   





r   zaten::layer_normcudnn_enablec           	   	   C  s<   t  r| jd||||||dS t| |||||\}}}|S )Nrt   )normalized_shape_ieps_fcudnn_enable_i)r   r  r  r   )	r+  r3  r  r(  rR  r}  r  r  r  r"  r"  r#  rt   H  s   	rt   zaten::instance_normuse_input_statsr|  r   rX  c
                 C  s&  t |d t |d}
|d u st |r6|
d u rtd|tjdg|
 tj	
| d}| jd|d}|d u s?t |r`|
d u rItd|tjdg|
 tj	
| d}| jd|d}|d u srt |sr|d u srt |r|| jd	||||d
S t |}| }|d }|d u rtd||d }d|d< || |d< t| || jdtj|gtjdd}t| || jdtj|gtjdd}t| || jdtj|gtjdd}t| || jdtj|gtjdd}| d|| jdt|d}t| |||||||||	
}t| || jdt|dS )Nrn   rH  zCUnsupported: ONNX export of instance_norm for unknown channel size.r[  r{  r]  r^  r  InstanceNormalizationrp  r   zJUnsupported: ONNX export of instance_norm training for unknown batch size.Reshape)r   rr  r  r  r   ri  r`  r   r   rr  rs  r|  r'  rh  copyr   r  r  r&   r  )r+  r3  r(  rR  ry  rz  r  r|  r}  rX  channel_sizeweight_value
bias_value
input_sizeinput_size_reshaper,  cweight_bias_running_mean_running_var_input_reshapedrx  r"  r"  r#  rn   c  s   
rn   zaten::unfoldc                   s   t  rjd ||dS t }z|  }W n ty$   d }Y nw |d urotd||}t||d |} fddt||D }	t|}
ttd|
	
   fdd|	D }jdg|R d	 iS t d
dS )Nr  )dimension_isize_istep_ir   rH  c              	     s*   g | ]\}}t j g|g|gd qS )rW  r   rY  )r  lowhi)	dimensionr+  r3  r"  r#  r    s    zunfold.<locals>.<listcomp>c              
     s(   g | ]}t jd |d gqS )r
  r  )r   r  r'  r  )r  r+  r  r"  r#  r    s    r6  r7  Unfoldr  )r   r  r  rh  r  r  r  rV  r9  r  popr'  r  )r+  r3  r  r   stepr  sizedimlow_indices
hi_indicesr   r  r  r"  )r  r+  r3  r  r#  r    s0   
r  z	aten::eluc                 C  sJ   |r|dkrt dd|S |r|dkrt dd|S | jd|t |dS )Nr[  r  zdoes not support scale in Eluinput_scalez#does not support input_scale in EluElur|  )r   r  r'  rM  )r+  r3  rP  r  r  r"  r"  r#  rI     s   rI   z
aten::seluc                 C  r.  )NSelur1  r2  r"  r"  r#  r     r  r   zaten::index_selectc                 C     t | |||S r  )r   _select_helper)r+  r?  rE   rm   r"  r"  r#  rl     s   rl   zaten::index_putc                 C  s   t |rt |}n|g}t  r$|g| ||g }| jdg|R  S t |d}t|dkr:|r8t| ||S |S t ddd| d S )Nrk   r#  r   r  rG  )	r   r  r  r  r  r  rV  r   r   )r+  r?  indices_list_valuevalues
accumulateindices_listrX  r"  r"  r#  rk     s   
rk   zaten::index_fillc           	      C  sr   t |d}t  r| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t| ||||S )Nr  rj   
int_Scalar)r=  r  )	r   r  r  r  _index_fill_reshape_helperrN  r  rR   r   )	r+  r?  rE   rm   rc  	dim_valueexpanded_index_shapeexpanded_indexexpanded_valuer"  r"  r#  rj   "  s"   	
rj   zaten::index_copyc                 C  sL   t |d}t  r| jd||||dS t | |||\}}t| ||||S )Nr  ri   r  )r   r  r  r  r  r   )r+  r?  rE   rm   sourcer  r  r  r"  r"  r#  ri   :  s   ri   zaten::bucketizec                 C  s   t jj}|r
t jj}| jd| d|| d|dd}t|}|d us&J ttd|d }t	| t
| |||d }	|rDt| ||	}
nt| ||	}
| jd|
|d}tj| |dgddS )	Nr6  r0  r   rX  rH  rl  rm  r  )ro  rp  rq  r,  r'  r   r  r9  r  rR   r  r]   rb   r  )r+  r?  
boundaries	out_int32r  out_type	new_shapetensor_rankunsqueeze_axesexpanded_boundariescondcond_outr"  r"  r#  r-   F  s$   "

r-   zaten::type_asc                 C  sf   t |}t |}||kr|d ur|S |d ur"| jd|| dS t  r-| d||S td|)Nrl  rm  r  zUnsupported: ONNX export of type_as for tensor of unknown dtype. Please check if the dtype of the parameter passed to the type_as function is correct.)r   r  r'  rw  r  r  r   ri  )r+  r?  rD  
self_dtypeother_dtyper"  r"  r#  r  l  s    

r  zaten::cosine_similarityc           	      C  s   t  r| jd||||dS t j| t| |||gdd}t j| t| |||gdd}t j| t| |||gdd}t| t| t| ||| jdt	|gd}t
| ||S )NrA   )r  r  r   r  r]  r^  )r   r  r  r  r   r   r   r'  r`  r   rF   )	r+  x1x2rE   r}  rB   x1_l2x2_l2div_tensr"  r"  r#  rA     s   &rA   zaten::pairwise_distancec                 C  s   t |s| jdt|gd}t| | jdtjdgtjddt| ||}t j| t	| t
| |||dgt |dd}t	| ||S )Nr]  r^  rH  r{  r  r  r  )r   rJ  r'  r`  r   rF   r  r   r  r   r   r  )r+  input1input2pr}  r  inv_p	summationr"  r"  r#  r     s   


r   zaten::clonec                 C  r  r  r"  )r+  r3  unused_memory_formatr"  r"  r#  r4        r4   z	aten::absc                 C  r.  )NAbsr1  r  r"  r"  r#  r     r5  r   z	aten::logc                 C  r.  )NLogr1  r  r"  r"  r#  r     r5  r   zaten::log1pc              	   C  s    t | t| ttd||S )NrH  )r   r   r   r  r`  r   r  r"  r"  r#  r         r   zaten::log10c              	   C  s*   d}|  dt| || j dt|gdS )NgUk@rk  r]  r^  r'  r   r`  r   )r+  r?  _ln10r"  r"  r#  r     s   &r   z	aten::powc                 C  sb   t j|}t|st jj}| jd|| d}t|s(| jd|| d}| d||}|S )Nrl  rm  r8  )r   rr  rs  r   ru  rv  r'  rw  )r+  r?  exponentf_dtyper   r"  r"  r#  r     s   

r   zaten::clampc              	   C  sz   t |rt| ||S t |rt| ||S t |r3t |r3t j| d|t |dt |dddS t| t| |||S )NCliprZ     min_fmax_frp  )r   r  r1   r2   r  rr  r  )r+  r?  r   r   r"  r"  r#  r3     s   



	r3   zaten::clamp_minc                 C  Z   t |rt j| d|t |dddS tj|}| jd|| d}t j| d||ddS )	Nr  rZ  r  )r  rp  rl  rm  Maxro  	r   r  rr  r  r   rr  rs  r'  rw  )r+  r?  r   r|  r"  r"  r#  r2        

r2   zaten::clamp_maxc                 C  r  )	Nr  rZ  r  )r  rp  rl  rm  Minro  r  )r+  r?  r   r|  r"  r"  r#  r1     r  r1   z	aten::maxc                 C  r  r  )r   _max_helperr+  r?  dim_or_yr  r"  r"  r#  r     s   r   zaten::maximumc                 C     t | ||dS N)r  )r   r   r"  r"  r#  r     r@  r   z	aten::minc                 C  r  r  )r   _min_helperr  r"  r"  r#  r   &  s   r   zaten::minimumc                 C  r  r  )r   r   r"  r"  r#  r   -  r@  r   z
aten::amaxc                 C     | j d|||dS )Nr  r  r1  r+  r?  rE   r  r"  r"  r#  r   4     r   z
aten::aminc                 C  r  )N	ReduceMinr  r1  r  r"  r"  r#  r   <  r  r   zaten::aminmaxc                 C  sR   d|i}t |st |dd}|g|d< | jd|fi || jd|fi |fS )Nr  r  rE   r  r  r  )r   r  rN  r'  )r+  r?  rE   r  reduce_kwargsr"  r"  r#  r   D  s   

r   z	aten::expc                 C  r.  )Nr  r1  r  r"  r"  r#  rP   S  r5  rP   zaten::dropout_zaten::dropoutc                 C  s.   t |d |s
|S | jd||dd\}}|S )NrH   Dropoutr  )ratio_fr.  )r   rr  r'  )r+  r3  r  trainr  r  r"  r"  r#  rH   Y  s
   rH   zaten::alpha_dropout_zaten::feature_alpha_dropout_zaten::feature_dropout_zaten::feature_alpha_dropoutzaten::alpha_dropoutzaten::feature_dropoutc                   s$   t dddtj fdd}|S )NrY  r  r#  c                   s   |r	t  d|S |S )Nztraining mode)r   r  )r+  r3  r  r  r!  r"  r#  feature_dropout  s   z-_unsupported_dropout.<locals>.feature_dropoutr   r  r   r  )r  r  r"  r!  r#  _unsupported_dropoutf  s   r  z
aten::normc                 C  sx   |dkr
t d}n|dkrt d}ntd||| |||d}|d ur:t |dd}| jd	|t| d
}|S )NrH  ReduceL1r  ReduceL2z)ONNX export only p-norms with p of 1 or 2)rE   r  r  r|  rl  rm  )	r   _reduce_op_symbolic_helperr   ri  rN  r'  r   rr  rw  )r+  r?  r  rE   r  r|  rZ  r  r"  r"  r#  r     s   r   zaten::conv_tbcc              	   C  st   t  r| jd||||dS | jd|g dd}| jd|g dd}t| |||dg|gdgd}| jd|g ddS )	Nr7   )pad_ir
  )rH  r  r   r  )r  rH  r   rH  )r  r   rH  )r   r  r  r'  r;   )r+  r3  r(  rR  r   convr"  r"  r#  r7     s   r7   zaten::_uniquec                 C  s(   t  r| jd|||ddS t d|S )N_uniquer  )sorted_ireturn_inverse_ir.  )r   r  r  r  )r+  r3  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_unique2r  )r  r  return_counts_ir.  r  rG  )r   r  r  r   )r+  r3  r  r  return_countsr"  r"  r#  r    s   	r  zaten::_cast_Bytez2.0z
the futurez8Avoid using this function and create a Cast node insteadc                 C     | j d|tjjdS rG  )r'  ro  rp  r  r+  r3  non_blockingr"  r"  r#  
_cast_Byte     r  zaten::_cast_Charc                 C  r
  rG  )r'  ro  rp  r  r  r"  r"  r#  
_cast_Char  r  r  zaten::_cast_Shortc                 C  r
  rG  )r'  ro  rp  r  r  r"  r"  r#  _cast_Short  r  r  zaten::_cast_Intc                 C  r
  rG  )r'  ro  rp  r,  r  r"  r"  r#  	_cast_Int  r  r  zaten::_cast_Longc                 C  r
  rG  )r'  ro  rp  rq  r  r"  r"  r#  
_cast_Long  r  r  zaten::_cast_Halfc                 C  r
  rG  )r'  ro  rp  FLOAT16r  r"  r"  r#  
_cast_Half  r  r  zaten::_cast_Floatc                 C  r
  rG  )r'  ro  rp  rv  r  r"  r"  r#  _cast_Float  r  r  zaten::_cast_Doublec                 C  r
  rG  )r'  ro  rp  r  r  r"  r"  r#  _cast_Double  r  r  zaten::_cast_Boolc                 C  r
  rG  r5  r  r"  r"  r#  
_cast_Bool)  r  r  zaten::emptyc                 C     t | |||||S r  )r  )r+  r  r|  layoutdevice
pin_memorymemory_formatr"  r"  r#  rM   4     rM   zaten::empty_likec                 C  r  r  )r  )r+  r3  r|  r  r  r  r  r"  r"  r#  rL   C  r  rL   zaten::new_emptyc                 C  2   t |}t |r|d ur|}t| |||||S r  )r   r  r  rM   r+  r?  r  r|  r  r  r  r  r"  r"  r#  r   R     
r   zaten::scalar_tensorc                 G  s<   t |dd}|d u rtjj}| jd|t| d}|S )Nr  r|  rl  rm  )r   rN  r   rr  rv  r'  rw  )r+  scalarr|  optionsr"  r"  r#  r   ]  s
   r   zaten::tensorc                 C  s
  t |dd}t |rV|d u rtjt |d }t }t |D ]&}| jdt	
dgd}t | ||}| jd|t| d}|| q#| jd	g|R d
diS |d u r`tj|}t |rxt |sot |rx| jd|ddd}| jd|t| dS )Nr  r|  r   r]  rH  r^  rl  rm  r6  r7  ConcatFromSequence)r7  
new_axis_i)r   rN  r  r   rr  rs  r  r9  r'  r`  r  r=  rw  r  _is_listrK  _is_scalar_list)r+  datar|  r  requires_gradr  r   shape_referencer"  r"  r#  r   g  s,   

r   zaten::as_tensorc                 C     t | |||S r  )r   )r+  r'  r|  r  r"  r"  r#  r!     r  r!   zaten::zerosc                 C  sz   |d u r	t jj}nt |}t|d}t|tr-t|dkr-| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   r]  r^  ConstantOfShaper{  r   rr  rv  r   r  r8  r9  rV  r'  r`  r   r   r  r|  r+  r  r|  r  r  r  ry  sizes_r"  r"  r#  r    s   

r  zaten::zeros_likec           	      C  T   |  d|}t|rtj|tjj}nt|}| j d|tjdg|	 ddS )Nr0  r+  r   r{  r^  
r'  r   r  r   rr  rs  rv  r`  r   r|  	r+  r3  r|  r  r  r  r  r:  ry  r"  r"  r#  r       

r  zaten::new_zerosc                 C  r  r  )r   r  r  r  r  r"  r"  r#  r     s   
r   z
aten::zeroc                 C  s   t |}t| ||S r  )r   r  r  )r+  r?  r  r"  r"  r#  r    s   
r  z
aten::onesc                 C  sz   |d u r	t jj}nt |}t|d}t|tr-t|dkr-| jdt	
g t	jd}| jd|t	j
dg| ddS )Nr  r   r]  r^  r+  rH  r{  r,  r-  r"  r"  r#  r     s   

r   zaten::ones_likec           	      C  r/  )Nr0  r+  rH  r{  r^  r0  r1  r"  r"  r#  r     r2  r   zaten::new_onesc                 C  r  r  )r   r  r  r   r  r"  r"  r#  r     r   r   z
aten::fullc              	   C  s   t |d}t |r,|d u rtjjn|}t| ||||}t| ||| jdt	
ddS t |dd}|d u r<tjj}	nt|}	t |d}
t|
tr`t|
dkr`| jdt	
g t	jd}| jd	||d|	 dS )
Nr   r]  rH  r^  r  r|  r  r   r+  )r   r  rJ  r   rr  rv  r  r   r'  r`  r   rN  r8  r9  rV  r   r  r  r|  )r+  r  rc  r|  r  r  r  const_valuetmpry  r.  r"  r"  r#  r[     s"   


r[   zaten::full_likec              	   C  s   t |d}t |dd}|d u rtj|tjj}nt|}t |rFt| ||||}	| j	d||
 d}t| |	|| j	dtddS | 	d	|}
| j	d
|
tj|g| ddS )NrZ  r  r|  rl  rm  r]  rH  r^  r0  r+  r{  )r   r  rN  r   rr  rs  rv  rJ  r  r'  rw  r   r`  r   r|  )r+  r3  
fill_valuer|  r  r  r  r  ry  r4  r:  r"  r"  r#  rZ     s"   

rZ   zaten::new_fullc           	      C  s4   t |}t |r|d ur|}t| ||||||S r  )r   r  r  r[   )	r+  r?  r   r5  r|  r  r  r  r  r"  r"  r#  r   <  s   
r   	aten::eyec                 G  s   t |dkr,|\}}}}}t| |dg}| jd||dd}t| ||||}	| d|	S t |dkr]|\}}
}}}}| jdt| |dgt| |
dgdd}t| ||||}	| d|	S tddt | d	S )
Nr  r   r6  rX  EyeLikers  r6  with 
 arguments)rV  r   r  r'  r  r  )r+  rX  r,  r|  r  r  r  rf  r:  r   mr"  r"  r#  rS   N  s"   rS   aten::slicec                 G  s  t |dkr|\}}}}t|d}|dkrtd||  dko+t| t	j
}|  dko;t| t	j
}|  dk}	|  dk}
|sP|	r\|sT|
r\|  dkrtjtjjkritd|t| |dg}t| |dg}t| |dg}| d	||||S |rdnt|d}|rtjnt|d}t|d}tj| ||g|g|gd
S t |dkr|\}}}d}|  dkot| t	j
}|  dkot| t	j
}|rdnt|d}|rtjnt|d}tj| ||g|g|gd
S tddt | dS )Nr-  r  rH  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   DynamicSlicerW  r  r;  r8  r9  )rV  r   r  r   ri  r  r  r8  r  r	   NoneTyper   operator_export_typero  OperatorExportTypesONNXr  r'  r
   r  rY  r  )r+  r?  rX  rE   r  r  r  is_start_noneis_end_noneis_start_onnx_constis_end_onnx_conststart_unsqueezedend_unsqueezeddim_unsqueezedr"  r"  r#  r   g  s   






r   zaten::hardtanhr?  min_valmax_valc                 C  s   t j| d|||ddS )Nr  r  r  rq  )r+  r?  rH  rI  r"  r"  r#  rg     s   rg   zaten::hardswishc                 C  s   t | |}| d||S r\  )re   r'  )r+  r?  hsr"  r"  r#  rf     s   
rf   zaten::hardsigmoidc                 C  s   | j d|ddS )NHardSigmoidgUUUUUU?r|  r1  r  r"  r"  r#  re     s   re   zaten::tanhshrinkc                 C  s   |  d|t| |S )NrQ  )r'  r   r  r"  r"  r#  r        r   zaten::hardshrinkc                 C  sx   t j|t jj}| jdtj|| dd}t| t	| ||t
| |t| |}| d||| jdtjd| ddS Nr]  r{  r^  r  r   )r   rr  rs  rv  r'  r`  r   r|  r   rb   r   r   )r+  r?  lambdry  lambd_opr  r"  r"  r#  rd     s"   "rd   zaten::softshrinkc           	      C  s   t j|t jj}| jdtj|| dd}t| ||}| d|t	| ||| jdtjd| dd}t
| |t| |}| d|t| ||| jdtjd| dd}t| ||S rM  )r   rr  rs  rv  r'  r`  r   r|  rb   r   r   r   r   )	r+  r?  rN  ry  rO  gt_condgt_outlt_condlt_outr"  r"  r#  r     s8   
	
	r   zaten::aliasc                 C  r  r  r"  r  r"  r"  r#  r     r  r   zaten::unsqueezec                 C  s~   |dk r6t |}|dur/tdt| d d d t|| d  d d	  || d }nt d
d|S t j| ||gdS )zbImplement unsqueezing a pytorch tensor in ONNX by inserting a new dimension at the specified `dim`r   Nz)ONNX export unsqueeze with negative axis r^  r_  r`  rH  ra  rb  r  rc  rd  )r   r  r&  r'  r  r  r  r;  r"  r"  r#  r    s2   

r  z
aten::sortc                 C  sn   |d urt dd| t |}z|| }W n ty!   d }Y nw |d u r-t dd|S | jd|||ddS )NSortz'Out parameter is not supported for sortr  TopKr  k_ir7  r.  )r   r  rh  r  r'  )r+  r?  rE   	decendingrx  
self_sizesrf  r"  r"  r#  r   1  s   
r   zaten::numelc                 C  s   t | |S r  )r   _numel_helperr  r"  r"  r#  r   H  r5  r   z
aten::topkc                 C  s<   |d urt dd| |st dd| | jd|||ddS )NrU  z'Out parameter is not supported for topkzAscending TopK is not supportedr  rV  )r   r  r'  )r+  r?  r  rE   largestr  rx  r"  r"  r#  r   N  s   r   zprim::convert_element_typec                 G  s,   t |d dd}| jd|t| dS )Nr   r  r|  rl  rm  )r   rN  r'  r   rr  rw  )r+  r?  rX  r|  r"  r"  r#  r>   ]  s   r>   zaten::toc                 G  s  t jdd }||r|S t|dkrt|d }t|d rJ|d   dkrJt|d  d}t|t	j
rJt|jdkrH| }t|}n|}t|sUt|t	j
rgtj|d }| jd|| dS | jd|t| dS t|d	krt|d
 dd}| jd|t| dS t|dkrt|d dd}| jd|t| dS t|dkrt|d dd}| jd|t| dS td|S )Nc                 S  s   t | dkr&| d   dkp%| d  tj p%t| d  tj	S t | dkr9t
| d dd}|d u S t | dv rLt
| d dd}|d u S d	S )
Nr-  r   prim::devicer  rH  r  r|  )rs     F)rV  r  r  r  isSubtypeOfr	   ListTypeofIntsr8  r$  r   rN  )rX  r|  r"  r"  r#  is_aten_to_device_onlyg  s   z"to.<locals>.is_aten_to_device_onlyr-  r   r#  rc  rl  rm  r  rH  r  r|  rs  r]  zUnknown aten::to signature)r   r  rV  r   rJ  r  r  rM  r8  r`  r  r:  rr   r<  r   rr  rs  r'  rw  rN  r  )r+  r?  rX  ra  r|  tvalr"  r"  r#  r   d  sB   

r   zaten::repeatc                 C  s0   t jj}t| ||}| d||}| d||S )Nr  Tile)r   rr  rq  r   r'  )r+  r?  repeatsr|  shape_r"  r"  r#  r     s   r   zaten::repeat_interleavec              
   C  s  t |}t |}t |}|d u rtd||d u r#td||d u r-td|t |rKt | || jdt	dgd}tj	dtj
d}nt |}|dk rZ|t|7 }| }t|D ]\}	}
|
d u rrd	\||	< ||	< qb|dks|d
kr|d d
kr|| dkrt dddd|S t | |||S |d
kr|| dkrt dddd|S |d d u rt dddd|S |d || ksJ d|d }ntd|t }t | ||d}t | |||}d\||< ||< t|D ]X\}	}t| ||	 |d
 }| jdt|d |d
  d|| jdt||d
 d  dg}| jdg|R ddi}t| ||d }t j| || jdt|ddd}|| q| jdg|R d|iS )NzGUnsupported: 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{  )r   r  rH  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  rH  r6  r7  	allowzero)r   r  rh  r   ri  r  r=  r'  r`  r   r  rN  rV  r  	enumeraterL  -_repeat_interleave_single_value_repeat_helperr9  _repeat_interleave_split_helperr  r  rR   r  )r+  r?  rd  rE   r  repeats_dimrepeats_sizesinput_sizesinput_sizes_tempr  r  repsfinal_splitsr_splitsi_splitsr_spliti_splitr_concatr"  r"  r#  r     s   





r   zaten::pixel_shufflec           	      C  s  t |}t|dkrt dd|S tdd |dd  D rvt j| t | |ddg| jd	t	d
d||d
d
gdd
d}| jd|g dd}t j| || jd	t	g ddd
d}t j| || jd	t	g ddd
d}t 
| |ddgS |d | | }t j| || jd	t	d||||d |d gdd
d}| jd|g dd}t j| || jd	t	d||d | |d | gdd
dS )Nr-  r   only support 4d inputc                 s  r  r  r"  r  r"  r"  r#  r  ,  r  z pixel_shuffle.<locals>.<genexpr>rH  r  r  r]  r   r  r^  rg  r
  )r   rH  r-  r  r  r  r  )r   r   r  rH  r   r   )r   r   r   r   r  rH  r  r   rh  rV  r  r  r=  r  r'  r`  r   rU  )	r+  r?  upscale_factorr!  
after_viewafter_transpose	reshape_h	reshape_woutput_channelr"  r"  r#  r   #  s~   
	

r   zaten::pixel_unshufflec           
      C  s  t |}t|dkrt dd|S tdd |dd  D rxt j| t | |dg| jdt	d	d	d
|d	gdd	d}t j| || jdt	d	d	d	d	d
|gdd	d}| jd|g dd}t j| || jdt	g ddd	d}t 
| |ddgS |d | | }t j| || jdt	d
|d |d | ||d | |gdd	d}	| jd|	g dd}t j| || jdt	d
||d | |d | gdd	dS )Nr-  r   rw  c                 s  r  r  r"  r  r"  r"  r#  r  u  r  z"pixel_unshuffle.<locals>.<genexpr>rH  r  r]  r   r  r^  rg  r
  )r   rH  r  r  r  r-  r  )r   r  rH  rH  r   r   r  rx  )
r+  r?  downscale_factorr!  r|  r}  r{  final_reshaper~  rz  r"  r"  r#  r   l  sx   




r   c           *   
     s  t d d d d d  g d}ttdd |D |}|r#d	nd
dkr<t  d|	  kr<tdd|S t  d|	  ksJJ  fddtdt D |
rfjd|g dd}|rq|rqtdd|S 	dr|d	d  
  }d d }t|dd u rtdd|S |	 }|}g }dksdkr|}n
dkr|\}}g }|d u rtn|}dkrg dndkrg dtjdd tjfdd}tjfdd}tjfd d!}tD ]-}|r#d	kr||\}}}n
||\}}t}||d f}nUd	krF|d
| \}} }!|d
| d \}"}#}$jd"|!|$dd#}n|d
| \}} |d
| d \}"}#t}jd"||"dd#}jd"| |#dd#}d
| d
| d
 f}|||||g}%|%||g|R   dkr|%||g|R   |ri nd$d%i}&dkr|	r||g}'n|g}'jdg|%R d
|'d&|&\}}(n/dkrވjdg|%R d
dd'|&\}}(ndkrjdg|%R d(d)|&\}}(})|	rjd|g d*d}tj|jd+tg d,d-dd.}nt|dg}||( dkr-||) q|
r;jd|g dd}dkrB|(njd"g|R d/di}dksXdkr\||fS dkrydkrh|)njd"g|R d/di}|||fS d S )0NzVExporting a model to ONNX with a batch_size other than 1, with a variable length with z can cause an error z9when running the ONNX model with a different batch size. z4Make sure to save the model with a batch size of 1, z=or define the initial states (h0/c0) as inputs of the model. )rm  r  r  Affiner{  ThresholdedRelu
ScaledTanhrK  r  Softsignrl  c                 S  s   g | ]}|  qS r"  )lower)r  act_funr"  r"  r#  r    r  z _generic_rnn.<locals>.<listcomp>r-  r  LSTMrH  zLSTMs with projectionsc                   s   g | ]
} ||  qS r"  r"  r  )all_weightsweights_per_layerr"  r#  r    r  r   r
  r  r  zRNN/GRU/LSTMzdropout in training modeRNNzunknown hidden sizeGRU))rH  r  r   rH  )r  r  )r  )r  r-  )rH  r  c                   s.    fdd|D } j dg|R ddiS )Nc              	     s2   g | ]\}}t j d g| g| gdqS )r   rW  r  )r  xyr+  r,  wr"  r#  r    s     z8_generic_rnn.<locals>.reform_weights.<locals>.<listcomp>r6  r7  r   r1  )r+  r  r,  	intervalsslicesr"  r  r#  reform_weights  s   z$_generic_rnn.<locals>.reform_weightsc                   s`   |  }dkr|\}}ndksdkr# fdd|D \}}t  fdd||fD S )Nr  r  r  c                 3      | ]
} |V  qd S r  r"  r  r  r+  hidden_sizereform_permutationr  r"  r#  r        
zB_generic_rnn.<locals>.transform_weights_no_bias.<locals>.<genexpr>c                 3       | ]}t  |d gV  qdS r  r  r  r  r+  r"  r#  r     s    
)r  )layer_indexweights	weight_ih	weight_hhr+  r  layer_weightsr  r  variantr"  r#  transform_weights_no_bias  s   

z/_generic_rnn.<locals>.transform_weights_no_biasc                   s|   |  }dkr|\}}}}ndksdkr' fdd|D \}}}} j d||dd}t fd	d|||fD S )
Nr  r  r  c                 3  r  r  r"  r  r  r"  r#  r  *  r  z:_generic_rnn.<locals>.transform_weights.<locals>.<genexpr>r6  r   rX  c                 3  r  r  r  r  r  r"  r#  r  .  s
    
)r'  r  )r  r  r  r  bias_ihbias_hhbias_concatr  r"  r#  transform_weights$  s   z'_generic_rnn.<locals>.transform_weightsc                   s&   dkr| S t j | dg|g|gdS )NrH  r   rW  r  )r  r  r  )r+  
num_layersr"  r#  retrieve_state3  s   z$_generic_rnn.<locals>.retrieve_stater6  rX  direction_sbidirectional)r.  hidden_size_iactivations_s)r.  r  linear_before_reset_ir  )r.  r  )r   r  rH  r  r]  )r   r   r  r^  rg  r7  )r&  r'  dictr  rV  r   r  r  r'  
startswithr  r  r  r   r  r  r=  r`  r  rU  )*r+  r  r3  initial_statesr  
has_biasesr  rH   r  r  batch_firstbatch_sizesonnxActivationsvariantToOnnxActivationMapnonlinearityw_hhunidirectionalprev_outputh_outsh0c0c_outssequence_lensr  r  r  r  r  r  r  state_indicesweight_ih_fweight_hh_fbias_fweight_ih_bweight_hh_bbias_binputsextra_kwargs
activationh_outc_outr"  )	r  r+  r  r  r  r  r  r  r  r#  _generic_rnn  s  



	









&
&
r  c
                 C  s2   t |t |}
}t| d||
|||||||	S )Nr  r   r  r  )r+  r3  hidden_vweight_vr  r  rH   r  r  r  hiddenr(  r"  r"  r#  
_lstm_full  s$   r  c
                 C  s4   t |t |}
}t| d||
||||||	|dS )Nr  r  r  )r+  r3  r  r  r  r  r  rH   r  r  r  r(  r"  r"  r#  _lstm_packed  s$   r  z
aten::lstmc                 G  s.   t |d rt| g|R  S t| g|R  S Nr  )r   rK  r  r  r+  rX  r"  r"  r#  r     s   r   zaten::lstm_cellc                   s   t  |dg}t |} fdd|D }t |r!||||fn||f}t |r,dnd}	t d||||	dddddd\}
}}t  |dgt  |dgfS )	Nr   c                   s   g | ]
}t  |d gqS r  r  r  r  r"  r#  r    r  zlstm_cell.<locals>.<listcomp>TFr  rH  )r  rH   r  r  r  )r   r  r  
_is_tensorr  rU  )r+  r?  r  w_ihr  b_ihb_hhr3  r(  r  r  r  r  r"  r  r#  r     s0   
r   z	aten::grur  gruzaten::rnn_tanhRNN_TANHrnn_tanhzaten::rnn_reluRNN_RELUrnn_relur  c                   sd   t ddddddddd	tjfdd t ddddddddd	fdd fdd	}|S )
NrY  r  rZ  c
                   s&   t |}
t|  |||
||||||	S r  r  )r+  r3  r  r  r  r  rH   r  r  r  r(  r  r"  r#  	_rnn_full	  s   
z"_one_hidden_rnn.<locals>._rnn_fullc
                   s(   t |}
t|  |||
|||||	|dS )Nr  r  )r+  r3  r  r  r  r  r  rH   r  r  r(  r  r"  r#  _rnn_packed&  s   
z$_one_hidden_rnn.<locals>._rnn_packedc                   s.   t |d r| g|R  S  | g|R  S r  )r   rK  r  )r  r  r"  r#  symbolicB  s   z!_one_hidden_rnn.<locals>.symbolicr  )r  r  r"  )r  r  r  r#  _one_hidden_rnn  s   r  zaten::_dim_arangec                 C  sT   |  d|}| j d|| j dt|ddd}t r!|  d|S t| |dd d d S )	Nr0  r$  r]  r^  r   rX  z_caffe2::Ranger-  )r'  r`  r   r   r  r   )r+  likerE   
like_shapestopr"  r"  r#  _dim_arangeK  s   r  zaten::detachc                 C  r  r  r"  r2  r"  r"  r#  rD   Z  r  rD   zaten::contiguousc                 C  s   |dkr
t d||S )Nr  z-onnx memory_format support is not implemented)r   ri  )r+  r3  r  r"  r"  r#  r6   a  s
   r6   zaten::_pack_padded_sequencec                 C  sz   |r| j d|g dd}| tjj std|t	j
|t	j
jt	j
jkr4| j d|tjjd}| j d||dd	S )
Nr
  r  r  z*'lengths' must be a Tensor for ONNX exportrl  rm  zprim::PackPaddedr  r.  )r'  r  r^  r`  r	   
TensorTypegetr   ri  r   rr  rs  rt  r  ro  rp  r,  )r+  r3  lengthsr  r"  r"  r#  _pack_padded_sequencel  s   r  zaten::_pad_packed_sequencec                 C  s6   | j d||dd\}}|r| j d|g dd}||fS )Nzprim::PadPackedr  r  r
  r  r  r1  )r+  r'  r  r  padding_valuetotal_lengthr  r"  r"  r#  _pad_packed_sequence  s   r  zaten::randintc                 G  s  t |dd}t |dd}t |dd}|d u rtjj}nt|}|d u r-t d||d u r7t d|t |d}	t |	r[| jd|t	j
dgt	jd	d
}
| jd|
||d}n	| jd|	||d}tjj}| jd|| d}||kr| jd|| d}|S )Nr  r|  r  highr   r  r+  r   r{  r^  RandomUniformLikelow_fhigh_fRandomUniform)shape_ir  r  rl  rm  )r   rN  r   rr  rq  r  r  rJ  r'  r`  r   r  rw  )r+  r  r  shapesr|  r"  low_ihigh_iry  r:  shape_constr   	int_dtyper   r"  r"  r#  r     sD   


r   zaten::randint_likec                 G  s   t |dd}t |dd}t |dd}|d u rtjj}nt|}|d u r-t d||d u r7t d|| jd|||d}	tjj}
| jd|	|
 d	}|
|kr\| jd|| d	}|S )
Nr  r|  r  r  r   r  r  rl  rm  )r   rN  r   rr  rq  r  r'  rw  )r+  r?  r  r  r|  r"  r  r  ry  r   r  r   r"  r"  r#  r     s*   

r   zaten::randnc                 G     t |dd}|d u rtjj}nt|}t |d}t |r9| jd|tj	dgtj
dd}| jd|| d	S | jd
|| dS )Nr  r|  r  r+  r   r{  r^  RandomNormalLikedtype_iRandomNormalr  r   r   rN  r   rr  rv  r  rJ  r'  r`  r   r  rw  r+  r  r|  r"  ry  r:  r  r"  r"  r#  r     *   


r   z
aten::randc                 G  r  )Nr  r|  r  r+  r   r{  r^  r  r  r  r  r  r  r"  r"  r#  r     r  r   zaten::randn_likec                 C  sH   t |dd}|d u rtj|tjj}nt|}| jd|| dS )Nr  r|  r  r  r   rN  r   rr  rs  rv  r'  rw  )r+  r?  r|  r  r  r  r  ry  r"  r"  r#  r     s   
r   zaten::rand_likec                 C  sB   t |dd}|d u rtj|tjj}| jd|t| dS )Nr  r|  r  r  r  )r+  r?  r|  r  r  r  r  r"  r"  r#  r   /  s   r   zaten::rreluc                 C  s@   |s|| d }| j d||dS | j d|||d}|  d||S )Nr  r{  r|  r  )r  r  rg  r1  )r+  r3  r  upperr{  r  r  r  r"  r"  r#  r   D  s
   r   zaten::bernoullic           	      C  s   |d urt |st dd| |d ur t |s t dd| tj|tjj}|tjjkr6t dd|S | jd|dd| d}|d urMt |sM|n|}| d	||}| jd
|| dS )N	Bernoulliz,out parameter is not supported for bernoulliz(generator is not supported for bernoulliinput dtype not accessibler  r[  r  )r  r  r   r  rl  rm  )	r   r  r  r   rr  rs  rt  r'  rw  )	r+  r3  r  r  rx  r|  randsprobr  r"  r"  r#  r'   O  s2   r'   zaten::log_sigmoidc                 C     |  d|}|  d|S )Nr  r  r1  )r+  r3  r  r"  r"  r#  r   o  rE  r   z	aten::erfc                 C  r.  )NErfr1  r2  r"  r"  r#  rO   w  r  rO   zaten::flattenc                 C  s   t |}|d u rt dd|S |dkrt | |dgS |dkr&| d|S |dk r.|| }|dkr@||d kr@| jd||dS |dkrT||d krT| jd||d dS t | ||||S )	NrE   rD  r   rH  r	  FlattenrX  r  )r   r  r  r=  r'  _flatten_helper)r+  r3  	start_dimend_dimrE   r"  r"  r#  rU   ~  s$   
rU   zaten::nonzeroc                 C  s   t | | d|S )z/Emitted from `torch.nonzero(x, as_tuple=False)`NonZero)r   r'  r2  r"  r"  r#  r     r  r   zaten::nonzero_numpyc                 C  s   t | t| |d|dS )NrH  )rH  )r  r   )r+  r3  rH  r"  r"  r#  r     s   r   zaten::isnanc                 C  s   |  d|}|S )NIsNaNr1  )r+  r3  r  r"  r"  r#  rq     s   rq   z	aten::anyc              	   G  s   t |dkr|d }d\}}n|\}}}t|d}dd |dD }t|d}| jd	|tjjd
}tj| |||d}t	| || jdt
jdt
jddS )NrH  r   rU  r   c                 S  s   g | ]}t |qS r"  r  )r  r"  r"  r"  r#  r    r  z_any.<locals>.<listcomp>r  r  rl  rm  r  r]  r{  r^  )rV  r   r  r  r'  ro  rp  rq  r  rb   r`  r   r  )r+  rX  r3  rE   r  	input_sumr"  r"  r#  _any  s   

"r  z	aten::allc              	   G  sL   |  d|d }t|dkr|  dt| |S |  dt| ||d |d S )Nr~  r   rH  r  )r'  rV  r  )r+  rX  r3  r"  r"  r#  _all  s   r  zaten::narrowc                 C  s   t j| ||g|g|| gdS )NrW  r  )r+  r3  rE   r  lengthr"  r"  r#  r     s   r   zaten::argmaxtorch._C.Valuer  c                 C     t | |||dS )NArgMaxr   _argmin_argmax_helperr+  r3  rE   r  r"  r"  r#  r        	r   zaten::argminc                 C  r  )NArgMinr  r  r"  r"  r#  r     r  r   zaten::scatterc                 C  s~   t j|t jj}t|}t|r| jd||||dS t j|}||kr1| jd|| d}| jd||t	| |||dS )NScatterrX  rl  rm  )
r   rr  rs  rt  r   rN  rJ  r'  rw  rQ   )r+  r?  rE   rm   srcsrc_typer  r"  r"  r#  r     s   

r   zaten::scatter_addc                 C  sz   t |}|d u rt dd|S t j|dd}|r(| jdtj|| dd}nt| ||}t 	| ||||}t
| ||S )Nr   r	  F)allow_nonstaticr]  r{  r^  )r   r  r  rh  r'  r`  r  r|  r  _scatter_helperr   )r+  r?  rE   rm   r!  ry  r  to_addr"  r"  r#  r     s   
r   z
aten::log2c              	   C  s(   d}|  dt| || j dt|dS )Ng9B.?rk  r]  r^  r  )r+  r?  _ln2r"  r"  r#  r     s   $r   zaten::is_floating_pointc                 C  s6   t |r| jdtdgdS | jdtdgdS Nr]  rH  r^  r   )r   ru  r'  r`  
BoolTensorr  r"  r"  r#  ro   !  s   
ro   zaten::__is_c                 C  sL   t |r t |r| jdtdgdS | jdtdgdS t| ||S r'  )r   r  r'  r`  r(  rN   rT  r"  r"  r#  __is_)  s
   

r)  zaten::__isnot_c                 C  r  r  )r)  rT  r"  r"  r#  __isnot_3  r  r*  zaten::one_hotc                 C  sn   | j dtddgd}tj|tjjtjjtjjtjj	tjj
hv r-| j d|tjjd}| j d|||dd	S )
Nr]  r   rH  r^  rl  rm  OneHotr  rX  )r'  r`  r  r   rr  rs  rt  r  r  r  r  ro  rp  rq  )r+  r?  num_classesr  r"  r"  r#  r   :  s   r   zaten::gatherc           	   	   C  s   t |drt dd|S tj|}| jdtddgd}t	| || jdt|gd}| jd| jd	||||d
|
 d}| dt | ||d g|}t j| ||gddS )Nr  r\   zsparse_grad == Truer]  r   rH  r^  rl  r+  rX  rm  rI  r  )r   r  r  r   rr  rs  r'  r`  r  r   rw  r  r  )	r+  r?  rE   rm   sparse_gradry  r  depthr   r"  r"  r#  r\   K  s   r\   c                 C  s   t | ||||S r  )r   _var_mean_helper)r+  r3  rE   
correctionr  r"  r"  r#  	_var_mean_  s   r1  z	aten::stdc                 G  s"   t | |g|R  \}}| d|S Nr  r  r'  r+  r3  rX  r  r  r"  r"  r#  r   e  s   r   z	aten::varc                 G  s   t | |g|R  \}}|S r  )r  r4  r"  r"  r#  r  l  s   r  zaten::var_meanc                 G  s2   t |dkrt| |d |d d S t| |g|R  S )NrH  r   )rV  r1  )r+  r3  rX  r"  r"  r#  r  s  s   r  zaten::std_meanc                 G  s&   t | |g|R  \}}| d||fS r2  r3  )r+  r3  rX  r  r  r"  r"  r#  r   |  s   r   zaten::logsumexpc                 C  r  )NReduceLogSumExpr  r1  r  r"  r"  r#  r     s   r   aten::arangec           
        s  t  r jdg|R  S tjdd }tj fdd}t|dks)t|dkrpt|dkr2d }n||d }t j |d	 |d
\}}}}t  |d	g}||}t  t	 t
 ||d d dg}	 jd|	t| dS t|dks|t|dkrt|dkrd }n||d }t j |d	 |d |d |d\}}}}t  |d	g}t  |d	g}t  |d	g}| d d|||}t  t	 t
 |d d d dg}	 d d|	||}	 jd|	t| dS t|dkrO||d }t j |d	 |d |d\}}}}t  |d	g}t  |d	g}| d||} dt  t	 t
 ||g|dd  R  dg|}	 jd|	t| dS t ddt| dS )Nr   c                 S  s   t | d} | S )Nr  )r   r  r{  r"  r"  r#  _get_arange_dtype  s   z!arange.<locals>._get_arange_dtypec                   s.   t | r jd d| tjj d} | S )Nrl  rt  rm  )r   ru  r'  r   rr  rq  rw  )range_tensorr  r"  r#  _float_step_convert  s   


z#arange.<locals>._float_step_convertr  r  rH  r   )r  r|  rl  rm  r-  r]  r  )r  r  r  r|  rk  rQ  rF  rI  rs  )r  r  r|  r6  r8  r9  )r   r  r  r   r  rV  _arange_cast_helperr  rU  r   r   r'  r   rr  rw  r  )
r+  rX  r7  r9  r|  r  r  r  r8  arange_tensorr"  r  r#  r     st   
	
&r   zaten::linspacec           
      C  sT   t | |d }t| t| ||t| || jdtjdtjdd}	t| t	| ||	|S )Nr]  rH  r{  r^  )
r   _arange_helperrF   r   r'  r`  r   r  r   r   )
r+  r  r  stepsr|  r  r  r  r8  r  r"  r"  r#  r~     s   
 r~   z
aten::liftc                 C  r  r  r"  r  r"  r"  r#  rx     r  rx   zaten::masked_fillc                 C  s6   | j d|tjjd}t|}|  d|t|||S )zImplement the masked_fill functionality available for a pytorch tensor in ONNX.

    Fills elements of the input tensor with `value` where `mask` is True.
    rl  rm  r  )r'  ro  rp  r6  r   rN  r  r+  r?  maskrc  r"  r"  r#  r     s   
r   zaten::masked_fill_c                 C  r*  r  )r   r>  r"  r"  r#  r     r  r   aten::indexc                   s0  t  rjd|ddS t |rt |}n|g}tjfddfdd|D }t|dkr@t jd	|d	 d
dS dd t	|D  t d	krQS t dkrdt
 d	 | d	  S t }|d u rtt ddS tdtj d t }tfddt|D jd  fddt|D  djd|d| d  } d  }t|d ddD ]}d| |  |}	d||	}d| |  }qt
d	|t|}
 tt d	  d d krzjdtdgdg fddt|D  }jdg|R dd	i}t |ttd d	 d d	g tt d	 d || d  }jd|dfd dt d	 D |
g  fd!dt d	 |D  }jdg|R dd	i}njd|
g fd"dt|D R dd	i}t |S )#Nrm   r  )r=  c                   sh   t | s2tj| tjjtjjkst | r2 jdk r"t	
dtd t  t | dg} | S )Nr  z?Exporting masked indices are only supported after ONNX opset 9.zExporting aten::index operator with indices of type Byte. Only 1-D indices are supported. In any other case, this will produce an incorrect ONNX graph.rH  )r   r  r   rr  rs  rt  r  rS  r  r   ri  r&  r'  rU  r   )rm   r  r"  r#  try_mask_to_index  s$   

z index.<locals>.try_mask_to_indexc                   s   g | ]} |qS r"  r"  )r  r  )rA  r"  r#  r  %  r  zindex.<locals>.<listcomp>rH  r   F)apply_reshapec                 S  s   g | ]\}}t |s|qS r"  )r   r  )r  r  r  r"  r"  r#  r  =  s
    r@  zoperator of advanced indexing on tensor of unknown rank. Try turning on shape inference during export: torch.onnx._export(..., onnx_shape_inference=True).z=Exporting aten::index operator of advanced indexing in opset z is achieved by combination of multiple ONNX operators, including Reshape, Transpose, Concat, and Gather. If indices include negative values, the exported graph will produce incorrect results.c              
     s0   g | ]} j d  j dt|gdddqS )r$  r]  r^  r   rX  )r'  r`  r  r  rE   )r+  shape_tensorr"  r#  r  \  s    r
  c                   s   g | ]}| vr|qS r"  r"  r  )adv_idx_indicesr"  r#  r  j      r  r  rX  r  r  rI  rF  r]  r^  c                      g | ]
}| vr| qS r"  r"  r  rE  dim_tensor_listr"  r#  r    s    r6  r7  c                   s   g | ]} | qS r"  r"  r  )rI  r"  r#  r    r  c                   rG  r"  r"  r  rH  r"  r#  r    
    c                   rG  r"  r"  r  rH  r"  r#  r    rJ  )r   r  r  r  r  r   r  rV  r  ri  rl   r  r  r&  r'  r   ru  r4  r  r'  r9  r`  r  r=  )r+  r?  rm   r)  r  adv_idx_countcum_adv_index
multiplierr  	adv_indexcum_adv_index_shape_tensorfolded_adv_idx_shape_listfolded_adv_idx_shapeadv_idx_permutefinal_shape_listfinal_shaper"  )rE  rI  r+  r?  rD  rA  r#  rm     s   

	


	rm   zaten::linalg_normordOptional[Sequence[int]]r|  c                 C  s   d }|d u r>t |rt | |dg}| jdtdgd}t |}|d u r.t dd|S |dkr9t |d}n!d	dg}nt	|dkrZt |rT| jdtdgd}t |d}|ret
| |||||S t| |||||S )
Nr  r]  r  r^  rE   (Input rank must be known at export time.rH  rZ  r   )r   r  r=  r'  r`  r  r  r  r  rV  r|   rz   )r+  r?  rU  rE   r  r|  	ord_valueself_dimr"  r"  r#  r{     s(   



r{   zaten::linalg_vector_normc                 C  s   t | |||||S r  )r   _linalg_vector_norm_helper)r+  r?  rU  rE   r  r|  r"  r"  r#  r|     s   r|   zaten::linalg_matrix_norm	List[int]c              	   C  s  t |d}|dkrt| |||S |dkrt dd|S t |d}|d u r-t| |||S |dks5|dkr<t dd	|S t |}|d u rLt dd
|S |d dk rZ|d  |7  < |d dk rh|d  |7  < |tjkss|tj kr|d |d |d< |d< |d |d kr|s|d  d8  < t j| | d||d g|d}|dkrt	| || jdt
|d gd|d\}	}
|	S t| || jdt
|d gd|d\}	}
|	S )Nre  fronuczlinalg.matrix_normzord==nucrZ  r  r  zord==2rW  r   rH  r  r  r]  r^  )r  r  )r   r  rY   r  r  r  infr  r'  r   r`  r  r   )r+  r?  rU  rE   r  r|  rX  rY  r  r  r)  r"  r"  r#  rz     sR   


rz   zaten::linalg_crossr  c                 C  r*  r  )rB   )r+  r3  rD  rE   r"  r"  r#  ry     r@  ry   zaten::frobenius_normc                 C  s,   |  d||}tj| |||d}|  d|S )NrI  r  r  )r'  r   r  )r+  r?  rE   r  sqrsumsqrr"  r"  r#  rY   &  s   rY   zaten::multinomialc                 C  sZ   |d urt |st dd| |s|dkrt dd| t| |}| jd|tjj|dS )NMultinomialz*generator is not supported for multinomialrH  zGreplacement=False when num_samples > 1 is not supported for multinomial)r   sample_size_i)r   r  r  r   r'  ro  rp  rq  )r+  r3  num_samplesreplacementr  	log_inputr"  r"  r#  r   /  s"   
r   zaten::baddbmmc           
      C  s\   t j|}t| ||}t| || jd|| d}t| || jd|| d}	t| ||	S rG  )r   rr  rs  r   r   r'  rw  r   )
r+  r?  batch1batch2r  rP  ry  	batch_mulmul_amul_br"  r"  r#  r%   I  s   r%   zaten::meshgridindexingOptional[str]c                   s:  |d u rd}n|dvrt d| |t|}|dkr(|dd d |d d<  fdd	|D } fd
d	|D } jdg|R ddi}g }t|D ]6\}}	 jdtjdtjddgt	| }
|| |
|< t
 |	 jdg|
R ddi}| d|| qL|dkr|d |d |d< |d<  jdg|R  S )Nij>   rm  xyzUnsupported indexing: rn  rH  r  r  c                   s,   g | ]}t  | jd tdgdqS )r]  r  r^  )r   r=  r'  r`  r  r  r  r"  r#  r  h  s    zmeshgrid.<locals>.<listcomp>c                   s   g | ]}  d |qS )r0  r1  r  r  r"  r#  r  n  rF  r6  r7  r   r]  r{  r^  r  prim::ListConstruct)r   ri  r   r  r'  ri  r`  r   r  rV  r;  r  )r+  r  rk  unpacked_tensor_listr  tensors_shape	out_shaperx  r  r   r  
t_reshapedr"  r  r#  r   [  s2   


 r   zaten::remainderc                 C  s(   t | ||}| d||}| d||S )NrI  rQ  )rg  r'  )r+  r3  rD  rF   quor"  r"  r#  r   }  s   r   z
aten::geluapproximatec                 C  s"  |dkrXt dt j }d}tj|tjd}tj|tjd}tjdtjd}tjdtjd}t| |t| ||}	t| |t| |t| ||	}
t| |t| |t| || d|
S d}| d	| d
|tj|tjd}t| || jdtjdtjdd}t| t| ||| jdtjdtjddS )Nr   r  gHm?r{  r[        ?r  g;f?r  rk  r]  rH  r^  )	r  r   r  r`  r   r  r   r   r'  )r+  r?  ru  kBetakKappar  kappar  half	self_cubeinner_sqrt2rO   erf_plusoner"  r"  r#  r^     s(   $"
r^   zaten::group_normc              
   C  s  t  r| jd||||||dS t |d}|d ur"|| dks"J t |}|d u r2t dd|S d|dg}	t | || jdt	|	d}
| jdtj
d	g| tj| d
d}| jdtj
dg| tj| d
d}| jd|
|||d}t | || d|}|d u s|  rtj
d	gtj| d
}| jd|d}|d u s|  rtj
dgtj| d
}| jd|d}ttd|d }t| t| |t | ||t | ||S )Nra   )num_groups_ir  cudnn_enabled_irH  r   zunknown input rankr  r]  r^  r[  r{  r  r  r  r0  )r   r  r  r  r  r  r=  r'  r`  r  r   r   rr  rs  r|  r  
mustBeNoner9  r  r   r   r  )r+  r3  
num_groupsr(  rR  r}  rX  r  
input_rankr:  r  r  r  norm_reshapedr   r  r  r  r"  r"  r#  ra     sl   



ra   zaten::_weight_normc                 C  s   t |}|d ur:tt|}|d ur$|dk r||7 }|dkr$|| t| |d|d}| d||}| d||S t  rG| jd|||dS t	
d|)	Nr  r  rH  rk  rI  _weight_normr  zDUnsupported: ONNX export of _weight_norm for tensor of unknown rank.)r   r  r9  r  remover   r'  r  r  r   ri  )r+  r  weight_grE   r  r  norm_vrF   r"  r"  r#  r    s"   

r  z	aten::dimc                 C  r  )zFImplement the dim functionality available for a pytorch tensor in ONNXr0  Sizer1  r>  r"  r"  r#  rE     s   zaten::__contains_c                 C  s`   t |}tdd |D r*t |r*| jdtt | ddd |D v dS t	
d|)Nc                 s  s    | ]}t |V  qd S r  )r   r  r  r"  r"  r#  r    s    

z__contains_.<locals>.<genexpr>r]  rc  c                 s  s     | ]}t | d V  qdS )rc  N)r   rM  r  r  r"  r"  r#  r    s    r^  zJUnsupported: ONNX export of __contains__ for non-constant list or element.)r   r  r  r  r'  r`  r   rM  r  r   ri  )r+  r?  elementunpacked_listr"  r"  r#  __contains_  s$   
r  zaten::__getitem_c                 C  s    t | || jdtdgd|S ru  )r   r'  r`  r   )r+  r?  r  r"  r"  r#  
__getitem_&  r  r  z
aten::itemc                 C  r  r  r"  r  r"  r"  r#  rr   ,  r  rr   z
aten::takec              
   C  sD   t | || jdtjdgtjdd}t| |d|}t| ||}|S )Nr]  r  r{  r^  r   )r   r=  r'  r`  r   r  rl   r   )r+  r?  rm   self_flattenedrx  r"  r"  r#  r   2  s   r   c                 C  s&   t | ||}t| |}t| ||}|S r  )r   rP   r   )r+  r3  targetdiff_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 ru  )	r   r   r   r  rb   r'  r`  r   r  )	r+  r3  r  log_r  
output_poszeros_mask_r  r"  r"  r#  _kl_div_non_log_target_implE  s   

r  zaten::kl_divc                 C  sf   |r	t | ||}nt| ||}|dkr|S |dkr!| jd|ddS |dkr-tj| |ddS td|S )Nr   rH  r  r  r  z4kl_div with reduction other than none, mean, or sum.)r  r  r'  r   r  r  )r+  r3  r  	reduction
log_targetr  r"  r"  r#  rs   P  s   rs   zaten::mse_lossc                 C  sd   t | t| ||t| ||}|dkr|S |dkr | jd|ddS |dkr,tj| |ddS td|S )Nr   rH  r  r  r  z6mse_loss with reduction other than none, mean, or sum.)r   r   r'  r   r  r  )r+  r3  r  r  r  r"  r"  r#  r   e  s   r   zaten::as_stridedc                 C  s  t |d}t|}t | || jdtjdgtjdd}t |s`tjdgtj	d}t
t||D ]\}\}	}
dg| }d||< |t|	||
  }q2|rT|| }| d|| jd|dS d }t
|D ]Y\}}
dg| }d||< t| || jdtdgd| jdt|d}	t | t| |	d	d d d | jdt|d}| d
|| jdt|
gd}|d u r|}qf| d||}qf|r| d|| dt|g}| d||S )Nr  r]  r  r{  r^  r   rH  r$  r-  rI  rF  )r   r  rV  r=  r'  r`  r   r  rJ  r  ri  r  r   r  r   )r+  r?  r  stridesoffsetr  self_1dindr  r   r  r_sizetmp_indr"  r"  r#  r    v  sL   


r    zaten::__derive_indexc              	   C  s   |  d||  d||S )NrF  rI  r1  )r+  rm   r  r  r"  r"  r#  __derive_index  s   r  zaten::__range_lengthc                 C  s6   |  d||}|  dt| ||}| j d|tjjdS )NrQ  rt  rl  rm  )r'  r  ro  rp  rq  )r+  lor  r  r   rF   r"  r"  r#  __range_length  s   r  zaten::linearc                 C  s   t |}t| |}|dkr9|  s9| jdtjdtjdd}| jdtjdtjdd}t	| |||||}|S t
| ||}|  sKt| ||}|S )Nr  r]  rH  r{  r^  )r   r  r   r  r  r'  r`  r   r  r   r   r   )r+  r3  r(  rR  r  rP  r  r  r"  r"  r#  r}     s   

zaten::hann_windowOptional[int]c              	   C  s   |d u rt  }|r|jst j}tj|}	nt|}	t| |dd d d }
| jd|
t	j
jd}t| | jdt jtjt jdd|}|du rVt| || jdt jdt jdd}t| ||}| jdt| t| ||	 d}|S )	Nr-  rl  rm  r]  r{  r^  FrH  )r`  r  ro   r  r   rr  
from_dtyper   r'  ro  rp  rv  r   r   r  r  r   r<  rF   r   r   rw  )r+  window_lengthperiodicr|  r  r  r  r(  dtype_ry  n_arrayr  r"  r"  r#  rc     s,   

rc   zaten::mvc                 C  r  r  r   )r+  r?  vecr"  r"  r#  r     r5  r   z	aten::dotc                 C  r  r  r  rT  r"  r"  r#  rG     r5  rG   zaten::movedimc           
      C  s   | d}| d}| | ksJ ||k r|S t|}|d us'J tt|}| }| }t|	 |	 D ]\}}	|||	< d||< d||	< q>dd |D }dd |D }t||D ]\}}	|||	< qb| j
d||dS )Nr  c                 S     g | ]}|d kr|qS r  r"  rC  r"  r"  r#  r    rF  zmovedim.<locals>.<listcomp>c                 S  r  r  r"  rC  r"  r"  r#  r    rF  r
  r  )r  r   r  r   r  r9  r  r  r  tolistr'  )
r+  r?  r  destinationri  r  src_dimsdst_dimsr!  dstr"  r"  r#  r     s&   




r   z
aten::fillc                 C  s    t j|t jj}t| |||S r  )r   rr  rs  rv  rZ   )r+  r?  rc  ry  r"  r"  r#  rT   %  s   rT   zaten::index_addc                   s  t d |rtt|dkrtdd|S t d  d u r(td|t	|}t	|}|d u s:|d u r@td|||krZ|| }t
|D ]}	t| |t	|g}qLt| }
t| }|
d urx|d urx|
|krxtd|tt
|}d	d
 t
|D } fdd
t
|D }tj| ||||d}t| ||}t
 D ]
}	t| |dg}qt
|  d D ]}	t| |t	|g}qt| | t| |||S )NzyWarning: ONNX export does not support duplicated values in 'index' field, this will cause the ONNX model to be incorrect.rH  rh   z
alpha != 1r  zXONNX export does NOT support exporting 'index_add_()' function with unknown 'dim' value.z~ONNX export does NOT support exporting 'index_add_()' function while the rank of self tensor or tensor to be added is unknown.zoONNX export does not support exporting 'index_add_()' function with duplicated values in 'index' parameter yet.c                 S  r  r  r"  r  r"  r"  r#  r  c  r  zindex_add.<locals>.<listcomp>c                   s   g | ]}| krt jnd qS r  )sysmaxsizer  rE   r"  r#  r  d  s    rW  r   )r&  r'  r   rM  rN  r  r  r   ri  r  r  r  r  r9  rY  rQ   r   )r+  r?  rE   rm   rD  rP  self_dim_rankother_dim_rankdeltar  other_dim_sizeself_dim_sizenew_shape_axesnew_shape_startsnew_shape_endsr  r"  r  r#  rh   /  s\   


rh   z
aten::rollc                 C  s   t |t |ks
J |}tt |D ]A}g }tj| ||| g||  gtjgd}|| tj| ||| gdg||  gd}|| | jdg|R d|| i}q|S )NrW  r   r6  r7  )rV  r  r   rY  r  r  r  r'  )r+  r?  shiftsr!  r  r  r  r:  r"  r"  r#  r   v  s   

r   zaten::crossc                 C  sp   t ||}t| |dg|g}t| |dg|g}t| |dg|g}t| |dg|g}t| t| ||t| ||S )Nr  rH  )r   _get_dim_for_crossr   r   r   )r+  r3  rD  rE   roll_x_1roll_y_1roll_x_2roll_y_2r"  r"  r#  rB     s   rB   zaten::cdistr  #use_mm_for_euclid_dist_if_necessaryc                 C  sR   t |}|d usJ t | ||d g}t | ||d g}t| |||dddS )NrH  r  gư>F)r}  r  )r   r  r  r   )r+  r  r  r  compute_moder  broadcasted_x1broadcasted_x2r"  r"  r#  r/     s   
r/   z
aten::lerpc                 C  sx   |  d||}t| |  d|| j dtdd|  d||  d|||  d||  d||  d| j dtdd|S )	NrQ  r  r]  rv  r^  rF  rI  r[  )r'  r  r`  r   )r+  r?  r  r(  diffr"  r"  r#  rw     s   rw   zaten::broadcast_tensorsc                   sT   t |}t |d |D ]}t |q fdd|D } jdg|R  S )Nr   c                   s   g | ]}t  |qS r"  )rQ   r  r+  t_with_final_shaper"  r#  r    rF  z%broadcast_tensors.<locals>.<listcomp>ro  )r   r  r  r   r'  )r+  r?  all_tensorsr   t_listr"  r  r#  r+     s   
r+   zaten::is_pinnedc                 C     d S r  r"  )r+  r?  r  r"  r"  r#  rp     r  rp   prim::ConstantSplitc                 C  s^   t ||}|d u rt dd|S |g||  }|| }|r#|| | jd|||t|dS )Nr  rC  rD  rE  )r   r  r  r  r'  rV  )r+  r?  rI  rE   r   rJ  rK  r"  r"  r#  r     s   
r   prim::ConstantChunkc                 C  s@   t ||}|d u rt dd|S || d | }t| |||S )Nr  rC  rH  )r   r  r  r   )r+  r?  rG  rE   rf  rI  r"  r"  r#  r     s   r   zprim::shapec                 C  r.  r/  r1  r  r"  r"  r#  r     r5  r   z	prim::maxc                 C  s   t j| d||ddS )Nr  r  ro  rq  rT  r"  r"  r#  r     s   
r   z	prim::minc                 C  sB   |st |rt| || jdtdgd}t| |S t| ||S ru  )r   r  r   r'  r`  r   r   rT  r"  r"  r#  r     s
   

r   z
prim::datac                 C  r  r  r"  r  r"  r"  r#  r     r  r   zprim::layoutc                 C  s   | j dtddS ru  r  r  r"  r"  r#  r      rL  r   ro  c                 O  r  r  r"  r+  r  r  r"  r"  r#  r   '  r  r   zprim::ListUnpackOptional[List[_C.Value]]c                 O  s2   t |dkr|d   dkrt|d S d S )NrH  r   ro  )rV  r  r  r   r  r  r"  r"  r#  r   -  s    r   zprim::TupleConstructc                 O  r  r  r"  r  r"  r"  r#  r   :  r  r   zprim::Uninitializedc                 O  r  r  r"  r  r"  r"  r#  r   @  r  r   zprim::unchecked_castc                 C  r  r  r"  r  r"  r"  r#  r   J  r  r   zprim::dtypec                 C  s.   t |}|d u rtjj}| jdt|dS r\  )r   r  r   rr  rv  r'  r`  r   )r+  r?  ry  r"  r"  r#  r   P  s   
r   prim::tolistc                 C  s&   t |d}|dkrt dd|S |S )ztolist is currently supported only for 1D input tensors.

    dim_val and elem_ty_val represent dimension and type annotations
    that need to match dimension and type of the input tensor.
    r  rH  r  zdim_val > 1)r   r  r  )r+  r3  dim_valelem_ty_valrE   r"  r"  r#  r   Z  s   r   r\  Nonec                 O  s>   | j   }t|tjrd S tdd|  d| j  S )Nr\  z,output type should be 'DeviceObjType', not '')	original_noder  r  r8  r	   r$  r   r  r  )r+  r  r  output_typer"  r"  r#  r   k  s   r   z
prim::LoopList[_C.Value]c              	   O  s(  | j }| j}| j}| j}tj}tj}t| }	t	j
| dg|R | t|	d\}
}}t|	|D ]M\}}t| D ]6\}}|dkrS|t|k rS|||   |dkrr|d t|k rrt| tjsr|||d    q<tj||j|||d q2tj||}tjrtj||| |S )NLoopr.  n_blocksr   rH  F)r  envvalues_in_envparams_dictr   r>  ru  r  blocksr   add_op_with_blocksoutputsSizerV  r  ri  r  r(  r  r8  r	   r)  r`  _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  r>  opset_version
old_blocksnew_op_outputsnew_block_contextsnew_node	old_blocknew_block_contextr  b_infixed_outputsr"  r"  r#  r   y  sP   r   zprim::Ifc              	   O  s  | j }| j}| j}| j}| j}tj}tj}	|d  	 dk}
|
rt
|d  d }t|tr6t|nt|}|r>dnd}t| | }tj|||||d}t| }t| }g }tt|D ]!}|| |vr}td||  d|| |||  }|| qg|S t| }tj| dg|R | t|d	\}}}t||D ]\}}tj||j|||d
 qtj ||	}tj!rtj"|||	 |S )Nr   r#  rc  rH  TzThe sub block ATen output z is not in env.Ifr  F)#r  r  r  r  r  r   r>  ru  r  r  r   rM  r  r8  r9  r  r  r  r`  r	   r  r.  r  rV  r   ri  r  r  r   r  r  r  r  r  r  )r+  r  r  r,  r  r  r  r  r>  r  	static_if
input_flagr3  	block_idx	current_bif_output_listcurrent_b_listfinal_b_listr  onnx_br  r  r  r  r  r  r  r"  r"  r#  r     sv   r   r&  c                   s(   j }| r	d S t|  tjrd S |ddkr' jdt	
|ddS |ddkr9 jdt	
|ddS |  tj sQ|  tj r_ jdtt	
|ddS |  tj r fddt	
|dD } jd	g|R  S td
|d dtj d| )Nrc  r   r]  r^  re  value_sc                   s   g | ]	} j d |dqS )r]  r  r1  )r  re  r  r"  r#  r  "  s    z!prim_constant.<locals>.<listcomp>ro  z"Unsupported prim::Constant kind: 'z'. Please send a bug report at .)r  r  r8  r  r  r	   r$  r%  r'  r   rM  r^  r_  r`  ofFloatsr`  r   	ofStringsr   ri  r
   PYTORCH_GITHUB_ISSUES_URL)r+  r  r  r  str_constantsr"  r  r#  r     s8   

r   
prim::typedevice_valuec                 O  sJ   |   dkrt|   }|d ur| jdt|dS tdd|S )Nr\  r]  r  r  z,Device type cannot be statically determined.)	r  r  r   get_device_from_valuer3  r'  r  r   r  )r+  r  rX  r  r  r"  r"  r#  r   /  s   r   zonnx::Placeholderc                 O  s*   | j }| j}| j}| j}tj||||S r  )r  r  r  r  r`  r	   '_jit_onnx_convert_pattern_from_subblock)r+  r  r  r  r  r  r  r"  r"  r#  r   >  s   r   zaten::resolve_conjzaten::resolve_negc                 C  r  r  r"  r2  r"  r"  r#  r
  K  s   	r
  zaten::_conjzaten::conj_physicalc                 C  s    t |rt d|S t| |S )Nz aten::_conj, aten::conj_physical)r   is_complex_valuer  r
  r2  r"  r"  r#  r	  W  s   
	
r	  zaten::logitc                 C  s   | j dtdd}t|sC| j d|tj| d}|  d||}|  d||}|  d|||}|  d	||}|  d|||}n|}|  d||}	|  d
||	}
|  d|
S )Nr]  r[  r^  rl  rm  rQ  r  r  r  rk  r  )	r'  r`  r   r   r  r   rr  rs  rw  )r+  r?  r}  r  one_sub_epsself_less_equal_one_sub_epstemporary_selftemporary_self_less_epszr   rF   r"  r"  r#  r   k  s   
r   )r  r  )r+  r-  r  )r[  )T)r  r  r  r  r  r  r  )F)r+  r-  r3  rx  ry  r  rz  r  )rE   r<  )r+  r-  r3  rx  r   rx  )
r+  r-  r3  rx  r   rx  r6  rx  rc  rx  )r  r  rE   r<  r  r  )r   r   r  r   )NNN)r+  r-  r3  rx  r  r  r(  rx  rR  rx  r}  r  r  r  )r+  r-  r3  rx  r  r  r(  rx  rR  rx  r}  r  r  r  r  rx  )
r+  r-  r  r  r|  r   r}  r   rX  r  )FF)NN)FN)NNNFN)NNF)r+  r-  r?  rx  rH  r  rI  r  )r  r  )NNFN)r+  r-  r3  r  rE   r  r  r  )r+  r-  r?  r  rU  r  rE   rV  r  r  r|  r  )r+  r-  r?  r  rU  r  rE   rV  r  r  r|  r  )r+  r-  r?  r  rU  r  rE   r[  r  r  r|  r  r  )NF)r+  r-  rk  rl  )r  )r+  r-  r?  r  ru  r  )TNNNNF)r+  r-  r|  r  )r  r  )r+  r-  r  r  )r+  r-  r  r  )r+  r-  r  r  )r+  r-  r  rx  )r+  r-  r3  rx  )r+  r-  r?  r  r}  r  (r  __doc__
__future__r   r  r  r  r  r&  typingr   r   r   r   r   r   r`  torch._C._onnxr	   _onnxro  torch.nn.modules.utils
torch.onnxr
   r   r   r   r   torch.onnx._globalsr   torch.onnx._internalr   r   r   torch.typesr   r  partialonnx_symbolic_onnx_symbolicr%  r  r  r4  r;  r  r   r   r   r   r   r   rF   r  r   rW  rh  rg  rV   rX   r  r   r.   r   r  r   r*   r   r   r   r   r   r   r   r@   r   r"   r   r#   r$   r   r   r  _apply_paramsr  rC   r  r  r   r   rR   r,   rQ   rK   rJ   r   r   r   r  r  r  r   r  r   r  r  r   r   r   r   r   r   r   r   r0   rW   rw  r   rv   r`   r   r   r_   nnmodulesutils_single_pair_tripler  r   r   r   r  r  r  r  r5   r  r   r   r   r
  r  r(   r)   r  r  r"  rN   r   rb   r)  r   r/  r]   ru   r1  r2  r3  r   r   r   r   r>  rA  r  r   rJ  r\  rb  r?   r;   r<   r=   r8   r9   r:   r&   r   rt   rn   r  rI   r   rl   rk   rj   ri   r-   r  rA   r   r4   r   r   r   r   r   r3   r2   r1   r   r   r   r   r   r   r   rP   rH   r  r   r7   r  r  
deprecatedr  r  r  r  r  r  r  r  r  rM   rL   r   r   r   r!   r  r  r   r  r   r   r   r[   rZ   r   rS   r   rg   rf   re   r   rd   r   r   r  r   r   r   r>   r   r   r   r   r   r  r  r  r   r   r  r  rD   r6   r  r  r   r   r   r   r   r   r   r'   r   rO   rU   r   r   rq   r  r  r   r   r   r   r   r   ro   r)  r*  r   r\   r1  r   r  r  r   r   r   r~   rx   r   r   rm   r{   r|   rz   ry   rY   r   r%   r   r   r^   ra   r  rE   r  r  rr   r   r  r  rs   r   r    r  r  r}   rc   r   rG   r   rT   rh   r   rB   r/   rw   r+   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r	  r   r"  r"  r"  r#  <module>   s     


&
5	


!
>	

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

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