+
    9i                         ^ RI t ^ RIHtHt ^ RIHt ^ RIHtHt ^ RI	H
t
 ^ RIHt ] P                  ! ]4      t ! R R]4      t ! R	 R
]4      tR# )    N)AttentionMaskFusionAttention)NumpyHelper)	NodeProtohelper)	OnnxModel)BertOnnxModelc                   Z   a a ] tR t^t oRtV3R lV 3R lltV3R lR ltR tRtVt	V ;t
# )FusionTnlrAttentionz
Fuse TNLR Attention subgraph into one Attention node.
TNLR Attention has extra addition after qk nodes and adopts [S, B, NH] as I/O shape.
c                2   < V ^8  d   QhRS[ RS[RS[RS[/# )   modelhidden_size	num_headsattention_mask)r   intr   )format__classdict__s   "f/var/www/html/photoedit/myenv/lib/python3.14/site-packages/onnxruntime/transformers/onnx_model_tnlr.py__annotate__ FusionTnlrAttention.__annotate__   s9     H HH H 	H
 &H    c                (   < \         SV `  WW44       R # N)super__init__)selfr   r   r   r   	__class__s   &&&&&r   r   FusionTnlrAttention.__init__   s     	YGr   c                ^   < V ^8  d   QhRS[ RS[RS[RS[RS[RS[ RS[ RS[ R	S[R
,          /	# )r   
mask_indexmatmuladdr   r   inputoutput
add_qk_strreturnN)strr   r   )r   r   s   "r   r   r      su     F FF F 	F
 F F F F F 
T	Fr   c	                   V^ 8  g   Q hV^ 8  d+   WT,          ^ 8w  d   \         P                  RV RV 24       R# V P                  P                  VP                  ^,          4      p	V P                  P                  VP                  ^,          4      ;'       g-    V P                  P                  VP                  ^ ,          4      p
V	e   V
f   R# \
        P                  ! V	4      p\
        P                  ! V
4      pV P                  P                  R4      pV	P                  p\        P                  ! V4      p\        P                  ! VR,           VV^V,          .VP                  V4      P                  4       RR7      p	V P                  P                  WP                  4       \        P                  ! VR,           V^V,          .VP                  V4      P                  4       RR7      p
V P                  P                  WP                  4       VVR,           VR,           .pVe   VP!                  V4       MVP!                  R	4       Ve#   VP!                  R	4       VP!                  V4       \        P"                  ! RVV.VR
7      pRVn        VP&                  P)                  \        P*                  ! RV4      .4       V# )r   zinput hidden size z# is not a multiple of num of heads N	Attention_qkv_weightT)name	data_typedimsvalsraw	_qkv_bias )inputsoutputsr,   zcom.microsoftr   )loggerdebugr   get_initializerr$   r   to_arraycreate_node_namer-   r   tensor_dtype_to_np_dtypemake_tensorastypetobytesadd_initializerthis_graph_nameappend	make_nodedomain	attributeextendmake_attribute)r   r!   r"   r#   r   r   r$   r%   r&   weightbias
qkv_weightqkv_biasattention_node_nametensor_dtypenp_typeattention_inputsattention_nodes   &&&&&&&&&         r   create_attention_node)FusionTnlrAttention.create_attention_node   s`    1}}? 7A=LL-k]:]^g]hij++FLLO<zz))#))A,7cc4::;U;UVYV_V_`aVb;c>T\ ))&1
''-"jj99+F''11,?##$}4"q;/""7+335
 	

""6+?+?@!!${2"k/")113
 	

""4)=)=> -/+-

 !##J/##B'!##B'##J/))#H$	
 !0  '')>)>{I)V(WXr   c                   TpVP                   R 8w  d   R# V P                  P                  V. R	O. R
O4      pVe	   Vw   rgrp
MR# . p\        VP                  4       F>  w  rW9  d   K  W^ ,          P
                  ^ ,          8X  d   K-  VP                  V4       K@  	  \        V4      ^8w  d   R# V^ ,          pV P                  P                  V
. RO. RO4      pVf   R# Vw    pppV P                  P                  VR.^ .4      pV^ ,          pV P                  P                  V
. RO. RO4      pVf   R# Vw  pppV P                  P                  V. RO. RO4      pVf   R# VR,          pVR,          pV P                  P                  V. RO. RO4      pVf   R# VR,          pVR,          pV P                  P                  VRR.^^ .4      pVf   R# VP                  ^ ,          V8X  Ed   RpTpV P                  VVVV P                  V P                  VVP
                  ^ ,          V^ ,          P                  ^ ,          4      pVf   R# V P                  P                  V4       V P                  V P                  VP                  &   \        P                   ! RRVP                  ,           .VP
                  ^ ,          .RVP                  ,           . ROR7      pV P                  P#                  VV P                  4       VP                  ^ ,          VP                  ^ &   RVP                  ,           VP
                  ^ &   V P$                  P'                  VW.4       V P$                  P'                  V4       V P$                  P'                  V4       V P$                  P'                  V4       V P$                  P'                  V4       RV n        R# R# )SkipLayerNormalizationNWhereReshape	Transposeback_transpose_in_back_transpose_)permT)rS   AddMatMulrT   rU   rZ   )   r[   r[   r   r   r   )rU   rT   SlicerY   rZ   )r[   r   r   r   r[   )SoftmaxrY   rZ   )r   r   r   )MulrU   rT   r\   rY   rZ   )r   r   r   r   r   r[   )r[   r   r   )op_typer   match_parent_path	enumerater$   r%   r@   lenrO   r   r   nodes_to_addr?   node_name_to_graph_namer,   r   rA   add_nodenodes_to_removerD   prune_graph)r   normalize_nodeinput_name_to_nodesoutput_name_to_node
start_node	qkv_nodes_matmul_belowreshape_qkvtranspose_qkv
matmul_qkvother_inputs_ir$   
root_inputv_nodesr#   r"   upper_nodes	transposeqk_nodesadd_qk	matmul_qkq_nodesk_nodesrelative_position_bias_nodesr!   attention_last_nodenew_nodeback_transposes   &&&&                          r   fuseFusionTnlrAttention.fuseg   s    $
!!%== JJ00H
	
  KTHQZ":#3#34IB/!++A..& 5 |!!!_
**..>

 ?!(Aq#vjj226K=1#NN	:://
<XZcd!)FI**..E

 ?bk**..>

 ?bk'+zz'C'CFYX_L`cdfgbh'i$'/<<?j(J"- 11  #**1-,Q/55a8	H $$X.:>:N:ND((7 $--%56#$!HMM1N JJ0D0DE ) 2HNN1!5!EHOOA  '')<m(XY  ''1  ''0  ''0  ''0  $DS )r   )ri   )__name__
__module____qualname____firstlineno____doc__r   rO   r   __static_attributes____classdictcell____classcell__r   r   s   @@r   r   r      s/     
H HF FPq$ q$r   r   c                   8   a a ] tR t^t oV 3R ltR tRtVtV ;t# )TnlrOnnxModelc                   < \         SV `  WV4       \        V 4      V n        \	        W P
                  V P                  V P                  4      V n        R # r   )r   r   r   r   r   r   r   attention_fusion)r   r   r   r   r   s   &&&&r   r   TnlrOnnxModel.__init__   sA    ;7+D1 3D:J:JDNN\`\o\o pr   c                :    V P                   P                  4        R # r   )r   apply)r   s   &r   fuse_attentionTnlrOnnxModel.fuse_attention   s    ##%r   )r   r   )	r   r   r   r   r   r   r   r   r   r   s   @@r   r   r      s     q
& &r   r   )loggingfusion_attentionr   r   fusion_utilsr   onnxr   r   
onnx_modelr   onnx_model_bertr	   	getLoggerr   r5   r   r    r   r   <module>r      sD   
  ; $ "   )			8	$H$/ H$V&M &r   