o
    i                     @  s  d dl mZ ddlmZ ddlmZ d dlmZm	Z	m
Z
 er0d dlmZ d dlmZ d dlmZ d d	lZd d
lm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Zd d	lZd d	lZd d	lZd d	lZdd Z dd Z!dd Z"dd Z#dd Z$d~ddZ%dd#d$Z&dd%d&Z'dd'd(Z(d)d* Z)i d	d	fd+d,Z*i d	fd-d.Z+G d/d0 d0Z,d1d2 Z-d3d4 Z.dd6d7Z/dd9d:Z0dd<d=Z1ddDdEZ2dFdG Z3dHdI Z4dJdK Z5dLdM Z6dNdO Z7dPdQ Z8dRdS Z9dTdU Z:G dVdW dWZ;g dXZ<G dYdZ dZe;Z=i i fd[d\Z>dd]d^Z?dd`daZ@ddbdcZAddddeZBdddfdgZCG dhdi diZDi d	d	d	d5d	fdjdkZEe<g dl ZFG dmdn dne
ZGeGe-eGee/dodpeGejHd5dqeGejId5dqeGe.eGe0eGe/eGe1eGe2d5dqdr	ZJeKeJZLddxdyZMdzd{ ZNG d|d} d}ZOd	S )    )annotations   )sampling)uni_pc)TYPE_CHECKINGCallable
NamedTuple)ModelPatcher)	BaseModel)ControlBaseN)partialc                 C  sX   t | d |k r*dg| d t | d   dg | t | d d   } t | d |k s| S )N   l        r   )len)areanum_dims r   ,/mnt/c/Users/fbmor/ComfyUI/comfy/samplers.pyadd_area_dims   s   4r   c              	   C  s  t |jdd  }d }d}d| v r| d }|d |krd S d| v r-| d }|d |k r-d S d| v rbt| d }t|t|}t|d t|krb|d t| |t|d t|d t|   }d| v rj| d }|}|d urtt|D ])}	t|j|	d  |t||	   ||	 ||	< ||	d |t||	  ||	 }qvd| v rd}
d	| v r| d	 }
| d }|d |jd  }|d urtt|D ]}	||	d
 |t||	  ||	 }q||
 }|d
	|jd |jd  |jd
 fd|j
d
   }nt|}|| }d| vr|d urd}tt|D ]j}	t||jd|	  d }|t||	  dkrIt|D ]}||	d |d
}|d| |d
  9 }q2||	 |t||	   |j|	d  k r~t|D ]}||	d ||	 d
 | d
}|d| |d
  9 }qaqi }| d }|D ]}|| j|jd |d||< q| dd }| dd }d }d| v r| d }i }|d }|d
 }|dkr|j|j|d |j}n	|j|j|j}|g|d< tdg d}|||||||| d |S )Nr         ?timestep_startr   timestep_endr   strengthmaskmask_strengthr   )r         model_conds)
batch_sizer   hookscontrolgligenpositionmiddle_patchcond_obj)input_xmultconditioningr   r   patchesuuidr   r(   )tupleshapelistr   r   rangeminnarrow	unsqueezerepeatndimtorch	ones_likeprocess_condgetmodelset_positiondevice	set_emptycollections
namedtuple)condsx_intimestep_indimsr   r   r   r   r$   ir   r   r%   fuzzrrtmr&   r   cr   r   r'   r    gligen_typegligen_modelgligen_patchr#   r   r   r   get_area_and_mult   s   4,$$:
( 


rI   c                 C  sF   | |u rdS |   |  krdS | D ]}| | || s  dS qdS )NTF)keys
can_concat)c1c2kr   r   r   cond_equal_sizer   s   rO   c                 C  sN   | j j|j jkr
dS dd }|| j|jsdS || j|js dS t| j|jS )NFc                 S  s,   | d u |d u kr
dS | d ur| |urdS dS )NFTr   )obj1obj2r   r   r   objects_concatable   s   z+can_concat_cond.<locals>.objects_concatable)r$   r*   r   r'   rO   r&   )rL   rM   rR   r   r   r   can_concat_cond|   s   rS   c                 C  sn   i }| D ]}|D ]}| |g }|||  |||< qqi }|D ]}|| }|d |dd  ||< q!|S )Nr   r   )r5   appendconcat)c_listtempxrN   curoutr<   r   r   r   cond_cat   s   
r[   r6   'BaseModel'hooked_to_run4dict[comfy.hooks.HookGroup, list[tuple[tuple, int]]]default_condslist[list[dict]]c              	   C  s~  g }|D ]
}| t| q| D ]J\}}	|	D ]C\}
}t|| dkr&q|
j}|d urS|| }t|d }t|D ]}||d |||  || }q;||
j8 }q||  |
j8  < qqt	|D ]Z\}}t|| dkroqbtj
jj|dd t|dkrqb|| }|D ]5}t|||}|d u rq|j|d}|jd ur| j||j| ||jt  ||j  ||fg7  < qqbd S )Nr   r   T)inplace        )r%   )rT   r2   r3   itemsr   r   r,   r.   r%   	enumeratenn
functionalrelumaxrI   _replacer   current_patcher%prepare_hook_patches_current_keyframe
setdefaultr+   )r6   r]   r_   r=   timestepmodel_optionsdefault_mults_
lora_hooksto_runr#   r@   r   curr_default_multr?   r%   condrX   pr   r   r   finalize_default_conds   sD    
rv   r
   r<   r=   torch.Tensorrn   	dict[str]c                 C  sJ   | dd }|d u s|| ||||st| ||||S |t| ||||S )Ncontext_handler)r5   should_use_context_calc_cond_batch_outerexecute)r6   r<   r=   rm   rn   handlerr   r   r   calc_cond_batch   s   r~   c                 C  s6   t jjtt jjt jjj|dd}|| ||||S NTis_model_options)	comfypatcher_extensionWrapperExecutornew_executor_calc_cond_batchget_all_wrappers
WrappersMPCALC_COND_BATCHr|   )r6   r<   r=   rm   rn   executorr   r   r   r{      s
   r{   c           .   	   C  s,  g }g }i }g }d}	t t|D ]a}
|t| |t|d  ||
 }g }|d url|D ];}d|v r>|| d}	q0t|||}|d u rIq0|jd urW| j	||j| |
|jt  ||j  ||
fg7  < q0|| q|	r}t| ||||| | j| | D ]\}}t|dkr|d }|d d j}g }t t|D ]}t|| d |d r||g7 }q|  |d d }| j|j}t dt|d D ]]}
|d t||
  }t||d  gt|dd   }tt}|D ](}dd || d j D }|| d j D ]\}}|| |  qq| j||d	d
 |k r0|} nqg }g }g }g }g } g }!d }"d }#|D ]7}||}$|$d }||j ||j ||j |!|j ||$d  | |j |j}"|j}#qCt|}%t |}t!|}t |g|% }&| jj"|d}'d|v rt#j$j%|'|d dd}'|#d urt#j$%|'&di |#|'d< |d d  |'d< | d d  |'d< ||'d< |'|d< |"d ur|"'||&|t||'|d< d|v r|d | j(||&||d)|%}(n| j(||&fi |)|%}(t |%D ]n}$||$ })|!|$ }*|*d u r3||)  |(|$ ||$  7  < ||)  ||$ 7  < q
||) }+||) },t|*d }-t |-D ]!}
|+*|
d |*|
|-  |*|
 }+|,*|
d |*|
|-  |*|
 },qE|+|(|$ ||$  7 }+|,||$ 7 },q
t|dksqt t|D ]}
||
  ||
   < q|S )NFgBA8defaultTr   r   c                 S  s   i | ]	\}}||  qS r   )size).0rN   vr   r   r   
<dictcomp>      z$_calc_cond_batch.<locals>.<dictcomp>)cond_shapesg      ?)r   transformer_options)
copy_dict1r'   cond_or_unconduuidssigmasr   model_function_wrapper)inputrm   rE   r   r   )+r,   r   rT   r2   
zeros_liker3   rI   r   rj   rk   rl   r+   rv   prepare_staterc   r*   rS   reverseget_free_memoryr8   r:   defaultdictr&   r   memory_requiredpopr$   r%   r   r(   r   r'   catr[   apply_hooksr   r   merge_nested_dictsr5   get_controlapply_modelchunkr.   ).r6   r<   r=   rm   rn   	out_conds
out_countsr]   r_   has_default_condsr@   rt   	default_crX   ru   r   rr   firstfirst_shapeto_batch_tempto_batchfree_memorybatch_amountinput_shaper   ttrN   r   r$   r%   rE   r   r   r   r   r'   obatch_chunks	timestep_r   output
cond_indexaout_cout_ctsr?   r   r   r   r      s   


"








"
"\r   c                 C  s"   t d tt| ||g|||S )NzuWARNING: The comfy.samplers.calc_cond_uncond_batch function is deprecated please use the calc_cond_batch one instead.)loggingwarningr)   r~   )r6   rt   uncondr=   rm   rn   r   r   r   calc_cond_uncond_batch\  s   
r   c	                 C  s   d|v r || || ||||||| |||d}	||d |	 }
n||| |  }
| dg D ]}|
|||| |||||d
}	||	}
q.|
S )Nsampler_cfg_function)rt   r   
cond_scalerm   r   sigmacond_denoiseduncond_denoisedr6   rn   
input_condinput_uncondsampler_post_cfg_function)
denoisedrt   r   r   r6   r   r   r   rn   r   r5   )r6   	cond_preduncond_predr   rX   rm   rn   rt   r   args
cfg_resultfnr   r   r   cfg_function`  s   
r   c                 C  s   t |dr|dddkrd }n|}||g}	d|v r*|	||| |d}
|d |
}nt| |	|||}|dg D ]}|	|||||| |d}
||
}q8t| |d |d	 ||||||d
	S )Nr   disable_cfg1_optimizationF sampler_calc_cond_batch_function)r<   r   r   r6   rn   sampler_pre_cfg_function)r<   	conds_outr   rm   r   r   r6   rn   r   r   )rn   rt   r   )mathiscloser5   r~   r   )r6   rX   rm   r   rt   r   rn   seeduncond_r<   r   rZ   r   r   r   r   sampling_functionq  s   
"r   c                   @  s"   e Zd Zdd Zi dfddZdS )KSamplerX0Inpaintc                 C  s   || _ || _d S N)inner_modelr   )selfr6   r   r   r   r   __init__  s   
zKSamplerX0Inpaint.__init__Nc                 C  s   |d ur-d|v r|d ||| j | jdd}d| }|| | j j j||| j| jd|  }| j ||||d}|d urC|| | j|  }|S )Ndenoise_mask_function)r6   r   )extra_optionsr   )rX   r   noiselatent_imagern   r   )r   r   scale_latent_inpaintr   r   )r   rX   r   denoise_maskrn   r   latent_maskrZ   r   r   r   __call__  s   &zKSamplerX0Inpaint.__call__)__name__
__module____qualname__r   r   r   r   r   r   r     s    r   c                 C  sZ   | }g }t |j| }t|D ]}|t|jdt||    g7 }q|dg7 }t|S )Nr   rb   )r   r   r,   floatintr2   FloatTensor)model_samplingstepsssigsssrX   r   r   r   simple_scheduler  s   $

r   c                 C  s   | }g }d}t jt|j| dddr|d7 }g }ndg}tt|j| d}|t|jk rC|t|j| g7 }||7 }|t|jk s.|d d d }t|S )Nr   r   h㈵>abs_tolrb   )r   r   r   r   rh   r   r2   r   )r   r   r   r   rX   r   r   r   r   ddim_scheduler  s   
r   Fc                 C  s   | }| |j}| |j}d}|r t|||d d d }ntjt||dddr3|d7 }d}t|||}g }	t	t
|D ]}
||
 }|	t|| qB|rZ|	dg7 }	t|	S )	NTr   r   r   r   r   Frb   )rm   	sigma_max	sigma_minr2   linspacer   r   r   r   r,   r   rT   r   )r   r   sgmfloorr   startendappend_zero	timestepsr   rX   tsr   r   r   normal_scheduler  s"   

r   333333?c           	      C  s   t | jd }dtjdd|dd }ttjj|||| }g }d}|D ]}||kr8|t	| jt
| g7 }|}q&|dg7 }t|S )Nr   r   F)endpointr   rb   )r   r   numpyr   rintscipystatsbetappfr   r   r2   r   )	r   r   alphar  total_timestepsr   r   last_trC   r   r   r   beta_scheduler  s   

r  皙?c           	        s   |dkr	ddg}nTd u r|d fddt D }|  }| }||d    d| |d   d    fddt |D }|| dg }dd |D }t|| j  S )	Nr   r   rb   r   c                   s   g | ]}|   qS r   r   r   r@   )linear_stepsthreshold_noiser   r   
<listcomp>  s    z-linear_quadratic_schedule.<locals>.<listcomp>c                   s$   g | ]}|d   |    qS )r   r   r  )constlinear_coefquadratic_coefr   r   r    s    c                 S  s   g | ]}d | qS )r   r   )r   rX   r   r   r   r    s    )r,   r2   r   r   cpu)	r   r   r  r  sigma_schedulelinear_sigma_schedulethreshold_noise_step_diffquadratic_stepsquadratic_sigma_scheduler   )r  r  r  r  r  r   linear_quadratic_schedule  s    
r  nr   r   r   r   returnc                 C  sX   t j| t jd| d }|| d }|t| d| t|   |d d< |S )N)dtyper   r   )r2   aranger   div_	new_zerosr   atantan_)r  r   r   adj_idxsr   r   r   r   kl_optimal_scheduler  s   ,r%  c                 C  s   |   dkrtjd| jtjdS | jd }tj|df| jtjd}tj|| jtjd}t|D ]F}| | }|  dkr<q/t|dkdkrJd||< q/t	|\}}t
|||df< t
|||df< t|||df< t|||d	f< q/||fS )
Nr   )r   r   r8   r  r   FTr   r      )numelr2   zerosr8   r   r*   boolr,   rh   wherer-   )masksbbounding_boxesis_emptyr@   r   yrX   r   r   r   get_mask_aabb  s$   
r1  c              	   C  sN  t t| D ]}| | }d|v rh|d }|d dkrh| }|dd  }t|d }d}t t|D ]}	|tdt||	 ||	  f7 }q3t t|D ]}	|t||	|  ||	  f7 }qL||d< |}|| |< d|v r$|d }
|
j|d}
| }t|
jt|kr|
d}
|
jdd  |kr|
jd	k rt	j
|
d|d
 |d ddd}
nt	j
|
|d
 |d dd}
|ddrtjt|
ddjd}t|\}}|d rd|d< n>|d }|d |d  d |d |d  d |d |d f\}}}}td|}td|}t|t|t|t|f}||d< |
|d< || |< qd S )Nr   r   
percentager   r   r   r   r8   r   r   bilinearnoneset_area_to_boundsF)dim)r   r   r   r   r'  r   )r,   r   copyrh   roundtor*   r/   r1   r   utilscommon_upscalesqueezer5   r2   absvaluesr1  r   )
conditionsr?   r8   r@   rE   r   modifiedr   a_lendr   boundsboxesr/  boxHWYXr   r   r   %resolve_areas_and_cond_masks_multidim	  sR   " 


*
<

rL  c                 C  s   t d t| ||g|S )NzWARNING: The comfy.samplers.resolve_areas_and_cond_masks function is deprecated please use the resolve_areas_and_cond_masks_multidim one instead.)r   r   rL  )rA  hwr8   r   r   r   resolve_areas_and_cond_masks;  s   
rO  c                 C  s   d|vrd S dd }|d }d }| D ]D}d|v rP|d }|||rO|d u r(|}qd|vr/|}qt |d d t|d d  t |d t|d  krO|}q|d u rV|}q|d u r]d S d|v ri|d |krid S | }|d  |d< | |g7 } d S )Nr   c                 S  s   t | t|d } t |t| d }t| d }t|d }tt||D ]}| ||  |||  k r6 dS q%tt||D ]}| | | ||   || |||   krW dS q>dS )Nr   FT)r   r   r,   r-   )r   area_cmpa_l
area_cmp_lr@   r   r   r   area_insideC  s   (z7create_cond_with_same_area_if_none.<locals>.area_insider   r   )r   prodr   r9  )r<   rE   rS  c_areasmallestrX   r   rZ   r   r   r   "create_cond_with_same_area_if_none?  s6   
<rW  c              	   C  s   | j }tt|D ]a}|| }d }d }d|v r4|t|d |dd}|t|d |dd}nd|v r?||d }d|v rJ||d }|d usR|d urj| }|d ur^||d< |d urf||d< |||< q	d S )	Nclip_start_percentstart_percentrb   clip_end_percentend_percentr   r   r   )r   r,   r   percent_to_sigmarh   r5   r-   r9  )r6   r<   r   rC   rX   r   r   r  r   r   r   calculate_start_end_timestepsk  s*   r]  c                   sH   | j  tt|D ]}|| } fdd}d|v r!|d | | q	d S )Nc                   s
     | S r   )r\  r   r   r   r   <lambda>  s   
 z!pre_run_control.<locals>.<lambda>r   )r   r,   r   pre_run)r6   r<   rC   rX   percent_to_timestep_functionr   r_  r   pre_run_control  s   rc  c                 C  sN  g }g }g }g }t t| D ]#}| | }	d|	vr1||	v r*|	| d ur*||	|  q||	|f qt t|D ]#}|| }	d|	vr[||	v rT|	| d urT||	|  q8||	|f q8t|dkrdd S t t|D ]:}	||	t|  }
|
d }||v r|| d ur| }|||	||< ||g7 }qj| }|||	||< |||
d < qjd S )Nr   r   r   )r,   r   rT   r9  )r<   r   nameuncond_fill_func
cond_cnets
cond_otheruncond_cnetsuncond_otherrC   rX   rW   r   r  r   r   r   apply_empty_x_to_equal_area  s>   rj  c                 K  s   t t|D ]r}|| }| }||d< ||d< d }	t|jdkr(|jd d }	|d|	|d< |d|jd d |d< |d	||d	< |D ]}
|
|vrS||
 ||
< qG| di |}| }|d
  }|D ]}
||
 ||
< qg||d
< |||< q|S )Nr8   r   r   r'  r   widthheightr   prompt_typer   r   )r,   r   r9  r*   r5   )model_functionr<   r   r8   rm  kwargsrC   rX   paramsdefault_widthrN   rZ   r   r   r   r   encode_model_conds  s.   
rr  c                   @  s   e Zd Zdd Zdd ZdS )Samplerc                 C  s   d S r   r   )r   r   r   r   sample  s   zSampler.samplec                 C  s2   t |jjj}t |d }tj||ddp||kS )Nr   r   )rel_tol)r   r   r   r   r   r   )r   
model_wrapr   	max_sigmar   r   r   r   max_denoise  s   zSampler.max_denoiseN)r   r   r   rt  rx  r   r   r   r   rs    s    rs  ))eulereuler_cfg_ppeuler_ancestraleuler_ancestral_cfg_ppheunheunpp2exp_heun_2_x0exp_heun_2_x0_sdedpm_2dpm_2_ancestrallmsdpm_fastdpm_adaptivedpmpp_2s_ancestraldpmpp_2s_ancestral_cfg_pp	dpmpp_sdedpmpp_sde_gpudpmpp_2mdpmpp_2m_cfg_ppdpmpp_2m_sdedpmpp_2m_sde_gpudpmpp_2m_sde_heundpmpp_2m_sde_heun_gpudpmpp_3m_sdedpmpp_3m_sde_gpuddpmlcmipndmipndm_vdeisres_multistepres_multistep_cfg_ppres_multistep_ancestralres_multistep_ancestral_cfg_ppgradient_estimationgradient_estimation_cfg_pper_sdeseeds_2seeds_3	sa_solversa_solver_pecec                   @  s$   e Zd Zi i fddZdddZdS )KSAMPLERc                 C  s   || _ || _|| _d S r   )sampler_functionr   inpaint_options)r   r  r   r  r   r   r   r     s   
zKSAMPLER.__init__NFc	              	     s   ||d< t ||}	||	_| jddr1t|ddd }
tj|j|
dd|j	|j
|	_n||	_|jj|d	 ||| ||}d }t|d  d urW fd
d}| j|	||f|||d| j}|jj|d |}|S )Nr   randomFr   )   r   r  )	generatorr8   r   c                   s    | d | d | d S )Nr@   r   rX   r   )rX   callbacktotal_stepsr   r   r`    r   z!KSAMPLER.sample.<locals>.<lambda>
extra_argsr  disabler   )r   r   r  r5   r2   manual_seedrandnr*   r;  r  r8   r   r   r   noise_scalingrx  r   r  r   inverse_noise_scaling)r   rv  r   r  r  r   r   r   disable_pbarmodel_kr  
k_callbacksamplesr   r  r   rt    s   
&  zKSAMPLER.sample)NNF)r   r   r   r   rt  r   r   r   r   r    s    r  c                 C  sH   | dkrdd }|}n| dkrdd }|}nt td| }t|||S )Nr  c              
   S  sR   t |dkr|S |d }|dkr|d }t |d }tj| |||d ||||dS Nr   r   r   r4  r  )r   k_diffusion_samplingsample_dpm_fast)r6   r   r   r  r  r  r   r  r   r   r   dpm_fast_function  s   z#ksampler.<locals>.dpm_fast_functionr  c                 [  sL   t |dkr|S |d }|dkr|d }tj| |||d f|||d|S r  )r   r  sample_dpm_adaptive)r6   r   r   r  r  r  r   r   r   r   r   dpm_adaptive_function  s   $z'ksampler.<locals>.dpm_adaptive_functionz	sample_{})getattrr  formatr  )sampler_namer   r  r  r  r  r   r   r   ksampler  s   	r  c                 C  sr  |D ]}|| d d  ||< t || |jdd  | q|D ]	}t| ||  qt| drD|D ]}t| j|| |||||||d	||< q/|D ]}|| D ]}	|D ]}
||
kr]t||
 |	 qPqLqF|D ]}|| D ]}	d|	v r{|	d jD ]}||  qsqhqb|D ]	}t	| ||  qd|v r|d }|D ]#}|dkrt
ttdd ||| dd	d  t
||| d
dd  q|S )Nr   extra_conds)r   r   r   latent_shapesr   positivec                 S  s   |  dddkS )Ncontrol_apply_to_uncondFTr   )rE   r   r   r   r`  0  s    zprocess_conds.<locals>.<lambda>r   c                 S     | | S r   r   rf  rX   r   r   r   r`  0      r    c                 S  r  r   r   r  r   r   r   r`  1  r  )rL  r*   r]  hasattrrr  r  rW  r   initialize_timestepsrc  rj  r+   filter)r6   r   r<   r8   r   r   r   r  rN   rE   kkhookr  r   r   r   process_conds  sB   
&$r  dict[str, list[dict[str]]]c                 C  s   i }| D ].}| | D ]'}d|v r1|d }|  }t|dkr1|dd }|||fg }|| q
qt|dkr;d S | D ]%\}}	|d }|d }tjj	|  |g }|d urd|	D ]}
||
d< q]q?d S )Nr   r   r   r   )
get_extra_hooksr   r5   rl   rT   rc   r   r   	HookGroupcombine_all_hooks)r<   hook_replacementrN   r  r   extra_hooksr   
to_replacekeyconds_to_modifyrt   r   r   r   preprocess_conds_hooks6  s.   
	
r  c           
      C  s   | dd}|du r| D ]}| | D ]}|dd qqdS i }| D ]#}| | D ]}| dd}|durD||sD||g }|| q(q"| D ]\}}||}	t|	dkr[d}	|D ]}|	|d< q]qJdS )zModify 'hooks' on conds so that only hooks that were registered remain. Properly accounts for
    HookGroups that have the same reference.registered_hooksNr   r   )r5   r   is_subset_ofrl   rT   rc   new_with_common_hooksr   )
r<   rn   
registeredrN   r  r  r   r  r  	new_hooksr   r   r    filter_registered_hooks_on_condsQ  s2   



r  c                 C  s8   t  }| D ]}| | D ]}||dd  qqt|S )Nr   )setaddr5   r   )r<   	hooks_setrN   r  r   r   r   get_total_hook_groups_in_condsm  s   r  c                 C  s  | du rdS |  dd}|du rdS g }|dur|| |dur&|| t|dkr.dS d|v r]|d }|D ]$}|| }tt|D ]}t|| dr[|D ]}	|| |	||< qOqDq8d|v r|d }|D ] }|| }|D ]}
t||
 dr|D ]}	||
 |	||
< qzqoqgddg}|D ]6}||v r|| }| D ]'}| D ] }tt|D ]}t|| dr|D ]}	|| |	||< qqqqqdS )	z[
    If any patches from hooks, wrappers, or callbacks have .to to be called, call it.
    Nto_load_optionsr   r'   r;  patches_replacewrappers	callbacks)r5   rT   r   r,   r  r;  r@  )rn   r8   r  r  castsr'   rd  
patch_listr@   castrN   wrappers_and_callbackswc_namewcwc_dictwc_listr   r   r   cast_to_load_optionsu  s^   

r  c                   @  sp   e Zd ZdddZdd Zdd Zd	d
 Zdd Zi dfddZi dfddZ	dddZ
dddZdddZdS )	CFGGuidermodel_patcherr	   c                 C  s   || _ |j| _i | _d| _d S )Nr   )r  rn   original_condscfg)r   r  r   r   r   r     s   
zCFGGuider.__init__c                 C  s   |  ||d d S )N)r  negative)inner_set_conds)r   r  r  r   r   r   	set_conds  s   zCFGGuider.set_condsc                 C  s
   || _ d S r   )r  )r   r  r   r   r   set_cfg  s   
zCFGGuider.set_cfgc                 C  sJ   |D ] }| j  rtj|| r| j  | _ tj|| | j|< qd S r   )r  
is_dynamicr   sampler_helperscond_has_hooksget_non_dynamic_delegateconvert_condr  )r   r<   rN   r   r   r   r    s
   zCFGGuider.inner_set_condsc                 O  s   | j |i |S r   )outer_predict_noise)r   r   ro  r   r   r   r     s   zCFGGuider.__call__Nc              	   C  s6   t jj| j| t jjt jjj| jdd	||||S r   )
r   r   r   new_class_executorpredict_noiser   r   PREDICT_NOISErn   r|   r   rX   rm   rn   r   r   r   r   r    s   zCFGGuider.outer_predict_noisec              
   C  s0   t | j||| jdd | jdd | j||dS )Nr  r  r   )r   r   r<   r5   r  r  r   r   r   r    s   0zCFGGuider.predict_noisec              
   C  s   |d urt |dkr| j|}t| j|| j||||	|
d| _tj| j	}||
di d< ||	d}tjj|j|tjjtjjj|d dd}|| |||||||}| j|t jS )	Nr   r  r   sample_sigmasr   rn   Tr   )r2   count_nonzeror   process_latent_inr  r<   r   r  create_model_options_clonern   rl   r   r   r  rt  r   r   SAMPLER_SAMPLEr|   process_latent_outr;  float32)r   r   r   r8   samplerr   r   r  r  r   r  extra_model_optionsr  r   r  r   r   r   inner_sample  s   
zCFGGuider.inner_sampleFc
                 C  s   t j| j|j| j| j\| _| _| _| jj	}
|j
|
tjd}|j
|
tjd}|
|
}t| j|
| j d z| j  | j|||
|||||||	d
}W | j  n| j  w t j| j| j | `| `|S )Nr&  r   )r   r  prepare_samplingr  r*   r<   rn   r   loaded_modelsload_devicer;  r2   r  r  model_dtypera  r
  cleanupcleanup_models)r   r   r   r  r   r   r  r  r   r  r8   r   r   r   r   outer_sample  s   &

 zCFGGuider.outer_samplec	                 C  sj  |j d dkr	|S |jr!tj| \}}	tj| \}}
n|j g}	|d ur|jr9| }|d t|	 }n|g}tt|t|	D ]}|t	
|	|  qEtt|D ]}tj|| |	| | jj||< qXt|dkrztj|\}}
n|d }| }i | _| jD ]}ttdd | j| | j|< qt| j zi| j}tj| j| _| jj}t| jdkrtjjj| j_tj| j| j| j t| j| j tjj | j!| tjj"tjj#j$| jdd}|j%|||||||||	d	}W t&| j| jj'd	 || _|| j_| j(  nt&| j| jj'd	 || _|| j_| j(  w | `t|	dkr3tj)*tj+||	}|S )
Nr   r   r   c                 S  s   |   S r   )r9  r^  r   r   r   r`    r  z"CFGGuider.sample.<locals>.<lambda>Tr   r   r3  ),r*   	is_nestedr   r<  pack_latentsunbindr   r,   rT   r2   onesr  prepare_maskr  r  r   r<   r  r+   mapr  rn   r  	hook_moder  r   EnumHookModeMinVramprepare_model_patcherr  r   r   r  r  r   r   OUTER_SAMPLEr|   r  offload_devicerestore_hook_patchesnested_tensorNestedTensorunpack_latents)r   r   r   r  r   r   r  r  r   r  rp   denoise_masksr@   rN   orig_model_optionsorig_hook_moder   r   r   r   r   rt    sb   "
 
zCFGGuider.sample)r  r	   r   )NNFNN)NNFN)r   r   r   r   r  r  r  r   r  r  r
  r  rt  r   r   r   r   r    s    


r  c              
   C  s6   t | }||| || |||	|||
|||S r   )r  r  r  rt  )r6   r   r  r  r  r8   r  r   rn   r   r   r  r  r   
cfg_guiderr   r   r   rt  *  s   
rt  )ddimr   
uni_pc_bh2c                   @  s"   e Zd ZU ded< dZded< dS )SchedulerHandlerzCallable[..., torch.Tensor]r}   Tr*  use_msN)r   r   r   __annotations__r)  r   r   r   r   r(  3  s   
 r(  T)r   )r)  )	simplesgm_uniformkarrasexponentialddim_uniformr  normallinear_quadratic
kl_optimalr   objectscheduler_namestrr   c                 C  s\   t |}|d u rd| }t| t||jr || |S |j|t| jt| j	dS )Nzerror invalid scheduler )r  r   r   )
SCHEDULER_HANDLERSr5   r   error
ValueErrorr)  r}   r   r   r   )r   r4  r   r}   errr   r   r   calculate_sigmasG  s   


r:  c                 C  sT   | dkrt tj}|S | dkrt tj}|S | dkr$tdddid}|S t| }|S )Nr   r'  r&  ry  r  T)r  )r  r   sample_unipcsample_unipc_bh2r  )rd  r  r   r   r   sampler_objectQ  s   

r=  c                   @  sJ   e Zd ZeZeZedZdddi fddZ	dd Z
dddZdd
dZdS )KSampler)r  r  r   r'  Nc                 C  s\   || _ || _|| jvr| jd }|| jvr| jd }|| _|| _| || || _|| _d S )Nr   )	r6   r8   
SCHEDULERSSAMPLERS	schedulerr  	set_stepsdenoisern   )r   r6   r   r8   r  rA  rC  rn   r   r   r   r   a  s   




zKSampler.__init__c                 C  s\   d }d}| j | jv r|d7 }d}t| jd| j|}|r,t|d d |dd  g}|S )NFr   Tr   r4  r   )r  "DISCARD_PENULTIMATE_SIGMA_SAMPLERSr:  r6   get_model_objectrA  r2   r   )r   r   r   discard_penultimate_sigmar   r   r   r:  n  s   zKSampler.calculate_sigmasc                 C  s|   || _ |d u s|dkr| || j| _d S |dkr#tg | _d S t|| }| || j}||d  d  | _d S )NgH.?rb   r   )r   r:  r;  r8   r   r2   r   r   )r   r   rC  	new_stepsr   r   r   r   rB  |  s   zKSampler.set_stepsFc                 C  s   |
d u r| j }
|d ur!|t|
d k r!|
d |d  }
|r!d|
d< |d ur?|t|
d k r4|
|d  }
n|d ur:|S t|S t| j}t| j||||| j||
| j	||	|||dS )Nr   r   r   )r   r   r  r  r   )
r   r   r2   r   r=  r  rt  r6   r8   rn   )r   r   r  r  r  r   
start_step	last_stepforce_full_denoiser   r   r  r  r   r  r   r   r   rt    s   

*zKSampler.sampler   )	NNNFNNNFN)r   r   r   SCHEDULER_NAMESr?  SAMPLER_NAMESr@  r  rD  r   r:  rB  rt  r   r   r   r   r>  \  s    
r>  )r6   r\   r]   r^   r_   r`   )r6   r
   r<   r`   r=   rw   rn   rx   )r6   r
   r<   r`   r=   rw   )FF)r  r  )r  N)r  r   r   r   r   r   r  rw   )NNNN)r<   r  )r<   r  rn   rx   )NN)rn   rx   )r   r3  r4  r5  r   r   r  rw   )P
__future__r   k_diffusionr   r  extra_samplersr   typingr   r   r   comfy.model_patcherr	   comfy.model_baser
   comfy.controlnetr   r2   	functoolsr   r:   r   r   comfy.sampler_helpersr   comfy.patcher_extensioncomfy.hookscomfy.context_windowscomfy.utilsscipy.statsr  r  r   rI   rO   rS   r[   rv   r~   r{   r   r   r   r   r   r   r   r   r  r  r%  r1  rL  rO  rW  r]  rc  rj  rr  rs  KSAMPLER_NAMESr  r  r  r  r  r  r  r  rt  rL  r(  get_sigmas_karrasget_sigmas_exponentialr6  r+   rK  r:  r=  r>  r   r   r   r   <module>   s    U


+

 	



2,	#	

&

1 


