o
    i                     @   s`   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Z	d
e	fddZ
dS )    N)override)ComfyExtensionioc                 C   s@   t jjj|g dd}| | jg ddd| }| | }||fS )N)dimT)r	   keepdim)torchnn
functional	normalizesum)v0v1v0_parallelv0_orthogonal r   4/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_apg.pyproject   s   r   c                   @   s4   e Zd ZedejfddZedejfddZdS )APGreturnc                 C   sn   t jdddt jdt jjddddd	d
ddt jjddddddddt jjddddd	dddgt j gdS )Nr   zAdaptive Projected Guidancezsampling/custom_samplingmodeletag      ?g      $g      $@g{Gz?z[Controls the scale of the parallel guidance vector. Default CFG behavior at a setting of 1.T)defaultminmaxsteptooltipadvancednorm_thresholdg      @g        g      I@g?zQNormalize guidance vector to this value, normalization disable at a setting of 0.momentumg      zTControls a running average of guidance during diffusion, disabled at a setting of 0.)node_iddisplay_namecategoryinputsoutputs)r   SchemaModelInputFloatOutput)clsr   r   r   define_schema   sF   
		
zAPG.define_schemac                    s8   dd  fdd}|  }|| t|S )Nr   c                    s  t | d dkr| d S | d d }| d d }| d d }| d }d ur,|kr,d||| }dkrFts>|n | }dkrc|jdg ddd	}tt|| }|| }t||\}}	|	 |  }
||
 || |  }||g| d dd   S )
N	conds_out   r   sigma
cond_scale   r   T)pr	   r
   )lenr   	is_tensornormminimum	ones_liker   )argsconduncondr1   r2   guidanceguidance_normscaleguidance_parallelguidance_orthogonalmodified_guidancemodified_condr   r"   r!   
prev_sigmarunning_avgr   r   pre_cfg_function:   s4   
z%APG.execute.<locals>.pre_cfg_function)clone"set_model_sampler_pre_cfg_functionr   
NodeOutput)r-   r   r   r!   r"   rG   mr   rD   r   execute5   s   '

zAPG.executeN)	__name__
__module____qualname__classmethodr   r(   r.   rJ   rL   r   r   r   r   r      s
    &r   c                   @   s(   e Zd Zedeeej  fddZdS )ApgExtensionr   c                    s   t gS N)r   )selfr   r   r   get_node_listg   s   zApgExtension.get_node_listN)	rM   rN   rO   r   listtyper   	ComfyNoderT   r   r   r   r   rQ   f   s    rQ   r   c                      s   t  S rR   )rQ   r   r   r   r   comfy_entrypointm   s   rX   )r   typing_extensionsr   comfy_api.latestr   r   r   rW   r   rQ   rX   r   r   r   r   <module>   s    Y