o
    i:                     @   s   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d ZG dd dejZG dd	 d	ejjZG d
d dejZG dd deZdefddZdS )    N)override)ComfyExtensionioc                 C   sR   || }|| }|t || t |d  |  }|| }	||||	   }
|
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_result r   8/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_perpneg.pyr      s   &r   c                   @   ,   e Zd Zedd ZedejfddZdS )PerpNegc                 C   sJ   t jdddt jdt jdt jjdddd	d
ddgt j gdddS )Nr   z&Perp-Neg (DEPRECATED by PerpNegGuider)_for_testing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clsr   r   r   define_schema   s   

zPerpNeg.define_schemareturnc                    s6   |  }tj| fdd}|| t|S )Nc                    s   | d }| d }| d }| d }| d }| d }| d }t j|j||jd}t j||g|||\}	|t||||	 | }
|
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   nocondr   r   cfg_function.   s   z%PerpNeg.execute.<locals>.cfg_function)cloner=   sampler_helpersconvert_condset_model_sampler_cfg_functionr   
NodeOutput)r4   r   r   r   mrG   r   rE   r   execute)   s
   

zPerpNeg.executeN__name__
__module____qualname__classmethodr5   r   rL   rN   r   r   r   r   r      s
    
r   c                   @   s*   e Zd Zdd Zdd Zi dfddZdS )Guider_PerpNegc                 C   s&   t |ddi}| |||d d S )Nprompt_typer<   )positiveempty_negative_promptr<   )node_helpersconditioning_set_valuesinner_set_conds)selfrV   r<   rW   r   r   r   	set_condsC   s   zGuider_PerpNeg.set_condsc                 C   s   || _ || _d S N)cfgr   )r[   r^   r   r   r   r   set_cfgG   s   
zGuider_PerpNeg.set_cfgNc                 C   s  | j dd }| j dd }| j dd }|dddkr/t| jdr/d }t| jdr/d }|||g}tj| j	||||}	|dg D ]}
||	| j|||| j	|d	}|
|}	qE|	\}}}t
||||| j| j}|d
g D ]}
|||| j| j	|||||||d}|
|}qo|S )NrV   r<   rW   disable_cfg1_optimizationFr   r   sampler_pre_cfg_function)conds	conds_outr   timestepr9   r:   r   r;   sampler_post_cfg_function)denoisedconduncondr   r   r8   r7   r:   r;   r9   
empty_condempty_cond_denoised)rb   getmathiscloser   r^   r=   r>   rB   inner_modelr   )r[   r
   rd   r;   seedpositive_condnegative_condri   rb   outfnrC   r   r   noise_pred_emptyr   r   r   r   predict_noiseK   sB   





zGuider_PerpNeg.predict_noise)rP   rQ   rR   r\   r_   ru   r   r   r   r   rT   B   s    rT   c                   @   r   )PerpNegGuiderc                 C   sp   t jddt jdt jdt jdt jdt jjddd	d
dddt jjddd	d
dddgt j gddS )Nrv   r   r   rV   r<   r   r^   g       @r   r   g?r   )r!   r"   r#   r$   roundr   r   Tr    )r&   r(   r)   r*   r+   )r   r-   r.   r/   r0   r1   Guiderr2   r3   r   r   r   r5   ~   s   



	zPerpNegGuider.define_schemar6   c                 C   s,   t |}|||| ||| t|S r]   )rT   r\   r_   r   rL   )r4   r   rV   r<   r   r^   r   guiderr   r   r   rN      s   
zPerpNegGuider.executeNrO   r   r   r   r   rv   }   s
    
rv   c                   @   s(   e Zd Zedeeej  fddZdS )PerpNegExtensionr6   c                    s
   t tgS r]   )r   rv   )r[   r   r   r   get_node_list   s   zPerpNegExtension.get_node_listN)	rP   rQ   rR   r   listtyper   	ComfyNoder{   r   r   r   r   rz      s    rz   r6   c                      s   t  S r]   )rz   r   r   r   r   comfy_entrypoint   s   r   )r   comfy.model_managementr=   comfy.sampler_helperscomfy.samplerscomfy.utilsrX   rl   typing_extensionsr   comfy_api.latestr   r   r   r~   r   r>   	CFGGuiderrT   rv   rz   r   r   r   r   r   <module>   s    
,;	