U
    ‰dG·  ã                   @   s®  d Z ddlZddlZddlmZmZ ddlZddlmZ ddlm	Z	 ddlm
Z ddlmZ ddlmZ dd	lmZ e	 d
dd¡dd„ ƒZdd„ Ze	 d
d
¡dd„ ƒZe	 d
d
¡dd„ ƒZdd„ Ze	 d
dd
¡dd„ ƒZd£dd„Ze	 d
d¡dd„ ƒZdd„ Zed d!d"ƒZed#d$d"ƒZed%d&d"ƒZed'd!d(ƒZed)d$d(ƒZed*d&d(ƒZ ed+d$d,ƒZ!e	 "d-dddddd¡d.d/„ ƒZ#e	 d
dd
d
¡d¤d0d1„ƒZ$e	 d
dd
d
¡d2d3„ ƒZ%e	 d
dd4¡d¥d5d6„ƒZ&d7d8„ Z'd9d:„ Z(d;d<„ Z)d=d>„ Z*d?d@„ Z+dAdB„ Z,d¦dCdD„Z-dEdF„ Z.dGdH„ Z/dIdJ„ Z0dKdL„ Z1dMdN„ Z2e	 d
ddd¡dOdP„ ƒZ3dQdR„ Z4e4dSej5j6jj7ƒZ8e4dTej5j6jj9ƒZ:e4dUej5j6jj;ƒZ<e	 d
dddd¡dVdW„ ƒZ=e	 d
d
dddd4¡d§dXdY„ƒZ>e	 d
ddd4¡d¨dZd[„ƒZ?d\d]„ Z@d^d_„ ZAe	 d
d
dd¡d©d`da„ƒZBe	 d
d
dd¡dªdbdc„ƒZCe	 d
dd¡d«ddde„ƒZDdfdg„ ZEd¬dhdi„ZFdjdk„ ZGdldm„ ZHeGZIeGZJeGZKeHZLeHZMeHZNdndo„ ZOdpdq„ ZPdrds„ ZQdtdu„ ZRe	 d
d¡dvdw„ ƒZSd­dxdy„ZTd®dzd{„ZUd|d}„ ZVd~d„ ZWd€d„ ZXd‚dƒ„ ZYd„d…„ ZZd†d‡„ Z[dˆd‰„ Z\dŠd‹„ Z]dŒd„ Z^dŽd„ Z_e	 d
dddd¡d‘d’„ ƒZ`d“d”„ Zae	 "d-dd¡e	 d
dd¡d•d–„ ƒƒZbe	 d
dddd
¡d—d˜„ ƒZce	 d
d
d
dddd
dd¡	d™dš„ ƒZde	 d
d
dd¡d›dœ„ ƒZeddž„ ZfdŸd „ ZgG d¡d¢„ d¢ƒZhdS )¯z(This file exports ONNX ops for opset 11.é    N)ÚTupleÚUnion)Ú_C)Úsymbolic_helper)Úsymbolic_opset9)Úsymbolic_opset10)Úutils)ÚGLOBALSÚvÚfc                 C   s‚   |  ¡  ¡ }|d krtjj}ntj tj| ¡}| jdt	j
|tj| dd}| jdt	j
|tj| dd}tj| d|||ddS )NÚConstant©Údtype©Zvalue_tÚClipé   ©Zopset_before)ÚtypeÚ
scalarTyper   Ú
ScalarTypeÚFLOATÚscalar_type_to_onnxÚindexÚcast_pytorch_to_onnxÚopÚtorchÚtensorÚscalar_type_to_pytorch_typeÚopset9Úop_with_optional_float_cast)ÚgÚselfÚmin_valÚmax_valr   © r$   ú?/tmp/pip-unpacked-wheel-ua33x9lu/torch/onnx/symbolic_opset11.pyÚhardtanh   s8    
ÿ ÿþ ÿþ     ÿr&   c                    sª   |  ¡  ¡ }‡ fdd„}|d k	r4|||ƒ}|||ƒ}t |¡rJtˆ ||ƒS t |¡r`tˆ ||ƒS t |¡dkr’t |¡dkr’tjˆ d|||ddS tˆ tˆ ||ƒ|ƒS d S )Nc                    s0   | d k	r(t  | ¡s(ˆ jd| t j| dS | S d S )NÚCast©Zto_i)r   Ú_is_noner   r   )r   r   ©r    r$   r%   Ú_cast_if_not_none2   s      ÿz clamp.<locals>._cast_if_not_noner   r   r   r   )	r   r   r   r)   Ú	clamp_maxÚ	clamp_minÚ_get_tensor_rankr   r   )r    r!   ÚminÚmaxr   r+   r$   r*   r%   Úclamp/   s,    



ÿþ     ÿr1   c                 C   sh   |  ¡  ¡ }| jd|tj| d}t |¡dkrPt | ¡}tj| d|||ddS tj| d||ddS d S )Nr'   r(   r   r   r   r   ZMax©	r   r   r   r   r   r.   r   Zunusedr   )r    r!   r/   r   r0   r$   r$   r%   r-   N   s    
     ÿr-   c                 C   sh   |  ¡  ¡ }| jd|tj| d}t |¡dkrPt | ¡}tj| d|||ddS tj| d||ddS d S )Nr'   r(   r   r   r   r   ZMinr2   )r    r!   r0   r   r/   r$   r$   r%   r,   [   s    
     ÿr,   c                 C   sŒ   t j| d|dd}| ¡  ¡ }|d kr0tjj}ntj tj	| ¡}| j
dtjdtj| dd}| j
dtjdtj| dd}t| |||ƒS )	NZRelué   r   r   r   r   r   é   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   )r    ÚinputZrelur   r"   r#   r$   r$   r%   Úrelu6h   s,    
ÿ ÿþ ÿþr6   Úic                 C   s   | j d|||dS )NÚGather©Úaxis_i©r   )r    r!   Údimr   r$   r$   r%   Úselect   s    r=   Fc                    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 ],}||  ¡  	¡ dkrzˆ 
d|| ¡||< qz|d }|dd … D ]}	t ˆ||	¡}q¼ˆ 
d|¡‰ ‡ ‡fdd	„|D ƒ}ˆj
d|žddiŽ}n„|d }|}
|
 ¡ d k	rn|
 ¡  	¡ dkrnt  |¡}|d k	r`|dkr`t ˆ||
|¡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ròt ˆ||d ¡}t  ˆ||¡}| ¡  	¡ }|d k	r>|| ¡  	¡ kr>ˆj
d|t j| d}t j t j| ¡}t j| }|r¢ˆj
dˆ 
d|¡tjdg|dd}ˆ 
d|||¡}tˆ||ƒ}nˆ 
d|||¡}|S )NÚ	index_putÚbr   é   ÚBoolZNonZeroÚShapec                    s(   g | ] }t  ˆt ˆ|ˆ d ¡dg¡‘qS )Néÿÿÿÿ)r   Ú_unsqueeze_helperr   Úexpand)Ú.0Úind©Zbroadcast_index_shaper    r$   r%   Ú
<listcomp>ž   s   ý  ÿzindex_put.<locals>.<listcomp>ÚConcatr:   rC   )ÚaxesÚstartsÚendsr9   r'   r(   ÚConstantOfShaper   r   Ú	ScatterND)r>   )rJ   )r   Ú_is_packed_listÚ_unpack_listÚis_caffe2_aten_fallbackÚatÚ
_parse_argÚlenÚranger   r   r   r   Úaddr.   Zmasked_fillÚmasked_scatterrD   Ú_slice_helperÚsysÚmaxsizerE   Ú_reshape_helperr   r   r   r   r   r   )r    r!   Zindices_list_valueÚvaluesÚ
accumulateZindices_listÚargsZidx_r   rG   Zbool_inpÚrankZsub_data_shapeZvalues_shaper   ÚzerosÚresultr$   rH   r%   r>   †   sv    
ü( 
 
   ÿ
ÿ

ýr>   c                 C   s8   t  |¡}|d k	r&|dkr&t  dd¡S | jd||ddS )Né   Úpixel_shufflezonly support 4d inputZDepthToSpaceZCRD)Zblocksize_iÚmode_s)r   r.   Ú_unimplementedr   )r    r!   Zupscale_factorr`   r$   r$   r%   rd   ö   s    
rd   c                 C   s   t  | ||¡S ©N)r   Z_interpolate_helper)Únamer<   Zinterpolate_moder$   r$   r%   Ú_interpolateþ   s    ri   Úupsample_nearest1dé   ZnearestÚupsample_nearest2drc   Úupsample_nearest3dé   Úupsample_linear1dZlinearÚupsample_bilinear2dÚupsample_trilinear3dÚupsample_bicubic2dZcubicTc              	   C   s   t  | ||||||¡S rg   )r   Z__interpolate_helper)r    r5   ÚsizeZscale_factorÚmodeZalign_cornersZrecompute_scale_factorZ	antialiasr$   r$   r%   Ú__interpolate  s          ÿru   c                 C   sD   t  |d¡rt  dd¡S t  ¡ r2|  d||||¡S | jd|||dS )Nr7   Úgatherzsparse_grad == TrueZGatherElementsr9   )r   Ú_maybe_get_constrf   rR   rS   r   )r    r!   r<   r   Zsparse_gradr$   r$   r%   rv     s
    rv   c              	   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 )NÚscatterÚsrc©Úoverload_nameZScatterElementsr9   r'   r(   )r   rR   rS   r   r   Ú_maybe_get_scalarÚ	_is_valuer   r   r   Ú	expand_as)r    r!   r<   r   ry   Zsrc_typer$   r$   r%   rx     s&    

ý    ÿrx   Únonec                 C   sj   | j dtj|tjdd}|rT| ¡  ¡ dkrTt |dd¡}| j d|tj| d}n|}|   d	||¡}|S )
Nr   r   r   zprim::Constantr7   r   r'   r(   ZCumSum)	r   r   r   ÚintÚnodeÚkindr   Ú
_get_constr   )r    r!   r<   r   Z
dim_tensorZparsed_dtypeÚcastZcsumr$   r$   r%   Úcumsum3  s      ÿr…   c                 C   s$   t  | t  | ||¡¡}|  d||¡S )NÚGatherND)r   Únonzeror~   r   )r    r!   Úmaskr   r$   r$   r%   Úmasked_selectA  s    r‰   c                 C   st   t  | t  | ||¡¡}t | |t dg¡¡}tj| |t dg¡t dg¡t  | |t dg¡¡dd}|  	d|||¡S )NrC   r   T©rK   rL   rM   Zdynamic_slicerO   )
r   r‡   r~   r   r\   r   Ú
LongTensorrY   rs   r   )r    r!   rˆ   Úsourcer   r$   r$   r%   rX   F  s    

úrX   c                 C   sT   t  |¡s| ¡  ¡ dkr&|  d|¡S t| || jdt dg¡dƒ}t  | |dg¡S )Nzonnx::SplitToSequenceZSequenceLengthr   r   r   )	r   Ú_is_tensor_listr   r‚   r   rs   r   r‹   Ú_squeeze_helper)r    r!   Zsz_0r$   r$   r%   Ú_lenW  s    ÿþr   c                 C   s4   t  |¡r|  d||¡S ddlm} || ||ƒS d S )NÚ
SequenceAtr   )Ú
__getitem_)r   r   r   Ztorch.onnx.symbolic_opset9r‘   )r    r!   r7   Úgetitemr$   r$   r%   r‘   a  s    
r‘   c                 C   s   |   d||¡}|   d|||¡S )NÚSequenceEraseÚSequenceInsertr;   )r    Útensor_listr7   r
   r$   r$   r%   Ú	_set_itemk  s    r–   c                 C   s   |   d||¡S ©Nr”   r;   )r    r!   r   r$   r$   r%   Úappendp  s    r˜   c                 C   sn   t  |¡r^t  |¡r^| ¡ }| ¡ dkr4t  dd¡S t  |¡}|}|D ]}|  d||¡}qF|S t 	| |||¡S )Nzprim::ListConstructrW   z6does not support adding dynamic tensor list to anotherr”   )
r   r}   r   r   r‚   rf   rQ   r   r   rW   )r    r!   ÚotherÚalphaZtensor_list_nodeZtensorsÚlÚtr$   r$   r%   rW   t  s     ÿ
rW   c                 C   s   |   d|||¡S r—   r;   )r    r!   Úposr   r$   r$   r%   Úinsert„  s    rž   c                 C   s   |   d||¡S ©Nr“   r;   ©r    r•   r<   r$   r$   r%   Úpopˆ  s    r¡   c                 C   s   |   d||¡S rŸ   r;   r    r$   r$   r%   ÚDeleteŒ  s    r¢   c                 C   s:   t  |¡rt | ||¡S t  |dd¡}| jd||dS d S )Nr7   r<   ÚConcatFromSequencer9   )r   rP   r   Úcatrƒ   r   r    r$   r$   r%   r¤     s    
r¤   c                 C   s<   t  |¡rt | ||¡S t  |dd¡}| jd||ddS d S )Nr7   r<   r£   r@   ©r:   Z
new_axis_i)r   rP   r   Ústackrƒ   r   r    r$   r$   r%   r¦   ˜  s    
r¦   c           	      C   s$   | j d||dd\}}}}|||fS )NÚUniquerc   )Úsorted_iÚoutputsr;   )	r    r!   ÚsortedÚreturn_inverseÚreturn_countsÚuÚindicesÚinverse_indicesÚcountsr$   r$   r%   Ú_unique2   s       ÿr±   c                    sr   t  ddddddd¡t  ddddddd¡dtjttdf ttdf ttttdf f ttdœ‡ ‡fd	d
„ƒƒ}|S )NTFr
   Úisr7   r   .)r5   Úkernel_sizeÚstrideÚpaddingÚ	ceil_modeÚcount_include_padc           	   	      s|   t  ˆ||||ˆ ¡}|s|}|rV| jd|| jdt d| d ¡ddd}dt|ƒ }| jd	|ˆ|ƒˆ|ƒ|d |d
}|S )NÚPadr   )r   r   é   r   Úconstant©re   ©r   ZAveragePool)Zkernel_shape_iZ	strides_iZpads_iZceil_mode_i)r   Z_avgpool_helperr   r   r   rU   )	r    r5   r³   r´   rµ   r¶   r·   Zdivisor_overrideÚoutput©rh   Útuple_fnr$   r%   Úsymbolic_fn©  s6         ÿüúz_avg_pool.<locals>.symbolic_fn)N)r   Úquantized_argsÚ
parse_argsr   ÚValuer   r€   r   )rh   r¿   rÀ   r$   r¾   r%   Ú	_avg_pool¨  s    	 ø

ù!rÄ   Ú
avg_pool1dÚ
avg_pool2dÚ
avg_pool3dc           
      C   s&   | j d|||dd\}}}}	|||	fS )Nr§   rc   )r:   r¨   r©   r;   )
r    r!   r<   rª   r«   r¬   r­   r®   r¯   r°   r$   r$   r%   Ú
unique_dimÔ  s        ÿrÈ   c              	   C   s   t j| ||||||dS )N)Úlargestrª   Úout)r   Z_topk_helper)r    r!   Úkr<   rÉ   rª   rÊ   r$   r$   r%   ÚtopkÜ  s          ÿrÌ   c                 C   s   t j| ||||dS )N)Ú	decendingrÊ   )r   Z_sort_helper)r    r!   r<   rÍ   rÊ   r$   r$   r%   Úsortã  s    rÎ   c                 C   s   |   d|¡S )NZRoundr;   ©r    r!   r$   r$   r%   Úroundè  s    rÐ   c                 C   s4   t  |¡st  |¡r"t | ||¡S | jd||ddS )NZModr   )Zfmod_i)r   Ú_is_fpr   Ú	remainderr   )r    r5   r™   r$   r$   r%   rÒ   ì  s    rÒ   c              
      s  t  ||¡sòˆ jd|||d‰|d kr*ˆS t  |¡rÚt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ÚSplitToSequencer9   c                    s   g | ]}t  ˆ |d g¡‘qS r¼   )r   rD   )rF   r
   r*   r$   r%   rI   ý  s   ÿzsplit.<locals>.<listcomp>r   r   r   r   ÚAddÚSlicec                    s2   g | ]*}ˆ   d ˆˆ j dtj|gtjdd¡‘qS )r   r   r   r   )r   r   r   Úlong)rF   r7   ©r    Z	split_outr$   r%   rI     s   ûý)r   Z_is_split_staticr   rP   rU   rQ   r   r   rÖ   rV   r˜   r   Úsplit)r    r!   Zsplit_size_or_sizesr<   Ú_outputsÚsplit_sizesÚstartÚaxisÚresr7   Úendr$   r×   r%   rØ   ò  s6    ÿþ
þ  ÿú	rØ   c                 C   s   t | ||||ƒS rg   )rØ   )r    r!   rÚ   r<   rÙ   r$   r$   r%   Úsplit_with_sizes  s    rß   c              	   C   sF   |d kr2| j d|| j dtjdtjdd|ddS t | |||¡S d S )NrÓ   r   r@   r   r   r   )r:   Ú
keepdims_i)r   r   r   rÖ   r   Úunbind)r    r!   r<   rÙ   r$   r$   r%   rá     s    ûrá   c                 C   s~  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d 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d d}|S )Nr£   r   r@   r¥   r   r   ÚSizerB   r   ÚSubÚMulr¹   r'   ÚLongr(   rJ   rN   r9   rC   Ú	Transpose©Zperm_i)r   rP   Z_is_listZ_is_scalar_listr   r   rs   r   r   r.   Úint64r   r\   Úopset10Zflip)r    r5   ÚpadZpad_lenr`   Ú	extensionÚpaddingsZ	padding_cr$   r$   r%   Ú_prepare_onnx_paddings0  sZ    ÿþý 
"ý  ÿú  ÿ   ÿ  ÿrí   c                 C   s<   d}t  |¡}t  | ||¡}t| ||ƒ}| jd||||dS )Nrº   r¸   r»   )r   r|   Ú_if_scalar_type_asrí   r   )r    r5   rµ   Úvaluert   rê   r$   r$   r%   Úconstant_pad_ndc  s
    
rð   c                 C   s"   d}t | ||ƒ}| jd|||dS )NÚreflectr¸   r»   ©rí   r   ©r    r5   rµ   rt   rì   r$   r$   r%   Úreflection_padk  s    rô   c                 C   s"   d}t | ||ƒ}| jd|||dS )NZedger¸   r»   rò   ró   r$   r$   r%   Úreplication_padq  s    rõ   c                 C   sr   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   rT   rõ   rô   rð   r   Z_pad_circularÚRuntimeError)r    r5   rê   rt   rï   r$   r$   r%   rê     s    rê   c                 C   s   |   d|¡S )NZDetr;   rÏ   r$   r$   r%   Ú
linalg_det  s    rø   c                 C   s   t  | t| |ƒ¡S rg   )r   Úlogrø   )r    r5   r$   r$   r%   Úlogdet‘  s    rú   c                 G   s¢  dd„ }t |ƒdks t |ƒdkr¨t |ƒdkr2d }n||d ƒ}tj| |d |d\}}}}| jdtjdtj| d	d
}| jdtjdtj| d	d
}	|  d|||	¡}
nöt |ƒdksÂt |ƒdkrt |ƒdkrÔd }n||d ƒ}tj| |d |d |d |d\}}}}|  d|||¡}
n„t |ƒdkr†||d ƒ}tj| |d |d |d\}}}}| jdtjdtj| d	d
}	|  d|||	¡}
ntdtt |ƒƒ d ƒ‚|
S )Nc                 S   s   t  | d¡} | S )Nr7   )r   rw   r   r$   r$   r%   Ú_get_arange_dtype–  s    z!arange.<locals>._get_arange_dtyper¹   rn   r@   r   )rÞ   r   r   r   r   ÚRangerc   é   rk   )rÛ   rÞ   Ústepr   r4   )rÛ   rÞ   r   z&Unknown aten::arange signature taking z arguments.)	rU   r   Z_arange_cast_helperr   r   r   r   ÚNotImplementedErrorÚstr)r    r_   rû   r   r   rÞ   rÛ   rþ   Zstart_defaultZdelta_defaultZarange_tensorr$   r$   r%   Úarange•  sr      ÿ ÿþ ÿþ    ÿ   ÿ ÿþÿr  c                 C   sT   |   d|¡}| j d|| j dt |¡ddd}t ¡ rB|   d|¡S t| |dd d d ƒS )	NrB   r8   r   r   r   r9   z_caffe2::Rangerc   )r   r   r   r   rR   r  )r    Úliker<   Z
like_shapeÚstopr$   r$   r%   Ú_dim_arangeÐ  s       ÿr  c                 C   s"   |d kr|   d|¡S t | ||¡S )NrB   )r   r   Ú_size_helper©r    r!   r<   r$   r$   r%   rs   Û  s    rs   c                 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r4| j dt |g¡d}t 	| ||¡}| j dtj
dtjdd}|   d	||¡}	|   d
|	¡}
|
 ¡ }t |¡}t |||g¡}t ||¡ t |¡}|  d|¡}t ||¡ |
S |}|dkrtt dt|ƒ d d t|ƒ d d d ¡ |S t | ||g¡S )NZSqueezer7   r<   r   r   r   r@   r   ÚEqualZIfZ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.)r   r   Ú_is_constantrŽ   rƒ   r.   Z_get_tensor_dim_sizer   r   r  Zonesrè   r   r   Ú
_add_blockÚ_add_output_to_blockÚwarningsÚwarnr   )r    r!   r<   Z
input_rankZadjusted_dimÚdim_sizeZdim_constantrs   Z	const_oneÚcondZif_node_outputsZif_nodeZif_blockZsqueeze_Z
else_blockZ	identity_r$   r$   r%   Úsqueezeá  sZ    




ÿþýüûúùÿ
r  c                 C   s(   t  |¡rt  |dd¡}t  | ||g¡S )Nr7   r<   )r   r  rƒ   rD   r  r$   r$   r%   Ú	unsqueeze  s    
r  c                 C   s   | j d||dddS )NZGemmg        g      ð?)Zbeta_fZalpha_fr;   )r    r!   r™   r$   r$   r%   Úmm  s    r  c                 C   sœ   t  ¡ r| jd||ddS t  |¡r0t  |¡}n|g}t|ƒdkrŽ|d }t  |¡sŽ| ¡  ¡ dkst| ¡  ¡ dkrŽt	 
| |¡}|  d||¡S t	 | ||¡S )	Nr   ZTensorrz   r@   r   rA   ÚByter†   )r   rR   rS   rP   rQ   rU   r)   r   r   r   r‡   r   r   )r    r!   r   r®   r$   r$   r%   r     s    

ÿÿr   c           	      C   sv   t  |d¡}t  ¡ r*| jd|||d|dS t  | |||¡\}}t  |¡}t  | ||¡}t | ||d ¡}t	| ||||ƒS )Nr7   Ú
index_fillZ
int_Scalar)r{   Údim_i)
r   rT   rR   rS   Ú_index_fill_reshape_helperr|   rî   r   rE   rx   )	r    r!   r<   r   rï   Ú	dim_valueÚexpanded_index_shapeÚexpanded_indexZexpanded_valuer$   r$   r%   r  3  s(    ú	   ÿ
r  c                 C   sL   t  |d¡}t  ¡ r(| jd||||dS t  | |||¡\}}t| ||||ƒS )Nr7   Ú
index_copy)r  )r   rT   rR   rS   r  rx   )r    r!   r<   r   rŒ   r  r  r  r$   r$   r%   r  H  s       ÿr  c                 C   sÐ   |  ¡  ¡ |  ¡  ¡ kr6| jd|tj|  ¡  ¡  d}|  ¡  ¡ dkrX| jd||ddS | jdtjdtjd	d
}t |¡s’| jd|tjd d}|  d||¡}| jd|tj|  ¡  ¡  d}|  d||¡}|S )Nr'   r(   r  ÚBitShiftÚRIGHT©Zdirection_sr   r¹   r   r   ÚFloatÚPowÚDiv©	r   r   r   r   r   r   r   Zfloat32rÑ   )r    r!   r™   ÚtwoÚtwo_powÚrshiftr$   r$   r%   Ú	__rshift_R  s&    ý
ýr$  c                 C   sÐ   |  ¡  ¡ |  ¡  ¡ kr6| jd|tj|  ¡  ¡  d}|  ¡  ¡ dkrX| jd||ddS | jdtjdtjd	d
}t |¡s’| jd|tjd d}|  d||¡}| jd|tj|  ¡  ¡  d}|  d||¡}|S )Nr'   r(   r  r  ÚLEFTr  r   r¹   r   r   r  r  rä   r   )r    r!   r™   r!  r"  Úlshiftr$   r$   r%   Ú	__lshift_m  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Ô   r   r¹   r   rã   r@   rü   r   rC   )r   r   r   r  r  r   rD   r\   )r    Zinput_dZkernel_size_dZ
dilation_dZ	padding_dZstride_dZblocks_dZblocks_d_indicesZkernel_gridZkernel_maskZ
block_maskr$   r$   r%   Ú_get_im2col_indices_along_dimˆ  s<    	  ÿýü  ÿ  ÿr(  c                 C   s.   | j dt dd||gd ¡d}|   d||¡S )Nr   r   r¹   r   r¸   )r   r   r‹   )r    r5   Ú	padding_hÚ	padding_wrê   r$   r$   r%   Ú_get_im2col_padded_input³  s     r+  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 )	Nr   r   r   r@   rä   rJ   rC   r9   )rs   r   r   r   r   rD   )r    r5   Úkernel_hÚkernel_wZ	batch_dimZchannel_dimZchannel_unfoldedr$   r$   r%   Ú_get_im2col_output_shape»  s      ÿûr.  r²   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 )Nr   r¹   r   rk   r   r@   r8   r9   rc   ræ   rn   rç   )	rs   r   r   r   r(  r.  r+  r   r\   )r    r5   r³   Zdilationrµ   r´   Zinput_hZinput_wZstride_hZstride_wr)  r*  Z
dilation_hZ
dilation_wr,  r-  Zblocks_row_indicesZblocks_col_indicesZoutput_shapeZpadded_inputr½   r$   r$   r%   Úim2colË  s8         ÿ     ÿr/  c                 C   s$   |   d||¡}tj| ||||ddS )NrÔ   TrŠ   )r   r   rY   )r    r5   r<   rÛ   ÚlengthrÞ   r$   r$   r%   Únarrowÿ  s         ÿr1  c                 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r˜t  dd	¡S |dk r¨|| }t  | ||||¡S )
Nr@   rC   ZFlattenr9   r   éþÿÿÿr¹   r<   zfONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.)r   r.   r   rf   Z_flatten_helper)r    r5   Z	start_dimZend_dimr<   r$   r$   r%   Úflatten  s"    
þr3  c                 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	 d
}t j| |||dS t	 
| |||||¡S d S )Nr   r   rC   r   r   ZNotr  r'   rå   r(   ©Zaxes_irà   )r   r\   r   r   r   rè   r‹   r   Ú_reducesum_helperr   Úlinalg_vector_norm)r    r!   Úordr<   Zkeepdimr   Zcond_opr$   r$   r%   r6     s0      ÿ ÿ  ÿ   ÿr6  c
                 C   sr  |rt jrt d¡S |	d k	r,|	dkr,tdƒ‚| jdt d¡d}
| jd|
d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¡}|  d||
¡}t | ¡ ¡}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|
dd	}t ||¡ t ||¡ | ¡  ¡ d d d fS )Nz7embedding_bag with scale_grad_by_freq for training moder   zembedding_bag with padding_idxr   r@   r   r'   é	   r(   rJ   r:   )rK   rL   rM   ZstepsZLoopr8   r9   rÕ   rä   r4  Z
ReduceMeanZ	ReduceMax)rJ   )r	   Ztraining_moder   Z_onnx_unsupportedr÷   r   r   r   rD   r  rY   rZ   r[   r   r	  r   Z_add_input_to_blockr)   r5  r
  r½   )r    Zembedding_matrixr®   ÚoffsetsZscale_grad_by_freqrt   ÚsparseZper_sample_weightsZinclude_last_offsetZpadding_idxZloop_conditionZzeroZindices_lenZoffsets_startsZoffsets_endsZloop_lenZloopZ
loop_blockZblock_input_iterr  Zindices_startZindices_endZindices_rowZ
embeddingsZper_sample_weights_rowZcond_outr$   r$   r%   Úembedding_bag5  s     
ÿ  ÿû     ÿ     ÿ  ÿ

    ÿ  ÿ
   ÿ
r;  c              	   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§   r8   r@   ZReduceL1r¹   ZReduceL2z8Unsupported: ONNX export of embedding_renorm with norm: z. Only 1. and 2. are supported.r4  rÔ   r   gH¯¼šò×z>r   r  rä   ZWhereZGreaterrO   )r   r€   r÷   r   r   r   rD   )r    Zweightr®   Zmax_normZ	norm_typeZunique_indicesZpartial_weightZpartial_weight_normZpartial_weight_norm_ZscalesZpartial_weight_renormr$   r$   r%   Úembedding_renormŒ  s>    
ÿ  ÿ
üür<  c              
   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 )Nr8   rB   r   r9   rã   r   r@   r   r   r  rÔ   rä   rJ   r:   )rJ   )r   r   r   rÖ   r   rE   rØ   )r    r!   Úchunksr<   r  Zchunk_size_sÚ
chunk_sizeZ	chunk_vecr$   r$   r%   Úchunk±  s      ÿþr?  c                 C   s"   t  | ||  d|¡¡}t| ||ƒS )NZRandomNormalLike)r   Úmulr   rW   )r    ÚlocZscaleÚseedrb   r$   r$   r%   ÚnormalÁ  s    rC  c                   @   s   e Zd ZdZedd„ ƒZdS )ÚPrimZprimc              
   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 )NrB   r   r   r   r8   r   r9   r@   rÔ   r  rä   rÕ   )r   r   r   rÖ   rV   r˜   )r    r!   r=  r<   Zinput_shaperÜ   Zinput_shape_dimrÛ   r>  Zchunk_size_minus_1Zinput_shape_dim_shiftZ	chunk_dimrÝ   r7   r   rÞ   r$   r$   r%   ÚConstantChunkÎ  s$     ÿ zPrim.ConstantChunkN)Ú__name__Ú
__module__Ú__qualname__ÚdomainÚstaticmethodrE  r$   r$   r$   r%   rD  Ë  s   rD  )F)F)N)N)N)N)N)N)r   N)N)N)N)iÚ__doc__rZ   r  Útypingr   r   r   r   Z
torch.onnxr   r   r   r   ré   r   Ztorch.onnx._globalsr	   rÂ   r&   r1   r-   r,   r6   r=   r>   rd   ri   rj   rl   rm   ro   rp   rq   rr   rÁ   ru   rv   rx   r…   r‰   rX   r   r‘   r–   r˜   rW   rž   r¡   r¢   r¤   r¦   r±   rÄ   ÚnnÚmodulesZ_singlerÅ   Z_pairrÆ   Z_triplerÇ   rÈ   rÌ   rÎ   rÐ   rÒ   rØ   rß   rá   rí   rð   rô   rõ   Zreflection_pad1dZreflection_pad2dZreflection_pad3dZreplication_pad1dZreplication_pad2dZreplication_pad3drê   rø   rú   r  r  rs   r  r  r  r   r  r  r$  r'  r(  r+  r.  r/  r1  r3  r6  r;  r<  r?  rC  rD  r$   r$   r$   r%   Ú<module>   sä   






p







'
$3
;




3
+
3

V
$
