o
    ðÇhÛ*  ã                   @   sl  d dl Z d dlZd dlmZmZ d dlmZmZ de	de
fdd„Zdejfd	d
„Zdejfdd„Zdejfdd„Zdejfdd„Ze ddddd¡dejfdd„ƒZdejfdd„Ze ddddddddd¡	dejfdd„ƒZe ddddddddd¡	dejfdd„ƒZe dddd¡dejfdd„ƒZe d¡dejfdd „ƒZe dddd!¡dejfd"d#„ƒZe d¡dejfd$d%„ƒZe dd!d!d!d!d!d!d!¡dejfd&d'„ƒZ			d7dejfd(d)„Ze dddddd¡dejfd*d+„ƒZe ddddddd,¡	d8dejfd-d.„ƒZdejfd/d0„Ze ddddd¡dejfd1d2„ƒZd9dejfd3d4„Z e d¡dejfd5d6„ƒZ!dS ):é    N)Úsymbolic_helperÚsymbolic_opset9)Ú	jit_utilsÚregistrationÚdomainÚversionc                 C   s†   t  d¡}t |¡}h d£}|D ]0\}}| › d|› }t |¡r@tj ||¡s@||v r8tjjd|› ||dd tj |||¡ qd S )Nztorch.onnx.symbolic_caffe2>   ÚcatÚreluÚsliceÚreshapeÚsigmoidÚ
avg_pool2dÚ
dequantizeÚ
max_pool2dÚupsample_nearest2dÚquantize_per_tensorÚ_empty_affine_quantizedz::zaten::T)Úcustom)	Ú	importlibÚimport_moduleÚinspectÚ
getmembersÚ
isfunctionr   ÚregistryÚis_registered_opÚregister)r   r   ÚmoduleÚquant_version_opsÚ
aten_q_opsÚopÚfuncÚname© r"   ún/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torch/onnx/symbolic_caffe2.pyÚregister_quantized_ops
   s   

ÿÿ€ör$   Úgc                 C   sH   |t  | ¡ d¡t  | ¡ d¡dœ}| jd|fi |¤Ž}t j |¡ |S )NÚY_scaleÚY_zero_point)Úaxes_iÚ	Y_scale_fÚY_zero_point_iz_caffe2::Int8Transpose)r   Ú	_node_getÚnoder   Ú_quantized_opsÚadd)r%   ÚinputÚaxesÚ
quant_argsÚoutputr"   r"   r#   Ú_permute_helper(   s   ýr3   c                 C   ó   g d¢}t | ||ƒS )N)r   é   é   é   ©r3   ©r%   r/   r0   r"   r"   r#   Ú	nchw2nhwc3   ó   r:   c                 C   r4   )N)r   r6   r7   r5   r8   r9   r"   r"   r#   Ú	nhwc2nchw8   r;   r<   c                 C   s   |   d||¡}tj |¡ |S ©Nz_caffe2::WeightPrepack©r   r   r-   r.   )r%   ÚweightÚbiasr2   r"   r"   r#   Úlinear_prepack=   s   rA   ÚvÚfÚic                 C   s2   ||dœ}| j d|||fi |¤Ž}tj |¡ |S )N©r)   r*   z_caffe2::Int8FCr>   )r%   r/   r?   r@   ÚscaleÚ
zero_pointÚkwargsr2   r"   r"   r#   ÚlinearF   s   þrI   c           	      C   s    |   d|||¡}tj |¡ |S r=   r>   )	r%   r/   r?   r@   ÚstrideÚpaddingÚdilationÚgroupsr2   r"   r"   r#   Úconv_prepackQ   s   rN   Úisc
              	   C   óV   |  ¡ d dd… }
||| |||
d||	dœ}| jd|||fi |¤Ž}tj |¡ |S )NÚshaper7   r6   ÚNHWC©Ú	strides_iÚpads_iÚdilations_iÚgroup_iÚ	kernels_iÚorder_sr)   r*   z_caffe2::Int8Conv©r,   r   r   r-   r.   ©r%   r/   r?   r@   rJ   rK   rL   rM   rF   rG   Úkernel_sizerH   r2   r"   r"   r#   Úconv2d\   ó   ø
r]   c
              	   C   rP   )NrQ   r7   r6   rR   rS   z_caffe2::Int8ConvRelurZ   r[   r"   r"   r#   Úconv2d_reluy   r^   r_   c                 C   s0   ||dœ}| j d||fi |¤Ž}tj |¡ |S )NrE   z_caffe2::Int8Addr>   )r%   Úinput_aÚinput_brF   rG   rH   r2   r"   r"   r#   r.   –   s   þr.   c                 C   s\   |t jvrt | |¡S t  | ¡ d¡t  | ¡ d¡dœ}| jd|fi |¤Ž}t j |¡ |S )Nr&   r'   rE   z_caffe2::Int8Relu)r   r-   Úopset9r	   r+   r,   r   r.   )r%   r/   rH   r2   r"   r"   r#   r	   ¡   s   
þr	   Útc                 C   s.   ||dœ}| j d|fi |¤Ž}tj |¡ |S )NrE   z_caffe2::Int8Quantizer>   )r%   r/   rF   rG   ÚdtyperH   r2   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/   rQ   rF   rG   rd   Ú
pin_memoryÚmemory_formatÚlayoutr"   r"   r#   r   ¾   s   r   c                 C   s‚   |t jvrt | |||¡S t  |d¡}|t  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|fi |¤Ž}t	| |ƒ}t j 
|¡ |S )NrO   r&   r'   )Úoutput_size_ir)   r*   z_caffe2::Int8ResizeNearest)r   r-   rb   r   Ú
_parse_argr+   r,   r:   r   r<   r.   )r%   r/   Úoutput_sizeÚalign_cornersÚscales_hÚscales_wrH   r2   r"   r"   r#   r   Í   s   
ý

r   c           	   	   C   sŠ   |t jvrt | ||||||¡S ||| |d dt  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|fi |¤Ž}t| |ƒ}t j 	|¡ |S )Nr   rR   r&   r'   ©rT   rU   Úkernel_irY   r)   r*   z_caffe2::Int8MaxPool)
r   r-   rb   r   r+   r,   r:   r   r<   r.   )	r%   r/   r\   rJ   rK   rL   Ú	ceil_moderH   r2   r"   r"   r#   r   å   s    

ÿú

r   Únonec           
   
   C   sŒ   |t jvrt | |||||||¡S ||| |d dt  | ¡ d¡t  | ¡ d¡dœ}t| |ƒ}| jd|fi |¤Ž}	t| |	ƒ}	t j 	|	¡ |	S )Nr   rR   r&   r'   ro   z_caffe2::Int8AveragePool)
r   r-   rb   r   r+   r,   r:   r   r<   r.   )
r%   r/   r\   rJ   rK   rq   Úcount_include_padÚdivisor_overriderH   r2   r"   r"   r#   r     s.   
øú

r   c                 C   s`   |t jvrt | ||¡S t  | ¡ d¡t  | ¡ d¡dœ}| jd||fi |¤Ž}t j |¡ |S )Nr&   r'   rE   z_caffe2::Int8Reshape)r   r-   rb   r   r+   r,   r   r.   )r%   r/   rQ   rH   r2   r"   r"   r#   r   '  s   
þr   c                 C   sž   |t jvrt | |||||¡S |dkrtdƒ‚t  |d¡}t  |d¡}t  |d¡}|||t  | ¡ d¡t  | ¡ d¡dœ}| jd|fi |¤Ž}t j 	|¡ |S )Nr7   z2ONNX quantized slice export only works for step 1.rD   r&   r'   )Ústart_idx_iÚ	end_idx_iÚdim_ir)   r*   z_caffe2::Int8Slice)
r   r-   rb   r
   ÚRuntimeErrorrj   r+   r,   r   r.   )r%   r/   ÚdimÚstartÚendÚsteprH   r2   r"   r"   r#   r
   4  s    
ûr
   c           	      C   s„   t  |¡}|d }|t jvrt | ||¡S t  |d¡}|d  ¡ d |d  ¡ d dœ}| jdg|¢R d|i|¤Ž}t j |¡ |S )Nr   rD   r&   r'   rE   z_caffe2::Int8ConcatÚaxis_i)	r   Ú_unpack_listr-   rb   r   rj   r,   r   r.   )	r%   Útensor_listry   rF   rG   Útensorsr/   rH   r2   r"   r"   r#   r   K  s   

þr   c                 C   sL   |t jvrt | |¡S d}d}||dœ}| jd|fi |¤Ž}t j |¡ |S )Ng      p?r   rE   z_caffe2::Int8Sigmoid)r   r-   rb   r   r   r.   )r%   r/   Ú	out_scalerG   rH   r2   r"   r"   r#   r   [  s   
þr   )NNNre   )NN)"r   r   Ú
torch.onnxr   r   rb   Útorch.onnx._internalr   r   ÚstrÚintr$   ÚGraphContextr3   r:   r<   rA   Ú
parse_argsrI   rN   r]   r_   r.   r	   r   r   r   r   r   r   r   r
   r   r   r"   r"   r"   r#   Ú<module>   sn   	

ÿÿÿ

ÿú
ÿÿ	øÿ$