
    +j                     x    d dl Z d dlmZmZ d dlmZ  G d dej                  Z G d de          Zdefd	Z	dS )
    N)ComfyExtensionio)overridec                   ~    e Zd Zedej        fd            Zedej        j        de	de	de	dej
        f
d            ZdS )	
NAGuidancereturnc                    t          j        dddddt           j                            dd          t           j                            d	d
dddd          t           j                            dd
dddd          t           j                            ddddd          gt           j                            d          g          S )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_schemazNAGuidance.define_schema   s    y 8 B( w0LMM{SdQT  _p  q  q{ScPT  _y  z  zyc3DtTT	 (MNN
 
 
 	
    r
   r   r   r   c                     |                                 }fd}|                    |           |                                 t          j        |          S )Nc                    |                     dd           }|| S d|v rd|v s| S |                     dd           }|| }| d d |d         |d         f         } | j        d         }|t          |          z  }|                    d          }|                    d          }| ||z  ||dz   z           }	| ||z  ||dz   z           }
|	z  |
dz
  z  z
  }d}t	          j        |	ddd	                              |          }t	          j        |ddd	                              |          }||z  }t	          j        |t	          j        |                    |z  }||z  }|z  |	dz
  z  z   }|B||||z  ||dz   z  |d         |d         f<   ||||z  ||dz   z  |d         |d         f<   |S || ||z  ||dz   z  <   | S )
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_patchz6NAGuidance.execute.<locals>.nag_attention_output_patch#   sJ   *../?FFN%
''A,?,?
 &))+t<<I$!!!Yq\)A,6671J"c.&9&99I$**1--G$**1--G	G+I1,EEFE	G+I1,EEFEY&)c/)BBFCz%1"dCCCMMcRRH*Vqb$GGGQQRUVVK(*E =w0O0OPPSXXL & 5')3esY6OOG$elW,Y'A+-FF	RSU^_`UaHaabelW,Y'A+-FF	RSU^_`UaHaabELI'	Wq[(AABJr#   )cloneset_model_attn1_output_patchdisable_model_cfg1_optimizationr   
NodeOutput)r    r
   r   r   r   mrG   s     ```  r!   executezNAGuidance.execute   so    KKMM
/	 /	 /	 /	 /	 /	 /	b 	
&&'ABBB	))+++}Qr#   N)__name__
__module____qualname__classmethodr   r   r"   r   TypefloatrK   rM    r#   r!   r   r      s        
bi 
 
 
 [
( : BHM : e :  : X] : bdbo :  :  :  [:  :  : r#   r   c                   L    e Zd Zedeeej                          fd            ZdS )NagExtensionr   c                    K   t           gS N)r   )selfs    r!   get_node_listzNagExtension.get_node_list[   s       
 	
r#   N)	rN   rO   rP   r   listtyper   	ComfyNoderZ   rT   r#   r!   rV   rV   Z   sE        
T$r|*<%= 
 
 
 X
 
 
r#   rV   r   c                  "   K   t                      S rX   )rV   rT   r#   r!   comfy_entrypointr_   b   s      >>r#   )
r1   comfy_api.latestr   r   typing_extensionsr   r]   r   rV   r_   rT   r#   r!   <module>rb      s     / / / / / / / / & & & & & &Q  Q  Q  Q  Q  Q  Q  Q h
 
 
 
 
> 
 
 
      r#   