a
    h&                  	   @   s  d dl Z d dlZd dlm  mZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZmZ e jejddZede
ddd	dlejd
ddZede
ddd	dmejd
ddZede
ddddnejd
ddZede
dddddoejd
ddZeddpejd
ddZeddqejd
ddZeddrejd
ddZed e
dddddsejd
d!d"Zed#e
ddddtejd
d$d%Z ed&duejd
d'd(Z!ed)e
dddddvejd
d*d+Z"ed,e
dddddddwejd
d/d0Z#ed1e
ddddddxejd
d2d3Z$d4d5 Z%ed6e
&d7d8gd9d:d; Z'ed<ejd
d=d>Z(ed?e
dddddyejd
d@dAZ)edBejd
dCdDZ*edEdzejd
dFdGZ+edHe
ddddejd
dIdJZ,edKejd
dLdMZ-edNejd
dOdPZ.edQejd
dRdSZ/edTejd
dUdVZ0edWejd
dXdYZ1edZejd
d[d\Z2ed]ejd
d^d_Z3ed`ejd
dadbZ4edcejd
dddeZ5edfejd
dgdhZ6ediejd
djdkZ7dS ){    N)
_constants_type_utilserrorssymbolic_helpersymbolic_opset11symbolic_opset9utils)	jit_utilsregistration   )Zopsetzaten::softmaxvinonegc                 C   sP   | j d||d}|rL|  dkrLt|dd}| j d|t| d}|S )NZSoftmaxaxis_iprim::Constantr   dtypeCastZto_iopnodekindr   
_get_constr   JitScalarType	onnx_type)r   inputdimr   softmaxparsed_dtype r"   I/var/www/auris/lib/python3.9/site-packages/torch/onnx/symbolic_opset13.pyr       s    r    zaten::log_softmaxc                 C   sP   | j d||d}|rL|  dkrLt|dd}| j d|t| d}|S )NZ
LogSoftmaxr   r   r   r   r   r   r   )r   r   r   r   Z	return_opr!   r"   r"   r#   log_softmax&   s    r$   zaten::frobenius_normFc                 C   s^   t |d}t |s2t|dkr2| jd|ddS | d||}t j| |||d}| d|S )Nisr   ZReduceL2
keepdims_iMulZSqrt)r   Z_maybe_get_constZ	_is_valuelenr   _reducesum_helper)r   selfr   keepdimZdim_valZsqrZsumsqrr"   r"   r#   frobenius_norm2   s    r-   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 | d}| dkr$ jd||||dS t |dd}t ||}|d u rh|d ur\|| }ntd||g||  }|| }|r|
|  jdt|d} jd||||dS )NSplitToSequencer   c                    s   g | ]}t  |d gqS )r   )r   _unsqueeze_helper).0r   r   r"   r#   
<listcomp>I   s   zsplit.<locals>.<listcomp>Constantr   r   Zvalue_tAddSlicec                    s2   g | ]*}  d  j dtj|gtjddqS )
SequenceAtr2   r3   r4   r   torchtensorlong)r0   r   r   Z	split_outr"   r#   r1   X   s   valueSplitr   outputsr   
split_size$Unknown dimension size not supported)r   _is_split_staticr   Z_is_packed_listr)   Z_unpack_listr9   r:   r;   rangeappend	_node_getr   r   r   _get_tensor_dim_sizer   SymbolicValueError)r   r+   split_size_or_sizesr   _outputssplit_sizesstartaxisresr   end	split_valrA   sizesplitsleftoverr"   r<   r#   split=   sR    

	



rT   zaten::split_with_sizesc                 C   s   t | ||||S NrT   r   r+   rK   r   rJ   r"   r"   r#   split_with_sizesv   s    rX   zaten::unsafe_splitc                 C   s   t | ||||S rU   rV   )r   r+   rI   r   rJ   r"   r"   r#   unsafe_split{   s    rY   zaten::unsafe_split_with_sizesc                 C   s   t | ||||S rU   )rX   rW   r"   r"   r#   unsafe_split_with_sizes   s    rZ   zaten::tensor_splitc           "      C   s&  | j dtj|tjdd}t| |d}| j dtjdtjdd}t||rt|	 d}|
 dkr| j dtjdgtjdd}g }	|d usJ t|d D ]J}
| j d|| j dtj|
gtjdddd}|	|  d	|||| |}qt| ||}|	|  d	|||| |	S t|d
d}t||}|d u r`|d urT|| }ntd||| }|| }||d g }|| |g }| j dtj|| tjdd}| j d||||dS t|rxt|dkrxt| || j dtdd}t| |d}| j d|tjjd}| j dtjdgtjdd}| j d||dd}|  d}tj| d|||ddd\}\}}|j}t|}t|}t|}|j d||dd}|j d|| d||dd}| d	||||}| d||}| d|}t|| t|| |	  }| j d|| j dtjdtjdddd}t| |d}t| ||}|  d	||||}|  d||S t| ||} |  d| |}|  d||}!|  d| |}|  d|!|}|  d||  dt| |d|}| j d||dd}|d u r| j d|||dS | j d||||dS d S )Nr2   r3   r4   r      r=   ZGatherr   r6   r   indices_or_sectionsrB   r>   r?   r   r   ConcatSequenceEmptyLoop)r@   n_blocksr5   SequenceInsertIdentityDivModTileSubr.   )r   r9   r:   r;   opset11	unsqueezer   rC   rF   r   r   rD   rE   _size_helperr   rG   r   rH   Z
_is_tensor_get_tensor_rank_C_onnxTensorProtoDataTypeBOOLr	   add_op_with_blocksblockr   _add_input_to_block_add_output_to_blockoutput)"r   r+   r\   r   rJ   rM   Zconst_1rP   rL   rN   r   rO   rA   rQ   Zmin_split_sizeZnum_splits_one_extrarR   rS   loop_lenloop_conditionZ	padding_0final_splitslooploop_context_
loop_blockblock_input_itercondslicecond_outloop_outZ
last_sliceZdim_sizeZmin_split_size_plus_1r"   r"   r#   tensor_split   s    








r   zaten::unbindc              	      s   |d u r2j d|j dtjdtjdd ddS j dtdg| d}j d|| |d	}|dkrn|gn|} fd
d|D }|S )Nr.   r2   r[   r3   r4   r   r   r'   r>   r?   c                    s,   g | ]$} d |j dt gdqS )ZSqueezer2   r4   )r   r9   r:   )r0   outr   r   r"   r#   r1   "  s   zunbind.<locals>.<listcomp>r8   )r   r+   r   rJ   rR   r@   Zsqueezed_outputsr"   r   r#   unbind  s    r   zaten::nonzero_numpyc                 C   s   t | t| |d|dS )Nr[   )rJ   )r   opset9nonzero)r   r   rJ   r"   r"   r#   nonzero_numpy)  s    r   zaten::wherec              	   C   sb   t |s| jd|tjjd}|d u rRt| |}t | || jdt	
dd|S | d|||S )Nr   r   r2   r[   r4   ZWhere)r   Z_is_boolr   rl   rm   rn   r   r   Z_unbind_helperr9   r:   )r   	conditionr+   otherrJ   r"   r"   r#   where/  s    
r   z&aten::fake_quantize_per_channel_affine   c                 C   s   ||fdvr&t d| d| d||dkrD| jd|tjjd}n| jd|tjjd}| jd||||d	}||fd
kr| d|t| | jdt	j
dt	jdd}| jd||||d	S )N)r      )r   r   r   r   VFor (quant_min, quant_max), ONNX allows only (0, 127), (0, 255) and (-128, 127). Got (, )r   r   r   QuantizeLinearr   r   Clipr2   r   r3   r4   DequantizeLinear)r   rH   r   rl   rm   UINT8INT8r   unusedr9   r:   uint8)r   inputsscale
zero_pointrM   	quant_min	quant_max	quantizedr"   r"   r#    fake_quantize_per_channel_affine=  s*    r   z%aten::fake_quantize_per_tensor_affinec                 C   s   ||fdvr&t d| d| d||dkrD| jd|tjjd}n| jd|tjjd}tj	|tjj
tjjkr| jd|tjjd}| d|||}||fd	kr| d
|t| | jdtjdtjdd}| d|||S )Nr   r   r   r   r   r   r   r   r   r   r2   r   r3   r4   r   )r   rH   r   rl   rm   r   r   r   r   
from_value	UNDEFINEDFLOATr   r   r9   r:   r   )r   r   r   r   r   r   r   r"   r"   r#   fake_quantize_per_tensor_affine`  s4    r   c                    s   d fdd	}|S )Nc                    sF   t | |}|d u r"t | | S t |dd}| j |||dS d S )Nr   r,   r&   )r   Z_maybe_cast_reduce_op_inputZ_handle_reduce_dim_noner   r   )r   r+   r   r,   onnx_op_namer"   r#   symbolic  s
    z%_reduce_op_symbolic.<locals>.symbolic)NNr"   )r   r   r"   r   r#   _reduce_op_symbolic  s    	r   z	aten::sumZ	ReduceSumsum)Zdecoratec                    s    t | tj fdd}|S )Nc                    s@   t dd fdd}t dddd fdd}||fS )Nr   r   c                    s   d }|   dkrBt|dd}t| }| jd||d}n|   dkr`t d|S | |}|d urtj	| }||kr| jd||d}|S Nzonnx::Constantr   r   r   r   r   
r   r   r   r   r   r   r   r   _unimplementedr   )r   r+   r   
dtype_onnxresultresult_dtype_onnxnamer   r"   r#   reduce_nodim  s    
z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr   c                    s   d }|   dkrBt|dd}t| }| jd||d}n|   dkr`t d|S | |||}|d urtj	| }||kr| jd||d}|S r   r   )r   r+   r   r,   r   r   r   r   r   r"   r#   
reduce_dim  s    z6_reduce_with_dtype.<locals>.reduce.<locals>.reduce_dim)r   
parse_args)r   argskwargsr   r   r   r"   r#   reduce  s
    
z"_reduce_with_dtype.<locals>.reduce)r   r   Z_overload_by_arg_count)Zonnx_opr   r   r"   r   r#   _reduce_with_dtype  s    'r   zaten::unflattenc              
   C   sP  t |}|d u rt ddS | jdtj|gtjdd}| d||}| d||}| d|}| jdtjd	gtjdd}| d
|| jdtjdgtjdd}| d|||}| d|| jdtjdgtjdd}	| d
|	| jdtjdgtjdd}
| jdtjtjgtjdd}| d||
|}| jd|||d	d}t 	| ||S )Nr   zfONNX and PyTorch use different strategies to split the input. Input rank must be known at export time.r2   r3   r4   r5   re   Shaper   Reshaper[   r6   r]   r   )
r   rk   r   r   r9   r:   int64r   Z	INT64_MAX_reshape_helper)r   r   r   Zunflattened_sizeZ	input_dim
input_sizeZhead_start_idxZhead_end_idxZhead_part_rankZdim_plus_oneZtail_start_idxZtail_end_idxZtail_part_rankZfinal_shaper"   r"   r#   	unflatten  s>    

r   zaten::unsafe_chunkc           	   	   C   s   |d u r2| j d|| j dtjdtjdd|ddS t||}|d u rRtdd	S || d | }|g||  }|| }|r|| | j dtj|tjdd}| j d
||||dS )Nr.   r2   r[   r3   r4   r   r   unsafe_chunkzunknown dimension sizer>   r?   )r   r9   r:   r;   r   rG   r   rE   )	r   r+   chunksr   rJ   rQ   rA   rR   rS   r"   r"   r#   r     s$    
r   z
aten::tilec                 C   s  |  d|}|  d|}|  d|}|  d||}| j dtdgd}|  d||}tj| d|d	d
d\}	\}
}}|
j dtd
gd}|
 d||}|
 d||}|
j d||dd}t|
j| | d|}t|j| |		 
 }|  d||}tj| d|d	d
d\}\}}}|j dtd
gd}| d| d||}| d||}|j d||dd}| d||}t|j| | d|}t|j| |	 
 }| j d|tjjd}|  d||S )Nr   Sizerg   r2   r   r4   ZGreaterIf   r[   )r`   r@   r   Expandr]   r   rb   ZLessZAbsr   r   rf   )r   r9   r:   r	   ro   
LongTensorr   rr   rp   r   rs   rl   rm   ZINT64)r   r+   dimsZ
self_shapeZ	self_rankZ	dims_rankdiffZ
const_zeroZdims_shorter_than_self_shapeZif_op_greaterZif_context_greaterZelse_context_greaterry   Z	const_oneZdiff_1d_greaterZexapnd_ones_greaterZdims_Zidentity_dimZ
dims_finalZdims_longer_than_self_shapeZ
if_op_lessZif_context_lessZelse_context_lessZdiff_1d_lessZexapnd_ones_lessZself_final_shapeZself_Zidentity_selfZ
self_finalr"   r"   r#   tile  s\    


r   zaten::repeat_interleavec           !   	   C   s  t |}t |}t |}|d u r2td||d u rFtd||d u rZtd||}t |rt | || jdt	dgd}tj	dtj
d}n
t |}|dk r|t|7 }| }	t|D ] \}
}|d u rd	\|	|
< ||
< q|dks|d
kr|d d
krt | |||S |d
ko0|d d u }|	| dksF|rt | ||}t| |d}|rt | || jdtdgd}| d|| jdtd
gd}t| || d|||}nt| |||S | jd| d|tj	d
gtjdd}t| ||d}t| |||}d\|	|< ||< | jdt	d
d}| jd|tjjd}|}| d}tj| d|||d
d\}\}}|j}t |}t |}t |}|d||}|d||}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dt|	d}|d||}|jd|tjjd}t"|| t"|| |# $ } | jd| |d} | 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.r2   rc   r4   r   r3   )r   rc   r[   Equalr   ZConstantOfShaper   )rc   r[   r   r   r^   r_   r`   r7   r]   r   ra   ZConcatFromSequencer   )%r   rk   Z_get_tensor_sizesr   rH   Z_is_noner   r   r9   r:   r   Z_maybe_get_scalarr)   copy	enumerateZ-_repeat_interleave_single_value_repeat_helperrj   rh   ri   r   r   r   repeat_interleaver;   rT   rl   rm   rn   r	   ro   rp   r   rq   expandrr   r   rs   )!r   r+   Zrepeatsr   Zoutput_sizeZrepeats_dimZrepeats_sizesZinput_sizesZ	final_dimZoutput_sizesidxr   Zcond_dynamic_repeatsZrepsZ
repeat_dimZrepeat_condZ	reps_likeZr_splitsZi_splitsru   rt   rv   rw   rx   ry   rz   r{   r|   Zr_splitZi_splitZr_concatr~   r   r"   r"   r#   r   F  s    




"





r   zaten::diagonalc                    s$  t |}|d ur:|dkr|n|| }|dkr2|n|| }tj | jdt|gdd}tj | jdt|gdd} jd||dd}t |d d d }	 jd|	|d}	|d urtt	|}
|

| |

|  jd	||
||g d
}nt ddS  d||	t j dgdd jdt|gd}|dkr| d d| d|| jdtdgd}d}n4 d d d||| jdtdgd} jd|dd}t |dd d } d| jdtdgd} d| jdtt|d gd} fddtt	|d d D }||  jdg|R ddi}t |dd d } d d| jdtjdtjdd}tj d|dd \}\}}}|d||}t |||d g}|jd!||d d"}t||d#d d }t|j| t|j| |S )$Nr   r2   r4   r   r]   r   ZEyeLike)Zk_iZ	Transpose)Zperm_idiagonalzunknown input rankr(   rc   )Zaxes_ir'   ZMaxZMinrg   r5      ZCumSumr[   c              
      s.   g | ]&}t j  jd t|gddqS )r2   r4   r   )r   rQ   r   r9   r   )r0   rM   r   r   r"   r#   r1     s   zdiagonal.<locals>.<listcomp>r   Notr   r3   r   r   r   ZGatherND)Zbatch_dims_i   )r   rk   r   rQ   r   r9   r   zeroslistrD   remover   r*   ZonesabsrE   r:   r   r	   ro   r/   r   rr   rp   )r   r+   offsetZdim1Zdim2ZrankZ	dim1_sizeZ	dim2_sizeZ
mask_shapemaskZaxesZ	offset_opZ	diag_sizeZselect_window_ones_fillZselect_windowZgather_shapeZgather_indicesZoverrun_condZif_opZ
if_contextZelse_contextry   Zgather_indices_if_blockZfinal_non_overrunZfinal_overrunr"   r   r#   r     s    



	
	r   zquantized::linearc                 C   sn   t | |\}}}}t | |\}	}
}}t | |||
|}t | |\}}}}t| ||	|}t | |||S rU   )r   dequantize_helperrequantize_bias_helperr   linearquantize_helperr   q_inputq_weightbiasop_scaleop_zero_pointr   input_scalery   weightweight_scalerM   q_biasrs   r"   r"   r#   quantized_linearN  s    
r   zquantized::linear_reluc                 C   sz   t | |\}}}}t | |\}	}
}}t | |||
|}t | |\}}}}t| ||	|}t| |}t | |||S rU   )r   r   r   r   r   relur   r   r"   r"   r#   quantized_linear_relu^  s    
r   zquantized::conv1d_reluc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S rU   )r   r   r   r   conv1dr   r   r   r   r   r   stridepaddingdilationgroupsr   r   r   r   ry   r   r   rM   r   rs   r"   r"   r#   quantized_conv1d_reluo  s    
r   zquantized::conv2d_reluc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S rU   )r   r   r   r   conv2dr   r   r   r"   r"   r#   quantized_conv2d_relu  s    
r   zquantized::conv3d_reluc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S rU   )r   r   r   r   conv3dr   r   r   r"   r"   r#   quantized_conv3d_relu  s    
r   zquantized::conv1dc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S rU   )r   r   r   r   r   r   r   r"   r"   r#   quantized_conv1d  s    
r   zquantized::conv2dc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S rU   )r   r   r   r   r   r   r   r"   r"   r#   quantized_conv2d  s    
r   zquantized::conv3dc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S rU   )r   r   r   r   r   r   r   r"   r"   r#   quantized_conv3d  s    
r   zquantized::conv_transpose1dc                 C   sx   t | |\}}}}t | |\}}}}t | ||||}t | |\}}}}t| ||||||||	}t | ||	|
S rU   r   r   r   r   Zconv_transpose2dr   r   r   r   r   r   r   Zoutput_paddingr   r   r   r   r   r   ry   r   r   rM   r   rs   r"   r"   r#   quantized_conv_transpose1d  s    
r   zquantized::conv_transpose2dc                 C   sx   t | |\}}}}t | |\}}}}t | ||||}t | |\}}}}t| ||||||||	}t | ||	|
S rU   r   r   r"   r"   r#   quantized_conv_transpose2d$  s    
r   zquantized::conv_transpose3dc                 C   sx   t | |\}}}}t | |\}}}}t | ||||}t | |\}}}}t| ||||||||	}t | ||	|
S rU   )r   r   r   r   Zconv_transpose3dr   r   r"   r"   r#   quantized_conv_transpose3d@  s    
r   )N)N)NF)N)N)N)N)N)r   N)N)NNN)r   r   )r   r   )N)NN)8	functoolsr9   Ztorch._C._onnxZ_CZ_onnxrl   Z
torch.onnxr   r   r   r   r   rh   r   r   r   Ztorch.onnx._internalr	   r
   partialZonnx_symbolicZ_onnx_symbolicr   ZGraphContextr    r$   r-   rT   rX   rY   rZ   r   r   r   r   r   r   r   Z_apply_paramsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s   $	
	7    	  !  $
1*6  y