
     Ti                        S SK Jr  S SKrS SKJr  S SKrS SKJrJ	r	J
r
  S SKJr  \\\R                  4   r " S S\
R                   5      r\
R$                  " \R'                  5       /5      r\R*                  " \5      rg)    )annotationsN)Union)_fusion_utils	_ir_utilspattern)MatchFailureErrorc                  b    \ rS rSr% S\S'   S r          S	S jr          S	S jrSrg)
SDPA   zfloat | None_scalec	                   UR                  U/ SQS9n	UR                  U[        R                  5      n
UR                  U
/ SQS9nUR                  U[        R                  5      nUR                  U/ SQS9n[        R                  " XU/S/ SQS9n[        R                  " UR                  X&5      UR                  X&5      U/S/ S	QS9n[        R                  " UR                  X5      UR                  X5      U/S
/ S	QS9nUR                  X.5      n[        R                  " UR                  X5      UR                  X5      U/S/ S	QS9nUR                  X5      n[        R                  " UU/SSS/S9nUR                  USS9nUR                  U5      nUR                  USU5      n[        R                  " UU/5      nUR                  UU5      nU$ )N)r            )perm)r   r   r   )r   r   r   r   
key_format)BHSdr   BSHd)tag_var
tag_valuesquery_scaling)MulDivNonekey_scaling
qk_scalinghas_maskTF)axisg        )	TransposeReshaper   	ANY_VALUEOrValuer   r   MatMulAddSoftmaxIsNaNWhere)selfopquerykeyvaluemaskquery_scale	key_scaleqk_scalekey_transposed_1key_3dkey_3d_transposedkey_transposed_2key_transposed_3key_transposed
attn_scoremasked_attn_scoreattn_weightis_nanadj_attn_weightattn_outputs                        c/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxscript/rewriter/ort_fusions/sdpa.pyr   SDPA.pattern   s    <<,<? C!2!23LLiL@::&79J9JK <<,<? 1AB /
 u*u*
 $-
 !~1~1
 "-
 YYu5
 __z,z,
 !-

 FF:4__
+ZTSXM

 jj"j5+&((63<oo&DEiiU3    c                N  ^ [         R                  " 5       n0 n	[        R                  " X/ SQ5        US:X  a  [        R                  " X/ SQ5        O)US:X  d
   SU 35       e[        R                  " X/ SQ5        [        R                  " X/ SQ5        SU4S jjn
U
" S	S
5      nU
" SS5      nU
" SS5      nX-  U-  U l        U	S   n[        U[        5      (       d  U$ S[        R                  " U5      -  n[        R                  " U R                  USSS9(       a  S U l        U$ )N)BHSDhr   )rB   rC   SkvrE   r   zUnexpected key format: )rB   rF   rC   rE   )rB   rC   rF   Dvc                   > TR                  U S5      nUS:X  a  gTR                  U5      n[        R                  " U5      nUc  [        U S3U5      eUS:X  a  U$ US:X  d   SU S35       eSU-  $ )Nr         ?z is not a scalar.r   r   zUnexpected z scaling operation)getr   get_singleton_valuer   )tag_name
scale_namescaling_typescaler-   match_bindingss        r>   get_scale_value#SDPA.check.<locals>.get_scale_value   s    )--h?Lv%&**:6!55e<=+zl:K,LeTT5( L'50^K
|K]2^^0;&r@   r   r/   r   r0   r   r1   rE   rI   gh㈵>g:0yE>)rel_tolabs_tol)rL   strrM   rU   returnfloat)
r   MatchResultr   check_shaper   
isinstanceintmathsqrtisclose)r)   contextr+   r,   r-   r.   r   rP   check_resultbindingsrQ   query_scale_valuekey_scale_valueqk_scale_value	head_sizedefault_scaling_factors          `        r>   check
SDPA.checkm   s    **,#% 	!!(3HI%%h5LM'O+B:,)OO'%%h5LM!!(3JK	' ,O]K)-E(zB'9NJ TN	)S))!$tyy';!;<<%;TSWXDKr@   c                n    X#U/nUb  UR                  U5        UR                  " UU R                  USS.6$ )Nzai.onnxruntime._fusion)rO   r   _domain)appendr
   r   )	r)   r*   r+   r,   r-   r.   r   _	sdpa_argss	            r>   rewriteSDPA.rewrite   sC     '	T"ww++!,	
 	
r@   )r   N)
r+   ir.Value | Noner,   rp   r-   rp   r.   rp   r   rU   )	__name__
__module____qualname____firstlineno____annotations__r   rg   rn   __static_attributes__ r@   r>   r
   r
      s~    L\= = 	=
 = = =~
 
 	

 
 
 
r@   r
   )
__future__r   r\   typingr   onnx_irironnxscript.rewriterr   r   r   onnxscript.rewriter._basicsr   r[   SymbolicDimDimRewriteRuleClassBaser
   RewriteRuleSetrule
sdpa_rulesapply_fusion_rules	fuse_sdparw   r@   r>   <module>r      sv    #    A A 9C c
7'' c
N ##		
 ,,Z8	r@   