
    h&                         S SK rS SK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KJr   " S S	\5      r " S
 S\5      r " S S\5      rg)    N)onnx_pb   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwargfind_by_nameget_mul_node   )QuantOperatorBase)QDQOperatorBasec                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )ConvInteger   c                 $   > [         TU ]  X5        g Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      a/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/operators/conv.pyr   ConvInteger.__init__       3    c                 0   U R                   nU R                  R                  n[        UR                  S   UR                  5       5      nUc  [        SUR                  S    S35      eUR                  S   nUR                  S   nUS-   nUS-   n	[        R                  " [        UR                  5      [        R                  S	9n
S
U
S'   [        R                  R                  U[         R"                  R$                  [        UR                  5      /U
5      nUR'                  U5        [        R                  R)                  SXx/U	/5      nUR+                  U5        [        R                  R)                  SX)/U/US-   5      nUR+                  U5        g)ap  
Given a node, this function handles bias add by adding a "reshape" node on bias and an "add" node
    parameter nodes: new nodes would be appended into nodes
    parameter node: current node (Conv)
    parameter scaled_output: output of quant conv without bias
    parameter output: output of Conv
    parameter bias_name: bias of Conv
    return: the name of output
r   Nz	Expected z to be an initializerr   r   _bias_reshape_shape_bias_reshape_output)dtypeReshapeAdd	_bias_add)node	quantizermodelr	   inputinitializer
ValueErroroutputnponeslendimsint64onnxhelpermake_tensor
onnx_protoTensorProtoINT64add_initializer	make_nodeappend)r   nodesscaled_outputr'   r)   weightr-   reshape_input_datareshape_input_shapereshape_outputshape
init_shapereshape_nodeadd_nodes                 r   add_biasConvInteger.add_bias   s]    yy$$djjmU->->-@A>yA7LMNN Q!ZZ]$'<<"88V[[)"((;a[[,,!7!7!=!=FKK@P?QSX

 	j){{,,Y9K8adrcst\" ;;((0ORXQY[ado[opXr   c                    U R                   nUR                  S:X  d   eU R                  R                  US/5      u  nnnnU R                  R	                  US/U R                  R
                  S9u  nnnn	UR                  U5        UR                  U5        UR                  U5        UR                  U	5        UR                  S   S-   n
UR                  (       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 R                  R!                  UR                  S   S	S
9nU
S-   n[        R                  R                  SU
/U/U
S-   US9nUR                  U5        [#        U5      S:X  d   eU(       a  US-   nOUS   S-   US   -   S-   n[%        UU R                  R&                  5      nUc!  [)        UUS-   U5      nUR                  U5        UR                  S   n[#        UR*                  5      S:H  nU(       d  UR                  S   OUR                  S   S-   nU(       a  US-   OSnUR                  [)        UU/UU5      5        U(       a  U R-                  UU5        U R                  =R&                  U-  sl        g )NConvr   r   reduce_range_output_quantized_quant r   T)	mandatory_cast_outputCast_cast)tor   _scales_mul__mulz:0   quant_scaled_output_output_scale_mul)r'   op_typer(   quantize_activationquantize_weightrK   extendr-   name	attributeupdater   r3   r4   r:   r;   get_tensor_typer0   r	   	new_nodesr
   r*   rF   )r   r'   quantized_input_nameszero_point_namesscale_namesr<   quantized_input_names_weightzero_point_names_weightscale_names_weightnodes_weightconv_integer_outputconv_integer_namekwargsr_   conv_integer_node	onnx_typecast_op_output	cast_nodescales_mul_opscales_mul_nodescales_mul_op_outputhas_biasscaled_output_nameoutput_scale_mul_ops                           r   quantizeConvInteger.quantize:   s   yy||v%%% NN..taS9	
! NN**4!4>>C^C^*_	
(#$$%AB 78-.\""kk!n/BB48IIDII02IMM,Y78 ( KK110CFYEZ\m
qw
 	&' NN224;;q>T2R	,~=KK)) !') * 
	 	Y ;1$$$-=M'NS0;q>AFJM&}dnn6N6NO"*;8Lm\OLL).55a8tzz?a'3;T[[^QRgAg J[/2EE`b!56"#	
 MM%!34  E) r    )	__name__
__module____qualname____firstlineno__r   rF   rw   __static_attributes____classcell__r   s   @r   r   r      s    4#JL* L*r   r   c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )QLinearConv   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   QLinearConv.__init__   r   r   c                   > U R                   nUR                  S:X  d   eU R                  R                  UR                  S   5      u  nnnnnU R                  R                  UR                  S   5      (       a  U R                  R                  5       (       a  U R                  R                  US/5      u  nnnn	U 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        OU R                  R                  US/5      u  nnnn	U R                  R                  US/U R                  R                  S9u  nnnnUR!                  U5        UR!                  U5        UR!                  U5        U	R!                  U5        U(       a  Uc  ["        TU ]I  5       $ SnSn['        UR                  5      S:X  a  U R                  R(                  [        R                  R*                  :X  a  [-        S	5      eU R                  R/                  UR                  S   UR                  S   UR                  S   5      nS
nUR                  S   [0        -   nUR2                  (       a  UR2                  S-   OSn0 nUR4                   H  nUR7                  [9        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<                  R>                  " SUU/U40 UD6nU	R                  U5        [A        UR                  S   UUU[B        RD                  5      nUU R                  RF                  UR                  S   '   U R                  =RH                  U	-  sl$        g )NrI   r   r   r   rJ   rN   FrW   z@Quantization to FLOAT8E4M3FN for operator Conv is not supported.TrM   r   )%r'   rZ   r(   _get_quantization_paramsr-   is_input_a_initializerr*   is_per_channelr[   quantize_weight_per_channelr6   r7   INT8r;   r\   rK   r]   r   rw   r0   weight_qTypeFLOAT8E4M3FNRuntimeErrorquantize_bias_staticr   r^   r_   r`   r   r3   r4   r:   r   r   Inputquantized_value_maprb   )r   r'   
data_foundoutput_scale_nameoutput_zp_namerU   rc   rd   re   r<   quant_weight_tuplerf   rg   rh   ri   quantized_bias_namebias_presentqlinear_conv_outputqlinear_conv_namerl   r_   qlinear_conv_inputsqlinear_conv_nodeq_outputr   s                           r   rw   QLinearConv.quantize   s   yy||v%%% NN33DKKNC	
 >>00A??DNNDaDaDcDc 224!=% !%!K!K

1&&++"
 "(();A)>?##$6q$9:1!45 224!=%  ..taSt~~GbGb.c,'"!(()EF##$;<12LL&2:7#%% tzz?a~~**j.D.D.Q.QQ"#eff"&.."E"EdjjQRmUYU_U_`aUbdhdndnopdq"rL"kk!n/GG48IIDII02IMM,Y78 ( ""#8#;<"";q>2""#3A#67""#8#;<"";q>2""#3A#67 	""#45"">2&&':; KK11.1D0EGX
\b
 	&' "KKN$$
 >F**4;;q>:  E) r   ry   rz   r{   r|   r}   r   rw   r~   r   r   s   @r   r   r      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  UR                  S:X  d   eU R                  R                  UR                  S   5        U R
                  (       d(  U R                  R                  UR                  S   5        U R                  R                  UR                  S   UR                  S:X  a  SOSS9u  p#U(       a*  U R                  R                  UR                  S   U5        O(U R                  R                  UR                  S   5        [        UR                  5      S:X  aP  U R                  R                  UR                  UR                  S   UR                  S   UR                  S   5        g g )NrI   ConvTransposer   r   )default_axisrW   r   )r'   rZ   r(   quantize_activation_tensorr*   disable_qdq_for_node_outputr-   is_tensor_per_channel"quantize_weight_tensor_per_channelquantize_weight_tensorr0   quantize_bias_tensorr^   )r   r'   is_weight_per_channelweight_axiss       r   rw   QDQConv.quantize   s'   yy||v%)HHH11$**Q-@//NN55dkk!nE-1^^-Q-QJJqMT\\V-C .R .
* !NN==djjm[YNN11$**Q-@tzz?aNN//		4::a=$**UV-Y]YcYcdeYfg  r   ry   r   r   s   @r   r   r      s    4h hr   r   )numpyr.   r3   r   r6   quant_utilsr   r   r   r   r	   r
   base_operatorr   qdq_base_operatorr   r   r   r   ry   r   r   <module>r      sN      &  - .u*# u*pc*# c*Lho hr   