
    h                         S SK r S SKrS SKrSSKJrJrJrJrJ	r	J
r
Jr  SSKJr  SSKJr  SSKJr  S rS	 rS
 r " S S\5      r " S S\5      rg)    N   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwargfind_by_nameget_mul_node	ms_domain   )QuantOperatorBase)	QOpMatMul)QDQOperatorBasec                     U R                    Vs/ s H  oR                  S:X  d  M  UPM     nnU(       a%  [        R                  R	                  US   5      S:  $ gs  snf )NtransBr   F	attributenameonnxhelperget_attribute_value)	gemm_nodeattrtransB_attributes      a/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/operators/gemm.pyis_B_transposedr      sT    )2)<)<V)<		X@U)<V{{../?/BCaGG	 Ws
   AAc                     U R                    Vs/ s H  oR                  S:X  d  M  UPM     nnU(       a"  [        R                  R	                  US   5      $ gs  snf )Nbetar         ?r   r   r   beta_attributes      r   get_betar!      sM    '0':':R':tii6>Qd':NR{{..~a/@AA	 Ss
   AAc                     U R                    Vs/ s H  oR                  S:X  d  M  UPM     nnU(       a
  SUS   l        gs  snf )Nr   r   r   )r   r   fr   s      r   set_default_betar$   $   s@    '0':':R':tii6>Qd':NR!q	 Ss
   A A c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )QLinearGemm,   c                 $   > [         TU ]  X5        g Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      r   r,   QLinearGemm.__init__-       3    c           
      h  > 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   U R                  R                  [        U5      (       a  SO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 ]E  5       $ Sn[%        UR                  5      S:X  a  U R                  R                  UR                  S   5      (       d  [         TU ]E  5       $ U R                  R'                  UR                  S   UR                  S   UR                  S   [)        U R                   5      5      nUR                  S   [*        -   nUR,                  (       a  UR,                  S-   OSn0 nUR.                   H/  nUR,                  S	:w  d  M  UR1                  [3        U5      5        M1     [4        US
'   / n[7        S5       H   nUR                  UU   UU   UU   /5        M"     UR                  XU/5        [8        R:                  R<                  " SUU/U40 UD6nU	R                  U5        [?        UR                  S   UUU[@        RB                  UR                  U R                  R                  S9nUU R                  RD                  UR                  S   '   U R                  =RF                  U	-  sl#        g )NGemmr   r   r   )reduce_range    _quantr   domainQGemm)	node_type
node_qtype)$nodeop_type	quantizer_get_quantization_paramsoutputis_input_a_initializerinputis_per_channelquantize_activationquantize_weight_per_channelweight_qTyper   appendquantize_weightr7   extendr+   quantizelenquantize_bias_staticr!   r   r   r   updater   r
   ranger   r   	make_noder   r   Inputquantized_value_map	new_nodes)r.   r?   
data_foundoutput_scale_nameoutput_zp_name_quantized_input_nameszero_point_namesscale_namesnodesquant_weight_tuplequantized_input_names_weightzero_point_names_weightscale_names_weightnodes_weightquantized_bias_nameqgemm_output
qgemm_namekwargsr   qgemm_inputsi
qgemm_nodeq_outputr1   s                           r   rM   QLinearGemm.quantize0   s   yy||v%%% NN33DKKNC	
 >>00A??DNNDaDaDcDc 224!=% !%!K!K

1++$T**"
 "(();A)>?##$6q$9:1!45 224!=%  ..taSt~~GbGb.c,'"!(()EF##$;<12LL&2:7#%% tzz?a>>88AGGw')) #'.."E"E

1tzz!}djjmXdii=P# {{1~(@@-1YYTYY)B
I~~'0;< ( %x qA!6q!9;q>K[\]K^ _`  	0^TU[[**7L<.R\g`fg
Z  "KKN$$ll~~22
 >F**4;;q>:  E) r4    __name__
__module____qualname____firstlineno__r,   rM   __static_attributes____classcell__r1   s   @r   r&   r&   ,   s    4\* \*r4   r&   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )QDQGemm   c                 $   > [         TU ]  X5        g r)   r*   r-   s      r   r,   QDQGemm.__init__   r3   r4   c           	         U R                   n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5      (       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  a  U R                  R                  UR                  S   5      (       ay  U R                  R                  UR                  UR                  S   UR                  S   UR                  S   [        U R                   5      5        [!        U R                   5        g ["        R$                  " SU R                   R                   S35        g g )	Nr6   r   r   )default_axisr9   r   zBias of Gemm node 'zC' is not constant. Please exclude this node for better performance.)r?   r@   rA   quantize_activation_tensorrE   disable_qdq_for_node_outputrC   is_tensor_per_channelr   "quantize_weight_tensor_per_channelquantize_weight_tensorrN   rD   quantize_bias_tensorr   r!   r$   loggingwarning)r.   r?   is_weight_per_channelweight_axiss       r   rM   QDQGemm.quantize   ss   yy||v%%%11$**Q-@//NN55dkk!nE-1^^-Q-QJJqM_T-B-B .R .
* !NN==djjm[YNN11$**Q-@tzz?a~~44TZZ]CC33IItzz!}djjmTZZ]HUYU^U^L_ !+)$))..)99|}  r4   rl   rm   rt   s   @r   rv   rv      s    4 r4   rv   )r   numpynpr   quant_utilsr   r   r   r   r   r	   r
   base_operatorr   matmulr   qdq_base_operatorr   r   r!   r$   r&   rv   rl   r4   r   <module>r      sR         -  .`*) `*Fo r4   