U
    d0\                     @   s  d dl Z d dlm  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d2d	d
Zedddd3ddZedddd4ddZeddddd5ddZd6ddZd7ddZd8ddZedddd9ddZd:ddZeddddd;ddZeddddddd<d d!Zedddddd=d"d#Zd$d% Zd&d' Zed(d)Zeddddd>d*d+Zd?d,d-Zeddddd.d/ ZG d0d1 d1ZdS )@    N)symbolic_helper)symbolic_opset9)symbolic_opset11)utilsvinonec                 C   sL   | j d||d}|rH|  dkrHt|dd}| j d|tj| d}|S )NZSoftmaxaxis_iprim::Constantr   dtypeCastZto_iopnodekindr   
_get_constscalar_type_to_onnx)ginputdimr   softmaxparsed_dtype r   ?/tmp/pip-unpacked-wheel-ua33x9lu/torch/onnx/symbolic_opset13.pyr      s      r   c                 C   sL   | j d||d}|rH|  dkrHt|dd}| j d|tj| d}|S )NZ
LogSoftmaxr	   r   r   r   r   r   r   )r   r   r   r   Z	return_opr   r   r   r   log_softmax   s      r   Fc                 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    r%   c              
      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 | d }| dkr  jd||||dS t |dd}t ||}|d kr`|d k	rX|| }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>9   s   zsplit.<locals>.<listcomp>Constantr   r   Zvalue_tAddZSlicec                    s2   g | ]*}  d  j dtj|gtjddqS )
SequenceAtr*   r+   r,   r   torchtensorlong)r(   r   r   Z	split_outr   r   r)   H   s   valueSplitr
   outputsr   
split_sizez$Unknown dimension size not supported)r   Z_is_split_staticr   Z_is_packed_listr!   Z_unpack_listr0   r1   r2   rangeappendr   r   r   _get_tensor_dim_sizeRuntimeError)r   r#   split_size_or_sizesr   _outputssplit_sizesstartaxisresr   endZ	split_valr8   sizesplitsleftoverr   r3   r   split.   sR    
  	



rG   c                 C   s   t | ||||S NrG   r   r#   r?   r   r>   r   r   r   split_with_sizesd   s    rK   c                 C   s   t | ||||S rH   rI   )r   r#   r=   r   r>   r   r   r   unsafe_splith   s    rL   c                 C   s   t | ||||S rH   )rK   rJ   r   r   r   unsafe_split_with_sizesl   s    rM   c              	      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 )Nr&   r*      r+   r,   r   r
   r   r5   r6   c                    s,   g | ]$} d |j dt gdqS )ZSqueezer*   r,   )r   r0   r1   )r(   outr   r   r   r   r)   ~   s   zunbind.<locals>.<listcomp>r/   )r   r#   r   r>   rE   r7   Zsqueezed_outputsr   rQ   r   unbindp   s    rR   c                 C   s   t | t| |d|dS )NrN   )r>   )rR   opset9nonzero)r   r   r>   r   r   r   nonzero_numpy   s    rU   c              	   C   sj   |   dkr&| jd|tjd d}|d krZt| |}t| || jdt	dd|S | d|||S )NZBoolr   r   r*   rN   r,   ZWhere)
type
scalarTyper   r   Zcast_pytorch_to_onnxrS   rT   Z_unbind_helperr0   r1   )r   	conditionr#   otherr>   r   r   r   where   s         rZ      c                 C   s   ||fdkrt d|||dkr:| 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\   ]For (quant_min, quant_max), ONNX allows only (0, 127), (0, 255) and (-128, 127). Got ({}, {})r   r   r   QuantizeLinearr	   r_   Clipr*   r\   r+   r,   DequantizeLinear)r<   formatr   _C_onnxTensorProtoDataTypeUINT8INT8rS   unusedr0   r1   uint8)r   inputsscale
zero_pointrA   	quant_min	quant_max	quantizedr   r   r    fake_quantize_per_channel_affine   s&     rq   c                 C   s   ||fdkrt d|||dkr:| jd|tjjd}n| jd|tjjd}|  dkrr| 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   ZFloatra   r_   rb   r*   r\   r+   r,   rc   )r<   rd   r   re   rf   rg   rh   rV   rW   FLOATrS   ri   r0   r1   rj   )r   rk   rl   rm   rn   ro   rp   r   r   r   fake_quantize_per_tensor_affine   s*     rs   c                    s   d fdd	}|S )Nc                    sF   t | |}|d kr"t| | S t|dd}| j |||dS d S )Nr   r$   r   )rS   Z_maybe_cast_reduce_op_inputr   Z_handle_reduce_dim_noner   r   )r   r#   r   r$   onnx_op_namer   r   symbolic   s
    z%_reduce_op_symbolic.<locals>.symbolic)NNr   )ru   rv   r   rt   r   _reduce_op_symbolic   s    	rw   c                    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kr6t|dd}| jd|tj| d}n|   dkrRt dS | |S Nzonnx::Constantr   r   r   r   r   r   r   r   r   r   r   _unimplemented)r   r#   r   namerv   r   r   reduce_nodim   s      z8_reduce_with_dtype.<locals>.reduce.<locals>.reduce_nodimr   c                    s`   |   dkr6t|dd}| jd|tj| d}n|   dkrRt dS | |||S rx   ry   )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)rw   rS   Zoverload_by_arg_count)Zonnx_opr|   r   r   r{   r   _reduce_with_dtype   s    r   Z	ReduceSumsumc           	   	   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 )Nr&   r*   rN   r+   r,   r   rO   unsafe_chunkzunknown dimension sizer5   r6   )r   r0   r1   r2   r   r;   rz   r:   )	r   r#   chunksr   r>   rD   r8   rE   rF   r   r   r   r     s$    
r   c               	   C   s  |}|}t |r8t | || jdtdgd}d}n
t |}t |}t |}t |}	|d krpt	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s:|d	krj|d d	krjt |sZ| 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|dd}|}| d}| d|||}t| }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|dd}t|| t|| |  }| jd||d}|S )Nr*   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   r   rN   ZExpandEqualZConstantOfShapeZShaper+   )r   rN   r   	   r   ZSequenceEmptyZLoopr.   Concatr
   ZSequenceInsertZConcatFromSequencer	   )r   )r   Z_is_noneZ_reshape_helperr   r0   r1   Z_maybe_get_scalar_get_tensor_rankZ_get_tensor_sizesr<   r!   copy	enumerateZ_size_helperopset11Z	unsqueezeZ
_is_tensor
LongTensorrZ   rS   repeat_interleaver2   rG   r   
_add_blockr   Z_add_input_to_blockexpand_add_output_to_blockoutput) r   r#   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_splitsZloop_conditionZloop_lenZfinal_splitsZloopZ
loop_blockZblock_input_iterZcondZr_splitZi_splitZr_concatZcond_outZloop_outr   r   r   r     s    
  



"    




  r   c                    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} d|}| }t|}|d||}t|||	d g}|jd||	d  d!}t|| t|}t ||d"d d }t|| |S )$Nr*   r,   r   r   r   r	   ZEyeLike)Zk_iZ	Transpose)Zperm_idiagonalzunknown input rankr    r   )Zaxes_ir   ZMaxZMinZSubr-      ZCumSumrN   c              
      s.   g | ]&}t j  jd t|gddqS )r*   r,   r   )rS   rD   r   r0   r   )r(   rA   r   resultr   r   r)     s   zdiagonal.<locals>.<listcomp>r
   ZNotr   r+   ZIfZGatherND   )Zbatch_dims_i   )r   )rS   rD   r   r0   r   zerosr   r   listr9   removerz   r"   Zonesabsr:   r1   Zint64r   r   r   r'   r   )r   r#   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_nodeZif_blockZgather_indices_if_blockZfinal_non_overrun_Z
else_blockZfinal_overrun_r   r   r   r     s        



	

     
r   c                   @   s8   e Zd ZdZdZedd Zedd Zedd Zd	S )
	Quantizedz^
    https://github.com/pytorch/pytorch/wiki/PyTorch-ONNX-exporter#quantized-model-export
    rp   c                 C   sn   t | |\}}}}t | |\}	}
}}t | |||
|}t | |\}}}}t| ||	|}t | |||S rH   )r   dequantize_helperrequantize_bias_helperrS   linearquantize_helper)r   q_inputq_weightbiasop_scaleop_zero_pointr   input_scale_weightweight_scalerA   q_biasr   r   r   r   r     s        zQuantized.linearc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S rH   )r   r   r   rS   conv2dr   r   r   r   r   ZstridepaddingZdilationgroupsr   r   r   r   r   r   r   rA   r   r   r   r   r   r   %  s*               zQuantized.conv2dc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S rH   )r   r   r   rS   r   Zrelur   r   r   r   r   conv2d_relu?  s,               zQuantized.conv2d_reluN)	__name__
__module____qualname____doc__domainstaticmethodr   r   r   r   r   r   r   r     s   

r   )N)N)NF)N)N)N)N)r   N)N)NNN)r[   r\   )r[   r\   )N)NN) r0   Ztorch._C._onnxZ_CZ_onnxre   Z
torch.onnxr   r   rS   r   r   r   r   r   r   r%   rG   rK   rL   rM   rR   rU   rZ   rq   rs   rw   r   r   r   r   r   r   r   r   r   r   <module>   sN   
	5



      !

 
s