U
    <cx                  	   @   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 d dlmZmZmZ e jejddZdd Zede	d	d
dejdPejdddZede	d	d
dejdQejdddZede	d	d	d
ejdRejdddZede	d	d	d
d
ejdSejdddZedejdTejdddZedejdUejdddZedejdVejdd d!Z ed"e	d	d	d
d
ejdWejdd#d$Z!ed%e	d	d
d
ejdXejdd&d'Z"ed(ejdYejdd)d*Z#ed+e	d	d	d	d
ejdZejdd,d-Z$ed.e	d	d	d	d
d
d
ejd[ejdd1d2Z%ed3e	d	d	d	d
d
ejd\ejdd4d5Z&ejd6d7 Z'ed8ed9d:gd;ejd<d= Z(ed>e	d	d
d
d
ejd]ejdd?d@Z)edAejd^ejddBdCZ*edDe	d	d
d
d
ejejddEdFZ+edGejejddHdIZ,edJejejddKdLZ-edMejejddNdOZ.dS )_    N)_type_utilserrorssymbolic_helpersymbolic_opset11symbolic_opset9utils)	_beartype	jit_utilsregistration   )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kwargsr   ?/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/symbolic_opset13.py_apply   s    z_apply_params.<locals>._applyr   )r   r   r   r   r   r   _apply_params   s    r   z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_dtyper   r   r   r)       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_norm;   s    r4   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 | d}| dkr$ jd||||dS t |dd}t ||}|d krh|d k	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>T   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 )
SequenceAtr9   r:   r;   r!   torchtensorlong)r7   r   r   Z	split_outr   r   r8   c   s   valueSplitr   outputsr   
split_size$Unknown dimension size not supported)r   _is_split_staticr!   Z_is_packed_listr0   Z_unpack_listr@   rA   rB   rangeappend	_node_getr"   r(   r$   _get_tensor_dim_sizer   SymbolicValueError)r   r2   split_size_or_sizesr(   _outputssplit_sizesstartaxisresr   end	split_valrH   sizesplitsleftoverr   rC   r   splitG   sX    
  	


 
r[   zaten::split_with_sizesc                 C   s   t | ||||S r   r[   r   r2   rR   r(   rQ   r   r   r   split_with_sizes   s    r^   zaten::unsafe_splitc                 C   s   t | ||||S r   r\   )r   r2   rP   r(   rQ   r   r   r   unsafe_split   s    r_   zaten::unsafe_split_with_sizesc                 C   s   t | ||||S r   )r^   r]   r   r   r   unsafe_split_with_sizes   s    r`   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 k	st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 kr`|d k	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 kr| j d|||dS | j d||||dS d S )Nr9   r:   r;   r      rD   ZGatherr   r=   r   indices_or_sectionsrI   rE   rF   r   r   ConcatSequenceEmptyLoop)rG   n_blocksr<   SequenceInsertZIdentityZDivZModZTileSubr5   )r!   r@   rA   rB   opset11	unsqueezer   rJ   rM   r"   r(   AssertionErrorrK   rL   _size_helperr$   rN   r   rO   
_is_tensor_get_tensor_rank_C_onnxTensorProtoDataTypeBOOLr	   add_op_with_blocksblockr   _add_input_to_block_add_output_to_blockoutput)"r   r2   rb   r(   rQ   rT   Zconst_1rW   rS   rU   r   rV   rH   rX   Zmin_split_sizeZnum_splits_one_extrarY   rZ   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 k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 )Nr5   r9   ra   r:   r;   r   r   r.   rE   rF   c                    s,   g | ]$} d |j dt gdqS )ZSqueezer9   r;   )r!   r@   rA   )r7   outr(   r   r   r   r8   2  s   zunbind.<locals>.<listcomp>r?   )r   r2   r(   rQ   rY   rG   Zsqueezed_outputsr   r   r   unbind"  s    r   zaten::nonzero_numpyc                 C   s   t | t| |d|dS )Nra   )rQ   )r   opset9nonzero)r   r'   rQ   r   r   r   nonzero_numpy9  s    r   zaten::wherec              	   C   sb   t |s| jd|tjjd}|d krRt| |}t | || jdt	
dd|S | d|||S )Nr   r   r9   ra   r;   ZWhere)r   Z_is_boolr!   rp   rq   rr   r   r   Z_unbind_helperr@   rA   )r   	conditionr2   otherrQ   r   r   r   where@  s    
   r   z&aten::fake_quantize_per_channel_affine   c                 C   s   ||fdk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   Clipr9   r   r:   r;   DequantizeLinear)r   rO   r!   rp   rq   UINT8INT8r   unusedr@   rA   uint8)r   inputsscale
zero_pointrT   	quant_min	quant_max	quantizedr   r   r    fake_quantize_per_channel_affineO  s"    r   z%aten::fake_quantize_per_tensor_affinec                 C   s   ||fdkr&t d| d| d||dkrD| jd|tjjd}n| jd|tjjd}|  d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   ZFloatr   r   r   r9   r   r:   r;   r   )r   rO   r!   rp   rq   r   r   typeZ
scalarTypeFLOATr   r   r@   rA   r   )r   r   r   r   r   r   r   r   r   r   fake_quantize_per_tensor_affines  s&    r   c                    s   t jd fdd	}|S )Nc                    sF   t | |}|d kr"t| | S t|dd}| j |||dS d S )Nr   r3   r-   )r   Z_maybe_cast_reduce_op_inputr   Z_handle_reduce_dim_noner$   r!   )r   r2   r(   r3   onnx_op_namer   r   symbolic  s
    z%_reduce_op_symbolic.<locals>.symbolic)NN)r   beartype)r   r   r   r   r   _reduce_op_symbolic  s    	r   z	aten::sumZ	ReduceSumsum)Zdecoratec                    s&   t | tjtj fdd}|S )Nc                    sL   t ddtj fdd}t ddddtj fdd}||fS )Nr   r   c                    sb   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |S Nzonnx::Constantr   r   r   r   r   	r"   r#   r   r$   r!   r   r%   r&   _unimplemented)r   r2   r   namer   r   r   reduce_nodim  s      z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr   c                    sf   |   dkr:t|dd}| jd|t| d}n|   dkrXt d|S | |||S r   r   )r   r2   r(   r3   r   r   r   r   
reduce_dim  s      z6_reduce_with_dtype.<locals>.reduce.<locals>.reduce_dim)r   
parse_argsr   r   )r   r   r   r   r   r   r   r   reduce  s    


z"_reduce_with_dtype.<locals>.reduce)r   r   Zoverload_by_arg_countr   r   )Zonnx_opr   r   r   r   r   _reduce_with_dtype  s
    r   zaten::unsafe_chunkc           	   	   C   s   |d kr2| j d|| j dtjdtjdd|ddS t||}|d krRtdd	S || d | }|g||  }|| }|r|| | j dtj|tjdd}| j d
||||dS )Nr5   r9   ra   r:   r;   r   r   unsafe_chunkzunknown dimension sizerE   rF   )r!   r@   rA   rB   r   rN   r   rL   )	r   r2   chunksr(   rQ   rX   rH   rY   rZ   r   r   r   r     s$    
r   zaten::repeat_interleavec           "   	   C   s  |}|}t |r8t | || jdtdgd}d}n
t |}t |}t |}t |}	|d krtt	
d||d krt	
d||	d krt	
d||dk r|t|	7 }|	 }
t|	D ] \}}|d krd\|
|< |	|< q|d	ko|d d k}|
| dks
|rt | ||}t| |d}|dksH|d	krx|d d	krxt |sh| jdt|d}| d
||}n^|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|ddi}t |||d }t ||| jdt|
d}|d||}|jd|tjjd} t!||  t!|| |" # }!| jd|!|d}!|!S )Nr9   rh   r;   r   zGUnsupported: ONNX export of repeat_interleave for unknown repeats rank.zGUnsupported: ONNX export of repeat_interleave for unknown repeats size.zEUnsupported: ONNX export of repeat_interleave for unknown input size.)r   rh   ra   ZExpandEqualZConstantOfShapeZShaper:   )rh   ra   r   r   rd   re   rf   r>   rc   r   rg   ZConcatFromSequencer   )rc   )$r   Z_is_noneZ_reshape_helperr!   r@   rA   Z_maybe_get_scalarro   Z_get_tensor_sizesr   rO   r0   copy	enumeraterm   rj   rk   rn   
LongTensorr   r   repeat_interleaverB   r[   rp   rq   rr   r	   rs   rt   r   ru   expandrv   r"   rw   )"r   r2   Zrepeatsr(   Zoutput_sizer'   Z	final_dimZrepeats_dimZrepeats_sizesZinput_sizesZoutput_sizesidxZ
input_sizeZcond_dynamic_repeatsZrepsZ
repeat_dimZrepeat_condZ	reps_likeZr_splitsZi_splitsry   rx   rz   r{   r|   r}   r~   r   r   Zr_splitZi_splitZr_concatr   r   r   r   r   r     s    
  



"    

     


    r   zaten::diagonalc                    s  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}t|}	|	d k	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rL 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$|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 )%Nr9   r;   r(   rc   r   r   ZEyeLike)Zk_iZ	Transpose)Zperm_idiagonalzunknown input rankr/   rh   )Zaxes_ir.   ZMaxZMinri   r<      ZCumSumra   c              
      s.   g | ]&}t j  jd t|gddqS )r9   r;   r   )r   rX   r!   r@   r   )r7   rT   r   resultr   r   r8     s   zdiagonal.<locals>.<listcomp>r   ZNotr   r:   ZIf   r   ZGatherND)Zbatch_dims_i   )rc   )r   rX   r!   r@   r   zerosr   ro   listrK   remover   r1   ZonesabsrL   rA   Zint64r	   rs   r6   r   rv   rt   )r   r2   offsetZdim1Zdim2Z	dim1_sizeZ	dim2_sizeZ
mask_shapemaskZrankZaxesZ	offset_opZ	diag_sizeZselect_window_ones_fillZselect_windowZgather_shapeZgather_indicesZoverrun_condZif_opZ
if_contextZelse_contextr}   Zgather_indices_if_blockZfinal_non_overrunZfinal_overrunr   r   r   r   x  s        



	
	        r   zquantized::linearc                 C   sn   t | |\}}}}t | |\}	}
}}t | |||
|}t | |\}}}}t| ||	|}t | |||S r   )r   dequantize_helperrequantize_bias_helperr   Zlinearquantize_helper)r   q_inputq_weightbiasop_scaleop_zero_pointr'   input_scaler}   weightweight_scalerT   q_biasrw   r   r   r   quantized_linear  s        r   zquantized::conv2dc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S r   )r   r   r   r   conv2dr   r   r   r   r   ZstridepaddingZdilationgroupsr   r   r'   r   r}   r   r   rT   r   rw   r   r   r   quantized_conv2d  s        r   zquantized::conv2d_reluc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S r   )r   r   r   r   r   Zrelur   r   r   r   r   quantized_conv2d_relu  s        r   )N)N)NF)N)N)N)N)N)r   N)N)NNN)r   r   )r   r   )N)NN)/	functoolsr@   Ztorch._C._onnxZ_CZ_onnxrp   Z
torch.onnxr   r   r   r   rj   r   r   r   Ztorch.onnx._internalr   r	   r
   partialZonnx_symbolicZ_onnx_symbolicr   r   r   ZGraphContextr)   r+   r4   r[   r^   r_   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    	
	7    	  !  !

#    u