U
    <ºcœ*  ã                   @   sb  d dl Z d dlZd dlmZmZ d dlmZmZ e	e
dœdd„Zejdœdd	„Zejdœd
d„Zejdœdd„Zejdœdd„Ze ddddd¡ejdœdd„ƒZejdœdd„Ze ddddddddd¡	ejdœdd„ƒZe ddddddddd¡	ejdœdd„ƒZe dddd¡ejdœdd„ƒZe d¡ejdœdd„ƒZe dddd ¡ejdœd!d"„ƒZe d¡ejdœd#d$„ƒZe dd d d d d d d ¡ejdœd%d&„ƒZd6ejdœd'd(„Ze dddddd¡ejdœd)d*„ƒZe ddddddd+¡d7ejdœd,d-„ƒZejdœd.d/„Ze ddddd¡ejdœd0d1„ƒZd8ejdœd2d3„Z e d¡ejdœd4d5„ƒZ!dS )9é    N)Úsymbolic_helperÚsymbolic_opset9)Ú	jit_utilsÚregistration)ÚdomainÚversionc                 C   s˜   t  d¡}t |¡}dddddddd	d
ddh}|D ]`\}}| › d|› }t |¡r2tj ||¡s2||kr‚tjjd|› ||dd tj |||¡ q2d S )Nztorch.onnx.symbolic_caffe2ÚreluÚ_empty_affine_quantizedÚ
dequantizeÚquantize_per_tensorÚupsample_nearest2dÚ
avg_pool2dÚreshapeÚsliceÚcatÚ
max_pool2dÚsigmoidz::zaten::T)Zcustom)	Ú	importlibÚimport_moduleÚinspectÚ
getmembersÚ
isfunctionr   ÚregistryZis_registered_opÚregister)r   r   ÚmoduleZquant_version_opsZ
aten_q_opsÚopÚfuncÚname© r   ú>/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/symbolic_caffe2.pyÚregister_quantized_ops   s8    

õ ÿ   ÿr    )Úgc                 C   sD   |t  | ¡ d¡t  | ¡ d¡dœ}| jd|f|Ž}t j |¡ |S )NÚY_scaleÚY_zero_point)Zaxes_iÚ	Y_scale_fÚY_zero_point_iz_caffe2::Int8Transpose)r   Ú	_node_getÚnoder   Ú_quantized_opsÚadd)r!   ÚinputÚaxesZ
quant_argsÚoutputr   r   r   Ú_permute_helper&   s    ýr-   c                 C   s   ddddg}t | ||ƒS )Nr   é   é   é   ©r-   ©r!   r*   r+   r   r   r   Ú	nchw2nhwc1   s    r3   c                 C   s   ddddg}t | ||ƒS )Nr   r/   r0   r.   r1   r2   r   r   r   Ú	nhwc2nchw6   s    r4   c                 C   s   |   d||¡}tj |¡ |S ©Nz_caffe2::WeightPrepack©r   r   r(   r)   )r!   ÚweightÚbiasr,   r   r   r   Úlinear_prepack;   s    r9   ÚvÚfÚic                 C   s.   ||dœ}| j d|||f|Ž}tj |¡ |S )N©r$   r%   z_caffe2::Int8FCr6   )r!   r*   r7   r8   ÚscaleÚ
zero_pointÚkwargsr,   r   r   r   ÚlinearD   s    þrA   c           	      C   s    |   d|||¡}tj |¡ |S r5   r6   )	r!   r*   r7   r8   ÚstrideÚpaddingÚdilationÚgroupsr,   r   r   r   Úconv_prepackO   s    rF   Úisc
              	   C   sR   |  ¡ d dd… }
||| |||
d||	dœ}| jd|||f|Ž}tj |¡ |S )NÚshaper0   r/   ÚNHWC©Ú	strides_iÚpads_iZdilations_iZgroup_iZ	kernels_iÚorder_sr$   r%   z_caffe2::Int8Conv©r'   r   r   r(   r)   ©r!   r*   r7   r8   rB   rC   rD   rE   r>   r?   Úkernel_sizer@   r,   r   r   r   Úconv2dZ   s    ø
rQ   c
              	   C   sR   |  ¡ d dd… }
||| |||
d||	dœ}| jd|||f|Ž}tj |¡ |S )NrH   r0   r/   rI   rJ   z_caffe2::Int8ConvRelurN   rO   r   r   r   Úconv2d_reluw   s    ø
rR   c                 C   s,   ||dœ}| j d||f|Ž}tj |¡ |S )Nr=   z_caffe2::Int8Addr6   )r!   Zinput_aZinput_br>   r?   r@   r,   r   r   r   r)   ”   s    þr)   c                 C   sX   |t jkrt | |¡S t  | ¡ d¡t  | ¡ d¡dœ}| jd|f|Ž}t j |¡ |S )Nr"   r#   r=   z_caffe2::Int8Relu)r   r(   Úopset9r   r&   r'   r   r)   )r!   r*   r@   r,   r   r   r   r   Ÿ   s    
þr   Útc                 C   s*   ||dœ}| j d|f|Ž}tj |¡ |S )Nr=   z_caffe2::Int8Quantizer6   )r!   r*   r>   r?   Údtyper@   r,   r   r   r   r   ¬   s    þr   c                 C   s   |   d|¡S )Nz_caffe2::Int8Dequantize)r   )r!   r*   r   r   r   r
   ·   s    r
   c	           	      C   s   |S )Nr   )	r!   r*   rH   r>   r?   rU   Z
pin_memoryZmemory_formatZlayoutr   r   r   r	   ¼   s    r	   c                 C   s~   |t jkrt | |||¡S t  |d¡}|t  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|f|Ž}t	| |ƒ}t j 
|¡ |S )NrG   r"   r#   )Zoutput_size_ir$   r%   z_caffe2::Int8ResizeNearest)r   r(   rS   r   Ú
_parse_argr&   r'   r3   r   r4   r)   )r!   r*   Zoutput_sizeZalign_cornersZscales_hZscales_wr@   r,   r   r   r   r   Ë   s    
ý

r   c           	   	   C   s†   |t jkr t | ||||||¡S ||| |d dt  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|f|Ž}t| |ƒ}t j 	|¡ |S )Nr   rI   r"   r#   ©rK   rL   Zkernel_irM   r$   r%   z_caffe2::Int8MaxPool)
r   r(   rS   r   r&   r'   r3   r   r4   r)   )	r!   r*   rP   rB   rC   rD   Ú	ceil_moder@   r,   r   r   r   r   ã   s,    

      ÿú

r   Únonec           
   
   C   sˆ   |t jkr"t | |||||||¡S ||| |d dt  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|f|Ž}	t| |	ƒ}	t j 	|	¡ |	S )Nr   rI   r"   r#   rW   z_caffe2::Int8AveragePool)
r   r(   rS   r   r&   r'   r3   r   r4   r)   )
r!   r*   rP   rB   rC   rX   Zcount_include_padZdivisor_overrider@   r,   r   r   r   r      s.    
øú

r   c                 C   s\   |t jkrt | ||¡S t  | ¡ d¡t  | ¡ d¡dœ}| jd||f|Ž}t j |¡ |S )Nr"   r#   r=   z_caffe2::Int8Reshape)r   r(   rS   r   r&   r'   r   r)   )r!   r*   rH   r@   r,   r   r   r   r   %  s    
þr   c                 C   sš   |t jkrt | |||||¡S |dkr.tdƒ‚t  |d¡}t  |d¡}t  |d¡}|||t  | ¡ d¡t  | ¡ d¡dœ}| jd|f|Ž}t j 	|¡ |S )Nr0   z2ONNX quantized slice export only works for step 1.r<   r"   r#   )Zstart_idx_iZ	end_idx_iZdim_ir$   r%   z_caffe2::Int8Slice)
r   r(   rS   r   ÚRuntimeErrorrV   r&   r'   r   r)   )r!   r*   ÚdimÚstartÚendÚstepr@   r,   r   r   r   r   2  s     
ûr   c           	      C   s€   t  |¡}|d }|t jkr*t | ||¡S t  |d¡}|d  ¡ d |d  ¡ d dœ}| jd|žd|i|—Ž}t j |¡ |S )	Nr   r<   r"   r#   r=   ú_caffe2::Int8ConcatZaxis_i)r_   )	r   Z_unpack_listr(   rS   r   rV   r'   r   r)   )	r!   Ztensor_listr[   r>   r?   Ztensorsr*   r@   r,   r   r   r   r   I  s    

þr   c                 C   sH   |t jkrt | |¡S d}d}||dœ}| jd|f|Ž}t j |¡ |S )Ng      p?r   r=   z_caffe2::Int8Sigmoid)r   r(   rS   r   r   r)   )r!   r*   Z	out_scaler?   r@   r,   r   r   r   r   Y  s    
þr   )NNN)N)NN)"r   r   Z
torch.onnxr   r   rS   Ztorch.onnx._internalr   r   ÚstrÚintr    ZGraphContextr-   r3   r4   r9   Ú
parse_argsrA   rF   rQ   rR   r)   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   sb   	ÿÿÿ

ÿ   úÿÿ	 øÿ$