64#hDUddlZddlmZmZmZddlmZddlZddlm Z iZ ee e fe d<de de fdZGd d ZGd d Zd ZGddeZGddeZGddZGddeZGddeZGddeZy)N)SequenceMappingDict) DynamicPrompt)is_linkNODE_CLASS_CONTAINS_UNIQUE_ID class_typereturnc|tvr t|Stj|}d|jj dij vt|<t|S)N UNIQUE_IDhidden)rnodesNODE_CLASS_MAPPINGS INPUT_TYPESgetvalues)r class_defs >D:\ComfyUI_windows_portable\ComfyUI\comfy_execution\caching.pyinclude_unique_id_in_inputr sb22,Z88))*5I0;y?T?T?V?Z?Z[ceg?h?o?o?q0q!*- ( 44c6eZdZdZdZdZdZdZdZdZ y) CacheKeySetc i|_i|_yN)keys subcache_keysself dynpromptnode_idsis_changed_caches r__init__zCacheKeySet.__init__s rctr)NotImplementedError)rr s radd_keyszCacheKeySet.add_keyss !##rcHt|jjSr)setrrs r all_node_idszCacheKeySet.all_node_idss499>>#$$rc6|jjSr)rrr(s r get_used_keyszCacheKeySet.get_used_keyssyy!!rc6|jjSr)rrr(s rget_used_subcache_keysz"CacheKeySet.get_used_subcache_keys!s!!((**rc:|jj|dSr)rrrnode_ids r get_data_keyzCacheKeySet.get_data_key$syy}}Wd++rc:|jj|dSr)rrr/s rget_subcache_keyzCacheKeySet.get_subcache_key's!!%%gt44rN) __name__ __module__ __qualname__r"r%r)r+r-r1r3rrrrs% $%"+,5rrceZdZdZy) Unhashablec$td|_y)NNaN)floatvaluer(s rr"zUnhashable.__init__+s 5\ rN)r4r5r6r"r7rrr9r9*s"rr9c t|ttttt dfr|St|t rItt|jDcgc]\}}t|t|fc}}St|tr>tttj|Dcgc] }t|c}StScc}}wcc}wr) isinstanceintr<strbooltyper frozensetsorteditems to_hashablerzip itertoolscountr9)objkvis rrGrG.s#UCtDz:; C !vciikGZ[GZtq!;q>;q>:GZ[\\ C "Y__.0MAQ0MNOO| \0Ms  C 7C$c$eZdZfdZdZxZS) CacheKeySetIDcXt||||||_|j|yr)superr"rr%rrr r! __class__s rr"zCacheKeySetID.__init__<s( H.>?" hrc|D]p}||jvr|jj|s.|jj|}||df|j|<||df|j|<ryNr )rrhas_nodeget_noderrr r0nodes rr%zCacheKeySetID.add_keysAsvG$))#>>**73>>**73D")4 +=!>DIIg +2D4F*GD  w ' r)r4r5r6r"r% __classcell__rTs@rrPrP;s HrrPcHeZdZfdZdefdZdZdZdZdZ dZ xZ S) CacheKeySetInputSignaturecft||||||_||_|j |yr)rRr"rr!r%rSs rr"z"CacheKeySetInputSignature.__init__Ls0 H.>?" 0 hrr cyNFr7r(s rinclude_node_id_in_inputz2CacheKeySetInputSignature.include_node_id_in_inputRsrc|D]}||jvr|jj|s.|jj|}|j |j||j|<||df|j |<yrV)rrrWrXget_node_signaturerrYs rr%z"CacheKeySetInputSignature.add_keysUs}G$))#>>**73>>**73D!%!8!8!QDIIg +2D4F*GD  w ' rcg}|j||\}}|j|j||||D]$}|j|j|||&t|Sr)get_ordered_ancestryappendget_immediate_node_signaturerG)rrr0 signature ancestors order_mapping ancestor_ids rrdz,CacheKeySetInputSignature.get_node_signature_sn #'#<#>y+Wde f%9%%rc*|j|s tdgS|j|}|d}tj|}||j j |g}|js#t|dr |js t|r|j||d}t|jD]J} t|| r$|| \} } || } |j| d| | ff5|j| || fL|S)Nr;r NOT_IDEMPOTENTinputsANCESTOR)rWr<rXrrr!rrbhasattrrnrrgrErr) rrr0ancestor_order_mappingrZr rrirokeyrlancestor_socketancestor_indexs rrhz6CacheKeySetInputSignature.get_immediate_node_signaturegs!!'*%L> !!!'*,' --j9 !6!6!:!:7!CD  ( ( *wyBR/SXaXpXpvPQ[v\   W %h&++-(Cvc{#17.o!7 !D  #z>?&S!TU  #vc{!34 )rc:g}i}|j||||||fSr)get_ordered_ancestry_internal)rrr0rjrks rrfz.CacheKeySetInputSignature.get_ordered_ancestry}s+   **9gy-X-''rc4|j|sy|j|d}t|j}|D]T}t ||s||d}||vs|j |t |dz ||<|j||||Vy)Nror)rWrXrErrrglenrw) rrr0rjrkro input_keysrsrls rrwz7CacheKeySetInputSignature.get_ordered_ancestry_internals!!'* ##G,X6FKKM* Cvc{#$Sk!n m3$$[114Y!1CM+.66y+yZgh r) r4r5r6r"rBrbr%rdrhrfrwr[r\s@rr^r^Ks/ $H&,( irr^cNeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z y ) BasicCachecD||_d|_||i|_i|_yra) key_class initializedcache subcaches)rrs rr"zBasicCache.__init__s%"    rc^||_|j||||_||_d|_y)NT)rr cache_key_setr!rrs r set_promptzBasicCache.set_prompts/"!^^IxAQR 0rc|jsJ|jj}|jj D]!}|j |j}#|Sr)rrr)rrunion)rr subcaches rr)zBasicCache.all_node_idssX%%224--/H~~h&;&;&=>H0rct|jj}g}|jD]}||vs|j ||D]}|j|=yr)r'rr+rrg)r preserve_keys to_removerss r _clean_cachezBasicCache._clean_caches[D..<<>?  ::C-'  %C 3rct|jj}g}|jD]}||vs|j ||D]}|j|=yr)r'rr-rrg)rpreserve_subcachesrrss r_clean_subcacheszBasicCache._clean_subcachess^ !3!3!J!J!LM >>C,,  %"Cs#rc`|jsJ|j|jyr)rrrr(s r clean_unusedzBasicCache.clean_unuseds)  rct|jsJ|jj|}||j|<yrrrr1r)rr0r= cache_keys r_set_immediatezBasicCache._set_immediates5&&33G< % 9rc|jsy|jj|}||jvr|j|Syrrrr0rs r_get_immediatezBasicCache._get_immediatesB&&33G<  "::i( (rc|jj|}|jj|d}|$t |j }||j|<|j |j||j|Sr) rr3rrr}rrrr!)rr0 children_ids subcache_keyrs r_ensure_subcachezBasicCache._ensure_subcachesq))::7C >>%%lD9  !$..1H+3DNN< (DNNL$:O:OPrc|jsJ|jj|}||jvr|j|Syr)rrr3r)rr0rs r _get_subcachezBasicCache._get_subcachesE))::7C 4>> )>>,/ /rcg}|jD]#}|j||j|d%|jD]1}|j||j|jd3|S)N)rsr=)rr)rrgrrecursive_debug_dump)rresultrss rrzBasicCache.recursive_debug_dumpsd::C MM# 3@ A>>C MM3DNN3  K #   Y '99)DI#!),I'' 2E}- rcL|j|}|y|j|Sr)rr)rr0rs rrzHierarchicalCache.gets+##G, =##G,,rcR|j|}|J|j||yr)rr)rr0r=rs rr'zHierarchicalCache.sets.##G,    We,rcP|j|}|J|j||Sr)rr)rr0rrs rensure_subcache_forz%HierarchicalCache.ensure_subcache_fors1##G,   %%g|<,>,K,KH,U V% r)d) r4r5r6r"rrrrr'rr[r\s@rrr s+%  ,> 3  rrcdeZdZdZfdZfdZdZdZdZfdZ dZ d Z d Z fd Z xZS) DependencyAwareCachez A cache implementation that tracks dependencies between nodes and manages their execution and caching accordingly. It extends the BasicCache class. Nodes are removed from this cache once all of their descendants have been executed. c^t||i|_i|_t |_y)z Initialize the DependencyAwareCache. Args: key_class: The class used for generating cache keys. N)rRr" descendantsrjr'executed_nodesrs rr"zDependencyAwareCache.__init__Hs+ #!ercP|jj|jj|jj|jj|j jt |||||j||y)a3 Clear the entire cache and rebuild the dependency graph. Args: dynprompt: The dynamic prompt object containing node information. node_ids: List of node IDs to initialize the cache for. is_changed_cache: Flag indicating if the cache has changed. N) rclearrrrjrrRr_build_dependency_graphrSs rrzDependencyAwareCache.set_promptTs      !!# 9h0@A $$Y9rc|jj|jj|D]0}t|j|<t|j|<2|D]x}|j |d}|j D]O}t |s|d}|j|j||j|j|Qzy)z Build the dependency graph for all nodes. Args: dynprompt: The dynamic prompt object containing node information. node_ids: List of node IDs to build the graph for. rorN)rrrjr'rXrradd)rrr r0ro input_datarls rrz,DependencyAwareCache._build_dependency_graphjs   G(+D  W %&)eDNN7 #  G''0:F$mmo :&",Q-K$$[155g>NN7+// < . rc|j|||jj||j|y)z Mark a node as executed and store its value in the cache. Args: node_id: The ID of the node to store. value: The value to store for the node. N)rrr_cleanup_ancestorsrs rr'zDependencyAwareCache.sets6 GU+ ( (rc$|j|S)z Retrieve the cached value for a node. Args: node_id: The ID of the node to retrieve. Returns: The cached value for the node. )rr/s rrzDependencyAwareCache.gets""7++rct|||}|D]>}|j|j||j|j|@|S)a! Ensure a subcache exists for a node and update dependencies. Args: node_id: The ID of the parent node. children_ids: List of child node IDs to associate with the parent node. Returns: The subcache object for the node. )rRrrrrj)rr0rrrrTs rrz(DependencyAwareCache.ensure_subcache_forsW7+G\B$H   W % ) )( 3 NN8 $ ( ( 1%rcjj|gD]D}|jvstfdj|Ds4j |Fy)z Check if ancestors of a node can be removed from the cache. Args: node_id: The ID of the node whose ancestors are to be checked. c3:K|]}|jvywr)r).0 descendantrs r z:DependencyAwareCache._cleanup_ancestors..siKhZzT%8%88KhsN)rjrrallr _remove_node)rr0rls` rrz'DependencyAwareCache._cleanup_ancestorssV >>--gr:Kd111i4K[K[\gKhii%%k2 ;rc|jj|}||jvr |j|=|jj|}||jvr|j|=yy)zq Remove a node from the cache. Args: node_id: The ID of the node to remove. N)rr1rr3r)rr0rrs rrz!DependencyAwareCache._remove_nodese&&33G<  " 9%))::7C 4>> )|, *rcy)zW Clean up unused nodes. This is a no-op for this cache implementation. Nr7r(s rrz!DependencyAwareCache.clean_unuseds rct|}|j|j|jt |j d|S)z Dump the cache and dependency graph for debugging. Returns: A list containing the cache state and dependency graph. )rrjr)rRrrgrrjlistr)rrrTs rrz)DependencyAwareCache.recursive_debug_dumpsH-/ ++"4#6#67   r)r4r5r6__doc__r"rrr'rrrrrrr[r\s@rrr@s? $:,=, ) ," 3 -  rr)rItypingrrrcomfy_execution.graphrrcomfy_execution.graph_utilsrrrArB__annotations__rrr9rGrPr^r}rrrr7rrrs**/ /13tCI35354555."" HKH Ci CiJSSj$= $=L2z2jW:Wr