
     Ti6                        S SK Jr  S SKJrJr  S SKrS SKJrJ	r	J
r
   \\\R                  4   r " S S\
R                  5      rSS jr\" SS	9r\" S
S	9r\R&                  " \5      r\R&                  " \5      rg)    )annotations)SequenceUnionN)_fusion_utils	_ir_utilspatternc                  Z   ^  \ rS rSr      SU 4S jjrS r   S S	S jjrS rSrU =r	$ )
MultiHeadAttention#   c               H   > [         TU ]  U5        X l        X0l        X@l        g N)super__init__
_is_rotary_has_past_present_is_cross_attention)selfname	is_rotaryhas_past_presentis_cross_attention	__class__s        b/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxscript/rewriter/ort_fusions/mha.pyr   MultiHeadAttention.__init__$   s#     	#!1#5     c
           	     t   UR                  U[        R                  S/S9n
UR                  U
/ SQS9nU R                  (       d}  UR                  U[        R                  S/S9n[        R
                  " UR                  U/ SQS9U/SSS/S	9nUR                  U[        R                  S
/S9nUR                  U/ SQS9nOUnU R                  (       a7  UR                  XXSS9nU R                  (       d  UR                  X7XSS9nOUnOUnUnU R                  (       a  UR                  X_SS9nOUnU R                  (       a  UR                  XmSS9nOUnUnUnUR                  UUUSS/SS9nUR                  U/ SQS9nUR                  U[        R                  S/S9nU R                  (       a  UUU4$ U$ )Nquery_BSHDh)_outputsr            perm	key_BSHDhkey_transposedTF)tag_var
tag_valuesvalue_BSHDhcom.microsoft_domainaxissdpa_outputzai.onnxruntime._fusion)_allow_other_inputsr   r,   attention_reshaped)Reshaper   	ANY_VALUE	Transposer   OrValuer   RotaryEmbeddingr   ConcatSDPA)r   op	query_BSDkeyvaluepast_key
past_valueposition_idscossinr   query_BHSDhr)   value_BHSDhquery_BHSDh_embkey_BHSDh_embkey_seq	value_seqkey_seq_to_sdpavalue_seq_to_sdpasdpaattention_transposed	attentions                          r   r   MultiHeadAttention.pattern1   s    jjG,=,=jXll;\lB''**S'"3"3{m*LC//c5s;( %=C **UG,=,=*XK,,{,FK  K?? 003_ 1 O ++ " 2 2s !3 ! !$ *OM !!iibiAG#G !!		*	CI#I "%ww $#_,  
  "||D||DJJ '"3"3?S>T  
	 !!gy00r   c                  ^ [         R                  " 5       nUR                  5       n0 mS)U4S jjnU" U/ SQ5      (       a  UR                  SU S3U5      $ U" U/ SQ5      (       a  UR                  SU S3U5      $ U R                  (       aw  U" U/ SQ5      (       a  UR                  SU S3U5      $ U" U/ S	Q5      (       a  UR                  SU S
3U5      $ Ub  UR                  SU5      $ Ub  UR                  SU5      $ OU" U/ SQ5      (       a  UR                  SU S3U5      $ UR
                  R                  S5      nU	(       a  SOSnUU:w  a  UR                  SU SU 3U5      $ U" U/ SQ5      (       a  UR                  SU S3U5      $ U R                  (       aL  U" U/ SQ5      (       a  UR                  SU S3U5      $ U" U/ SQ5      (       a  UR                  SU S3U5      $ S n[        UR                  5      S:  a  UR                  S   nUU l
        UGb   UR                  =nc  UR                  SU5      $ UR                  5       S:X  as  U" U/ SQ5      (       a  UR                  SU S3U5      $ TR                  S5      nUTR                  S5      :X  a  SU l        O~US :X  a  S!U l        OpUR                  S"5      $ UR                  5       S#:X  a.  U" USS$/5      (       a  UR                  SU S%3U5      $ S!U l        OUR                  S&U S'3U5      $ SU l        UR
                  R                  S(S 5      U l        U$ )*Nc                <   > [         R                  " TX5      (       + $ r   )r   check_shape_bool)valdimsbindingss     r   no_match*MultiHeadAttention.check.<locals>.no_match   s    $55hJJJr   )BSDzShape mismatch: z3 does not match expected dimensions ['B', 'S', 'D'])rW   rX   HDhz9 does not match expected dimensions ['B', 'S', 'H', 'Dh'])rW   rZ   Skvr[   z; does not match expected dimensions ['B', 'H', 'Skv', 'Dh'])rW   rZ   r\   Dvz; does not match expected dimensions ['B', 'H', 'Skv', 'Dv']z+past_key should be None in cross-attention.z-past_value should be None in cross-attention.)rW   r\   rY   z5 does not match expected dimensions ['B', 'Skv', 'D']
key_formatBHSdBSHdzUnexpected key format: z. Expected: )rW   rZ   Spastr[   z= does not match expected dimensions ['B', 'H', 'Spast', 'Dh'])rW   rZ   ra   r]   z= does not match expected dimensions ['B', 'H', 'Spast', 'Dv']r"   z Mask shape cannot be determined.   )B_or_1H_or_1S_or_1StzH does not match expected dimensions ['1 or B', '1 or H', '1 or S', 'St']re   rX   Fr!   Tz0Mask dimension 2 cannot be verified to be 1 or Sr    rf   z4 does not match expected dimensions ['1 or S', 'St']zMask shape z% is not supported. Expected 2D or 4D.scale)rR   zir.ValuerS   zSequence[str]returnbool)r   MatchResultproducerfailr   
attributes
get_stringr   leninputsmaskshaperankget_use_mask_broadcast	get_float_scale)r   r:   r;   r<   r=   r0   r>   r?   r   r&   r%   r)   _check_result	sdpa_noderU   sdpa_key_formatexpected_key_formatrq   
mask_shape
mask_dim_2rT   s                        @r   checkMultiHeadAttention.check   s    **,((*	#%	K I//$$"9+-`a 
 K!677$$";-/hi 
 ##455#((&se+fg  677#((&ug-hi 
 ##((A  %#((C  & .//#((&se+`a  (22==lKO,:&"55#((-o->lK^J_`  011#((&ug-bc  %%H&?@@',,*8*4qr   J(ABB',,*:,6st"  y 1$##A&D	"jj(
1#((6   A%D"FGG',,*4&0xy  &\\(3
c!22/4D,1_/3D,',,J  "a'D8T"233',,*4&0de  ,0(#((!*-RS 
 (-D$**44WdC
 r   c                   [         R                  " US5      n[        U[        5      (       d  g U R                  (       a7  UR                  X(XSS9nU R                  (       d  UR                  X8XSS9nOUnO|U R                  (       ag  UnUR                  U/ SQS9nUR                  X1R                  / SQS95      nUR                  U/ SQS9nUR                  XAR                  / SQS95      nOUnUnU R                  nU R                  (       aF  UR                  S/S9nUR                  USSS	9nUR                  UUUUS
S9nUR                  UU5      nSSU R                  -  -   nUR!                  UUUS S UUUUSUU R"                  S9$ )Nr    r*   r+   r   r#   )r   r   )
value_intsr!   )startendr   r.   )	num_headsr,   r   rg   )r   get_dim
isinstanceintr   r7   r   r5   r3   Constantrq   ru   Shaper8   Expandr   r
   rw   )r   r:   r;   r<   r=   r>   r?   r   r@   rA   rB   rx   r   query_BSD_embkey_BSD_embrq   onerX   
shape_11S1num_outputss                       r   rewriteMultiHeadAttention.rewrite  s    %%k15	)S)) ??..? / M ++ 00s 1  "%%%M,,s,6C**S+++*LMKLL\L:EJJukkZk&HIE%MKyy##++!+-C!3A3Q!<J99T:.D1t5556$$# ++ % 
 	
r   )r   r   r   rw   ru   rq   )r   ri   r   ri   r   ri   )NNN)rh   zpattern.MatchResult)
__name__
__module____qualname____firstlineno__r   r   r   r   __static_attributes____classcell__)r   s   @r   r
   r
   #   sT    6 	6
 6 !6WF J 
JX>
 >
r   r
   c                F   S VVs/ s H  nU (       a  S/OSS/  H	  nUU US.PM     M!     nnn[         R                  " U Vs/ s HE  n[        R                  " SUS   (       a  SOS US	   (       a  S
OS US   (       a  SOS 340 UD6PMG     sn5      nU$ s  snnf s  snf )N)FTFT)r   r   r   MHAr   _Rotary r   _Pastr   _CrossAttention)r   RewriteRuleSetr
   rule)r   r   r   parameter_combinationsparams	mha_ruless         r   _make_rule_setr   W  s     ' 'I.>E7UDM#Q # 0"4	
 $R	

 '   && 1		
 1 ## &{ 39<$%787bA(./C(D$"MO
  1		
I 1		
s   &BABF)r   T)r   ri   )
__future__r   typingr   r   onnx_irironnxscript.rewriterr   r   r   r   SymbolicDimDimRewriteRuleClassBaser
   r   mha_rules_no_pastmha_rules_with_pastapply_fusion_rules	fuse_mha1	fuse_mha2 r   r   <module>r      s    # "  A A* C q
55 q
h	8 #E: $d;  ,,-@A	,,->?	r   