U
    9%e*                     @   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rt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   Y/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/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   	

   	 $