
    +j                         S SK r S SK Jr  S SKJs  Jr  S SKrS SKJr  S SK	J
r
Jr  S SKJr  S SKrS SKJrJr  SS jrSS jrS	 r " S
 S\R,                  5      r " S S\5      rS\4S jrg)    N)einsum)override)	rearrangerepeat)optimized_attention)ComfyExtensionioc                   ^^^ U R                   u  mnmTT-  mTS-  nTn[        UUU4S jXU45      u  pnU[        R                  :X  a-  [	        SU R                  5       UR                  5       5      U-  n	O[	        SX5      U-  n	A AUbU  [        US5      n[        R                  " U	R                  5      R                  * n
[        USUS9nU	R                  U) U
5        U	R                  SS9n	[	        S	U	R                  UR                  5      U5      nUR                  S
5      R                  TTST5      R!                  S
SSS5      R                  TSTT-  5      nX4$ )N      c                    > U R                  S5      R                  TSTT5      R                  SSSS5      R                  TT-  ST5      R                  5       $ )N   r         )	unsqueezereshapepermute
contiguous)tbdim_headheadss    6/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_sag.py<lambda>*attention_basic_with_sim.<locals>.<lambda>   sK    !++a.	Bx	(	Aq!		UB	)		    zb i d, b j d -> b i jzb ... -> b (...)zb j -> (b h) () j)hr   )dimzb i j, b j d -> b i dr   r   r   r   )shapemaptorchfloat32r   floatr   finfodtypemaxr   masked_fill_softmaxtor   r   r   )qkvr   maskattn_precision_scaler   simmax_neg_valueoutr   r   s      `        @@r   attention_basic_with_simr4      sV   WWNAq(HEA	
 
q	GA! &,aggiCeK,a3e;	112SYY/333d/15$. ++"+
C
(#&&/1
=Ca	E2x	(	Aq!		B(	)	  :r   c                    UR                   u  pEnU R                   u  ptpUR                  USXV5      nUR                  SSS9R                  SSS9U:  n
U
R                   S   n[	        [
        R                  " X-  U-  5      5      nS n[        S[
        R                  " [
        R                  " U5      S-  5      5       H-  nX-   [        SX-
  5      4 H  nX-  S:X  d  M  Un  O   Uc  M-    O   UnX-  nU
R                  X|U5      R                  S5      R                  UR                  5      n
[        R                  " XU	45      n
[        U SUS9nUU
-  U SU
-
  -  -   nU$ )	Nr   r   F)keepdimr   r   	   )kernel_sizesigma)r   r   meansumroundmathsqrtrangefloorr&   r   typer%   Finterpolategaussian_blur_2d)x0attnr9   	thresholdr/   hw1hw2r   lhlwr-   totalxxxijyblurreds                     r   create_blur_maprS   8   sT   **KAC88LA"<<2s(D99Q9&**1e*<yHDJJrNEdiiE)*+A	B1djj5!1A!56753q!%=)AyA~ * > 8 	A
A 	Q1	1	djj	 	 ==Bx(Drq>GnrQX.GNr   c                 T   US-
  S-  n[         R                  " U* X1S9n[         R                  " SXB-  R                  S5      -  5      nXUR	                  5       -  nUR                  U R                  U R                  S9n[         R                  " US S 2S 4   US S S 24   5      nUR                  U R                  S   SUR                  S   UR                  S   5      nUS-  US-  US-  US-  /n[        R                  " XS	S
9n [        R                  " XU R                  S   S9n U $ )Nr         ?)stepsr   r   )devicer%   r   reflect)mode)groups)r!   linspaceexppowr;   r)   rW   r%   mmexpandr   rB   padconv2d)	imgr8   r9   
ksize_halfrM   pdfx_kernelkernel2dpaddings	            r   rD   rD   [   s   /S(J
{JBA
))DAI??1--
.CWWYH{{#**CII{>HxxD)8D!G+<=Hsyy}a1BHNNSTDUVHa!1;!3C[TUEUVG
%%9
-C
((32
7CJr   c                   4    \ rS rSr\S 5       r\S 5       rSrg)SelfAttentionGuidancen   c                 ,   [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSSSS	S
9[         R                  R                  SSSSSSS9/[         R                  R                  5       /SS9$ )Nrj   zSelf-Attention Guidanceexperimentalmodelr0   rU   g       g      @g{Gz?)defaultminr&   step
blur_sigmag       @g        g      $@g?T)ro   rp   r&   rq   advanced)node_iddisplay_namecategoryinputsoutputsis_experimental)r	   SchemaModelInputFloatOutput)clss    r   define_schema#SelfAttentionGuidance.define_schemao   s    yy+2#w'w3TR|SctRU`de ! !
 	
r   c                    ^^^ UR                  5       nS mU4S jnUUU4S jnUR                  USS9  UR                  USSS5        [        R                  " U5      $ )Nc                    > US   nUS   nU R                   S   [        U5      -  nSU;   a3  UR                  S5      n[        XX$US   S9u  pXF-  n
XU-  XS-   -   mU$ [	        XX$US   S9$ )Nn_headscond_or_uncondr   r   r.   )r   r.   )r   lenindexr4   r   )r*   r+   r,   extra_optionsr   r   r   uncond_indexr3   r1   n_slicesattn_scoress              r   attn_and_record6SelfAttentionGuidance.execute.<locals>.attn_and_record   s     "),E*+;<N
c.11AN"-33A65aA[hiy[z{
 9!\"9(STn:UV
*1P]^nPoppr   c                   > TnTnTnSnU S   nU S   nU S   nU S   nU S   n	U S   n
U S   n[        UR                  S	S  5      S
::  a  U$ [        XaX45      nX-   U-
  n[        R                  R                  XW/XU
5      u  nXU-
  U-  -   $ )N      ?rn   uncond_denoisedunconddenoisedr9   model_optionsinputr      )rp   r   rS   comfysamplerscalc_cond_batch)argsuncond_attn	sag_scale	sag_sigmasag_thresholdrn   uncond_predr   
cfg_resultr9   r   rM   degradeddegraded_noisedsagr   rr   r0   s                  r   post_cfg_function8SelfAttentionGuidance.execute.<locals>.post_cfg_function   s    %KI"IMME01K(^Fj)JME 1MWA:##AB'(A-!! '{ZH&l[8O^^33E8_]jkFSC9 <<<r   T)disable_cfg1_optimizationmiddler   )clone#set_model_sampler_post_cfg_functionset_model_attn1_replacer	   
NodeOutput)r   rn   r0   rr   mr   r   r   s     ``   @r   executeSelfAttentionGuidance.execute   sZ    KKM	q"	=0 	
--.?[_-` 	
!!/8QB}}Qr    N)__name__
__module____qualname____firstlineno__classmethodr   r   __static_attributes__r   r   r   rj   rj   n   s(    
 
  6  6 r   rj   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)SagExtension   returnc                    #    [         /$ 7fN)rj   )selfs    r   get_node_listSagExtension.get_node_list   s      "
 	
s   
r   N)r   r   r   r   r   listrA   r	   	ComfyNoder   r   r   r   r   r   r      s)    
T$r||*<%= 
 
r   r   r   c                     #    [        5       $ 7fr   )r   r   r   r   comfy_entrypointr      s     >s   )NN)g      @r   )r!   r   torch.nn.functionalnn
functionalrB   r=   typing_extensionsr   einopsr   r   comfy.ldm.modules.attentionr   comfy.samplersr   comfy_api.latestr   r	   r4   rS   rD   r   rj   r   r   r   r   r   <module>r      s_         & $ ;  /
'R!F&I BLL I X
> 
 r   