a
    d                     @  s
  d Z ddlm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 g d
Zejej ddZ!dd Z"e!de#de$dddej%dddddddZ&e!dej%ddddZ'e!de$ddej%ddddZ(e!d e$ddej%ddd!d"Z)e!d#ej%ddd$d%Z*e!d&e#de$dd'dej%ddd(d)Z+e!d*ej%dddd,d-Z,e!d.e$dd'ej%ddd/d0Z-e!d1e"d2d3d4gd5e!d6e"d7d8d4gd5e!d9e"d:d;d4gd5e!d<e"d=d3d>gd5e!d?e"d@d8d>gd5e!dAe"dBd;d>gd5e!dCe"dDd8dEgd5ej%dFdGdFdHdIdJZ.e!dKe#dd+d+d+d+d+d+ej%dddLdMZ/e!dNe$dd'ddej%ddddOdPZ0e!dQe$dd'ddej%dddRdSZ1e!dTe$dd'dUej%ddddVdWZ2e!dXej%dddYdZZ3e!d[ej%ddd\d]Z4e!d^ej%ddd_d`Z5e!daej%dddbdcZ6e!ddej%dddedfZ7e!dgej%dddhdiZ8e!djej%ddddkdlZ9e!dmej%dddndoZ:e!dpej%dddqdrZ;e!dsej%dddtduZ<e!dve#dej%dddwdxZ=e!dyej%dddzd{Z>e!d|e$dd'd'd'ej%ddd}d~Z?e!de"de
j@jAjjBgd5e!de"de
j@jAjjCgd5e!de"de
j@jAjjDgd5ej%dd ZEe!de$dd'd'd'd'ej%ddddZFe!de$ddd'd'd'dUej%dddddZGe!de$dd'd'dUej%dddddZHe!de$dd'd'dUej%dddddZIe!dej%ddddZJe!dej%ddddZKe!de$ddd'd'ej%d	ddddZLe!de$ddd'd'ej%d
ddddZMe!de$dd'd'ej%dddddZNej%ddddZOe!dej%dddddZPe!de!de!dej%ddddZQe!de!de!dej%ddddZRe!dej%ddddddddZSe!dej%ddddZTe!dej%ddddZUe!dej%ddddZVe!de$dd'ej%ddddZWe!dej%dddddÄZXe!dăej%dddddƄZYe!dǃej%ddddɄZZe!dʃej%dddd̄Z[e!d̓ej%ddddτZ\e!dЃej%dddd҄Z]e!dӃej%ddddՄZ^e!dփej%dddd؄Z_e!dكej%ddddۄZ`ej%dddd݄Zaej%dddd߄Zbej%ddddZce!de$dddddej%ddddZde!dej%ddddZee!de#dd+d+e$dd'd'ej%ddddZfe!de$dddddej%ddddddZge!de$dddd'd'd'dd'd'	ej%ddddZhe!de$ddddej%ddddZie!dej%ddddZje!dej%dddddZke!dej%ddd dZldS (  z(This file exports ONNX ops for opset 11.    )annotationsN)OptionalSequenceUnion)_C)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset10symbolic_opset9utils)GLOBALS)	_beartype	jit_utilsregistration)4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   |  i S N )fnargskwargsrH   d/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/onnx/symbolic_opset11.py_applyW   s    z_apply_params.<locals>._applyrH   )rK   rL   rN   rH   rJ   rM   _apply_paramsT   s    rO   zaten::hardtanhTvfzjit_utils.GraphContext_C.Valuefloat)gselfmin_valmax_valc                 C  s`   t j|t j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)
r   JitScalarType
from_valueFLOAToptorchtensorrZ   opset9_op_with_optional_float_cast)rT   rU   rV   rW   scalar_typerH   rH   rM   r"   ]   s    r"   zaten::clamprT   c                   s   t j fdd}tj|tjj}|tjjkrD|||}|||}t|rZt ||S t|rpt	 ||S t
|dkrt
|dkrtj d|||ddS t t	 |||S d S )Nc                   s.   | d ur&t | s& jd| | dS | S d S )NCastZto_i)r
   _is_nonerb   	onnx_type)rd   rZ   rh   rH   rM   _cast_if_not_noneu   s    z clamp.<locals>._cast_if_not_noner   r\   r]   r^   )r   beartyper   r_   r`   	UNDEFINEDr
   rk   r   r   _get_tensor_rankre   rf   )rT   rU   minmaxrm   rg   rH   rh   rM   r   r   s(    




r   zaten::clamp_minc                 C  sb   | j d|tj| d}t|dkrJt| }tj	| d|||ddS tj	| d||ddS d S )Nri   rj   r   r\   r]   r^   ZMax
rb   r   r_   r`   rl   r
   rp   re   Zunusedrf   )rT   rU   rq   rr   rH   rH   rM   r      s    
r   zaten::clamp_maxc                 C  sb   | j d|tj| d}t|dkrJt| }tj	| d|||ddS tj	| d||ddS d S )Nri   rj   r   r\   r]   r^   ZMinrs   )rT   rU   rr   rq   rH   rH   rM   r      s    
r   zaten::relu6c                 C  sj   t j| d|dd}tj|tjj}| jdtjd|	 dd}| jdtjd|	 dd}t
| |||S )	NZRelu   r^   rX   r   rY   r[      )re   rf   r   r_   r`   ra   rb   rc   rd   rZ   r   )rT   inputZrelu_rg   rV   rW   rH   rH   rM   r6      s    r6   zaten::selectic                 C  s   | j d|||dS )NGatheraxis_irb   )rT   rU   dimr%   rH   rH   rM   r;      s    r;   zaten::index_putFc                   s  t |rt |}n|g}t  rH|g| ||g }jdg|R  S t |d}t|dkrd|S t|dkrtt|D ]&}t || r~	d|| ||< q~|d }|dd  D ]}	t
||	}q	d|  fdd|D }j	d	g|R d
di}n|d }|}
t |
rt |}|d urN|dkrNt
||
|S t |
}t |}|d ur|d ur||krt |
tt||}
t||
|S 	d| t |dg}t j	d|dgt|gtjgd}j	d	 |dd}t |}|d ur*|dkr*t
||d }t ||}tj|tjj}|tjjkrtj|tjj}||krj	d|| d}n|rtd||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_helperre   expand).0indZbroadcast_index_shaperT   rH   rM   
<listcomp>   s   zindex_put.<locals>.<listcomp>Concatrz   r   )axesstartsendsry   ri   rj   z'self does not have a valid scalar type.ConstantOfShaperY   r[   	ScatterND) r
   _is_packed_list_unpack_listis_caffe2_aten_fallbackat
_parse_arglenrange_is_boolrb   re   r   rp   Zmasked_fillr   listr,   _slice_helpersysmaxsizer   _reshape_helperr   r_   r`   ro   rl   r	   SymbolicValueErrorrc   rd   rZ   )rT   rU   Zindices_list_valuevalues
accumulateZindices_listrK   Zidx_r%   r   Zbool_inprankZ	mask_rankZ	self_rankZsub_data_shapeZvalues_shapeZself_scalar_typeZvalues_scalar_typezerosresultrH   r   rM   r'      s    
(





r'   zaten::pixel_shufflec                 C  s8   t |}|d ur&|dkr&t ddS | jd||ddS )N   r2   zonly support 4d inputZDepthToSpaceZCRD)Zblocksize_imode_s)r
   rp   _unimplementedrb   )rT   rU   Zupscale_factorr   rH   rH   rM   r2   O  s    
r2   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strintnamer|   Zinterpolate_modec                 C  s   t | ||S rG   )r
   Z_interpolate_helperr   rH   rH   rM   _interpolateY  s    r   zaten::__interpolatec              	   C  s   t | ||||||S rG   )r
   Z__interpolate_helper)rT   rv   r<   Zscale_factormodeZalign_cornersZrecompute_scale_factorZ	antialiasrH   rH   rM   __interpolatez  s    r   zaten::gatherc                 C  sD   t |drt ddS t  r2| d||||S | jd|||dS )Nrw   r!   zsparse_grad == TrueZGatherElementsry   )r
   _maybe_get_constr   r   r   rb   )rT   rU   r|   r%   Zsparse_gradrH   rH   rM   r!     s
    r!   zaten::scatterc              	   C  s   t  r| jd||||ddS tj|}t |}t |rR| jd||||dS tj||kr~| jd|tj|	 d}| jd||t
| |||dS d S )Nr:   srcoverload_nameZScatterElementsry   ri   rj   )r
   r   r   r   r_   r`   _maybe_get_scalar	_is_valuerb   rl   re   	expand_as)rT   rU   r|   r%   r   Zsrc_typerH   rH   rM   r:     s    

r:   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 )
NrX   rY   r[   zprim::Constantrw   rZ   ri   rj   ZCumSum)rb   rc   rd   r   nodekindr
   
_get_constr   r_   rl   )rT   rU   r|   rZ   Z
dim_tensorZparsed_dtypecastZcsumrH   rH   rM   r     s    r   zaten::masked_selectc                 C  s$   t | t | ||}| d||S )NGatherND)re   nonzeror   rb   )rT   rU   maskr%   rH   rH   rM   r-     s    r-   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   )
re   r   r   r
   r   rc   
LongTensorr   r<   rb   )rT   rU   r   sourcer%   rH   rH   rM   r,     s    

r,   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SequenceLengthrX   r   r[   )	r
   _is_tensor_listr   r   rb   r<   rc   r   _squeeze_helper)rT   rU   Zsz_0rH   rH   rM   _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   rb   Ztorch.onnx.symbolic_opset9r   )rT   rU   rw   getitemrH   rH   rM   r     s    
r   zaten::_set_itemc                 C  s   |  d||}|  d|||S )NSequenceEraseSequenceInsertr{   )rT   tensor_listrw   rP   rH   rH   rM   	_set_item  s    r   zaten::appendc                 C  s   |  d||S Nr   r{   )rT   rU   rd   rH   rH   rM   r     s    r   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   rb   re   r   )rT   rU   otheralphaZtensor_list_nodeZtensorsltrH   rH   rM   r     s    
r   zaten::insertc                 C  s   |  d|||S r   r{   )rT   rU   posrd   rH   rH   rM   r(     s    r(   z	aten::popc                 C  s   |  d||S Nr   r{   rT   r   r|   rH   rH   rM   r3     s    r3   zaten::Deletec                 C  s   |  d||S r   r{   r   rH   rH   rM   r     s    r   z	aten::catc                 C  s:   t |rt| ||S t |dd}| jd||dS d S )Nrw   r|   ConcatFromSequencery   )r
   r   re   r   r   rb   r   rH   rH   rM   r   "  s    
r   zaten::stackc                 C  s<   t |rt| ||S t |dd}| jd||ddS d S )Nrw   r|   r   r~   rz   Z
new_axis_i)r
   r   re   rA   r   rb   r   rH   rH   rM   rA   -  s    
rA   zaten::_unique2c           	      C  s$   | j d||dd\}}}}|||fS )NUniquer   )sorted_ioutputsr{   )	rT   rU   sortedreturn_inversereturn_countsuindicesinverse_indicescountsrH   rH   rM   _unique27  s    r   zaten::avg_pool1dZ
avg_pool1dzaten::avg_pool2dZ
avg_pool2dzaten::avg_pool3dZ
avg_pool3dc                   sV   t dddddddt dddddddtjddddd	d
d
d fdd}|S )NTFrP   isrw   r   rR   zSequence[int]zUnion[int, Sequence[int]]r   )rv   kernel_sizestridepadding	ceil_modecount_include_padc              	     s   |s|}t |||| }t|ts*J |}|rh| jd|| jdtd| d ddd}dt| }|rt	||||}	|td	d
 t
|	|D  }n|d }| jd||||d}
|
S )NPadrX   )r   r      r[   constantr   r   c                 s  s   | ]\}}|| V  qd S rG   rH   )r   ar}   rH   rH   rM   	<genexpr>t  s   z1_avg_pool.<locals>.symbolic_fn.<locals>.<genexpr>ZAveragePool)Zkernel_shape_iZ	strides_iZpads_i)r
   Z_avgpool_helper
isinstancetuplerb   rc   rd   r   re   Zget_pool_ceil_paddingzip)rT   rv   r   r   r   r   r   Zdivisor_overrideZadjusted_paddingZpadding_ceiloutputr   tuple_fnrH   rM   symbolic_fnO  s>    
z_avg_pool.<locals>.symbolic_fn)N)r
   quantized_args
parse_argsr   rn   )r   r   r   rH   r   rM   	_avg_poolA  s    	 &0r   zaten::unique_dimc           
      C  s&   | j d|||dd\}}}}	|||	fS )Nr   r   )rz   r   r   r{   )
rT   rU   r|   r   r   r   r   r   r   r   rH   rH   rM   rD     s    
rD   z
aten::topkc              	   C  s   t j| ||||||dS )N)largestr   out)r
   Z_topk_helper)rT   rU   kr|   r   r   r   rH   rH   rM   rB     s    rB   z
aten::sortc                 C  s   t j| ||||dS N)	decendingr   r
   Z_sort_helper)rT   rU   r|   r   r   rH   rH   rM   r=     s    r=   zaten::argsortc                 C  s   t j| ||||d\}}|S r   r   )rT   rU   r|   r   r   _r   rH   rH   rM   r     s    

r   zaten::roundc                 C  s   |  d|S )NZRoundr{   rT   rU   rH   rH   rM   r9     s    r9   zaten::remainderc                 C  s4   t |st |r"t| ||S | jd||ddS )NModr   )Zfmod_i)r
   _is_fpre   r7   rb   )rT   rv   r   rH   rH   rM   r7     s    r7   zaten::splitc              
     s  t ||s jd|||d|d u 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SplitToSequencery   c                   s   g | ]}t  |d gqS r   )r
   r   )r   rP   rh   rH   rM   r     s   zsplit.<locals>.<listcomp>rX   r   rY   r[   AddSlicec                   s2   g | ]*}  d  j dtj|gtjddqS )r   rX   rY   r[   )rb   rc   rd   long)r   rw   rT   Z	split_outrH   rM   r     s   )r
   Z_is_split_staticrb   r   r   r   rc   rd   r  r   r   re   r?   )rT   rU   Zsplit_size_or_sizesr|   _outputssplit_sizesstartaxisresrw   endrH   r  rM   r?     s2    

	r?   zaten::split_with_sizesc                 C  s   t | ||||S rG   )r?   )rT   rU   r  r|   r  rH   rH   rM   r>     s    r>   zaten::unbindc              	   C  sF   |d u r2| j d|| j dtjdtjdd|ddS t| |||S d S )Nr   rX   r~   rY   r[   r   )rz   
keepdims_i)rb   rc   rd   r  re   rC   )rT   rU   r|   r  rH   rH   rM   rC     s    rC   c                 C  sz  t |s0t |r0t |r0| jd|ddd}t| || jdtdgd}t 	|}|du 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   rX   r[   NSizer   rY   SubMulr   ri   rj   r   r   ry   r   	TransposeZperm_i)r
   r   Z_is_listZ_is_scalar_listrb   re   r<   rc   rd   rp   int64_C_onnxTensorProtoDataTypeZINT64r   opset10Zflip)rT   rv   r1   Zpad_lenr   	extensionpaddingsZ	padding_crH   rH   rM   _prepare_onnx_paddings  sF     
" 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  rb   )rT   rv   r   valuer   r1   rH   rH   rM   r   1  s
    
r   zaten::reflection_pad1dzaten::reflection_pad2dzaten::reflection_pad3dc                 C  s"   d}t | ||}| jd|||dS )Nreflectr   r   r  rb   rT   rv   r   r   r  rH   rH   rM   r5   ;  s    r5   zaten::replication_pad1dzaten::replication_pad2dzaten::replication_pad3dc                 C  s"   d}t | ||}| jd|||dS )NZedger   r   r  r  rH   rH   rM   r8   E  s    r8   z	aten::padrT   rv   r1   r   r  c                 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   r8   r5   r   re   Z_pad_circularr	   r   r  rH   rH   rM   r1   O  s    	r1   zaten::linalg_detc                 C  s   |  d|S )NZDetr{   r   rH   rH   rM   r)   e  s    r)   zaten::logdetc                 C  s   t | t| |S rG   )re   logr)   )rT   rv   rH   rH   rM   r+   k  s    r+   aten::arangec                 G  s   dd }t |dkrttdd |rtj}| jdtj|d |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\}}}}| jdtjd|	 dd	}	| jdtjd
|	 dd	}| d|	||S t |dksDt |dkrt |dkrXd }n||d }tj| |d |d
 |d |d\}
}}}| d|||S t |dkr||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 )Nrw   )r
   r   rY   rH   rH   rM   _get_arange_dtypet  s    z!arange.<locals>._get_arange_dtyper   c                 S  s
   t | tS rG   )r   r   )valrH   rH   rM   <lambda>x      zarange.<locals>.<lambda>rX   r   rY   r[   r~   Ranger   )r  rZ   r      r   )r  r  steprZ   ru   )r  r  rZ   r  zwith z
 arguments)r   allmaprc   r  rb   rd   r
   Z_arange_cast_helperrZ   r   )rT   rK   r  rZ   r  r  Zdelta_defaulttype_r%  Zstart_defaultr   rH   rH   rM   r   q  sj    
r   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   rx   rX   r[   r   ry   z_caffe2::Ranger   )rb   rc   rd   r
   r   r   )rT   liker|   Z
like_shapestoprH   rH   rM   _dim_arange  s    r+  z
aten::sizec                 C  s"   |d u r|  d|S t| ||S )Nr   )rb   r
   _size_helperrT   rU   r|   rH   rH   rM   r<     s    r<   zaten::squeezec                 C  s|  |d u r|  d|S t|s.t| ||gS t|dd}t|}|}|d urb|dk rb||7 }t||}|dk r~|d u s|d u 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Squeezerw   r|   r   rX   r[   r~   rY   Equal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.)rb   r
   _is_constantr   r   rp   Z_get_tensor_dim_sizerc   rd   r,  Zonesr  r   add_op_with_blocksr   _add_output_to_blockblockwarningswarnr   )rT   rU   r|   Z
input_rankZadjusted_dimdim_sizeZdim_constantr<   Z	const_onecondZif_opZ
if_contextZelse_contextr   Zsqueeze_Z	identity_rH   rH   rM   r@     sX    



r@   zaten::unsqueezec                 C  s(   t |rt |dd}t | ||gS )Nrw   r|   )r
   r1  r   r   r-  rH   rH   rM   rE     s    
rE   zaten::mmc                 C  s   | j d||dddS )NZGemmg        g      ?)Zbeta_fZalpha_fr{   )rT   rU   r   rH   rH   rM   r.     s    r.   zaten::indexc                 C  s   t  r| jd||ddS t |r0t |}n|g}t|dkr|d }t |st |srtj	
|tj	jkrt| |}| d||S t| ||S )Nr%   ZTensorr   r~   r   r   )r
   r   r   r   r   r   rk   r   r   r_   r`   UINT8re   r   rb   r%   )rT   rU   r%   r   rH   rH   rM   r%     s"    


r%   zaten::index_fillc           	      C  st   t |d}t  r*| jd|||d|dS t | |||\}}t |}t ||}t| ||d }t	| ||||S )Nrw   r$   Z
int_Scalar)r   dim_i)
r
   r   r   r   _index_fill_reshape_helperr   r  re   r   r:   )	rT   rU   r|   r%   r  	dim_valueexpanded_index_shapeexpanded_indexZexpanded_valuerH   rH   rM   r$   *  s"    	
r$   zaten::index_copyc                 C  sL   t |d}t  r(| jd||||dS t | |||\}}t| ||||S )Nrw   r&   )r:  )r
   r   r   r   r;  r:   )rT   rU   r|   r%   r   r<  r=  r>  rH   rH   rM   r&   A  s    r&   zaten::__rshift_c                 C  s   t j|t jjt j|kr:| jd|t j| d}t j|t jjt jjkrf| 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 )Nri   rj   BitShiftRIGHTZdirection_srX   r   rY   r[   PowDivr   r_   r`   ro   rb   rl   r9  rc   rd   float32r
   r   r  r  ra   )rT   rU   r   twotwo_powrshiftrH   rH   rM   	__rshift_M  s4    

rI  zaten::__lshift_c                 C  s   t j|t jjt j|kr:| jd|t j| d}t j|t jjt jjkrf| 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 )Nri   rj   r?  LEFTrA  rX   r   rY   r[   rB  r  rD  )rT   rU   r   rF  rG  lshiftrH   rH   rM   	__lshift_o  s4    

rL  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   rX   r   r[   r  r~   r#  r   r   )rb   rc   rd   r   rE   r
   r   r   )rT   Zinput_dZkernel_size_dZ
dilation_dZ	padding_dZstride_dZblocks_dZblocks_d_indicesZkernel_gridZkernel_maskZ
block_maskrH   rH   rM   _get_im2col_indices_along_dim  s0    
rM  c                 C  s.   | j dtdd||gd d}|  d||S )NrX   r   r   r[   r   )rb   rc   r   )rT   rv   	padding_h	padding_wr1   rH   rH   rM   _get_im2col_padded_input  s     rP  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 )	NrX   r   r[   r~   r  r   r   ry   )r<   rb   rc   rd   r
   r   )rT   rv   kernel_hkernel_wZ	batch_dimZchannel_dimZchannel_unfoldedrH   rH   rM   _get_im2col_output_shape  s    rS  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
|g dd}t| ||S )NrX   r   r[   r   r   r~   rx   ry   r   r  )r   r~   r   r   r   r   r  )	r<   rb   rc   rd   rM  rS  rP  r
   r   )rT   rv   r   Zdilationr   r   Zinput_hZinput_wZstride_hZstride_wrN  rO  Z
dilation_hZ
dilation_wrQ  rR  Zblocks_row_indicesZblocks_col_indicesZoutput_shapeZpadded_inputr   rH   rH   rM   r#     s$    r#   zaten::narrowc                 C  s$   |  d||}tj| ||||ddS )Nr   Tr   )rb   r
   r   )rT   rv   r|   r  lengthr  rH   rH   rM   r/     s    r/   zaten::flattenc                 C  s   t |}|dkr|S |dkrL|dks:|d ur||d kr| jd||dS n8|dkr|dksp|d ur||d kr| jd||d dS |d u rt dd	S |dk r|| }t | ||||S )
Nr~   r   ZFlattenry   r   r   r|   zfONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.)r
   rp   rb   r   Z_flatten_helper)rT   rv   Z	start_dimZend_dimr|   rH   rH   rM   r      s"    
r    zaten::linalg_vector_normr}   zOptional[Sequence[int]]bool)rT   r|   keepdimc                 C  s   |dkr|d u 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   rX   r   rY   r[   FNotr.  ri   rj   Zaxes_ir	  )r
   r   rb   rc   rd   r  r   r   r_   r`   rl   _reducesum_helperre   r*   )rT   rU   ordr|   rW  rZ   Zcond_oprH   rH   rM   r*   2  s$     r*   zaten::embedding_bagc
                 C  s  |rt jrtdS |	d u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	g|R 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r0|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_idxrX   r~   r[   ri   rj   r   rz   )r   r   r   ZstepsZLoopr0  rx   ry   r   r  rY  Z
ReduceMeanZ	ReduceMax)r   Zexport_trainingr
   Z_onnx_unsupportedRuntimeErrorrb   rc   rd   r  r  ZBOOLr   r,  r   r   r   r   r2  r4  r   Z_add_input_to_blockrk   rZ  r3  r   r   )rT   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_iterr8  Zindices_startZindices_endZindices_rowZ
embeddingsZper_sample_weights_rowZcond_outrH   rH   rM   r   S  s~    








r   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   rx   r~   ZReduceL1r   ZReduceL2z8Unsupported: ONNX export of embedding_renorm with norm: z. Only 1. and 2. are supported.rY  r   rX   gHz>r[   rC  r  ZWhereZGreaterr   )rb   r   r	   r   rc   rd   r
   r   )rT   Zweightr   Zmax_normZ	norm_typeZunique_indicesZpartial_weightZpartial_weight_normZpartial_weight_norm_ZscalesZpartial_weight_renormrH   rH   rM   r     s<    

r   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g|R ddi}t| |||S )Nrx   r   r   ry   r  rX   r~   rY   r[   rC  r   r  r   rz   )rb   rc   rd   r  re   r   r?   )rT   rU   chunksr|   r7  Zchunk_size_s
chunk_sizeZ	chunk_vecrH   rH   rM   r     s    r   zaten::normalc	           
      C  sD   |d ur"t |s"t| ||d }t| || d|}	t| |	|S )NZRandomNormalLike)r
   rk   re   r   mulrb   r   )
rT   meanZstdsizes	generatorrZ   ZlayoutZdeviceZ
pin_memoryr   rH   rH   rM   r0     s    r0   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   rX   rY   r[   rx   r   ry   r~   r   rC  r  r   )rb   rc   rd   r  r   r   )rT   rU   r_  r|   Zinput_shaper  Zinput_shape_dimr  r`  Zchunk_size_minus_1Zinput_shape_dim_shiftZ	chunk_dimr  rw   r%   r  rH   rH   rM   r4     s"     r4   )F)F)N)N)N)N)N)N)N)r   N)N)N)N)NNNNNN)m__doc__
__future__r   	functoolsr   r5  typingr   r   r   rc   r   Ztorch._Cr   r  Z
torch.onnxr   r	   r
   r   r  r   re   r   Ztorch.onnx._globalsr   Ztorch.onnx._internalr   r   r   __all__partialZonnx_symbolicZ_onnx_symbolicrO   r   r   rn   r"   r   r   r   r6   r;   r'   r2   r   r   r!   r:   r   r-   r,   r   r   r   r   r   r(   r3   r   r   rA   r   nnmodulesZ_singleZ_pairZ_tripler   rD   rB   r=   r   r9   r7   r?   r>   rC   r  r   r5   r8   r1   r)   r+   r   r+  r<   r@   rE   r.   r%   r$   r&   rI  rL  rM  rP  rS  r#   r/   r    r*   r   r   r   r0   r4   rH   rH   rH   rM   <module>   s8   7	#


"

7	$9G

2
  +3^%     