a
    .=ic0\                     @   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   l/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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 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 | d }| dkr  jd||||dS t |dd}t ||}|d u r`|d u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Add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_listr1   r2   r3   rangeappendr   r   r   _get_tensor_dim_sizeRuntimeError)r   r#   split_size_or_sizesr   _outputssplit_sizesstartaxisresr   endZ	split_valr9   sizesplitsleftoverr   r4   r   split.   sN    

	



rH   c                 C   s   t | ||||S NrH   r   r#   r@   r   r?   r   r   r   split_with_sizesd   s    rL   c                 C   s   t | ||||S rI   rJ   )r   r#   r>   r   r?   r   r   r   unsafe_splith   s    rM   c                 C   s   t | ||||S rI   )rL   rK   r   r   r   unsafe_split_with_sizesl   s    rN   c              	      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&   r*      r+   r,   r   r
   r   r6   r7   c                    s,   g | ]$} d |j dt gdqS )ZSqueezer*   r,   )r   r1   r2   )r(   outr   r   r   r   r)   ~   s   zunbind.<locals>.<listcomp>r0   )r   r#   r   r?   rF   r8   Zsqueezed_outputsr   rR   r   unbindp   s    rS   c                 C   s   t | t| |d|dS )NrO   )r?   )rS   opset9nonzero)r   r   r?   r   r   r   nonzero_numpy   s    rV   c              	   C   sj   |   dkr&| jd|tjd d}|d u rZt| |}t| || jdt	dd|S | d|||S )NBoolr   r   r*   rO   r,   ZWhere)
type
scalarTyper   r   Zcast_pytorch_to_onnxrT   rU   Z_unbind_helperr1   r2   )r   	conditionr#   otherr?   r   r   r   where   s    r\      c                 C   s   ||fdv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	   ra   Clipr*   r^   r+   r,   DequantizeLinear)r=   formatr   _C_onnxTensorProtoDataTypeUINT8INT8rT   unusedr1   r2   uint8)r   inputsscale
zero_pointrB   	quant_min	quant_max	quantizedr   r   r    fake_quantize_per_channel_affine   s$    rs   c                 C   s   ||fdv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_   rb   r   r   r   Floatrc   ra   rd   r*   r^   r+   r,   re   )r=   rf   r   rg   rh   ri   rj   rX   rY   FLOATrT   rk   r1   r2   rl   )r   rm   rn   ro   rp   rq   rr   r   r   r   fake_quantize_per_tensor_affine   s(    rv   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   )rT   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   )rx   ry   r   rw   r   _reduce_op_symbolic   s    	rz   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   namery   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 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)rz   rT   Zoverload_by_arg_count)Zonnx_opr   r   r   r~   r   _reduce_with_dtype   s    r   Z	ReduceSumsumc           	   	   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&   r*   rO   r+   r,   r   rP   unsafe_chunkzunknown dimension sizer6   r7   )r   r1   r2   r3   r   r<   r}   r;   )	r   r#   chunksr   r?   rE   r9   rF   rG   r   r   r   r     s$    
r   c               	   C   s  |}|}t |r8t | || jdtdgd}d}n
t |}t |}t |}t |}	|d u rpt	d|d u rt	d|	d u rt	d|dk r|t
|	7 }|	 }
t|	D ] \}}|d u rd\|
|< |	|< q|d	ko|d d u }|
| 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g|R 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   rO   ZExpandEqualZConstantOfShapeZShaper+   )r   rO   r   	   r   ZSequenceEmptyZLoopr/   Concatr
   ZSequenceInsertZConcatFromSequencer	   )r   Z_is_noneZ_reshape_helperr   r1   r2   Z_maybe_get_scalar_get_tensor_rankZ_get_tensor_sizesr=   r!   copy	enumerateZ_size_helperopset11Z	unsqueezeZ
_is_tensor
LongTensorr\   rT   repeat_interleaver3   rH   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_splits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 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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g|R 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MinSubr-      ZCumSumrO   c              
      s.   g | ]&}t j  jd t|gddqS )r*   r,   r   )rT   rE   r   r1   r   )r(   rB   r   resultr   r   r)     s   zdiagonal.<locals>.<listcomp>r
   Notr   r+   IfZGatherND   )Zbatch_dims_i   )rT   rE   r   r1   r   Zzerosr   r   listr:   remover}   r"   Zonesabsr;   r2   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
    rr   c                 C   sn   t | |\}}}}t | |\}	}
}}t | |||
|}t | |\}}}}t| ||	|}t | |||S rI   )r   dequantize_helperrequantize_bias_helperrT   linearquantize_helper)r   q_inputq_weightbiasop_scaleop_zero_pointr   input_scale_weightweight_scalerB   q_biasr   r   r   r   r     s    
zQuantized.linearc
              
   C   sv   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t | |||	S rI   )r   r   r   rT   conv2dr   r   r   r   r   ZstridepaddingZdilationgroupsr   r   r   r   r   r   r   rB   r   r   r   r   r   r   %  s    
zQuantized.conv2dc
              
   C   s   t | |\}
}}}t | |\}}}}t | ||||}t | |\}}}}t| |
||||||}t| |}t | |||	S rI   )r   r   r   rT   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) r1   Ztorch._C._onnxZ_CZ_onnxrg   Z
torch.onnxr   r   rT   r   r   r   r   r   r   r%   rH   rL   rM   rN   rS   rV   r\   rs   rv   rz   r   r   r   r   r   r   r   r   r   r   <module>   sJ   
	5



  !

 
s