
    "
3j-                     b    S SK r S SKJrJr  S SKJr  \ R                  " \5      r " S S\5      r	g)    N)AttentionMaskFusionAttention)	OnnxModelc                   F   ^  \ rS rSrSrS\S\S\S\4U 4S jjrS r	S	r
U =r$ )
FusionConformerAttention   zE
Fuse Conformer Attention subgraph into one MultiHeadAttention node.
modelhidden_size	num_headsattention_maskc                 &   > [         TU ]  XX45        g )N)super__init__)selfr	   r
   r   r   	__class__s        m/home/wildlama/miniconda3/lib/python3.13/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr   !FusionConformerAttention.__init__   s     	YG    c                    U R                   R                  U/ SQ/ SQ5      nUc:  U R                   R                  U/ SQ/ SQ5      nUc  [        R                  S5        g US   US   US   pvnS	u  pU R                   R                  U/ S
Q/ SQ5      n
U
c_  U R                   R                  U/ SQ/ SQ5      n
U
c:  U R                   R                  U/ SQ/ SQ5      n
U
c  [        R                  S5        g O@U
S   nU R                   R	                  USS 5      nUR
                  S   n	UR
                  S   n[        U
5      S:  a  U
S   R                  S:X  a  U
S   OS nU
S   nSnU R                   R                  U/ SQ/ SQ5      nS nUci  U R                   R                  U/ SQ/ SQ5      nUc@  U R                   R                  U/ SQ/ SQ5      nUc  [        R                  S5        g US   nOUS   nUb6  U R                   R                  U/ SQ/ SQ5      nUb  US   R
                  S   nUS   US   nnU R                   R                  U/ SQ/ SQ5      nUc  U R                   R                  U/ SQ/ SQ5      nUc^  U R                   R                  U/ S Q/ S!Q5      nUc:  U R                   R                  U/ S Q/ S"Q5      nUc  [        R                  S#5        g [        S$ U 5       S 5      n[        S% U 5       S 5      n[        S& [        U5       5       S 5      nUb  Ub  Uc  [        R                  S'5        g U R                   R                  U/ S(Q/ S)Q5      nUb5  US   R                  S*;   a"  US   US   :w  a  [        R                  S+5        g Uc&  U R                   R                  U/ S,Q/ S-Q5      nUb  UnS	u  nnU R                   R                  U/ S.Q/ S/Q5      nUc  U R                   R                  U/ S0Q/ S1Q5      nUc^  U R                   R                  U/ SQ/ SQ5      nUc:  U R                   R                  U/ SQ/ SQ5      nUc  [        R                  S25        g O@US3   nU R                   R	                  USS 5      nUR
                  S   nUR
                  S   n[        U5      S:  a  US   R                  S:X  a  US   OS nUS   n U R                  U5      u  n!n"U!S::  d  U"S::  d	  U"U!-  S:w  a  [        R                  S45        g UR                  S3   n#U R                   R                  U#5      n$U$bE  [        U$R                  5      S5:w  a,  [        R                  S6U#[        U$R                  5      5        Sn#S n%UR                  S   U R                  S   :H  =(       aK    U R                  S   UR                  S   :H  =(       a%    US L =(       a    US L=(       a    US L=(       a    US Ln&U&(       a9  U R                  UUU UUUUU!U"UR                  S   UR
                  S   U#UUUU	S79n%O*U R!                  UU UUUUU!U"UR
                  S   UU#UUUU	S89n%U%c  [        R                  S95        g U R"                  R%                  U%5        U R&                  U R(                  U%R*                  '   U R,                  R/                  XVU/5        U R,                  R/                  U5        U&(       di  US   R                  S::X  a  UR1                  5         US   R                  S::X  a  UR1                  5         U
S   R                  S::X  a  U
R1                  5         Uc  U R,                  R/                  U5        U R,                  R/                  U5        U R,                  R/                  U
5        S;U l        g )<N)AddMatMulReshape	Transposer   )   Nr   r   r   )r   r   r   r   )r   r   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   r   r   z0fuse_conformer_attention: failed to match v pathr      r   r   )Softmaxr   r   )r   r   r   )Wherer!   r"   r   r   )r   r    r   r    r   )r"   r!   r"   Divr   r   )r   r    r   r    r   r   z1fuse_conformer_attention: failed to match qk path)Equal	UnsqueezeCast)r#   r   r   r   r   )r   r   r   r   r   )Mulr   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 q pathc              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)r   Nop_type.0nodes     r   	<genexpr>0FusionConformerAttention.fuse.<locals>.<genexpr>   s     P74lli6O$$7   "	"c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)r   Nr)   r+   s     r   r.   r/      s     Hwt,,%2Gddwr0   c              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)r   Nr)   r+   s     r   r.   r/      s     X*;$||x?W*;r0   zGfuse_conformer_attention: failed to identify q reshape/add/matmul nodes)r   r   r   r   r   r#   )r   r   r   r   r   r   )r#   r'   z6fuse_conformer_attention: failed to match extra q path)Slicer   r3   r   Padr   r   r   )r   r   r   r   r   r   r   r   )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_size   zPfuse_conformer_attention: skipping attention_bias %s with dims %s (expected 4-D))
mask_indexq_matmulk_matmulv_matmulq_addk_addv_addr   r
   first_inputoutput
add_qk_strpast_kpast_v	present_k	present_v)r7   r8   r9   r:   r;   r<   r   r
   r>   key_padding_maskadd_qkr@   rA   rB   rC   zAfuse_conformer_attention: MultiHeadAttention node creation failedr   T)r	   match_parent_pathloggerdebug
get_parentr>   lenr*   nextreversedget_num_heads_and_hidden_sizeinputget_initializerdimslistcreate_attention_nodecreate_multihead_attention_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namenamenodes_to_removeextendpopprune_graph)'r   normalize_nodeinput_name_to_nodesoutput_name_to_node	qkv_nodesreshape_qkvtranspose_qkv
matmul_qkvrA   rC   v_nodesconcat_vconcat_parentadd_vmatmul_v	attn_maskqk_nodeswhere_qk
mask_nodesrE   	matmul_qkq_nodes	reshape_qadd_qmatmul_qextra_q_nodesnemotron_extra_q_nodesr@   rB   k_nodesconcat_kadd_kmatmul_kr   r
   attention_bias	bias_initnew_nodeuse_packed_attention_ops'                                          r   fuseFusionConformerAttention.fuse   s   JJ00?
	
 

44<I
  QR1:2	"yY[}J"**..?

 ?jj229G
 **666
 ?LL!STqzH JJ11(AtDM *I"))!,F"7|q0WR[5H5HE5QW[2;	:://(

 zz33>H
 ::77I&
 #LL!TU#A;#A;55.J
 %&rN11!4	$RL(2,	**..<

 ?jj22@G
 **66= 
 ?"jj::!A$G
 %WXP7PRVW	HwH$OX(7*;XZ^_1ALLbc

44M

 $););~)MRYZ[R\`mnp`qRqLLQR %)ZZ%A%A](&"
 &1 6"	**..L

 ?jj22FG
 **66= 
 ?"jj::!:!G
 %WXqzH JJ11(AtDM"))!,F *I"7|q0WR[5H5HE5QW[2;!%!C!CI!N	;>[A-+	2Ia1OLL^_  aJJ..~>	 S%8A%=LLbY^^$
  NNN1!22 "q!X^^A%66"%" T!" T!	"
 T! 	  #11$!!!#'$NN1-"))!,)##! 2 H& ;;!!!#'"))!,!*%## < H$ LL\]  *6:6J6J$$X]]3##[$LM##H- 'r{""h.r{""h.r{""h.    ''0##G,##G,  r   )r\   )__name__
__module____qualname____firstlineno____doc__r   intr   r   r|   __static_attributes____classcell__)r   s   @r   r   r      sD    HH H 	H
 &HN  N r   r   )
loggingfusion_attentionr   r   
onnx_modelr   	getLoggerr~   rG   r    r   r   <module>r      s.   
  ;  			8	$\  \ r   