o
    ;ήc                     @   s   d dl Z d dlZd dlZd dlmZ ddlmZmZ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	d
 Zdd Zdd ZG dd deZG dd deZdS )    N)onnx_pb   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwargfind_by_nameget_mul_node	ms_domain   )QuantOperatorBase)	QOpMatMul)QDQOperatorBasec                 C   s0   dd | j D }t|rdtj|d k S dS )Nc                 S      g | ]	}|j d kr|qS )transBname.0attr r   N/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/quantization/operators/gemm.py
<listcomp>       z#is_B_transposed.<locals>.<listcomp>r   F	attributelenonnxhelperget_attribute_value)	gemm_nodetransB_attributer   r   r   is_B_transposed   s   r"   c                 C   s,   dd | j D }t|rtj|d S dS )Nc                 S   r   betar   r   r   r   r   r      r   zget_beta.<locals>.<listcomp>r         ?r   r    beta_attributer   r   r   get_beta   s   r(   c                 C   s&   dd | j D }t|rd|d _dS )Nc                 S   r   r#   r   r   r   r   r   r   &   r   z$set_default_beta.<locals>.<listcomp>r%   r   )r   r   fr&   r   r   r   set_default_beta%   s   
r*   c                       s(   e Zd Z fddZ fddZ  ZS )QLinearGemmc                       t  || d S Nsuper__init__selfonnx_quantizer	onnx_node	__class__r   r   r0   .      zQLinearGemm.__init__c                    s  | j }|jdks
J | j|jd \}}}}}| j|jd r[| j r[| j|dg\}}}}	| j	|jd t
jjt|rBdnd}
||
d  ||
d  ||
d  n0| j|dg\}}}}	| jj|dg| jjd\}}}}|| || || |	| |r|d u rt  S d}t|jdkr| j|jd st  S | j|jd |jd |jd t| j }|jd t }|jdkr|jd nd }}i }|jD ]}|jd	kr|t| qt|d
< g }tdD ]}||| || || g q||||g tjj d||g|fi |}|	| t!|jd |||t"j#}|| jj$|jd < | j j%|	7  _%d S )NGemmr   r   r   )reduce_range    _quantr$   domainQGemm)&nodeop_type	quantizer_get_quantization_paramsoutputis_input_a_initializerinputis_per_channelquantize_activationquantize_weight_per_channel
onnx_protoTensorProtoINT8r"   appendquantize_weightr9   extendr/   quantizer   quantize_bias_staticr(   r   r   r   updater   r
   ranger   r   	make_noder   r   Inputquantized_value_map	new_nodes)r2   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_outputr5   r   r   rO   1   s   





 


zQLinearGemm.quantize__name__
__module____qualname__r0   rO   __classcell__r   r   r5   r   r+   -   s    r+   c                       s$   e Zd Z fddZdd Z  ZS )QDQGemmc                    r,   r-   r.   r1   r5   r   r   r0      r7   zQDQGemm.__init__c                 C   s   | j }|jdks
J | j|jd  | js| j|jd  | j r5| j|jd t	|r1dnd n	| j
|jd  t|jdkrv| j|jd rj| j|jd |jd |jd t| j  t| j  d S td| j j d S d S )Nr8   r   r   r;   r   zXBias of Gemm node '{}' is not constant. Please exclude this node for better performance.)r?   r@   rA   quantize_activation_tensorrE   disable_qdq_for_node_outputrC   rF   "quantize_weight_tensor_per_channelr"   quantize_weight_tensorr   rD   quantize_bias_tensorr(   r*   loggingwarningformatr   )r2   r?   r   r   r   rO      s$   
"*zQDQGemm.quantizerl   r   r   r5   r   rq      s    rq   )rw   numpynpr   r   rI   quant_utilsr   r   r   r   r   r	   r
   base_operatorr   matmulr   qdq_base_operatorr   r"   r(   r*   r+   rq   r   r   r   r   <module>   s    $	_