U
    T?h                     @   sB   d dl Z d dlmZmZ d dlmZ e eZG dd deZ	dS )    N)AttentionMaskFusionAttention)	OnnxModelc                       s4   e Zd ZdZeeeed fddZdd Z  Z	S )FusionConformerAttentionzM
    Fuse Conformer Attention subgraph into one MultiHeadAttention node.
    )modelhidden_size	num_headsattention_maskc                    s   t  |||| d S )N)super__init__)selfr   r   r   r	   	__class__ e/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr      s    z!FusionConformerAttention.__init__c           !      C   s  | j |dddddgdddddg}|d k	r<|\}}}}}ntd d S | j |dddddgdddddg}	d }
|	d k	r|	\}}}}
}| j |dd }|jd }|jd }ntd	 d S | j |d
ddgdddg}|d k	r|\}}}ntd d S | j |dddddgdddddg}|d k	r8|\}}}}}ntd d S | j |ddddddgddddddg}d }|d k	r|\}}}}}}| j |dd }|jd }|jd }ntd d S |}| |\}}|dks|dks|| dkrtd d S | j||||||
|||jd |jd ||||d} | d krLtd d S | j	
|  | j| j| j< | j|||g | j| |d jdkr|  |d jdkr|  |	d jdkr|	  | j| | j|	 d| _d S )NAddZMatMulZReshapeZ	Transpose   r   z2fuse_conformer_attention: failed to match qkv pathZConcatz0fuse_conformer_attention: failed to match v pathZSoftmaxz1fuse_conformer_attention: failed to match qk pathDivz0fuse_conformer_attention: failed to match q pathz0fuse_conformer_attention: failed to match k pathzCfuse_conformer_attention: failed to detect num_heads or hidden_size)add_qkpast_kpast_v	present_k	present_vzAfuse_conformer_attention: MultiHeadAttention node creation failedT)r   Zmatch_parent_pathloggerdebugZ
get_parentoutputZget_num_heads_and_hidden_sizeZcreate_multihead_attention_nodeinputZnodes_to_addappendZthis_graph_nameZnode_name_to_graph_namenameZnodes_to_removeextendZop_typepopZprune_graph)!r   Znormalize_nodeZinput_name_to_nodesZoutput_name_to_nodeZ	qkv_nodes_Zreshape_qkvZtranspose_qkvZ
matmul_qkvZv_nodesZadd_vZconcat_vZmatmul_vZconcat_parentr   r   Zqk_nodesr   Z	matmul_qkZq_nodesZ	reshape_qZadd_qZmatmul_qZk_nodesZmatmul_kZconcat_kZadd_kr   r   Zattention_last_noder   r   new_noder   r   r   fuse   s    








"


zFusionConformerAttention.fuse)
__name__
__module____qualname____doc__r   intr   r   r$   __classcell__r   r   r   r   r      s   	r   )
loggingZfusion_attentionr   r   Z
onnx_modelr   	getLoggerr%   r   r   r   r   r   r   <module>   s   
