U
    ‰d'  ã                   @   sÎ  d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZ e	e
dœdd„Zd	d
„ Zdd„ Zdd„ Zdd„ Ze ddddd¡dd„ ƒZdd„ Ze ddddddddd¡	dd„ ƒZe ddddddddd¡	dd„ ƒZe dddd¡dd„ ƒZe d¡dd „ ƒZe dddd!¡d"d#„ ƒZe d¡d$d%„ ƒZe dd!d!d!d!d!d!d!¡d&d'„ ƒZd7d(d)„Ze dddddd¡d*d+„ ƒZe ddddddd,¡d8d-d.„ƒZd/d0„ Ze ddddd¡d1d2„ ƒZd9d3d4„Ze d¡d5d6„ ƒZ dS ):é    N)Ú
getmembersÚ
isfunction)Úsymbolic_helper)Úsymbolic_opset9)Úsymbolic_registry)ÚdomainÚversionc                 C   s°   t  d|¡ t d¡}|t jd< tt jd ƒ}|D ]x}t|d ƒr2t  |d | |¡s2dddd	d
ddddddg}|d |kr’t  |d |d d|¡ t  |d |d | |¡ q2d S )NÚ ztorch.onnx.symbolic_caffe2Zcaffe2é   r   ÚreluÚ_empty_affine_quantizedÚ
dequantizeÚquantize_per_tensorÚupsample_nearest2dÚ
avg_pool2dÚreshapeÚsliceÚcatÚ
max_pool2dÚsigmoid)	r   Zregister_versionÚ	importlibÚimport_moduleZ_symbolic_versionsr   r   Zis_registered_opZregister_op)r   r   ÚmoduleZquant_version_opsÚopZ
aten_q_ops© r   ú>/tmp/pip-unpacked-wheel-ua33x9lu/torch/onnx/symbolic_caffe2.pyÚregister_quantized_ops	   s2    

  ÿõr   c                 C   s<   ||  ¡ d |  ¡ 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©Únoder   r   Ú_quantized_opsÚadd)ÚgÚ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   r   Ú	nchw2nhwc1   s    r.   c                 C   s   ddddg}t | ||ƒS )Nr   r+   r
   r*   r,   r-   r   r   r   Ú	nhwc2nchw6   s    r/   c                 C   s   |   d||¡}tj |¡ |S ©Nz_caffe2::WeightPrepack©r   r   r#   r$   )r%   ÚweightÚbiasr(   r   r   r   Úlinear_prepack;   s    r4   ÚvÚfÚic                 C   s.   ||dœ}| j d|||f|Ž}tj |¡ |S )N©r   r    z_caffe2::Int8FCr1   )r%   r&   r2   r3   ÚscaleÚ
zero_pointÚkwargsr(   r   r   r   ÚlinearD   s    þr<   c           	      C   s    |   d|||¡}tj |¡ |S r0   r1   )	r%   r&   r2   r3   ÚstrideÚpaddingÚdilationÚgroupsr(   r   r   r   Úconv_prepackO   s    rA   Úisc
              	   C   sR   |  ¡ d dd… }
||| |||
d||	dœ}| jd|||f|Ž}tj |¡ |S )NÚshaper
   r+   ÚNHWC©Ú	strides_iÚpads_iZdilations_iZgroup_iZ	kernels_iÚorder_sr   r    z_caffe2::Int8Convr!   ©r%   r&   r2   r3   r=   r>   r?   r@   r9   r:   Úkernel_sizer;   r(   r   r   r   Úconv2dX   s    ø
rK   c
              	   C   sR   |  ¡ d dd… }
||| |||
d||	dœ}| jd|||f|Ž}tj |¡ |S )NrC   r
   r+   rD   rE   z_caffe2::Int8ConvRelur!   rI   r   r   r   Úconv2d_relul   s    ø
rL   c                 C   s,   ||dœ}| j d||f|Ž}tj |¡ |S )Nr8   z_caffe2::Int8Addr1   )r%   Zinput_aZinput_br9   r:   r;   r(   r   r   r   r$   €   s    þr$   c                 C   sP   |t jkrt | |¡S | ¡ d | ¡ d dœ}| jd|f|Ž}t j |¡ |S )Nr   r   r8   z_caffe2::Int8Relu)r   r#   Úopset9r   r"   r   r$   )r%   r&   r;   r(   r   r   r   r   ‹   s    


þr   Útc                 C   s*   ||dœ}| j d|f|Ž}tj |¡ |S )Nr8   z_caffe2::Int8Quantizer1   )r%   r&   r9   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&   rC   r9   r:   rO   Z
pin_memoryZmemory_formatZlayoutr   r   r   r   ¨   s    r   c                 C   sv   |t jkrt | |||¡S t  |d¡}|| ¡ d | ¡ d dœ}t| |ƒ}| jd|f|Ž}t| |ƒ}t j 	|¡ |S )NrB   r   r   )Zoutput_size_ir   r    z_caffe2::Int8ResizeNearest)
r   r#   rM   r   Ú
_parse_argr"   r.   r   r/   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| ¡ d | ¡ d dœ}t| |ƒ}| jd|f|Ž}t| |ƒ}t j |¡ |S )Nr   rD   r   r   ©rF   rG   Zkernel_irH   r   r    z_caffe2::Int8MaxPool)	r   r#   rM   r   r"   r.   r   r/   r$   )	r%   r&   rJ   r=   r>   r?   Ú	ceil_moder;   r(   r   r   r   r   Â   s,    
      ÿ

ú

r   Únonec           
   
   C   s€   |t jkr"t | |||||||¡S ||| |d d| ¡ d | ¡ d dœ}t| |ƒ}| jd|f|Ž}	t| |	ƒ}	t j |	¡ |	S )Nr   rD   r   r   rQ   z_caffe2::Int8AveragePool)	r   r#   rM   r   r"   r.   r   r/   r$   )
r%   r&   rJ   r=   r>   rR   Zcount_include_padZdivisor_overrider;   r(   r   r   r   r   ×   s.    
ø

ú

r   c                 C   sT   |t jkrt | ||¡S | ¡ d | ¡ d dœ}| jd||f|Ž}t j |¡ |S )Nr   r   r8   z_caffe2::Int8Reshape)r   r#   rM   r   r"   r   r$   )r%   r&   rC   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¡}|||| ¡ d | ¡ d dœ}| jd|f|Ž}t j |¡ |S )Nr
   z2ONNX quantized slice export only works for step 1.r7   r   r   )Zstart_idx_iZ	end_idx_iZdim_ir   r    z_caffe2::Int8Slice)	r   r#   rM   r   ÚRuntimeErrorrP   r"   r   r$   )r%   r&   ÚdimÚstartÚendÚstepr;   r(   r   r   r   r   	  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   r7   r   r   r8   ú_caffe2::Int8ConcatZaxis_i)rY   )	r   Z_unpack_listr#   rM   r   rP   r"   r   r$   )	r%   Ztensor_listrU   r9   r:   Ztensorsr&   r;   r(   r   r   r   r      s    

þr   c                 C   sH   |t jkrt | |¡S d}d}||dœ}| jd|f|Ž}t j |¡ |S )Ng      p?r   r8   z_caffe2::Int8Sigmoid)r   r#   rM   r   r   r$   )r%   r&   Z	out_scaler:   r;   r(   r   r   r   r   0  s    
þr   )NNN)N)NN)!r   Úinspectr   r   Z
torch.onnxr   r   rM   r   ÚstrÚintr   r)   r.   r/   r4   Ú
parse_argsr<   rA   rK   rL   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   sR   	

	








     ÿ

	 ø$

