
    +j                     v    S SK r S SKJrJr  S SKJr   " S S\R                  5      r " S S\5      rS\4S	 jr	g)
    N)ComfyExtensionio)overridec                       \ rS rSr\S\R                  4S j5       r\S\R                  R                  S\
S\
S\
S\R                  4
S j5       rS	rg
)
NAGuidance   returnc                 l   [         R                  " SSSSS[         R                  R                  SSS9[         R                  R                  S	S
SSSSS9[         R                  R                  SS
SSSSS9[         R                  R                  SSSSSS9/[         R                  R                  SS9/S9$ )Nr   zNormalized Attention GuidancezgApplies Normalized Attention Guidance to models, enabling negative prompts on distilled/schnell models.zadvanced/guidanceTmodelzThe model to apply NAG to.)tooltip	nag_scaleg        g      @g      I@g?zOThe guidance scale factor. Higher values push further from the negative prompt.)mindefaultmaxstepr   	nag_alphag      ?      ?g{Gz?zXBlending factor for the normalized attention. 1.0 is full replacement, 0.0 is no effect.nag_taug      ?g      $@)r   r   r   r   z#The patched model with NAG enabled.)node_iddisplay_namedescriptioncategoryis_experimentalinputsoutputs)r   SchemaModelInputFloatOutput)clss    6/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_nag.pydefine_schemaNAGuidance.define_schema   s    yy 8 B( w0LM{SdQT  _p  q{ScPT  _y  zyc3DtT	 (MN
 	
    r   r   r   r   c                    ^^^ UR                  5       nUUU4S jnUR                  U5        UR                  5         [        R                  " U5      $ )Nc                   > UR                  SS 5      nUc  U $ SU;   a  SU;   d  U $ UR                  SS 5      nUb  U nU S S 2US   US   24   n U R                  S   nU[        U5      -  nUR                  S5      nUR                  S5      nXU-  XhS-   -   n	XU-  XgS-   -   n
U	T-  U
TS-
  -  -
  nSn[        R
                  " U	SSSS	9R                  U5      n[        R
                  " USSSS	9R                  U5      nX-  n[        R                  " U[        R                  " UT5      5      U-  nUU-  nUT-  U	ST-
  -  -   nUb2  UWXg-  XgS-   -  2US   US   24'   UXFU-  XhS-   -  2US   US   24'   U$ UXU-  XhS-   -  & U $ )
Ncond_or_uncond   r   	img_slicer   gư>T)pdimkeepdim)	getshapelenindextorchnorm	clamp_minminimum	full_like)outextra_optionsr(   r*   orig_out
batch_size	half_sizeind_negind_posz_posz_negguidedepsnorm_posnorm_guidedratioscale_factorguided_normalizedz_finalr   r   r   s                      r"   nag_attention_output_patch6NAGuidance.execute.<locals>.nag_attention_output_patch#   s   *../?FN%
'A,?
 &))+t<I$!Yq\)A,6671J"c.&99I$**1-G$**1-GG+I1,EFEG+I1,EFEY&)c/)BBFCzz%1"dCMMcRH**Vqb$GQQRUVK*E ==w0OPSXXL & 5')3esY6OOG$el,YA+-FF	RSU^_`UaHaabelW,YA+-FF	RSU^_`UaHaabEL'	q[(ABJr%   )cloneset_model_attn1_output_patchdisable_model_cfg1_optimizationr   
NodeOutput)r!   r   r   r   r   mrI   s     ```  r"   executeNAGuidance.execute   s@    KKM
/	b 	
&&'AB	))+}}Qr%    N)__name__
__module____qualname____firstlineno__classmethodr   r   r#   r   TypefloatrN   rP   __static_attributes__rR   r%   r"   r   r      sf    
bii 
 
( : BHHMM : e :  : X] : bdbobo :  : r%   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)NagExtensionZ   r	   c                    #    [         /$ 7fN)r   )selfs    r"   get_node_listNagExtension.get_node_list[   s      
 	
s   
rR   N)rS   rT   rU   rV   r   listtyper   	ComfyNodera   rZ   rR   r%   r"   r\   r\   Z   s)    
T$r||*<%= 
 
r%   r\   r	   c                     #    [        5       $ 7fr_   )r\   rR   r%   r"   comfy_entrypointrg   b   s     >s   )
r3   comfy_api.latestr   r   typing_extensionsr   re   r   r\   rg   rR   r%   r"   <module>rj      s9     / &Q  Q h
> 
 r%   