U
    T?h   ã                   @   sd   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	 d dl
mZ eeƒZG dd„ deƒZd	S )
é    )Ú	getLogger)ÚDict)ÚFusion)ÚFusionUtils)Úhelper)Ú	OnnxModelc                       s2   e Zd Zedœ‡ fdd„Zeedœdd„Z‡  ZS )ÚFusionQOrderedMatMul)Úmodelc                    s   t ƒ  |dd¡ d S )NÚQOrderedMatMulZMatMul)ÚsuperÚ__init__)Úselfr	   ©Ú	__class__© úa/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/fusion_qordered_matmul.pyr      s    zFusionQOrderedMatMul.__init__)Úinput_name_to_nodesÚoutput_name_to_nodec                 C   s€  | j  ||¡}t|ƒdks(|d jdkr,d S |d }d}| j  |jd ¡d krh| j  |jd ¡d krhd S | j  |jd ¡d kr‚d}| j  ||¡}t|ƒdkr d S |d }d }	d }
|jdkrô|}	| j  |	|¡}t|ƒdksæ|d jdkrêd S |d }
n|jdkr|}
nd S t |
| j ¡sd S | j  |dgdgfg|¡\}}}d }d }|dk r¤| j  |ddddgddddgfg|¡\}}}|dk rŠd S |d }|d }|d }n|d }t || j ¡sÀd S d }d	}| j  |ddddgddddgfg|¡\}}}|dk r6| j  |dgdgfg|¡\}}}|dk r,d S |d }nd
}|d }| j  |jd ¡d kr^d S t || j d
¡std S d }|	d k	r¸| j  |	dgdgfg|¡\}}}|dk r°d S |d }|d k	rÖt || j ¡sÖd S ||g}|	d k	rô| 	|	g¡ | 	|¡ | 	|
g¡ | j  
||
j||¡s.t d¡ d S |d k	rT| j  ||jd |jd ¡ |d k	rh|jd n|jd |jd |jd |jd |
jd |j| g}|	d k	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   ÚAddZQuantizeLinearZDequantizeLinearZReshapeZ	Transposeé   TFé   z0It is not safe to fuse QOrderedMatMul node. Skipr
   )Zname_prefix)ÚinputsÚ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   r   r&   Ú__classcell__r   r   r   r   r      s   r   N)Úloggingr   Útypingr   Zfusion_baser   Zfusion_utilsr   Zonnxr   Z
onnx_modelr   r'   r   r   r   r   r   r   Ú<module>   s   