o
    i
                      @   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                       s:   e Zd ZdZdedededef 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__ m/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr      s   z!FusionConformerAttention.__init__c           $      C   s  | j |g dg d}|d u rtd d S |d |d |d }}}d\}}	| j |g dg d	}
|
d u rQ| j |g d
g d}
|
d u rPtd d S n|
d }| j |dd }|jd }	|jd }|
d |
d }}d}| j |g dg d}|d u r| j |g dg d}|d u rtd d S |d }| j |g dg d}|d ur|d jd }|d |d }}| j |g dg d}|d u r| j |g dg d}|d u rtd d S |d |d |d }}}| j |g dg d}|d ur|d |d krtd d S d\}}| j |g dg d}|d u rR| j |g d g d!}|d u rQ| j |g d
g d}|d u rQtd" d S n|d# }| j |dd }|jd }|jd }|d |d }}| |\} }!| dks|!dks|!|  dkrtd$ d S d }"|jd |jd ko|jd |jd ko|d u }#|#r| jd9i d%|d&|d'|d(|d)|d*|d+|d,| d-|!d.|jd d/|jd d0|jd# d1|d2|d3|d4|	}"n| j	||||||| |!|jd ||jd# ||||	d5}"|"d u rtd6 d S | j
|" | j| j|"j< | j|||g | j| |#sX|d jd7kr@|  |d jd7krL|  |
d jd7krX|
  |d u rc| j| | j| | j|
 d8| _d S ):N)AddMatMulReshape	Transposer   )   Nr   r   r   z2fuse_conformer_attention: failed to match qkv path) r   )Concatr   r   r   r   )r   r   r   r   r   )r   r   r   r   )r   r   r   r   z0fuse_conformer_attention: failed to match v pathr   r   )Softmaxr   r   )r   r   r   )Wherer   r   r   r   )r      r   r   r   z1fuse_conformer_attention: failed to match qk pathr   )ZEqualZ	UnsqueezeZCast)Divr   r   r   r   )r   r   r   r   r   )ZMulr   r   r   r   )r   r   r   r   r   z0fuse_conformer_attention: failed to match q path)r   r   r   r   r   r   )r   r   r   r   r   r   z6fuse_conformer_attention: failed to match extra q path)r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   z0fuse_conformer_attention: failed to match k pathr   zCfuse_conformer_attention: failed to detect num_heads or hidden_sizeZ
mask_indexq_matmulk_matmulv_matmulq_addk_addv_addr   r   Zfirst_inputoutputZ
add_qk_strpast_kpast_v	present_k	present_v)r   r    r!   r"   r#   r$   r   r   r%   Zkey_padding_maskadd_qkr&   r'   r(   r)   zAfuse_conformer_attention: MultiHeadAttention node creation failedr   Tr   )r   Zmatch_parent_pathloggerdebugZ
get_parentr%   Zget_num_heads_and_hidden_sizeinputZcreate_attention_nodeZcreate_multihead_attention_nodeZ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_nodesZreshape_qkvZtranspose_qkvZ
matmul_qkvr'   r)   Zv_nodesZconcat_vZconcat_parentZadd_vZmatmul_vZ	attn_maskZqk_nodesZwhere_qkZ
mask_nodesr*   Z	matmul_qkZq_nodesZ	reshape_qZadd_qZmatmul_qZextra_q_nodesr&   r(   Zk_nodesZconcat_kZadd_kZmatmul_kr   r   new_nodeZuse_packed_attention_opr   r   r   fuse   sj  












"
2
	







zFusionConformerAttention.fuse)
__name__
__module____qualname____doc__r   intr   r   r3   __classcell__r   r   r   r   r      s    	r   )
loggingZfusion_attentionr   r   Z
onnx_modelr   	getLoggerr4   r+   r   r   r   r   r   <module>   s
   
