
     Ng                         d dl Z d dlZd dlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ dd	lmZ d
 Zd Zd Z G d de          Z G d de          ZdS )    N   )find_by_name)get_mul_node)TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwarg	ms_domain   )QuantOperatorBase)	QOpMatMul)QDQOperatorBasec                     d | j         D             }t          |          r)t          j                            |d                   dk    S dS )Nc                 (    g | ]}|j         d k    |S )transBname.0attrs     c/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/quantization/operators/gemm.py
<listcomp>z#is_B_transposed.<locals>.<listcomp>   s$    VVV	X@U@U@U@U@U    r   F	attributelenonnxhelperget_attribute_value)	gemm_nodetransB_attributes     r   is_B_transposedr"      sQ    VV)<VVV
 H{../?/BCCaGG5r   c                     d | j         D             }t          |          r%t          j                            |d                   S dS )Nc                 (    g | ]}|j         d k    |S betar   r   s     r   r   zget_beta.<locals>.<listcomp>   $    RRRtdi6>Q>Qd>Q>Q>Qr   r         ?r   r    beta_attributes     r   get_betar+      sI    RRy':RRRN
> B{..~a/@AAA3r   c                 `    d | j         D             }t          |          rd|d         _        dS )Nc                 (    g | ]}|j         d k    |S r%   r   r   s     r   r   z$set_default_beta.<locals>.<listcomp>   r'   r   r(   r   )r   r   fr)   s     r   set_default_betar/      s:    RRy':RRRN
> "!q3r   c                   (     e Zd Z fdZ fdZ xZS )QLinearGemmc                 L    t                                          ||           d S Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      r   r6   zQLinearGemm.__init__'   #    33333r   c           	      
   | j         }|j        dk    sJ | j                            |j        d                   \  }}}}}| j                            |j        d                   r| j                                        r| j                            |dg          \  }}}}	| j        	                    |j        d         | j        j
        t          |          rdnd          }
|                    |
d                    |                    |
d                    |                    |
d                    n| j                            |dg          \  }}}}	| j                            |dg| j        j                  \  }}}}|                    |           |                    |           |                    |           |	                    |           |r| t!                                                      S d}t%          |j                  dk    r| j                            |j        d                   s t!                                                      S | j                            |j        d         |j        d         |j        d         t)          | j                             }|j        d         t*          z   }|j        r
|j        dz   nd}i }|j        D ]/}|j        d	k    r"|                    t3          |                     0t4          |d
<   g }t7          d          D ],}|                    ||         ||         ||         g           -|                    |||g           t9          j        j        d||g|fi |}|	                    |           t?          |j        d         |||t@          j!        |j        | j        j
                  }|| j        j"        |j        d         <   | j        xj#        |	z  c_#        d S )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_weightr?   extendr5   quantizer   quantize_bias_staticr+   r   r   r   updater	   r
   ranger   r   	make_noder   r   Inputquantized_value_map	new_nodes)r8   rG   
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_outputr;   s                           r   rU   zQLinearGemm.quantize*   s   y|v%%%% N33DKNCC	
 >00A?? !	'DNDaDaDcDc !	' 224!==% !%!K!K
1+$T**1" "
 "(();A)>???##$6q$9:::1!45555 224!==%  ..taSt~Gb.cc,'"!(()EFFF##$;<<<1222LL&&& 	&2:77##%%% tz??a>88AGG *ww''))) #'."E"E
1tz!}djmXdi=P=P# # {1~(@@-1Y>TY))B
 	= 	=I~''0;;<<<$x q 	a 	aA!6q!9;q>K[\]K^ _````02C^TUUU[*7L<.R\gg`fgg
Z    "KN$l~2
 
 
 >F*4;q>:  E)    r   __name__
__module____qualname__r6   rU   __classcell__r;   s   @r   r1   r1   &   sZ        4 4 4 4 4\* \* \* \* \* \* \* \* \*r   r1   c                   $     e Zd Z fdZd Z xZS )QDQGemmc                 L    t                                          ||           d S r3   r4   r7   s      r   r6   zQDQGemm.__init__   r<   r   c           	      |   | j         }|j        dk    sJ | j                            |j        d                    | j        s%| j                            |j        d                    | j                            |j        d         t          |          rdnd          \  }}|r'| j        	                    |j        d         |           n%| j        
                    |j        d                    t          |j                  dk    r| j                            |j        d                   rl| j                            |j        |j        d         |j        d         |j        d         t          | j                              t!          | j                    d S t#          j        d| j         j         d           d S d S )	Nr>   r   r   )default_axisrA   r   zBias of Gemm node 'zC' is not constant. Please exclude this node for better performance.)rG   rH   rI   quantize_activation_tensorrM   disable_qdq_for_node_outputrK   is_tensor_per_channelr"   "quantize_weight_tensor_per_channelquantize_weight_tensorr   rL   quantize_bias_tensorr   r+   r/   loggingwarning)r8   rG   is_weight_per_channelweight_axiss       r   rU   zQDQGemm.quantize   s   y|v%%%%11$*Q-@@@/ 	FN55dk!nEEE-1^-Q-QJqM_T-B-B(I .R .
 .
*{ ! 	AN==djm[YYYYN11$*Q-@@@tz??a~44TZ]CC 33Itz!}djmTZ]HUYU^L_L_   !+++++}$).}}}      r   rr   rw   s   @r   ry   ry      sG        4 4 4 4 4      r   ry   )r   numpynpr   quant_utilsr   r   r   r   r   r	   r
   base_operatorr   matmulr   qdq_base_operatorr   r"   r+   r/   r1   ry    r   r   <module>r      s;         & & & & & & & & & & & & u u u u u u u u u u u u u u , , , , , ,       . . . . . .      `* `* `* `* `*) `* `* `*F    o     r   