+
    9i//                     p    ^ RI Ht ^ RIt^ RIHt ^ RIHtHtH	t	H
t
 ^ RIHt ]! ]4      t ! R R]4      tR# )    )	getLoggerN)Fusion)	NodeProtoTensorProtohelpernumpy_helper)	OnnxModelc                   l   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V3R lR ltR tR	t	Vt
V ;t# )
FusionAttentionVaezA
Fuse Attention subgraph of Vae Decoder into one Attention node.
c                ,   < V ^8  d   QhRS[ RS[RS[/# )   modelhidden_size	num_heads)r	   int)format__classdict__s   "k/var/www/html/photoedit/myenv/lib/python3.14/site-packages/onnxruntime/transformers/fusion_attention_vae.py__annotate__FusionAttentionVae.__annotate__   s"     ( (i (c (c (    c                `   < \         SV `  VR R.4       W n        W0n        RV n        RV n        R# )	AttentionSoftmaxTN)super__init__r   r   num_heads_warninghidden_size_warning)selfr   r   r   	__class__s   &&&&r   r   FusionAttentionVae.__init__   s3    i[9&" "&#' r   c                B   < V ^8  d   QhRS[ RS[ RS[S[S[3,          /# )r   	reshape_qadd_qreturn)r   tupler   )r   r   s   "r   r   r      s/     '& '&y '& '&W\]`be]eWf '&r   c                T   V P                   P                  V^4      pVe   \        VP                  4      ^8w  d   V P                  V P
                  3# V P                   P                  VP                  ^,          4      pVe2   \        V\        P                  4      '       d   VP                  ^8X  g   V P                  V P
                  3# \        V4      pV^ 8:  d   V P                  V P
                  3# V P                   P                  V4      w  rgVe2   \        V\        P                  4      '       d   VP                  ^8w  d   V P                  V P
                  3# VP                  ^ ,          pV P                  ^ 8  dJ   WPP                  8w  d:   V P                  '       d(   \         P#                  RWPP                  4       RV n        V P
                  ^ 8  dJ   WP
                  8w  d:   V P$                  '       d(   \         P#                  RWP
                  4       RV n        WX3# )zDetect num_heads and hidden_size from a reshape node.

Args:
    reshape_q (NodeProto): reshape node for Q
    add_q (NodeProto): add node for Q

Returns:
    Tuple[int, int]: num_heads and hidden_size
z?Detected number of attention heads is %d. Ignore --num_heads %dFz3Detected hidden size is %d. Ignore --hidden_size %d)r   
get_parentleninputr   r   get_constant_value
isinstancenpndarraysizer   get_constant_inputndimshaper   loggerwarningr   )	r   r#   r$   concatvaluer   _biasr   s	   &&&      r   get_num_heads_and_hidden_size0FusionAttentionVae.get_num_heads_and_hidden_size   s    &&y!4>S.!3>>4#3#333

--fll1o>!j

&C&C

VW>>4#3#333J	>>>4#3#333**//6L*T2::">">499PQ>>>4#3#333jjm>>A)~~"=%%%UW`bpbp */&aK3C3C$C'''TVacscst+0(%%r   c                j   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[ RS[ RS[RS[R	S[R
S[RS[ R,          /# )r   q_matmulq_addk_matmulk_addv_matmulv_addr   r   
input_nameoutput_namer%   N)r   r   str)r   r   s   "r   r   r   F   s     H HH H 	H
 H H H H H H H 
T	Hr   c                   VP                   ^ ,          V	8w  g1   VP                   ^ ,          V	8w  g   VP                   ^ ,          V	8w  dN   \        P                  RVP                   ^ ,          VP                   ^ ,          VP                   ^ ,          4       R# V^ 8  d&   W,          ^ 8w  d   \        P                  RW4       R# V P                  P	                  VP                   ^,          4      pV P                  P	                  VP                   ^,          4      pV P                  P	                  VP                   ^,          4      pV'       d   V'       d	   V'       g   R# V P                  P	                  VP                   ^,          4      ;'       g-    V P                  P	                  VP                   ^ ,          4      pV P                  P	                  VP                   ^,          4      ;'       g-    V P                  P	                  VP                   ^ ,          4      pV P                  P	                  VP                   ^,          4      ;'       g-    V P                  P	                  VP                   ^ ,          4      p\
        P                  ! V4      p\
        P                  ! V4      p\
        P                  ! V4      p\        P                  ! VP                  4      p\        P                  ! VP                  4      p\        P                  ! VP                  4      pVP                  ^
8X  d   \        P                  R4       R# \
        P                  ! V4      p\
        P                  ! V4      p\
        P                  ! V4      pVP                  VP                  8w  g   VP                  VP                  8w  d   R# VP                  ^ ,          pVP                  ^ ,          pVP                  ^ ,          pVV8X  d   VV8X  g   Q hV^ 8  d   VV8w  d   \        RV RV R24      h\        P                  ! VP                  R,          4      p\        P                  ! VVV3^R	7      p^\        V4      ,          pV P                  P                  R
4      p VTu;8X  d	   V8X  g   Q h Q h^ p!\        P                  ! VVV3^ R	7      p"^V,          p!V P                  V R,           \         P"                  VV.VR7       \        P$                  ! ^V.\        P&                  R7      p"^V,          p!V P                  V R,           \         P"                  V!.V"R7       V	V R,           V R,           .p#\(        P*                  ! R
V#V
.V R7      p$RV$n        V$P.                  P1                  \(        P2                  ! RV4      .4       V P5                  R4       V$# )a  Create an Attention node.

Args:
    q_matmul (NodeProto): MatMul node in fully connection for Q
    q_add (NodeProto): Add bias node in fully connection for Q
    k_matmul (NodeProto): MatMul node in fully connection for K
    k_add (NodeProto): Add bias node in fully connection for K
    v_matmul (NodeProto): MatMul node in fully connection for V
    v_add (NodeProto): Add bias node in fully connection for V
    num_heads (int): number of attention heads. If a model is pruned, it is the number of heads after pruning.
    hidden_size (int): hidden dimension. If a model is pruned, it is the hidden dimension after pruning.
    input_name (str): input name
    output_name (str): output name

Returns:
    Union[NodeProto, None]: the node created or None if failed.
zRFor self attention, input hidden state for q and k/v shall be same. Got %s, %s, %sNz9input hidden size %d is not a multiple of num of heads %dzBweights are in fp16. Please run fp16 conversion after optimizationzInput hidden size (z,) is not same as weight dimension of q,k,v (z:). Please provide a correct input hidden size or pass in 0:   NN)axisr   _qkv_weight)name	data_typedimsvals)dtype	_qkv_bias)inputsoutputsrI   zcom.microsoftr   zAttention (self attention))r*   r3   debugr   get_initializerr   to_arrayr-   prodr2   rJ   
ValueErrorstackr   create_node_nameadd_initializerr   FLOATzerosfloat32r   	make_nodedomain	attributeextendmake_attributeincrease_counter)%r   r<   r=   r>   r?   r@   rA   r   r   rB   rC   q_weight_tensork_weight_tensorv_weight_tensorq_bias_tensork_bias_tensorv_bias_tensorq_biask_biasv_biasq_bias_shapek_bias_shapev_bias_shapeq_weightk_weightv_weight
qw_in_size
kw_in_size
vw_in_sizeqw_out_size
qkv_weightqkv_weight_dimattention_node_nameqkv_bias_dimqkv_biasattention_inputsattention_nodes%   &&&&&&&&&&&                          r   create_attention_node(FusionAttentionVae.create_attention_nodeF   s   < >>!
*hnnQ.?:.MQYQ_Q_`aQbfpQpLLdq!q!q!	 ? 7A=LLTVam**44X^^A5FG**44X^^A5FG**44X^^A5FGO

225;;q>BppdjjF`F`afalalmnaoFp

225;;q>BppdjjF`F`afalalmnaoFp

225;;q>BppdjjF`F`afalalmnaoFp&&}5&&}5&&}5wwv||,wwv||,wwv||, $$*LL]^((9((9((9 >>X^^+x~~/O^^A&
^^A&
^^A&
Z'J*,DDD?{j8%k]2^_i^j kJ J  gghnnR01XXx8<1E
S--"jj99+F|;|;;;;;88VVV41=<'$}4!''n-	 	 	
 88Q,BJJ?;${2!''	 	 	
 -/+-
  ))# M$	
 !0  '')>)>{I)V(WX:;r   c                   V P                   P                  VR VRR7      pVf   R# V P                   P                  VRVRR7      pVf   R# V P                   P                  VRVRR7      pVf   R# V P                   P                  VRVRR7      pVf   R# V P                   P                  VR VRR7      pVf   R# V P                   P                  VRVRR7      p	V	f   R# V P                   P                  V	RVRR7      p
V
f   R# V P                   P                  V. RO. RO4      pVf   \        P	                  R4       R# Vw    rpV P                   P                  V. RO. RO4      pVe	   Vw  ppppM\        P	                  R4       R# V P                   P                  V. RO. RO4      pVf   \        P	                  R	4       R# Vw  pppppV P                   P                  V. RO. RO4      pVf   \        P	                  R
4       R# Vw     pppTpV P                  VV4      w  ppV^ 8:  d   \        P	                  R4       R# V P                  VVVVVVVVVP                  ^ ,          VP                  ^ ,          4
      pVf   R# V P                  P                  V4       V P                  V P                  VP                  &   V P                  P                  VV.4       RV n        R# )MatMulF)	recursiveNReshape	TransposeAddz&fuse_attention: failed to match v pathz'fuse_attention: failed to match qk pathz&fuse_attention: failed to match q pathz&fuse_attention: failed to match k pathz*fuse_attention: failed to detect num_headsT)r   r   r   r   r   )rF   r   r   r   N)r   r   Mulr   )r   r   r   r   )r   r   r   r   N)r   r   r   r   r   r   )rF   r   r   r   r   N)r   find_first_child_by_typematch_parent_pathr3   rQ   r9   r|   r*   outputnodes_to_addappendthis_graph_namenode_name_to_graph_namerI   nodes_to_remover_   prune_graph) r   softmax_nodeinput_name_to_nodesoutput_name_to_node
matmul_qkvreshape_qkvtranspose_qkvreshape_out
matmul_outadd_outtranspose_outv_nodesr7   add_vmatmul_vqk_nodes_softmax_qk	_add_zero_mul_qk	matmul_qkq_nodes_transpose_qr#   r$   matmul_qk_nodesadd_kmatmul_kattention_last_nodeq_num_headsq_hidden_sizenew_nodes    &&&&                            r   fuseFusionAttentionVae.fuse   s   ZZ88xQdpu8v
jj99*iQdpu9v

;;&9U < 
  jj999&9U : 
 ZZ88hPcot8u
**55j%I\hm5n?

;;G[Reqv;w **..LN`
 ?LLAB%,"Aq:://
<_amn;C8[)WiLLBC**..KM_
 ?LLAB8?5L)UH**..XZo
 ?LLAB(/%Aq!UH)%)%G%G	SX%Y"]!LLEF --NN1&&q)
   *6:6J6J$$X]]3##%8-$HI  r   )r   r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r9   r|   r   __static_attributes____classdictcell____classcell__)r    r   s   @@r   r   r      s8     ( ('& '&RH HT\  \ r   r   )loggingr   numpyr-   fusion_baser   onnxr   r   r   r   
onnx_modelr	   r   r3   r    r   r   <module>r      s1   
    = =  	8	]  ] r   