o
    ٷi                      @   sX   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 ee
ZG dd deZdS )	    )	getLogger)Fusion)FusionUtils)helper)	OnnxModelc                       s4   e Zd Zdef fddZdedefddZ  ZS )FusionQOrderedMatMulmodelc                    s   t  |dd d S )NQOrderedMatMulMatMul)super__init__)selfr   	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/fusion_qordered_matmul.pyr      s   zFusionQOrderedMatMul.__init__input_name_to_nodesoutput_name_to_nodec                 C   sf  | j ||}t|dks|d jdkrd S |d }d}| j |jd d u r4| j |jd d u r4d S | j |jd d u rAd}| j ||}t|dkrPd S |d }d }	d }
|jdkrz|}	| j |	|}t|dkss|d jdkrud S |d }
n
|jdkr|}
nd S t|
| j sd S | j |dgdgfg|\}}}d }d }|dk r| j |g dg dfg|\}}}|dk rd S |d }|d }|d }n|d }t|| j sd S d }d	}| j |g d
g dfg|\}}}|dk r| j |dgdgfg|\}}}|dk r	d S |d }nd}|d }| j |jd d u r"d S t|| j ds-d S d }|	d urO| j |	dgdgfg|\}}}|dk rKd S |d }|d ur^t|| j s^d S ||g}|	d urm|	|	g |	| |	|
g | j 
||
j||std d S |d ur| j ||jd |jd  |d ur|jd n|jd |jd |jd |jd |
jd |j| g}|	d ur||jd  ||jd  |r| j |jd }t| tjd||
jd g| j jdddd}|j	tddg |j	tddg |j	tddg d|_| j	| | j| | j| j|j< d S )N   r   AddQuantizeLinearDequantizeLinear)Reshape	Transposer   r   )r   r   r   r      T)r   r   r   r   )r   r   r   r   F   z0It is not safe to fuse QOrderedMatMul node. Skipr	   )name_prefix)inputsoutputsnameorder_Aorder_Border_Yzcom.microsoft)r   get_childrenlenop_typeget_constant_valueinputr   check_qdq_node_for_fusionmatch_parent_pathsextendis_safe_to_fuse_nodesoutputloggerdebugreplace_node_inputappendget_initializertranspose_2d_int8_tensorr   	make_nodecreate_node_name	attributemake_attributedomainnodes_to_removenodes_to_addthis_graph_namenode_name_to_graph_namer   )r   noder   r   matmul_childrenbias_add_nodebias_add_node_indexbias_add_childrenbias_add_childresidual_add_nodedownstream_quantize_noderesidual_add_childrenfirst_path_idfirst_input_parent_nodes_reshape_node_0transpose_node_0dequantize_node_0dequantize_node_1is_weight_transpose_requiredweight_path_idweight_nodesresidual_add_dequantize_noderesidual_path_idresidual_input_parent_nodessubgraph_nodesfused_node_inputsweight_tensor
fused_noder   r   r   fuse   s   




















	

zFusionQOrderedMatMul.fuse)__name__
__module____qualname__r   r   dictrV   __classcell__r   r   r   r   r      s    r   N)loggingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rW   r-   r   r   r   r   r   <module>   s   