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ÚQOrderedMatMulZMatMul)ÚsuperÚ__init__)Úselfr   ©Ú	__class__© úi/home/kim/smarthome/.venv/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 r½d S |d }|d }|d }n|d }t || j ¡s×d 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||¡sŠt 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)Z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	   )Zname_prefix)ZinputsZoutputsÚnameZorder_AZorder_BZorder_Yzcom.microsoft)r   Zget_childrenÚlenZop_typeZget_constant_valueÚinputr   Zcheck_qdq_node_for_fusionZmatch_parent_pathsÚextendZis_safe_to_fuse_nodesÚoutputÚloggerÚdebugZreplace_node_inputÚappendZget_initializerZtranspose_2d_int8_tensorr   Z	make_nodeZcreate_node_nameÚ	attributeZmake_attributeÚdomainZnodes_to_removeZnodes_to_addZthis_graph_nameZnode_name_to_graph_namer   )r   Únoder   r   Zmatmul_childrenZbias_add_nodeZbias_add_node_indexZbias_add_childrenZbias_add_childZresidual_add_nodeZdownstream_quantize_nodeZresidual_add_childrenZfirst_path_idZfirst_input_parent_nodesÚ_Zreshape_node_0Ztranspose_node_0Zdequantize_node_0Zdequantize_node_1Zis_weight_transpose_requiredZweight_path_idZweight_nodesZresidual_add_dequantize_nodeZresidual_path_idZresidual_input_parent_nodesZsubgraph_nodesZfused_node_inputsZweight_tensorZ
fused_noder   r   r   Úfuse   sö   



ý
ý

ý

ý



ÿ
û
ÿ


ÿ

ú
	

üzFusionQOrderedMatMul.fuse)Ú__name__Ú
__module__Ú__qualname__r   r   Údictr&   Ú__classcell__r   r   r   r   r      s    r   N)Úloggingr   Zfusion_baser   Zfusion_utilsr   Zonnxr   Z
onnx_modelr   r'   r   r   r   r   r   r   Ú<module>   s   