o
    iS                     @   s:  U 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mZm	Z	 d dl
mZ d dlmZmZ d dlZd dlmZ i Ze	eef ed< dedefd	d
ZG dd deZG dd dZdd ZG dd deZG dd deZG dd dZG dd deZG dd dZG dd deZdZ dZ!G dd  d eZ"dS )!    N)SequenceMappingDict)DynamicPrompt)ABCabstractmethod)is_linkNODE_CLASS_CONTAINS_UNIQUE_ID
class_typereturnc                 C   s>   | t v rt |  S tj|  }d| di  v t | < t |  S )N	UNIQUE_IDhidden)r	   nodesNODE_CLASS_MAPPINGSINPUT_TYPESgetvalues)r
   	class_def r   5/mnt/c/Users/fbmor/ComfyUI/comfy_execution/caching.pyinclude_unique_id_in_input   s
   
r   c                   @   sH   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )CacheKeySetc                 C   s   i | _ i | _d S N)keyssubcache_keysself	dynpromptnode_idsis_changed_cacher   r   r   __init__   s   
zCacheKeySet.__init__c                    s   t  r   )NotImplementedError)r   r   r   r   r   add_keys   s   zCacheKeySet.add_keysc                 C   s   t | j S r   )setr   r   r   r   r   all_node_ids"      zCacheKeySet.all_node_idsc                 C   
   | j  S r   )r   r   r$   r   r   r   get_used_keys%      
zCacheKeySet.get_used_keysc                 C   r'   r   )r   r   r$   r   r   r   get_used_subcache_keys(   r)   z"CacheKeySet.get_used_subcache_keysc                 C      | j |d S r   )r   r   r   node_idr   r   r   get_data_key+   r&   zCacheKeySet.get_data_keyc                 C   r+   r   )r   r   r,   r   r   r   get_subcache_key.   r&   zCacheKeySet.get_subcache_keyN)__name__
__module____qualname__r    r   r"   r%   r(   r*   r.   r/   r   r   r   r   r      s    
r   c                   @   s   e Zd Zdd ZdS )
Unhashablec                 C   s   t d| _d S )NNaN)floatvaluer$   r   r   r   r    2   r&   zUnhashable.__init__N)r0   r1   r2   r    r   r   r   r   r3   1   s    r3   c              	   C   sn   t | ttttttd fr| S t | tr!tdd t	| 
 D S t | tr4ttt dd | D S t S )Nc                 S   s    g | ]\}}t |t |fqS r   to_hashable).0kvr   r   r   
<listcomp>;        zto_hashable.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r7   )r9   ir   r   r   r<   =   s    )
isinstanceintr5   strboolbytestyper   	frozensetsorteditemsr   zip	itertoolscountr3   )objr   r   r   r8   5   s   

r8   c                       s$   e Zd Z fddZdd Z  ZS )CacheKeySetIDc                    s   t  ||| || _d S r   )superr    r   r   	__class__r   r   r    C   s   
zCacheKeySetID.__init__c                    sZ   |D ]'}|| j v rq| j|sq| j|}||d f| j |< ||d f| j|< qd S Nr
   )r   r   has_nodeget_noder   r   r   r-   noder   r   r   r"   G   s   
zCacheKeySetID.add_keys)r0   r1   r2   r    r"   __classcell__r   r   rN   r   rL   B   s    rL   c                       sR   e Zd Z fddZdefddZdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )CacheKeySetInputSignaturec                    s    t  ||| || _|| _d S r   )rM   r    r   r   r   rN   r   r   r    R   s   
z"CacheKeySetInputSignature.__init__r   c                 C   s   dS NFr   r$   r   r   r   include_node_id_in_inputW      z2CacheKeySetInputSignature.include_node_id_in_inputc                    sb   |D ]+}|| j v rq| j|sq| j|}| | j|I d H | j |< ||d f| j|< qd S rP   )r   r   rQ   rR   get_node_signaturer   rS   r   r   r   r"   Z   s   
z"CacheKeySetInputSignature.add_keysc                    s\   g }|  ||\}}|| |||I d H  |D ]}|| |||I d H  qt|S r   )get_ordered_ancestryappendget_immediate_node_signaturer8   )r   r   r-   	signature	ancestorsorder_mappingancestor_idr   r   r   rZ   d   s   z,CacheKeySetInputSignature.get_node_signaturec                    s   | |stdgS ||}|d }tj| }|| j|I d H g}|  s4t|dr0|j	s4t
|r9|| |d }t| D ]&}	t||	 r`||	 \}
}||
 }||	d||ff qC||	||	 f qC|S )Nr4   r
   NOT_IDEMPOTENTinputsANCESTOR)rQ   r5   rR   r   r   r   r   rX   hasattrrb   r   r\   rF   r   r   )r   r   r-   ancestor_order_mappingrT   r
   r   r^   rc   keyra   ancestor_socketancestor_indexr   r   r   r]   l   s"   



 
z6CacheKeySetInputSignature.get_immediate_node_signaturec                 C   s    g }i }|  |||| ||fS r   )get_ordered_ancestry_internal)r   r   r-   r_   r`   r   r   r   r[      s   z.CacheKeySetInputSignature.get_ordered_ancestryc           	      C   s   | |sd S ||d }t| }|D ]'}t|| r=|| d }||vr=|| t|d ||< | |||| qd S )Nrc   r      )rQ   rR   rF   r   r   r\   lenrj   )	r   r   r-   r_   r`   rc   
input_keysrg   ra   r   r   r   rj      s   

z7CacheKeySetInputSignature.get_ordered_ancestry_internal)r0   r1   r2   r    rB   rX   r"   rZ   r]   r[   rj   rU   r   r   rN   r   rV   Q   s    
rV   c                   @   s   e Zd Zd+ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zedd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S ),
BasicCacheFc                 C   s2   || _ d| _|| _|  |  i | _i | _t | _d S rW   )	key_classinitializedenable_providerscache	subcachesr#   _pending_store_tasksr   ro   rq   r   r   r   r       s   zBasicCache.__init__c                    s:   || _ | |||| _| j|I d H  || _d| _d S )NT)r   ro   cache_key_setr"   r   rp   r   r   r   r   
set_prompt   s   
zBasicCache.set_promptc                 C   s6   | j sJ | j }| j D ]	}|| }q|S r   )rp   rv   r%   rs   r   union)r   r   subcacher   r   r   r%      s
   

zBasicCache.all_node_idsc                 C   F   t | j }g }| jD ]}||vr|| q|D ]}| j|= qd S r   )r#   rv   r(   rr   r\   )r   preserve_keys	to_removerg   r   r   r   _clean_cache   s   


zBasicCache._clean_cachec                 C   rz   r   )r#   rv   r*   rs   r\   )r   preserve_subcachesr|   rg   r   r   r   _clean_subcaches   s   


zBasicCache._clean_subcachesc                 C   s   | j sJ |   |   d S r   )rp   r}   r   r$   r   r   r   clean_unused   s   
zBasicCache.clean_unusedc                 K      d S r   r   r   kwargsr   r   r   poll   rY   zBasicCache.pollc                 C   s.   | j sd S | j|}|| jv r| j| S d S r   rp   rv   r.   rr   r   r-   	cache_keyr   r   r   	get_local   s   

zBasicCache.get_localc                 C   s$   | j sJ | j|}|| j|< d S r   r   r   r-   r6   r   r   r   r   	set_local   s   
zBasicCache.set_localc                    s:   | j sJ | j|}|| j|< | |||I d H  d S r   )rp   rv   r.   rr   _notify_providers_storer   r   r   r   _set_immediate   s
   

zBasicCache._set_immediatec                    sX   | j sd S | j|}|| jv r| j| S | ||I d H }|d ur*|| j|< |S d S r   )rp   rv   r.   rr   _check_providers_lookup)r   r-   r   external_resultr   r   r   _get_immediate   s   


zBasicCache._get_immediatec                    s   ddl m}m}m}m}m} | jsd S | sd S | |s d S ||r&d S | ||}	|	d u r2d S ||j	|j
d}
| D ]@}z||	|
r]t| ||	|
}| j| || jj W q= ty} } z|d|jj d|  W Y d }~q=d }~ww d S )Nr   _has_cache_providers_get_cache_providers
CacheValue_contains_self_unequal_logger)outputsuiCache provider z error on store: )comfy_execution.cache_providerr   r   r   r   r   rq   _is_external_cacheable_value_build_contextr   r   should_cacheasynciocreate_task_safe_provider_storert   addadd_done_callbackdiscard	ExceptionwarningrO   r0   )r   r-   r   r6   r   r   r   r   r   contextcache_valueprovidertasker   r   r   r      s4   

&z"BasicCache._notify_providers_storec              
      sh   ddl m} z| ||I d H  W d S  ty3 } z|d| jj d|  W Y d }~d S d }~ww )Nr   )r   r   z async store error: )r   r   on_storer   r   rO   r0   )r   r   r   r   r   r   r   r   r   	  s   (zBasicCache._safe_provider_storec                    sB  ddl m}m}m}m}m} | jsd S | sd S ||rd S | ||}|d u r+d S | D ]p}	zO|	|s8W q.|		|I d H }
|
d ur~t
|
|sV|d|	jj d W q.t
|
jttfsk|d|	jj d W q.ddlm} ||
jt|
jdW   S W q. ty } z|d|	jj d	|  W Y d }~q.d }~ww d S )
Nr   r   z	Provider z returned invalid typez returned invalid outputs)
CacheEntry)r   r   r   z error on lookup: )r   r   r   r   r   r   rq   r   r   	on_lookupr?   r   rO   r0   r   listtuple	executionr   r   r   )r   r-   r   r   r   r   r   r   r   r   resultr   r   r   r   r   r     s>   


	&z"BasicCache._check_providers_lookupc                 C   s   t |do	t |dS )Nr   r   )re   )r   r6   r   r   r   r   5     z'BasicCache._is_external_cacheable_valuec                 C   s<   | j r| jsdS z| j|ddW S  ty   Y dS w )N r
   )rp   r   rR   r   r   r,   r   r   r   _get_class_type8  s   zBasicCache._get_class_typec              
   C   s~   ddl m}m}m} z||}|d u rW d S ||| ||dW S  ty> } z|d| d|  W Y d }~d S d }~ww )Nr   )CacheContext_serialize_cache_keyr   )r-   r
   cache_key_hashz'Failed to build cache context for node z: )r   r   r   r   r   r   r   )r   r-   r   r   r   r   r   r   r   r   r   r   @  s   zBasicCache._build_contextc                    sT   | j |}| j|d }|d u rt| j}|| j|< || j|| jI d H  |S r   )	rv   r/   rs   r   rn   ro   rw   r   r   )r   r-   children_idssubcache_keyry   r   r   r   _ensure_subcacheO  s   

zBasicCache._ensure_subcachec                 C   s.   | j sJ | j|}|| jv r| j| S d S r   )rp   rv   r/   rs   )r   r-   r   r   r   r   _get_subcacheX  s
   


zBasicCache._get_subcachec                 C   sP   g }| j D ]}||| j | d q| jD ]}||| j|  d q|S )N)rg   r6   )r   ry   )rr   r\   rs   recursive_debug_dump)r   r   rg   r   r   r   r   `  s   

zBasicCache.recursive_debug_dumpNF)r0   r1   r2   r    rw   r%   r}   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   rn      s,    

	

$	rn   c                       sN   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	  Z
S )HierarchicalCacheFc                    s   t  j||d d S )Nrq   )rM   r    ru   rN   r   r   r    i  r   zHierarchicalCache.__init__c                 C   s~   | j d usJ | j |}|d u r| S g }|d ur(|| | j |}|d us| }t|D ]}||}|d u r< d S q.|S r   )r   get_parent_node_idr\   reversedr   )r   r-   	parent_id	hierarchyrr   r   r   r   _get_cache_forl  s    

z HierarchicalCache._get_cache_forc                    s(   |  |}|d u rd S ||I d H S r   )r   r   r   r-   rr   r   r   r   r   ~  s
   
zHierarchicalCache.getc                 C   s"   |  |}|d u rd S t||S r   )r   rn   r   r   r   r   r   r     s   
zHierarchicalCache.get_localc                    s.   |  |}|d usJ |||I d H  d S r   )r   r   r   r-   r6   rr   r   r   r   r#     s   
zHierarchicalCache.setc                 C   s(   |  |}|d usJ t||| d S r   )r   rn   r   r   r   r   r   r     s   
zHierarchicalCache.set_localc                    s*   |  |}|d usJ |||I d H S r   )r   r   )r   r-   r   rr   r   r   r   ensure_subcache_for  s   
z%HierarchicalCache.ensure_subcache_forr   )r0   r1   r2   r    r   r   r   r#   r   r   rU   r   r   rN   r   r   h  s    r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )	NullCachec                       d S r   r   r   r   r   r   rw        zNullCache.set_promptc                 C   s   g S r   r   r$   r   r   r   r%     rY   zNullCache.all_node_idsc                 C   r   r   r   r$   r   r   r   r     rY   zNullCache.clean_unusedc                 K   r   r   r   r   r   r   r   r     rY   zNullCache.pollc                    r   r   r   r,   r   r   r   r     r   zNullCache.getc                 C   r   r   r   r,   r   r   r   r     rY   zNullCache.get_localc                    r   r   r   r   r-   r6   r   r   r   r#     r   zNullCache.setc                 C   r   r   r   r   r   r   r   r     rY   zNullCache.set_localc                    s   | S r   r   )r   r-   r   r   r   r   r     r   zNullCache.ensure_subcache_forN)r0   r1   r2   rw   r%   r   r   r   r   r#   r   r   r   r   r   r   r     s    r   c                       s^   e Zd Zd fdd	Z fddZdd Zd	d
 Zdd Zdd Zdd Z	 fddZ
  ZS )LRUCached   Fc                    s2   t  j||d || _d| _d| _i | _i | _d S )Nr   r   )rM   r    max_sizemin_generation
generationused_generationchildren)r   ro   r   rq   rN   r   r   r      s   
zLRUCache.__init__c                    s>   t  |||I d H  |  jd7  _|D ]}| | qd S )Nrk   )rM   rw   r   
_mark_used)r   r   r   r   r-   rN   r   r   rw     s   zLRUCache.set_promptc                    s   t  j jkrC j jk rC  jd7  _ fdd jD }|D ]} j|=  j|= | jv r4 j|= q!t  j jkrC j jk s   d S )Nrk   c                    s    g | ]} j |  jk r|qS r   )r   r   )r9   rg   r$   r   r   r<     r=   z)LRUCache.clean_unused.<locals>.<listcomp>)rl   rr   r   r   r   r   r   r   )r   r|   rg   r   r$   r   r     s   
zLRUCache.clean_unusedc                    s   |  | | |I d H S r   )r   r   r,   r   r   r   r     s   
zLRUCache.getc                 C   s(   | j |}|d ur| j| j|< d S d S r   )rv   r.   r   r   r   r   r   r   r     s   zLRUCache._mark_usedc                    s   |  | | ||I d H S r   )r   r   r   r   r   r   r#     s   
zLRUCache.setc                 C   s   |  | t| || d S r   )r   rn   r   r   r   r   r   r     s   
zLRUCache.set_localc                    sx   t  ||I d H  | j|I d H  | | | j|}g | j|< |D ]}| | | j| | j| q&| S r   )rM   r   rv   r"   r   r.   r   r\   )r   r-   r   r   child_idrN   r   r   r     s   


zLRUCache.ensure_subcache_for)r   F)r0   r1   r2   r    rw   r   r   r   r#   r   r   rU   r   r   rN   r   r     s    r   g?g?c                       sR   e Zd Zd fdd	Zdd Z fddZ fdd	Z fd
dZdd Z  Z	S )RAMPressureCacheFc                    s   t  j|d|d i | _d S )Nr   r   )rM   r    
timestampsru   rN   r   r   r      s   
zRAMPressureCache.__init__c                 C   s   |    d S r   )r   r$   r   r   r   r     s   zRAMPressureCache.clean_unusedc                    s0   t   | j| j|< t ||I d H  d S r   )timer   rv   r.   rM   r#   r   rN   r   r   r#     s   zRAMPressureCache.setc                    s*   t   | j| j|< t |I d H S r   )r   r   rv   r.   rM   r   r,   rN   r   r   r     s   zRAMPressureCache.getc                    s(   t   | j| j|< t || d S r   )r   r   rv   r.   rM   r   r   rN   r   r   r   
  s   zRAMPressureCache.set_localc                    s   t  j|kr	d S g }| j D ],\}}t| j| j|   }t  fdd|j	 | 9 }t
||| j| |f qt  j|k rq|ru| \}}}| j|= | j|d  | j|d  | j|d  t  j|k rs|sFd S d S d S d S )Nc                    s^   | d u rd S | D ]$}t |ttfr| qt |tjr,|jjdkr, | |  7  qd S )Ncpu)	r?   r   r   torchTensordevicerD   numelelement_size)r   output	ram_usagescan_list_for_ram_usager   r   r     s   
z=RAMPressureCache.ram_release.<locals>.scan_list_for_ram_usage)psutilvirtual_memory	availablerr   rG   %RAM_CACHE_OLD_WORKFLOW_OOM_MULTIPLIERr   r   RAM_CACHE_DEFAULT_RAM_USAGEr   bisectinsortr   popr   )r   target
clean_listrg   cache_entry	oom_score_r   r   r   ram_release  s"   
	"zRAMPressureCache.ram_releaser   )
r0   r1   r2   r    r   r#   r   r   r   rU   r   r   rN   r   r     s    r   )#r   r   rI   r   r   r   typingr   r   r   comfy_execution.graphr   abcr   r   r   comfy_execution.graph_utilsr   r	   rA   rB   __annotations__r   r   r3   r8   rL   rV   rn   r   r   r   r   r   r   r   r   r   r   <module>   s4   
 D T1<