o
    i!                     @  s   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mZ er@d dlmZ d dlmZ d dlmZ dd Zd	d
 Zd)ddZdd Zdd Zdd Zd*d+ddZdd Zdd Zd,d-d d!Zd,d-d"d#Zd$d% Zd.d'd(ZdS )/    )annotationsN)TYPE_CHECKING)ModelPatcher)	BaseModel)ControlBasec                 C  s   t j| ||S N)comfyutilsreshape_maskto)
noise_maskshapedevice r   3/mnt/c/Users/fbmor/ComfyUI/comfy/sampler_helpers.pyprepare_mask   s   r   c                 C  sD   g }| D ]}||v rt || tr||| 7 }q||| g7 }q|S r   )
isinstancelist)cond
model_typemodelscr   r   r   get_models_from_cond   s   r   
full_hookscomfy.hooks.HookGroupc                   s   g }| D ]}d|v r|d j D ]}|| qd|v r"||d  qd	 fdd g }t|}|D ]} || q2tj j|}|d urP|j D ]}|| qH|S )
Nhookscontrolcnetr   _listr   c                   s0   | j d ur|| j  | jd u r|S  | j|S r   )extra_hooksappendprevious_controlnet)r   r   get_extra_hooks_from_cnetr   r   r#   '   s
   

z6get_hooks_from_cond.<locals>.get_extra_hooks_from_cnet)r   r   r   r   )r   addr    setr   	HookGroupcombine_all_hooks)r   r   cnetsr   hook
hooks_list	base_cnetr   r   r"   r   get_hooks_from_cond   s$   
r,   c                 C  s`   g }| D ])}|d   }|di }|d d ur|d |d< ||d< t |d< || q|S )N   model_condsr   
cross_attnuuid)copygetr0   uuid4r    )r   outr   tempr.   r   r   r   convert_cond9   s   r6   c                 C  sN   | D ]"}|d }d|v r dS d|v r$|d }|  }t|dkr$ dS qdS )Nr-   r   Tr   r   F)get_extra_hookslen)r   r   r5   r   r   r   r   r   cond_has_hooksE   s   r9   c                 C  s   g }g }g }| D ]}|t | | d7 }|t | | d7 }|t | | d7 }qt|}d}g }|D ]}	||	 7 }||	|7 }q0dd |D }|| | }
|
|fS )z'loads additional models in conditioningr   gligenadditional_modelsr   c                 S  s   g | ]}|d  qS )r-   r   ).0xr   r   r   
<listcomp>d   s    z)get_additional_models.<locals>.<listcomp>)r   r%   
get_modelsinference_memory_requirements)condsdtyper(   r:   
add_modelskcontrol_netsinference_memorycontrol_modelsmr   r   r   r   get_additional_modelsQ   s    rI   model_options	dict[str]c                 C  sB   g }| durd| v r| d }| tjjjD ]}||j q|S )z7loads additional models from registered AddModels hooksNregistered_hooks)get_typer   r   EnumHookTypeAdditionalModelsextendr   )rJ   r   
registeredr)   r   r   r   (get_additional_models_from_model_optionsi   s   rR   c                 C  s    | D ]}t |dr|  qdS )z*cleanup additional models that were loadedcleanupN)hasattrrS   )r   rH   r   r   r   cleanup_additional_modelss   s
   
rU   c                 C  s   t t}i }| D ]A\}}|D ]:}| jjdi | D ],\}}	|| |	 ||d d u r7|	g||< qt	|	t	|| d krJ|	g||< qqq| jj
|d d gt|dd   |d}
| jj
|d gt|dd   |d}|
|fS )Nr      r-   )cond_shapesr   )collectionsdefaultdictr   itemsmodelextra_conds_shapesr    r2   mathprodmemory_required)r[   noise_shaperA   rW   cond_shapes_min_csr   rD   vr_   minimum_memory_requiredr   r   r   estimate_memoryy   s    

*&rf   Fr[   r   c                 C  s:   t jjtt jjt jjj|dd}|j| |||||dS )NT)is_model_options)rJ   force_full_loadforce_offload)	r   patcher_extensionWrapperExecutornew_executor_prepare_samplingget_all_wrappers
WrappersMPPREPARE_SAMPLINGexecute)r[   r`   rA   rJ   rh   ri   executorr   r   r   prepare_sampling   s
   rs   c                 C  s   d }t ||  \}}|t|7 }||  7 }|rd}	d }
nt| ||\}	}
|	|7 }	|
|7 }
tjj| g| |	|
|d | j}|||fS )Ng@xD)r_   re   rh   )	rI   model_dtyperR   get_nested_additional_modelsrf   r   model_managementload_models_gpur[   )r[   r`   rA   rJ   rh   ri   
real_modelr   rF   r_   re   r   r   r   rm      s   
rm   c                 C  s8   t | g }| D ]}|t| | d7 }qt t| d S )Nr   )rU   r   r%   )rA   r   control_cleanuprD   r   r   r   cleanup_models   s
   rz   dictc           
      C  s*  t j }|D ]	}t|| | qt jj|d di | jdd t jj|d di | jdd t j }t j	t jj
j}|t jjjD ]
}|| ||| qG|t jjjD ]
}|| ||| qZ| |||| t|dkrw||d< |di }d	D ]}	t jj||	i |d |	 dd q|S )
z%
    Registers hooks from conds.
    transformer_optionswrappersF)
copy_dict1	callbacksr   rL   to_load_options)r}   r   )r   r   r&   r,   rj   merge_nested_dicts
setdefaultr}   r   create_target_dictEnumWeightTargetModelrM   rN   TransformerOptionsadd_hook_patchesrO   register_all_hook_patchesr8   )
r[   rA   rJ   r   rD   rQ   target_dictr)   r   wc_namer   r   r   prepare_model_patcher   s(   
  
r   )r   r   r   )rJ   rK   )NFF)r[   r   )r[   r   rJ   r{   ) 
__future__r   r0   r]   rX   comfy.model_managementr   comfy.condscomfy.utilscomfy.hookscomfy.patcher_extensiontypingr   comfy.model_patcherr   comfy.model_baser   comfy.controlnetr   r   r   r,   r6   r9   rI   rR   rU   rf   rs   rm   rz   r   r   r   r   r   <module>   s6    


	