
    +j                         d dl Z d dl mZ d dlmc mZ d dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlZd dlmZmZ ddZdd
Zd Z G d dej                  Z G d de          ZdefdZdS )    N)einsum)override)	rearrangerepeat)optimized_attention)ComfyExtensionioc                    | j         \  }z  dz  }}t          fd| ||f          \  } }}|t          j        k    r9t	          d|                                 |                                          |z  }	nt	          d| |          |z  }	~ ~|Xt          |d          }t          j        |	j                  j	         }
t          |d|          }|	                    | |
           |	                    d          }	t	          d	|	                    |j                  |          }|                    d
                              d                              d
ddd                              dz            }||	fS )N      c                     |                      d                              d                              dddd                              z  d                                          S )N   r         )	unsqueezereshapepermute
contiguous)tbdim_headheadss    6/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_sag.py<lambda>z*attention_basic_with_sim.<locals>.<lambda>   sX    !++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_simr3      s   WNAq(HEA	 	 	 	 	 	
 
Aq	 GAq! &&,aggiiCCeK,a33e;	1122SY//33d/1555$... ++"+

C
(#&&//1
=
=Ca	E2x	(	(	Aq!			B(	)	)	  :r         @      ?c                    |j         \  }}}| j         \  }}}}	|                    |d||          }|                    dd                              dd          |k    }
|
j         d         }t	          t          j        ||	z  |z                      }d }t          dt          j        t          j        |          dz                      D ].}||z   t          d||z
            fD ]}||z  dk    r|} n| n/|}||z  }|
                    |||          
                    d                              |j                  }
t          j        |
||	f          }
t          | d|          }||
z  | d|
z
  z  z   }|S )	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attnr:   	thresholdr.   hw1hw2r   lhlwr,   totalxxxijyblurreds                     r   create_blur_maprT   8   s   *KAsC8LAq"b<<2sC((D99Q9&&**1e*<<yHDJrNEdibE)**++A	B1dj5!1!1A!56677  q53q!a%==) 	 	AqyA~~  >E  	A
A 	Q1	1	dj		 	 =Bx((Drq>>>GnrQX.GNr   c                 j   |dz
  dz  }t          j        | ||          }t          j        d||z                      d          z            }||                                z  }|                    | j        | j                  }t          j        |d d d f         |d d d f                   }|	                    | j
        d         d|j
        d         |j
        d                   }|dz  |dz  |dz  |dz  g}t          j        | |d	
          } t          j        | || j
        d                   } | S )Nr         ?)stepsr   r   )devicer$   r   reflect)mode)groups)r    linspaceexppowr<   r(   rX   r$   mmexpandr   rC   padconv2d)	imgr9   r:   
ksize_halfrN   pdfx_kernelkernel2dpaddings	            r   rE   rE   [   s'   /S(J
{JkBBBA
)DAI??1---
.
.CSWWYYH{{#*CI{>>HxD)8D!!!G+<==Hsy}a1BHNSTDUVVHa!1;!3C[TUEUVG
%W9
-
-
-C
(32
7
7
7CJr   c                   :    e Zd Zed             Zed             ZdS )SelfAttentionGuidancec                 :   t          j        dddt           j                            d          t           j                            ddddd	
          t           j                            dddddd          gt           j                                        gd          S )Nrk   zSelf-Attention Guidanceexperimentalmodelr/   rV   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_schemaz#SelfAttentionGuidance.define_schemao   s    y+2#w''w3TRR|SctRU`dee !! !
 
 
 	
r   c                     |                                 }d fd}fd}|                    |d           |                    |ddd           t          j        |          S )Nc                 2   |d         }|d         }| j         d         t          |          z  }d|v rL|                    d          }t          | ||||d                   \  }}	||z  }
|	|
|z  |
|dz   z           |S t	          | ||||d                   S )Nn_headscond_or_uncondr   r   r-   )r   r-   )r   lenindexr3   r   )r)   r*   r+   extra_optionsr   r   r   uncond_indexr2   r0   n_slicesattn_scoress              r   attn_and_recordz6SelfAttentionGuidance.execute.<locals>.attn_and_record   s     "),E*+;<N
c.111AN""-33A665aAU[hiy[z{{{
c 19!(\"9(lSTn:U"UV
*1a%P]^nPoppppr   c                 ^   }}}d}| d         }| d         }| d         }| d         }| d         }	| d         }
| d         }t          |j        d	d                    d
k    r|S t          ||||          }||z   |z
  }t          j                            ||g||	|
          \  }|||z
  |z  z   S )Nr5   rn   uncond_denoisedunconddenoisedr:   model_optionsinputr      )rp   r   rT   comfysamplerscalc_cond_batch)argsuncond_attn	sag_scale	sag_sigmasag_thresholdrn   uncond_predr   
cfg_resultr:   r   rN   degradeddegraded_noisedsagr   rr   r/   s                  r   post_cfg_functionz8SelfAttentionGuidance.execute.<locals>.post_cfg_function   s    %KI"IMME01K(^Fj)JME 1MWA:#ABB'((A--!! '{KMZZH&l[8O^33EF8_V[]jkkFSC9 <<<r   T)disable_cfg1_optimizationmiddler   )clone#set_model_sampler_post_cfg_functionset_model_attn1_replacer	   
NodeOutput)r   rn   r/   rr   mr   r   r   s     ``   @r   executezSelfAttentionGuidance.execute   s    KKMM	q 	q 	q 	q 	q"	= 	= 	= 	= 	= 	= 	=0 	
--.?[_-``` 	
!!/8QBBB}Qr   N)__name__
__module____qualname__classmethodr   r    r   r   rk   rk   n   sH        
 
 [
  6  6  [6  6  6 r   rk   c                   L    e Zd Zedeeej                          fd            ZdS )SagExtensionreturnc                    K   t           gS N)rk   )selfs    r   get_node_listzSagExtension.get_node_list   s       "
 	
r   N)	r   r   r   r   listrB   r	   	ComfyNoder   r   r   r   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r   r   r   c                  "   K   t                      S r   )r   r   r   r   comfy_entrypointr      s      >>r   )NN)r4   r5   )r    r   torch.nn.functionalnn
functionalrC   r>   typing_extensionsr   einopsr   r   comfy.ldm.modules.attentionr   comfy.samplersr   comfy_api.latestr   r	   r3   rT   rE   r   rk   r   r   r   r   r   <module>r      sa                    & & & & & & $ $ $ $ $ $ $ $ ; ; ; ; ; ;     / / / / / / / /
' ' ' 'R! ! ! !F  &I  I  I  I  I BL I  I  I X
 
 
 
 
> 
 
 
      r   