
    +j                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ d Z G d dej                  Z G d dej        j                  Z G d	 d
ej                  Z G d de          ZdefdZdS )    N)override)ComfyExtensionioc                     ||z
  }||z
  }|t          j        ||                                          t          j        |          dz  z  |z  z
  }||z  }	||||	z
  z  z   }
|
S )N   )torchmulsumnorm)xnoise_pred_posnoise_pred_negnoise_pred_nocond	neg_scale
cond_scaleposnegperpperp_neg
cfg_results              :/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_perpneg.pyr   r      st    
,
,C
,
,C59S#&&**,,uz#/ABcIIDiH"Zx%@@J    c                   J    e Zd Zed             Zedej        fd            ZdS )PerpNegc                 2   t          j        dddt           j                            d          t           j                            d          t           j                            dddd	d
d          gt           j                                        gdd          S )Nr   z(Perp-Neg (DEPRECATED by Perp-Neg Guider)experimentalmodelempty_conditioningr         ?              Y@{Gz?Tdefaultminmaxstepadvanced)node_iddisplay_namecategoryinputsoutputsis_experimentalis_deprecated)r   SchemaModelInputConditioningFloatOutputclss    r   define_schemazPerpNeg.define_schema   s    yC#w''%%&:;;{CSeRVaeff !! !
 
 
 	
r   returnc                     |                                 }t          j                            |          fd}|                    |           t          j        |          S )Nc           	      L   | d         }| d         }| d         }| d         }| d         }| d         }| d         }t           j                            |j        ||j        d          }t           j                            ||g|||          \  }	|t          ||||	|          z
  }
|
S )	Nr   cond_denoiseduncond_denoisedr   inputsigmamodel_optionsnegative)comfysamplersencode_model_condsextra_condsdevicecalc_cond_batchr   )argsr   r   r   r   r   r?   r@   nocond_processedr   r   r   noconds              r   cfg_functionz%PerpNeg.execute.<locals>.cfg_function.   s    ME!/2N!"34Nl+JWAME 1M$~@@ARTZ\]_`_gistt#(>#A#A%JZI[]^`egt#u#u XaIZ\egqrrrJr   )clonerB   sampler_helpersconvert_condset_model_sampler_cfg_functionr   
NodeOutput)r7   r   r   r   mrK   rJ   s      `  @r   executezPerpNeg.execute)   sl    KKMM&334FGG	 	 	 	 	 	 	
((666}Qr   N__name__
__module____qualname__classmethodr8   r   rP   rR    r   r   r   r      sV        
 
 [
"  bm       [     r   r   c                   &    e Zd Zd Zd Zi dfdZdS )Guider_PerpNegc                 f    t          j        |ddi          }|                     |||d           d S )Nprompt_typerA   )positiveempty_negative_promptrA   )node_helpersconditioning_set_valuesinner_set_conds)selfr]   rA   r^   s       r   	set_condszGuider_PerpNeg.set_condsC   sC     , DEZ]jlv\w x x(Mbpxyyzzzzzr   c                 "    || _         || _        d S N)cfgr   )rb   rf   r   s      r   set_cfgzGuider_PerpNeg.set_cfgG   s    "r   Nc                    | j                             dd           }| j                             dd           }| j                             dd           }|                    dd          dk    r8t          j        | j        d          rd }t          j        | j        d          rd }|||g}t          j                            | j	        ||||          }	|                    dg           D ]"}
||	| j        |||| j	        |d	} |
|          }	#|	\  }}}t          ||||| j        | j                  }|                    d
g           D ]&}
|||| j        | j	        |||||||d} |
|          }'|S )Nr]   rA   r^   disable_cfg1_optimizationFr    r   sampler_pre_cfg_function)conds	conds_outr   timestepr>   r?   r   r@   sampler_post_cfg_function)denoisedconduncondr   r   r=   r<   r?   r@   r>   
empty_condempty_cond_denoised)rk   getmathiscloser   rf   rB   rC   rG   inner_modelr   )rb   r   rm   r@   seedpositive_condnegative_condrr   rk   outfnrH   r   r   noise_pred_emptyr   s                   r   predict_noisezGuider_PerpNeg.predict_noiseK   s    
z488
z488Z^^$;TBB
8%@@EII|DNC00 & $<#.. &!%Jz:n,,T-=uaS`aa  ##$>CC 	 	B!48YaD<L_ln nD"T((CC;>8(8aAQSWSacgckll
  ##$?DD 	" 	"B&%'"h)#1!/!!.('7: :D DJJr   )rT   rU   rV   rc   rg   r~   rX   r   r   rZ   rZ   B   sP        { { {# # # 8: 0 0 0 0 0 0r   rZ   c                   J    e Zd Zed             Zedej        fd            ZdS )PerpNegGuiderc                    t          j        dddt           j                            d          t           j                            d          t           j                            d          t           j                            d          t           j                            dd	d
ddd          t           j                            ddd
ddd          gt           j                                        gd          S )Nr   zPerp-Neg Guiderr   r   r]   rA   r   rf   g       @r    r!   g?r"   )r$   r%   r&   r'   roundr   r   Tr#   )r)   r*   r+   r,   r-   r.   )r   r0   r1   r2   r3   r4   Guiderr5   r6   s    r   r8   zPerpNegGuider.define_schema~   s    y#*#w''%%j11%%j11%%&:;;ucsCW[\\{CSeRVaeff 	  "" !
 
 
 	
r   r9   c                     t          |          }|                    |||           |                    ||           t          j        |          S re   )rZ   rc   rg   r   rP   )r7   r   r]   rA   r   rf   r   guiders           r   rR   zPerpNegGuider.execute   sL    &&8-?@@@sI&&&}V$$$r   NrS   rX   r   r   r   r   }   sX        
 
 [
& %WYWd % % % [% % %r   r   c                   L    e Zd Zedeeej                          fd            ZdS )PerpNegExtensionr9   c                 "   K   t           t          gS re   )r   r   )rb   s    r   get_node_listzPerpNegExtension.get_node_list   s       
 	
r   N)	rT   rU   rV   r   listtyper   	ComfyNoder   rX   r   r   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r   r   r9   c                  "   K   t                      S re   )r   rX   r   r   comfy_entrypointr      s      r   )r   comfy.model_managementrB   comfy.sampler_helperscomfy.samplerscomfy.utilsr_   ru   typing_extensionsr   comfy_api.latestr   r   r   r   r   rC   	CFGGuiderrZ   r   r   r   rX   r   r   <module>r      se                         & & & & & & / / / / / / / /  )  )  )  )  ) bl )  )  ) X9 9 9 9 9U^- 9 9 9v% % % % %BL % % %:
 
 
 
 
~ 
 
 
 0      r   