
    hL                          S SK r 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
  SSKJr  SSKJr   " S S	\5      r  " S
 S\5      r  " S S\5      r " S S\5      rg)    N)onnx_pb   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypefind_by_nameget_mul_node   )QuantOperatorBase)QDQOperatorBasec                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )	QOpMatMul   c                 $   > [         TU ]  X5        g Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      c/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/operators/matmul.pyr   QOpMatMul.__init__       3    c                     U R                   R                  U R                  5      (       d/  [        R                  " SU R                  R
                   S35        gU R                   R                  U R                  R                  S   5      (       df  U R                   R                  U R                  R                  S   5      (       d/  [        R                  " SU R                  R
                   S35        gU R                   R                  (       a}  U R                   R                  U R                  R                  S   5      (       dF  [        R                  " SU R                   R                   SU R                  R
                   S35        gg	)
NzIgnore MatMul ]Fr
   r   z&Ignore MatMul due to non float inputs z%Ignore MatMul due to non constant B: [T)	quantizershould_quantize_nodenodeloggingdebugnameis_float_tensorinputinfoq_matmul_const_b_onlyfind_initializer_in_pathgraph_scope)r   s    r   should_quantizeQOpMatMul.should_quantize   s   ~~22499==MMN499>>*:!<=..tyyq/ABB..tyyq/ABBLLA$))..AQQRST >>//>>::499??1;MNNDT^^E_E_D``abfbkbkbpbpaqqrstr    )__name__
__module____qualname____firstlineno__r   r-   __static_attributes____classcell__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$ )MatMulInteger(   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   MatMulInteger.__init__)   r   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/SS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[        R                  R                  S	X#-   U
/U5      nUR                  U5        U
S
-   nU R                  R                  UR                  S   SS9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-   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SnU(       a  US-   nUR                  [!        UU/UR                  S   U5      5        U R                  =R                  U-  sl        g )NMatMulr   r
   Treduce_rangeop_level_per_channel_output_quantized_quant r8   _cast_output)	mandatoryCast_cast)tor   _scales_mul__mulz:0_output_scale_mul)r#   op_typer!   quantize_activationquantize_weightextendoutputr&   onnxhelper	make_nodeappendget_tensor_typelenr   	new_nodesr	   )r   r#   quantized_input_nameszero_point_namesscale_namesnodesquantized_input_names_weightzero_point_names_weightscale_names_weightnodes_weightmatmul_integer_outputmatmul_integer_namematmul_integer_nodecast_op_outputotype	cast_nodescales_mul_opscales_mul_nodescales_mul_op_outputoutput_scale_mul_ops                       r   quantizeMatMulInteger.quantize,   si   yy||x''' NN..taS9	
! NN**4!4^b*c	
(#$$%AB 78-.\" $A1D D6:iidii(2R"kk33!4"#	
 	() /?..t{{1~.NKK))"#!G+ * 
	 	Y ;1$$$ #  -/Q#%A6? 	 '}dnn6N6NO"*;8Lm\OLL).55a8 !"58K"K!56A#	
 	  E) r   r/   r0   r1   r2   r3   r   rk   r4   r5   r6   s   @r   r8   r8   (   s    4G* G*r   r8   c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )QLinearMatMul{   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   QLinearMatMul.__init__|   r   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/SS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                  R                  UR                  S   5      u  n
nnnnU
(       a  Uc  [        TU ]%  5       $ UR                  S   [        -   nUR                  (       a  UR                  S-   OSn/ 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 R                  R                  [        R                  R                   [        R                  R"                  [        R                  R$                  [        R                  R&                  1;   a  SOSn[(        R*                  R-                  S	UU/UUS
9nUR                  U5        [/        UR                  S   UUU[0        R2                  5      nUU R                  R4                  UR                  S   '   U R                  =R6                  U-  sl        g )Nr=   r   r
   Tr>   rB   rC   zcom.microsoftro   )domain)r#   rM   r!   rN   rO   rP   _get_quantization_paramsrQ   r   rk   r   r&   rU   weight_qType
onnx_protoTensorProtoFLOAT8E4M3FNFLOAT8E4M3FNUZ
FLOAT8E5M2FLOAT8E5M2FNUZrR   rS   rT   r   r   Inputquantized_value_maprX   )r   r#   rY   rZ   r[   r\   r]   r^   r_   r`   
data_foundoutput_scale_nameoutput_zp_namerJ   qlinear_matmul_outputqlinear_matmul_nameqlinear_matmul_inputsrt   qlinear_matmul_nodeq_outputr   s                       r   rk   QLinearMatMul.quantize   s   yy||x''' NN..taS9	
! NN**4!4^b*c	
(#$$%AB 78-.\" NN33DKKNC	
2:7#%% $A1I I6:iidii(2R "$$%:1%=>$$[^4$$%5a%89$$%:1%=>$$[^4$$%5a%89$$%67$$^4 ~~**&&33&&55&&11&&55	   	 #kk33!"# 4 
 	() "KKN!$$
 >F**4;;q>:  E) r   r/   rm   r6   s   @r   ro   ro   {   s    4N* N*r   ro   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )	QDQMatMul   c                 $   > [         TU ]  X5        g r   r   r   s      r   r   QDQMatMul.__init__   r   r   c                 N   U R                   nUR                  S:X  d   eU R                  (       a  UR                  nO+[        R
                  " UR                  UR                  5      nU H  n[        X0R                  R                  R                  5       5      (       ah  U R                  R                  USUR                  S9u  pEU(       a  U R                  R                  X55        M  U R                  R                  U5        M  U R                  R                  U5        M     g )Nr=   r
   )default_axisrM   )r#   rM   disable_qdq_for_node_outputr(   	itertoolschainrQ   r   r!   modelinitializeris_tensor_per_channel"quantize_weight_tensor_per_channelquantize_weight_tensorquantize_activation_tensor)r   r#   nodes_to_iteratetensor_nameis_per_channelchannel_axiss         r   rk   QDQMatMul.quantize   s    yy||x'''++#zz(tzz4;;G+KK)=)=)I)I)KLL/3~~/S/Sa 0T 0, "NNEEk`NN99+F99+F ,r   r/   rm   r6   s   @r   r   r      s    4G Gr   r   )r   r$   rR   r   rw   quant_utilsr   r   r   r   r	   base_operatorr   qdq_base_operatorr   r   r8   ro   r   r/   r   r   <module>r      s`       & r r , .! .
K*I K*\
R*I R*jG Gr   