
    `i                         S SK r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
Jr  S SK Jr   " S S	\5      r " S
 S\5      r " S S\5      rg)    N   )QuantOperatorBase)QDQOperatorBase   )find_by_nameget_mul_nodeQuantizedValueQuantizedValueTypeattribute_to_kwargBiasToQuantize)onnx_pbc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ConvInteger   c                 $   > [         TU ]  X5        g Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      l/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/quantization/operators/conv.pyr   ConvInteger.__init__	       3    c                    U R                   nUR                  S:X  d   eU R                  R                  USS/5      u  p#pESnSn[	        UR
                  5      S:X  aG  U R                  R                  UR
                  S   UR
                  S   UR
                  S   U5      nSnUR                  S   S	-   nUR                  S:w  a  UR                  S
-   OSn	0 n
UR                   H  nU
R                  [        U5      5        M     [        R                  R                  " SX#-   U/U	40 U
D6nUR                  U5        U(       a  U R                  R!                  XQUU5      nUS-   n[        R                  R                  SU/U/US-   ["        R$                  R&                  S9nUR                  U5        [	        U5      S:X  d   eU	S:w  a  U	S-   nOUS   S-   US   -   S-   n[)        XR                  R*                  5      nUc   [-        XOS-   U5      nUR                  U5        UR                  S   nU	S:w  a  U	S-   OSnUR                  [-        UU/UR                  S   U5      5        U R                  =R*                  U-  sl        g )NConvr   r    F   r   T_output_quantized_quantr   _cast_outputCast_cast)to_scales_mul__mulz:0_output_scale_mul)nodeop_type	quantizerquantize_inputsleninputquantize_bias_dynamicoutputname	attributeupdater   onnxhelper	make_nodeappendget_bias_add_nodes
onnx_protoTensorProtoFLOATr   	new_nodesr   )r   r-   quantized_input_nameszero_point_namesscale_namesnodesquantized_bias_namebias_presentconv_integer_outputconv_integer_namekwargsr6   conv_integer_nodecast_op_output	cast_nodescales_mul_opscales_mul_nodescales_mul_op_outputoutput_scale_mul_ops                      r   quantizeConvInteger.quantize   s   yy&'& NN**4!Q8 	F	+ !tzz?a"&.."F"FtzzRS}VZV`V`abVceieoeopqerGL#NL"kk!n/BB48IIODII0IMM,Y78 ( KK11-AVAi3F2GIZf^df&' "&.."C"CEQdDW#Y -~=KK))&3F2G.IY*=*G-7-C-C-I-I * K	 	Y K A%&%"-=M'NS0;q>AFJM&}nn6N6NO"*;8Lm\OLL).55a8 J[^`I`/2EEfh\>3G"H$++VW.Zmno  E) r    __name__
__module____qualname____firstlineno__r   rQ   __static_attributes____classcell__r   s   @r   r   r      s    48* 8*r   r   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )QLinearConvG   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   QLinearConv.__init__H   r   r   c                 ^   U R                   nUR                  S:X  d   eU R                  R                  UR                  S   5      (       a  U R                  R                  5       (       a  U R                  R                  US/5      u  p#pEU R                  R                  UR                  S   [        R                  R                  S5      nUR                  US   5        UR                  US   5        UR                  US   5        O!U R                  R                  USS/5      u  p#pESnSn[        UR                  5      S:X  aF  U R                  R                  UR                  S   UR                  S   UR                  S   5      nSnU R                  R                  UR                  S   5      u  pn  nU	(       d2  [!        S	R#                  UR                  S   UR$                  5      5      eUR                  S   S
-   nUR$                  S:w  a  UR$                  S-   OSn0 nUR&                   H  nUR)                  [+        U5      5        M     / nUR                  US   5        UR                  US   5        UR                  US   5        UR                  US   5        UR                  US   5        UR                  US   5        UR                  U
5        UR                  U5        U(       a  UR                  U5        [,        R.                  R0                  " SUU/U40 UD6nUR                  U5        [3        UR                  S   XU[4        R6                  5      nUU R                  R8                  UR                  S   '   U R                  =R:                  U-  sl        g )Nr    r   r   r   r!   Fr"   TzBQuantization parameters for output:"{}" of node:"{}" not specified
_quantizedr$   r]   )r-   r.   r/   is_input_a_weightr2   is_per_channelr0   quantize_weight_per_channelr=   r>   INT8r;   r1   quantize_bias_static_get_quantization_paramsr4   
ValueErrorformatr5   r6   r7   r   r8   r9   r:   r	   r
   Inputquantized_value_mapr@   )r   r-   rA   rB   rC   rD   quant_weight_tuplerE   rF   
data_foundoutput_scale_nameoutput_zp_namer*   qlinear_conv_outputqlinear_conv_namerI   r6   qlinear_conv_inputsqlinear_conv_nodeq_outputs                       r   rQ   QLinearConv.quantizeK   sI   yy&'&>>++DJJqM::t~~?\?\?^?^..taS9 J"k!%!K!KDJJWXM[e[q[q[v[vLM"O!(();A)>?##$6q$9:1!45 ..taV< J"k !tzz?a"&.."E"EdjjQRmUYU_U_`aUbdhdndnopdq"rLNN33DKKNC 	<
~q! ellA		+ , , #kk!n|;HL		UW		H0D]_-IMM,Y78 ( ""#8#;<"";q>2""#3A#67""#8#;<"";q>2""#3A#67 	""#45"">2&&':; KK11-ATWjVk2COGMO&' "$++a.2EZh"4":":<=E**4;;q>:  E) r   rS   rT   r[   s   @r   r]   r]   G   s    4<* <*r   r]   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )QDQConv   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   QDQConv.__init__   r   r   c                 .   U R                   nUR                  S:X  d   eU R                  R                  UR                  S   5        U R                  R                  5       (       a*  U R                  R                  UR                  S   S5        O(U R                  R                  UR                  S   5        [        UR                  5      S:X  aE  U R                  R                  UR                  S   UR                  S   UR                  S   5        g g )Nr    r   r   r"   r   )	r-   r.   r/   quantize_tensorr2   rd   quantize_tensor_per_channelr1   quantize_bias_tensor)r   r-   s     r   rQ   QDQConv.quantize   s    yy&'&&&tzz!}5>>((**NN66tzz!}aHNN**4::a=9tzz?aNN//

1tzz!}djjYZm\  r   rS   rT   r[   s   @r   rx   rx      s    4] ]r   rx   )r8   base_operatorr   qdq_base_operatorr   quant_utilsr   r   r	   r
   r   r   r   r=   r   r]   rx   rS   r   r   <module>r      sC     , . | | &<*# <*~@*# @*F]o ]r   