U
    <c                  4   @   sz  d Z ddlZddlZddlZddlmZmZmZ ddlZddlm	Z	 ddl
mZ ddlmZ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
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<g4Zejejd=d>Zd?d@ Z edAe!dBe"dCdDdDej#ej$e	j%e&e&dEdFdZ'edGej#ej$dHdIdZ(edJe"dCdCej#ej$dHdKdZ)edLe"dCdCej#ej$dHdMdZ*edNej#ej$dHdOd-Z+edPe!dBe"dCdQdCej#ej$dHdRd2Z,edSej#dej$dHdUdZ-edVe"dCdQej#ej$dHdWd)Z.edXe dYdZd[gd\ed]e d^d_d[gd\ed`e dadbd[gd\edce dddZdegd\edfe dgd_degd\edhe didbdegd\edje dkd_dlgd\ej#e/e0e/dmdndoZ1edpe!dBdTdTdTdTdTdTej#ej$dHdqdrZ2edse"dCdQdCdCej#dej$dHdtdZ3edue"dCdQdCdCej#ej$dHdvd1Z4edwe"dCdQdxej#dej$dHdydZ5edzej#ej$dHd{d$Z6ed|ej#ej$dHd}d#Z7ed~ej#ej$dHddZ8edej#ej$dHddZ9edej#ej$dHddZ:edej#ej$dHdd
Z;edej#dej$dHdd	Z<edej#ej$dHddZ=edej#ej$dHdd*Z>edej#ej$dHddZ?edej#ej$dHddZ@edej#ej$dHdd8ZAede"dCdQdQdQej#ej$dHddZBede dejCjDjjEgd\ede dejCjDjjFgd\ede dejCjDjjGgd\ej#dd ZHede"dCdQdQdQdQej#ej$dHdd;ZIede"dCdCdQdQdQdxej#dej$dHdd9ZJede"dCdQdQdxej#dej$dHdd4ZKede"dCdQdQdxej#dej$dHddZLedej#ej$dHdd0ZMedej#ej$dHdd.ZNede"dCdCdQdQej#dej$dHdd6ZOede"dCdCdQdQej#d ej$dHdd5ZPede"dCdQdQej#dej$dHdd:ZQej#ej$dHddZRedej#dej$dHddZSedededej#ej$dHdd,ZTedededej#ej$dHdd/ZUedej#ej$dHdd(ZVedej#ej$dHdd ZWedej#ej$dHdd"ZXedăej#ej$dHddZYedƃe"dCdQej#ej$dHddȄZZedɃej#dej$dHdd3Z[ed˃ej#dej$dHdd7Z\ed̓ej#ej$dHdd<Z]edσej#ej$dHdd%Z^edуej#ej$dHddZ_edӃej#ej$dHddZ`edՃej#ej$dHddZaed׃ej#ej$dHddلZbedڃej#ej$dHdd܄Zcej#ej$dHddބZdej#ej$dHddZeej#ej$dHddZfede"dCddddej#ej$dHddZgedej#ej$dHdd&Zhede!dBdTdTe"dCdQdQej#ej$dHddZiede"dCdDdddCej#ej$eee0  ejddd!Zkede"dCdCdCdQdQdQdCdQdQ	ej#ej$dHddZlede"dCdCdDdDej#ej$dHddZmedej#ej$dHddZnedej#dej$dHdd'Zoedej#ej$dHdd+ZpdS (  z(This file exports ONNX ops for opset 11.    N)OptionalSequenceUnion)_C)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset10symbolic_opset9utils)GLOBALS)	_beartype	jit_utilsregistrationaddappendarangeargsortcatchunk	clamp_max	clamp_minclampconstant_pad_ndcumsumDeleteembedding_bagembedding_renormflattengatherhardtanhim2col
index_fillindex
index_copy	index_putinsert
linalg_detlinalg_vector_normlogdetmasked_scattermasked_selectmmnarrownormalpadpixel_shufflepopprim_constant_chunkreflection_padrelu6	remainderreplication_padroundscatterselectsizesortsplit_with_sizessplitsqueezestacktopkunbind
unique_dim	unsqueeze   )Zopsetc                     s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                    s
   |  S N )fnargskwargsrG   ?/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/symbolic_opset11.py_applyV   s    z_apply_params.<locals>._applyrG   )rJ   rK   rM   rG   rI   rL   _apply_paramsS   s    rN   zaten::hardtanhTvf)gselfmin_valmax_valc                 C   sx   |   }|d krtjj}ntj|}| jdtj||	 dd}| jdtj||	 dd}t
j| d|||ddS )NConstantdtypeZvalue_tClip   Zopset_before)type
scalarTyper   JitScalarTypeFLOAT	from_nameoptorchtensorrW   opset9_op_with_optional_float_cast)rQ   rR   rS   rT   rW   scalar_typerG   rG   rL   r!   \   s(    
     zaten::clamprQ   c                    s   |   }tj fdd}|d k	r:|||}|||}t|rPt ||S t|rft ||S t|dkrt|dkrt	j
 d|||ddS t t |||S d S )Nc                    s6   | d k	r.t | s. jd| tj| dS | S d S )NCastZto_i)r	   _is_nonera   r   r^   r`   	onnx_type)rc   rW   rg   rG   rL   _cast_if_not_nonex   s    z clamp.<locals>._cast_if_not_noner   rY   rZ   r[   )r\   r]   r   beartyper	   rj   r   r   _get_tensor_rankrd   re   )rQ   rR   minmaxrW   rl   rG   rg   rL   r   s   s.    




     zaten::clamp_minc                 C   sn   |   }| jd|tj| d}t|dkrVt	
| }t	j| d|||ddS t	j| d||ddS d S )Nrh   ri   r   rY   rZ   r[   ZMaxr\   r]   ra   r   r^   r`   rk   r	   rn   rd   Zunusedre   )rQ   rR   ro   rW   rp   rG   rG   rL   r      s    
     zaten::clamp_maxc                 C   sn   |   }| jd|tj| d}t|dkrVt	
| }t	j| d|||ddS t	j| d||ddS d S )Nrh   ri   r   rY   rZ   r[   ZMinrq   )rQ   rR   rp   rW   ro   rG   rG   rL   r      s    
     zaten::relu6c                 C   s   t j| d|dd}|  }|d kr0tjj}ntj|}| jdt	j
d| dd}| jdt	j
d| dd}t| |||S )	NZRelu   r[   rU   r   rV   rX      )rd   re   r\   r]   r   r^   r_   r`   ra   rb   rc   rW   r   )rQ   inputZrelu_rW   rf   rS   rT   rG   rG   rL   r5      s    
zaten::selectic                 C   s   | j d|||dS )NGatheraxis_ira   )rQ   rR   dimr$   rG   rG   rL   r:      s    zaten::index_putFc                    s  t |rt |}n|g}t  rD|g| ||g }jd| S t |d}t|dkr`|S t|dkr tt|D ]&}t || rz	d|| ||< qz|d }|dd  D ]}	t
||	}q	d|  fdd|D }j	d|d
di}np|d }|}
t |
rTt |}|d k	rF|dkrFt
||
|S t||
|S 	d| t |dg}t j	d|dgt|gtjgd}j	d	 |dd}t |}|d k	r|dkrt
||d }t ||}|  }|d k	r*||  kr*j	d|tj| d}tj|}|rj	d	d|tjdg| dd}	d|||}t||}n	d|||}|S )Nr&   br      ZNonZeroShapec                    s(   g | ] }t t| d dgqS )N)r	   _unsqueeze_helperrd   expand).0indZbroadcast_index_shaperQ   rG   rL   
<listcomp>   s     zindex_put.<locals>.<listcomp>Concatrx   r~   )axesstartsendsrw   rh   ri   ConstantOfShaperV   rX   	ScatterND)r&   )r   )r	   _is_packed_list_unpack_listis_caffe2_aten_fallbackat
_parse_arglenrange_is_boolra   rd   r   rn   Zmasked_fillr+   r   _slice_helpersysmaxsizer   _reshape_helperr\   r]   r   r^   r`   rk   rb   rc   rW   )rQ   rR   Zindices_list_valuevalues
accumulateZindices_listrJ   Zidx_r$   r   Zbool_inprankZsub_data_shapeZvalues_shaperW   rf   zerosresultrG   r   rL   r&      sx    
(
 
   
  
zaten::pixel_shufflec                 C   s8   t |}|d k	r&|dkr&t ddS | jd||ddS )N   r1   zonly support 4d inputZDepthToSpaceZCRD)Zblocksize_imode_s)r	   rn   _unimplementedra   )rQ   rR   Zupscale_factorr   rG   rG   rL   r1   C  s    
zaten::upsample_nearest1dZupsample_nearest1d   Znearest)Zdecoratezaten::upsample_nearest2dZupsample_nearest2dr   zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dZlinearzaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZupsample_trilinear3dzaten::upsample_bicubic2dZupsample_bicubic2dZcubicnamerz   Zinterpolate_modec                 C   s   t | ||S rF   )r	   Z_interpolate_helperr   rG   rG   rL   _interpolateM  s    r   zaten::__interpolatec              	   C   s   t | ||||||S rF   )r	   Z__interpolate_helper)rQ   rt   r;   Zscale_factormodeZalign_cornersZrecompute_scale_factorZ	antialiasrG   rG   rL   __interpolaten  s          r   zaten::gatherc                 C   sD   t |drt ddS t  r2| d||||S | jd|||dS )Nru   r    zsparse_grad == TrueZGatherElementsrw   )r	   _maybe_get_constr   r   r   ra   )rQ   rR   rz   r$   Zsparse_gradrG   rG   rL   r      s
    zaten::scatterc              	   C   s   t  r| jd||||ddS |  }t |}t |rR| jd||||dS |  |kr| jd|tj	
|   d}| jd||t| |||dS d S )Nr9   srcoverload_nameZScatterElementsrw   rh   ri   )r	   r   r   r\   r]   _maybe_get_scalar	_is_valuera   r   r^   r`   rk   rd   	expand_as)rQ   rR   rz   r$   r   Zsrc_typerG   rG   rL   r9     s*    


    zaten::cumsumnonec                 C   sn   | j dtj|tjdd}|rX|  dkrXt|dd}| j d|t	|
 d}n|}|  d	||}|S )
NrU   rV   rX   zprim::Constantru   rW   rh   ri   ZCumSum)ra   rb   rc   intnodekindr	   
_get_constr   r^   rk   )rQ   rR   rz   rW   Z
dim_tensorZparsed_dtypecastZcsumrG   rG   rL   r     s      zaten::masked_selectc                 C   s$   t | t | ||}| d||S )NGatherND)rd   nonzeror   ra   )rQ   rR   maskr$   rG   rG   rL   r,     s    zaten::masked_scatterc                 C   st   t | t | ||}t| |tdg}tj| |tdgtdgt | |tdgdd}| 	d|||S )Nr~   r   Tr   r   r   Zdynamic_slicer   )
rd   r   r   r	   r   rb   
LongTensorr   r;   ra   )rQ   rR   r   sourcer$   rG   rG   rL   r+     s    

z	aten::lenc                 C   sT   t |s|  dkr&| d|S t| || jdtdgd}t | |dgS )Nzonnx::SplitToSequenceZSequenceLengthrU   r   rX   )	r	   _is_tensor_listr   r   ra   r;   rb   r   _squeeze_helper)rQ   rR   Zsz_0rG   rG   rL   _len  s    r   zaten::__getitem_c                 C   s4   t |r| d||S ddlm} || ||S d S )N
SequenceAtr   )
__getitem_)r	   r   ra   Ztorch.onnx.symbolic_opset9r   )rQ   rR   ru   getitemrG   rG   rL   r     s    
r   zaten::_set_itemc                 C   s   |  d||}|  d|||S )NSequenceEraseSequenceInsertry   )rQ   tensor_listru   rO   rG   rG   rL   	_set_item  s    r   zaten::appendc                 C   s   |  d||S Nr   ry   )rQ   rR   rc   rG   rG   rL   r     s    z	aten::addc                 C   sn   t |r^t |r^| }| dkr4t ddS t |}|}|D ]}| d||}qF|S t	| |||S )Nzprim::ListConstructr   z6does not support adding dynamic tensor list to anotherr   )
r	   r   r   r   r   r   r   ra   rd   r   )rQ   rR   otheralphaZtensor_list_nodeZtensorsltrG   rG   rL   r     s     
zaten::insertc                 C   s   |  d|||S r   ry   )rQ   rR   posrc   rG   rG   rL   r'     s    z	aten::popc                 C   s   |  d||S Nr   ry   rQ   r   rz   rG   rG   rL   r2     s    zaten::Deletec                 C   s   |  d||S r   ry   r   rG   rG   rL   r     s    z	aten::catc                 C   s:   t |rt| ||S t |dd}| jd||dS d S )Nru   rz   ConcatFromSequencerw   )r	   r   rd   r   r   ra   r   rG   rG   rL   r     s    
zaten::stackc                 C   s<   t |rt| ||S t |dd}| jd||ddS d S )Nru   rz   r   r|   rx   Z
new_axis_i)r	   r   rd   r@   r   ra   r   rG   rG   rL   r@   "  s    
zaten::_unique2c           	      C   s$   | j d||dd\}}}}|||fS )NUniquer   )sorted_ioutputsry   )	rQ   rR   sortedreturn_inversereturn_countsuindicesinverse_indicescountsrG   rG   rL   _unique2,  s       r   zaten::avg_pool1dZ
avg_pool1dzaten::avg_pool2dZ
avg_pool2dzaten::avg_pool3dZ
avg_pool3dc                    sl   t dddddddt dddddddtjd
tjtt tt t	ttt f ttd fdd	}|S )NTFrO   isru   r   )rt   kernel_sizestridepadding	ceil_modecount_include_padc           	   	      s   t |||| }t|ts"t|s*|}|rd| jd|| jdtd| d ddd}dt| }| jd	||||d |d
}|S )NPadrU   )r   r      rX   constantr   r   ZAveragePool)Zkernel_shape_iZ	strides_iZpads_iZceil_mode_i)	r	   Z_avgpool_helper
isinstancetupleAssertionErrorra   rb   rc   r   )	rQ   rt   r   r   r   r   r   Zdivisor_overrideoutputr   tuple_fnrG   rL   symbolic_fnD  s8         z_avg_pool.<locals>.symbolic_fn)N)
r	   quantized_args
parse_argsr   rm   r   Valuer   r   r   )r   r   r   rG   r   rL   	_avg_pool6  s    	 "r   zaten::unique_dimc           
      C   s&   | j d|||dd\}}}}	|||	fS )Nr   r   )rx   r   r   ry   )
rQ   rR   rz   r   r   r   r   r   r   r   rG   rG   rL   rC   l  s        z
aten::topkc              	   C   s   t j| ||||||dS )N)largestr   out)r	   Z_topk_helper)rQ   rR   krz   r   r   r   rG   rG   rL   rA   x  s          z
aten::sortc                 C   s   t j| ||||dS N)	decendingr   r	   Z_sort_helper)rQ   rR   rz   r   r   rG   rG   rL   r<     s    zaten::argsortc                 C   s   t j| ||||d\}}|S r   r   )rQ   rR   rz   r   r   _r   rG   rG   rL   r     s        
zaten::roundc                 C   s   |  d|S )NZRoundry   rQ   rR   rG   rG   rL   r8     s    zaten::remainderc                 C   s4   t |st |r"t| ||S | jd||ddS )NZModr   )Zfmod_i)r	   _is_fprd   r6   ra   )rQ   rt   r   rG   rG   rL   r6     s    zaten::splitc              
      s  t ||s jd|||d|d kr*S t |rtt ||krڇ fddt |D } jdtjdgtjdd} jdtj|gtjdd}g }t	|D ]2}	 d	|||	 }
|
 d
|||
| |
}q|S  fddt	|D S t ||||S d S )NSplitToSequencerw   c                    s   g | ]}t  |d gqS r   )r	   r   )r   rO   rg   rG   rL   r     s   zsplit.<locals>.<listcomp>rU   r   rV   rX   AddSlicec                    s2   g | ]*}  d  j dtj|gtjddqS )r   rU   rV   rX   )ra   rb   rc   long)r   ru   rQ   Z	split_outrG   rL   r     s   )r	   Z_is_split_staticra   r   r   r   rb   rc   r   r   r   rd   r>   )rQ   rR   Zsplit_size_or_sizesrz   _outputssplit_sizesstartaxisresru   endrG   r   rL   r>     s6    
  	zaten::split_with_sizesc                 C   s   t | ||||S rF   )r>   )rQ   rR   r   rz   r   rG   rG   rL   r=     s    zaten::unbindc              	   C   sF   |d kr2| j d|| j dtjdtjdd|ddS t| |||S d S )Nr   rU   r|   rV   rX   r   )rx   
keepdims_i)ra   rb   rc   r   rd   rB   )rQ   rR   rz   r   rG   rG   rL   rB     s    c                 C   sz  t |s0t |r0t |r0| jd|ddd}t| || jdtdgd}t 	|}|dkrx| d| d	|}n| jdtj|tj
d
d}| d| d|| jdtjdtj
d
d|}| jd|tjjd}| jd|| jd|tjdgtj
d
ddd}t | || jdtddgd}| jdt| |dgddgd}t | || jdtdgd}| jd|tjjd}|S )a!  Generate paddings in ONNX order based on pad in pytorch.

    Args:
        input: the input tensor.
        pad: the paddings in pytorch.
            The order is dim_n_begin, dim_n_end, dim_n-1_begin, dim_n-1_end, ..., dim_m_begin, dim_m_end,
            where m is in range [0, n].
    r   r   r|   r   rU   rX   NSizer}   rV   SubMulr   rh   ri   r   r   rw   r~   	TransposeZperm_i)r	   r   Z_is_listZ_is_scalar_listra   rd   r;   rb   rc   rn   int64_C_onnxTensorProtoDataTypeZINT64r   opset10Zflip)rQ   rt   r0   Zpad_lenr   	extensionpaddingsZ	padding_crG   rG   rL   _prepare_onnx_paddings  sR     
"       r  zaten::constant_pad_ndc                 C   s:   d}t |}t ||}t| ||}| jd||||dS )Nr   r   r   )r	   r   _if_scalar_type_asr  ra   )rQ   rt   r   valuer   r0   rG   rG   rL   r     s
    
zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C   s"   d}t | ||}| jd|||dS )Nreflectr   r   r  ra   rQ   rt   r   r   r  rG   rG   rL   r4   "  s    zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C   s"   d}t | ||}| jd|||dS )NZedger   r   r  r  rG   rG   rL   r7   ,  s    z	aten::padc                 C   sv   t |d}|dkr t| ||S |dkr4t| ||S |dkrJt| |||S |dkr`t| ||S td| |d S )NsZ	replicater  r   ZcircularzUnrecognized padding mode )	r	   r   r7   r4   r   rd   Z_pad_circularr   SymbolicValueError)rQ   rt   r0   r   r  rG   rG   rL   r0   6  s    zaten::linalg_detc                 C   s   |  d|S )NZDetry   r   rG   rG   rL   r(   F  s    zaten::logdetc                 C   s   t | t| |S rF   )rd   logr(   )rQ   rt   rG   rG   rL   r*   L  s    aten::arangec                 G   s  dd }t |dks t |dkrt |dkr2d }n||d }tj| |d |d\}}}}| jdtjd| d	d
}| jdtjd| d	d
}	| d|||	S t |dkst |dkrt |dkrd }n||d }tj| |d |d |d |d\}
}}}| d|||S t |dkrz||d }tj| |d |d |d\}}}}| jdtjd| d	d
}	| d|||	S tddt | dS d S )Nc                 S   s   t | d} | S )Nru   )r	   r   rV   rG   rG   rL   _get_arange_dtypeU  s    z!arange.<locals>._get_arange_dtyper   r   r|   r   )r  rW   rU   rV   rX   Ranger      r   )r   r  steprW   rs   )r   r  rW   r  zwith z
 arguments)r   r	   Z_arange_cast_helperra   rb   rc   rW   r   )rQ   rJ   r  rW   type_r  r   r  Zstart_defaultZdelta_defaultr   rG   rG   rL   r   R  s`              zaten::_dim_arangec                 C   sT   |  d|}| j d|| j dt|ddd}t rB|  d|S t| |dd d d S )	Nr}   rv   rU   rX   r   rw   z_caffe2::Ranger   )ra   rb   rc   r	   r   r   )rQ   likerz   Z
like_shapestoprG   rG   rL   _dim_arange  s       r  z
aten::sizec                 C   s"   |d kr|  d|S t| ||S )Nr}   )ra   r	   _size_helperrQ   rR   rz   rG   rG   rL   r;     s    zaten::squeezec                 C   s|  |d kr|  d|S t|s.t| ||gS t|dd}t|}|}|d k	rb|dk rb||7 }t||}|dk r~|d ks|d kr,| j dt|gd}t	| ||}| j dtj
dtjdd}|  d	||}	tj| d
|	dd\}
\}}}t|||g}t|j| | d|}t|j| |
S |}|dkrltdt| d d t| d d d  |S t| ||gS )NZSqueezeru   rz   r   rU   rX   r|   rV   EqualZIfr   Zn_blocksZIdentityz5This model contains a squeeze operation on dimension 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 z7input shapes, please export with dynamic_axes argument.)ra   r	   _is_constantr   r   rn   Z_get_tensor_dim_sizerb   rc   r   Zonesr  r   add_op_with_blocksr   _add_output_to_blockblockwarningswarnstr)rQ   rR   rz   Z
input_rankZadjusted_dimdim_sizeZdim_constantr;   Z	const_onecondZif_opZ
if_contextZelse_contextr   Zsqueeze_Z	identity_rG   rG   rL   r?     s^    

   

zaten::unsqueezec                 C   s(   t |rt |dd}t | ||gS )Nru   rz   )r	   r$  r   r   r!  rG   rG   rL   rD     s    
zaten::mmc                 C   s   | j d||dddS )NZGemmg        g      ?)Zbeta_fZalpha_fry   )rQ   rR   r   rG   rG   rL   r-     s    zaten::indexc                 C   s   t  r| jd||ddS t |r0t |}n|g}t|dkr|d }t |st |sn| 	 dkrt
| |}| d||S t
| ||S )Nr$   ZTensorr   r|   r   Byter   )r	   r   r   r   r   r   rj   r   r\   r]   rd   r   ra   r$   )rQ   rR   r$   r   rG   rG   rL   r$     s    

zaten::index_fillc           	      C   st   t |d}t  r*| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t	| ||||S )Nru   r#   Z
int_Scalar)r   dim_i)
r	   r   r   r   _index_fill_reshape_helperr   r  rd   r   r9   )	rQ   rR   rz   r$   r  	dim_valueexpanded_index_shapeexpanded_indexZexpanded_valuerG   rG   rL   r#     s(    	   
zaten::index_copyc                 C   sL   t |d}t  r(| jd||||dS t | |||\}}t| ||||S )Nru   r%   )r.  )r	   r   r   r   r/  r9   )rQ   rR   rz   r$   r   r0  r1  r2  rG   rG   rL   r%     s       zaten::__rshift_c                 C   s   |   |   kr<| jd|tj|    d}|   dkr^| jd||ddS | jdtjdtj	d	d
}t
|s| jd|tjjd}| d||}| jd|tj|    d}| d||}|S )Nrh   ri   r-  BitShiftRIGHTZdirection_srU   r   rV   rX   PowDivr\   r]   ra   r   r^   r`   rk   rb   rc   Zfloat32r	   r   r	  r
  r_   )rQ   rR   r   twotwo_powrshiftrG   rG   rL   	__rshift_  s*    

r<  zaten::__lshift_c                 C   s   |   |   kr<| jd|tj|    d}|   dkr^| jd||ddS | jdtjdtj	d	d
}t
|s| jd|tjjd}| d||}| jd|tj|    d}| d||}|S )Nrh   ri   r-  r3  LEFTr5  rU   r   rV   rX   r6  r  r8  )rQ   rR   r   r9  r:  lshiftrG   rG   rL   	__lshift_8  s*    

r?  c                 C   s   |  d|| j dt|d d}|  d|| j dt||d  d}|  d| j dtdd|| j dt|d}td|| |}| j d|dd}t| |dg}t| || j dtd	dgd}	|  d||	}
|
S )
Nr   rU   r   rX   r  r|   r  r   r~   )ra   rb   rc   r   rD   r	   r   r   )rQ   Zinput_dZkernel_size_dZ
dilation_dZ	padding_dZstride_dZblocks_dZblocks_d_indicesZkernel_gridZkernel_maskZ
block_maskrG   rG   rL   _get_im2col_indices_along_dimW  s<    
      r@  c                 C   s.   | j dtdd||gd d}|  d||S )NrU   r   r   rX   r   )ra   rb   r   )rQ   rt   	padding_h	padding_wr0   rG   rG   rL   _get_im2col_padded_input  s     rC  c              
   C   s   t | || jdtdd}t | || jdtdd}| d|| jdt|| d}| jdt| |dgt| |dg| jdtdgdddS )	NrU   r   rX   r|   r  r   r~   rw   )r;   ra   rb   rc   r	   r   )rQ   rt   kernel_hkernel_wZ	batch_dimZchannel_dimZchannel_unfoldedrG   rG   rL   _get_im2col_output_shape  s      rF  zaten::im2colr   c              	   C   s  t | || jdtdd}t | || jdtdd}|d |d  }}	|d |d  }
}|d |d  }}|d |d  }}t| ||||
|}t| |||||	}t| |||}t| ||
|}| jd||dd}| jd||d	d}| jd
|dddd	ddgd}t| ||S )NrU   r   rX   r   r   r|   rv   rw   r   r  r   r  )	r;   ra   rb   rc   r@  rF  rC  r	   r   )rQ   rt   r   Zdilationr   r   Zinput_hZinput_wZstride_hZstride_wrA  rB  Z
dilation_hZ
dilation_wrD  rE  Zblocks_row_indicesZblocks_col_indicesZoutput_shapeZpadded_inputr   rG   rG   rL   r"     s8              zaten::narrowc                 C   s$   |  d||}tj| ||||ddS )Nr   Tr   )ra   r	   r   )rQ   rt   rz   r   lengthr  rG   rG   rL   r.     s         zaten::flattenc                 C   s   t |}|dkr|S |dkrL|dks:|d k	r||d kr| jd||dS n8|dkr|dksp|d k	r||d kr| jd||d dS |d krt dd	S |dk r|| }t | ||||S )
Nr|   r~   ZFlattenrw   r   r   rz   zfONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.)r	   rn   ra   r   Z_flatten_helper)rQ   rt   Z	start_dimZend_dimrz   rG   rG   rL   r     s"    
zaten::linalg_vector_normr{   )rQ   rz   keepdimc                 C   s   |dkr|d kr:t | || jdtjdgtjdd}d}| d| d|| jdtdgd}| jd	|tj	|
   d
}t j| |||dS t| |||||S d S )Nr   rU   r~   rV   rX   FZNotr"  rh   ri   Zaxes_ir  )r	   r   ra   rb   rc   r  r   r   r^   r`   r\   r]   rk   _reducesum_helperrd   r)   )rQ   rR   ordrz   rI  rW   Zcond_oprG   rG   rL   r)     s4       
   zaten::embedding_bagc
                 C   s  |rt jrtdS |	d k	r,|	dkr,td| jdtdd}
| jd|
tj	j
d}
| jdtdgd}t| t| || jdtdddg}|s||g}| jd|d
di}tj| |dgdgtjgdgd}tj| |dgdgtjgdgd}t| || jdtdd}tj| d||
dd\}\}}|j}t|}t|}|jd||dd}|jd||dd}t||dg}t||dg}|d||||}|jd||dd}t|s|d||||}t||dg}|d||}|dkrtj||dgdd}n4|dkr,|jd|dgdd}n|jd|dgdd}|jd|
tj	j
d}t|| t|| |  d d d fS )Nz7embedding_bag with scale_grad_by_freq for training moder   zembedding_bag with padding_idxrU   r|   rX   rh   ri   r   rx   )r   r   r   ZstepsZLoopr#  rv   rw   r   r  rJ  Z
ReduceMeanZ	ReduceMax)r   )r   Zexport_trainingr	   Z_onnx_unsupportedRuntimeErrorra   rb   rc   r	  r
  ZBOOLr   r   r   r   r   r   r%  r'  r   Z_add_input_to_blockrj   rK  r&  r   r   )rQ   Zembedding_matrixr   offsetsZscale_grad_by_freqr   sparseZper_sample_weightsZinclude_last_offsetZpadding_idxZloop_conditionZzeroZindices_lenZoffsets_startsZoffsets_endsZloop_lenZloopZloop_contextr   Z
loop_blockZblock_input_iterr,  Zindices_startZindices_endZindices_rowZ
embeddingsZper_sample_weights_rowZcond_outrG   rG   rL   r     s    
                  

         
   
  zaten::embedding_renormc              	   C   s   |  d|}|  d||}t|}|dkr0d}n"|dkr>d}ntd| d|| j ||dgdd	}|  d
|| j dtdd}t|}|  d||}	|  d||	}
|  d|  d|||
|}
|  d|t| |dg|
S )Nr   rv   r|   ZReduceL1r   ZReduceL2z8Unsupported: ONNX export of embedding_renorm with norm: z. Only 1. and 2. are supported.rJ  r   rU   gHz>rX   r7  r  ZWhereZGreaterr   )ra   r   r   r  rb   rc   r	   r   )rQ   Zweightr   Zmax_normZ	norm_typeZunique_indicesZpartial_weightZpartial_weight_normZpartial_weight_norm_ZscalesZpartial_weight_renormrG   rG   rL   r   |  s@    
  
zaten::chunkc              
   C   s   | j d|  d||dd}|  d|| j dtjdgtjdd	}|  d
|  d|||}t| ||d |  d||  d||g}| j d|ddi}t| |||S )Nrv   r}   r   rw   r  rU   r|   rV   rX   r7  r   r  r   rx   )r   )ra   rb   rc   r   rd   r   r>   )rQ   rR   chunksrz   r+  Zchunk_size_s
chunk_sizeZ	chunk_vecrG   rG   rL   r     s      zaten::normalc	           
      C   sD   |d k	r"t |s"t| ||d }t| || d|}	t| |	|S )NZRandomNormalLike)r	   rj   rd   r   mulra   r   )
rQ   ZmeanZstdZsizes	generatorrW   ZlayoutZdeviceZ
pin_memoryr   rG   rG   rL   r/     s    zprim::ConstantChunkc              
   C   s  |  d|}| j dtj|gtjdd}| j d||dd}| j dtjdgtjdd}| j dtj|gtjdd}| j dtj|d gtjdd}	|  d	||	}
|  d
|
|}g }t|D ]N}| j dtj|d gtjdd}|  d||}||  d|||| |}q|S )Nr}   rU   rV   rX   rv   r   rw   r|   r   r7  r  r   )ra   rb   rc   r   r   r   )rQ   rR   rP  rz   Zinput_shaper   Zinput_shape_dimr   rQ  Zchunk_size_minus_1Zinput_shape_dim_shiftZ	chunk_dimr   ru   r$   r  rG   rG   rL   r3     s$      )F)F)N)N)N)N)N)N)N)r   N)N)N)N)NNNNNN)q__doc__	functoolsr   r(  typingr   r   r   rb   r   Ztorch._Cr   r	  Z
torch.onnxr   r   r	   r
   r  r   rd   r   Ztorch.onnx._globalsr   Ztorch.onnx._internalr   r   r   __all__partialZonnx_symbolicZ_onnx_symbolicrN   r   r   rm   ZGraphContextr   floatr!   r   r   r   r5   r:   r&   r1   r*  r   r   r   r    r9   r   r,   r+   r   r   r   r   r   r'   r2   r   r   r@   r   nnmodulesZ_singleZ_pairZ_tripler   rC   rA   r<   r   r8   r6   r>   r=   rB   r  r   r4   r7   r0   r(   r*   r   r  r;   r?   rD   r-   r$   r#   r%   r<  r?  r@  rC  rF  r"   r.   r   boolr)   r   r   r   r/   r3   rG   rG   rG   rL   <module>   s   7	 "

 o
"

)	$94

2
+3
 ^%     