
    +j8                     X   d dl mZmZ d dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZ eZ G d de          Z G d de          Z G d	 d
e          Z G d d          Z	 ddee
         dededz  deeed         ef         ed         z  fdZ G d d          Z G d de          ZdS )    )TypeLiteralN)is_linkExecutionBlocker)ComfyNodeABCInputTypeDictInputTypeOptionsc                       e Zd ZdS )DependencyCycleErrorN__name__
__module____qualname__     5/home/wildlama/comfy/ComfyUI/comfy_execution/graph.pyr   r              Dr   r   c                       e Zd ZdS )NodeInputErrorNr   r   r   r   r   r      r   r   r   c                       e Zd ZdS )NodeNotFoundErrorNr   r   r   r   r   r      r   r   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )DynamicPromptc                 >    || _         i | _        i | _        i | _        d S N)original_promptephemeral_promptephemeral_parentsephemeral_display)selfr   s     r   __init__zDynamicPrompt.__init__   s(    . "!#!#r   c                     || j         v r| j         |         S || j        v r| j        |         S t          d| d          )NNode z
 not found)r   r   r   r    node_ids     r   get_nodezDynamicPrompt.get_node   sT    d+++(11d***'00 ; ; ; ;<<<r   c                 &    || j         v p|| j        v S r   )r   r   r$   s     r   has_nodezDynamicPrompt.has_node%   s    $..R'T=R2RRr   c                 B    || j         |<   || j        |<   || j        |<   d S r   )r   r   r   )r    r%   	node_info	parent_id
display_ids        r   add_ephemeral_nodez DynamicPrompt.add_ephemeral_node(   s/    )2g&*3w'*4w'''r   c                 D    || j         v r| j         |         }|| j         v |S r   )r   r$   s     r   get_real_node_idzDynamicPrompt.get_real_node_id-   2    ///,W5G ///r   c                 8    | j                             |d           S r   )r   getr$   s     r   get_parent_node_idz DynamicPrompt.get_parent_node_id2   s    %))'4888r   c                 D    || j         v r| j         |         }|| j         v |S r   )r   r$   s     r   get_display_node_idz!DynamicPrompt.get_display_node_id5   r0   r   c                     t          | j                                                                      t          | j                                                            S r   )setr   keysunionr   r    s    r   all_node_idszDynamicPrompt.all_node_ids:   sD    4',,..//55c$:O:T:T:V:V6W6WXXXr   c                     | j         S r   )r   r:   s    r   get_original_promptz!DynamicPrompt.get_original_prompt=   s    ##r   N)r   r   r   r!   r&   r(   r-   r/   r3   r5   r;   r=   r   r   r   r   r      s        $ $ $= = =S S S5 5 5
  
9 9 9  
Y Y Y$ $ $ $ $r   r   	class_def
input_namevalid_inputsreturn)requiredoptionalhiddenNNNc                 L   |p|                                  }d}d}d|v r||d         v rd}|d         |         }n=d|v r||d         v rd}|d         |         }nd|v r||d         v rd}|d         |         }|dS |d         }t          |          dk    r	|d         }ni }|||fS )a  Get the input type, category, and extra info for a given input name.

    Arguments:
        class_def: The class definition of the node.
        input_name: The name of the input to get info for.
        valid_inputs: The valid inputs for the node, or None to use the class_def.INPUT_TYPES().

    Returns:
        tuple[str, str, dict] | tuple[None, None, None]: The input type, category, and extra info for the input name.
    NrB   rC   rD   rE   r      )INPUT_TYPESlen)r>   r?   r@   
input_infoinput_category
input_type
extra_infos          r   get_input_inforN   @   s       :9#8#8#:#:LJN\!!jL4L&L&L#!*-j9

	|	#	#
l:6N(N(N#!*-j9

	\	!	!jL4J&J&J!!(+J7
AJ
:]


 ~z11r   c                   L    e Zd Zd Zd Zd Zd ZddZd Zd	 Z	d
 Z
d Zd ZdS )TopologicalSortc                 |    || _         i | _        i | _        i | _        d| _        t          j                    | _        d S Nr   )	dynpromptpendingNodes
blockCountblockingexternalBlocksasyncioEventunblockedEvent)r    rS   s     r   r!   zTopologicalSort.__init__k   s;    "%moor   c                     | j                             |          d         }t          j        |         }t	          ||          S N
class_type)rS   r&   nodesNODE_CLASS_MAPPINGSrN   )r    	unique_idr?   r]   r>   s        r   rN   zTopologicalSort.get_input_infos   s9    ^,,Y77E
-j9	i444r   c                    | j                             |          d         }||vrt          d| d| d          ||         }t          |          st          d| d| d          |\  }}|                     |||           d S )Ninputsr#   z says it needs input z+, but there is no input to that node at allz, but that value is a constant)rS   r&   r   r   add_strong_link)r    
to_node_idto_inputrb   valuefrom_node_idfrom_sockets          r   make_input_strong_linkz&TopologicalSort.make_input_strong_linkx   s    ((44X>6!! !!!(!!!  A  A  Ax u~~ 	t !r!r!r(!r!r!rsss$)!k\;
CCCCCr   c                     |                      |          sa|                     |           || j        |         vr%i | j        |         |<   | j        |xx         dz  cc<   d| j        |         |         |<   d S d S )NrG   T)	is_cachedadd_noderV   rU   )r    rg   rh   rd   s       r   rc   zTopologicalSort.add_strong_link   s    ~~l++ 	HMM,'''|!<<<:<l+J7
+++q0+++CGDM,'
3K@@@	H 	Hr   FNc                 f   |g}g }t          |          dk    r|                                }|| j        v r2d| j        |<   d| j        |<   i | j        |<   | j                            |          d         }|D ]}||         }	t          |	          r||	\  }
}||
|vr%|                     ||          \  }}}|d uod|v o|d         }|s|sB| 	                    |
          s|
                    |
           |
                    |
||f           t          |          dk    |D ]} | j        |  d S )Nr   Trb   lazy)rI   poprT   rU   rV   rS   r&   r   rN   rk   appendrc   )r    node_unique_idinclude_lazysubgraph_nodesnode_idslinksr`   rb   r?   rf   rg   rh   _rJ   is_lazylinks                   r   rl   zTopologicalSort.add_node   s   "#(mma ID---+/Di()*DOI&')DM)$^,,Y77AF$ M M
z*5>> 	M05-L+%1l.6X6X '+':':9j'Q'Q$Aq*(4d:9MdR\]cRdG$ MG M#~~l;; :$OOL999lK%KLLL+ (mma.  	( 	(D D $'''	( 	(r   c                       j         v s
J d             xj        dz  c_         j         xx         dz  cc<    fd}|S )Nz5Can't add external block to a node that isn't pendingrG   c                      xj         dz  c_         j         xx         dz  cc<   j                                         d S NrG   )rW   rU   rZ   r7   )r%   r    s   r   unblockz3TopologicalSort.add_external_block.<locals>.unblock   sP    1$OG$$$)$$$##%%%%%r   )rU   rW   )r    r%   r|   s   `` r   add_external_blockz"TopologicalSort.add_external_block   sw    $/)))+b)))q    A%   	& 	& 	& 	& 	& 	& r   c                     dS )NFr   r$   s     r   rk   zTopologicalSort.is_cached   s    ur   c                 *      fd j         D             S )Nc                 6    g | ]}j         |         d k    |S r   )rU   ).0r%   r    s     r   
<listcomp>z3TopologicalSort.get_ready_nodes.<locals>.<listcomp>   s+    ZZZGDOG<TXY<Y<Y<Y<Y<Yr   )rT   r:   s   `r   get_ready_nodeszTopologicalSort.get_ready_nodes   s     ZZZZt'8ZZZZr   c                 p    | j         |= | j        |         D ]}| j        |xx         dz  cc<   | j        |= d S r{   )rT   rV   rU   )r    r`   blocked_node_ids      r   pop_nodezTopologicalSort.pop_node   sT    i(#}Y7 	2 	2OOO,,,1,,,,M)$$$r   c                 2    t          | j                  dk    S rR   )rI   rT   r:   s    r   is_emptyzTopologicalSort.is_empty   s    4$%%**r   )FN)r   r   r   r!   rN   ri   rc   rl   r}   rk   r   r   r   r   r   r   rP   rP   j   s        . . .5 5 5
D D DH H H( ( ( (<    [ [ [% % %+ + + + +r   rP   c                   b     e Zd ZdZ fdZd Zd Zd Zd Z fdZ	d Z
d	 Zd
 Zd Zd Z xZS )ExecutionListz
    ExecutionList implements a topological dissolve of the graph. After a node is staged for execution,
    it can still be returned to the graph after having further dependencies added.
    c                     t                                          |           || _        d | _        i | _        i | _        d S r   )superr!   output_cachestaged_node_idexecution_cacheexecution_cache_listeners)r    rS   r   	__class__s      r   r!   zExecutionList.__init__   sA    ###("!)+&&&r   c                 :    | j                             |          d uS r   )r   	get_localr$   s     r   rk   zExecutionList.is_cached   s     **7334??r   c                     || j         vr
i | j         |<   | j                            |          | j         |         |<   || j        vrt	                      | j        |<   | j        |                             |           d S r   )r   r   r   r   r7   add)r    rg   rd   s      r   
cache_linkzExecutionList.cache_link   s    T111/1D ,9=9J9T9TUa9b9bZ(6t===;>55D*<8&|488DDDDDr   c                     || j         vrd S | j         |                             |          }|d S | j                            ||           |S r   )r   r2   r   	set_local)r    rg   rd   rf   s       r   	get_cachezExecutionList.get_cache   sX    T1114$Z044\BB=4##L%888r   c                 n    || j         v r)| j         |         D ]}|| j        v r|| j        |         |<   d S d S r   )r   r   )r    r%   rf   rd   s       r   cache_updatezExecutionList.cache_update   s^    d444"<WE F F
!555@ED(4W= 54F Fr   c                 z    t                                          |||           |                     ||           d S r   )r   rc   r   )r    rg   rh   rd   r   s       r   rc   zExecutionList.add_strong_link   s9    k:FFFj11111r   c                   K   | j         J |                                 rdS |                                 }t          |          dk    ru| j        dk    rj| j                                         d {V  | j                                         |                                 }t          |          dk    r| j        dk    jt          |          dk    rn|                                 }|d         }|D ]&}| j	        
                    |          }||k    r|} n't          d          }|t          |          dg g d}d ||fS |                     |          | _         | j         d d fS )NrE   r   zDependency cycle detectedzgraph.DependencyCycleError)r%   exception_messageexception_type	tracebackcurrent_inputs)r   r   r   rI   rW   rZ   waitclearget_nodes_in_cyclerS   r5   r   strux_friendly_pick_node)r    	availablecycled_nodesblamed_noder%   display_node_idexerror_detailss           r   stage_node_executionz"ExecutionList.stage_node_execution   s     "***==?? 	$##((**	)nn!!d&9A&=&=%**,,,,,,,,,%%''',,..I	 )nn!!d&9A&=&=
 y>>Q2244L 'q/K'  "&."D"DW"M"M"g--"1KE . &&ABBB&%(WW">"$ M **"88CC"D$..r   c                 "     fd} fd}|D ]} ||          s ||          r|c S |D ]#} j         |         D ]} ||          r|c c S $|D ]5} j         |         D ]%} j         |         D ]} ||          r|c c c S &6|d         S )Nc                     j                             |           d         }t          j        |         }t	          |d          r|j        dk    rdS dS )Nr]   OUTPUT_NODETF)rS   r&   r^   r_   hasattrr   r%   r]   r>   r    s      r   	is_outputz6ExecutionList.ux_friendly_pick_node.<locals>.is_output  sS    0099,GJ1*=Iy-00 Y5Jd5R5Rt5r   c                     j                             |           d         }t          j        |         }t	          j        t          ||j                            S r\   )rS   r&   r^   r_   inspectiscoroutinefunctiongetattrFUNCTIONr   s      r   is_asyncz5ExecutionList.ux_friendly_pick_node.<locals>.is_async  sH    0099,GJ1*=I.wy)BT/U/UVVVr   r   )rV   )r    	node_listr   r   r%   r   blocked_node_id1s   `      r   r   z#ExecutionList.ux_friendly_pick_node  sI   
	 	 	 	 		W 	W 	W 	W 	W
 ! 	 	Gy!! XXg%6%6  ! 	# 	#G#'=#9 # #9_-- #"NNNNN##
 ! 	' 	'G#'=#9 ' '(,o(F ' '$ y!122 '&''' |r   c                 &    | j         J d | _         d S r   )r   r:   s    r   unstage_node_executionz$ExecutionList.unstage_node_execution4  s    "..."r   c                     | j         }|                     |           | j                            |d            | j                            |d            d | _         d S r   )r   r   r   ro   r   r$   s     r   complete_node_executionz%ExecutionList.complete_node_execution8  s\    %g  $///&**7D999"r   c                    d | j         D             | j        D ]D}| j        |         D ]4}d| j        |         |                                         v rd|         |<   5EfdD             }t          |          dk    rA|D ]}D ]}||         v r	|         |= |= fdD             }t          |          dk    At	                                                    S )Nc                     i | ]}|i S r   r   )r   r%   s     r   
<dictcomp>z4ExecutionList.get_nodes_in_cycle.<locals>.<dictcomp>C  s    EEEwwEEEr   Tc                 F    g | ]}t          |                   d k    |S r   rI   r   r%   
blocked_bys     r   r   z4ExecutionList.get_nodes_in_cycle.<locals>.<listcomp>H  s1    XXX#j>Q:R:RVW:W:WW:W:W:Wr   r   c                 F    g | ]}t          |                   d k    |S r   r   r   s     r   r   z4ExecutionList.get_nodes_in_cycle.<locals>.<listcomp>O  s1    \\\Wc*WBU>V>VZ[>[>[>[>[>[r   )rT   rV   valuesrI   listr8   )r    rg   rd   	to_remover%   r   s        @r   r   z ExecutionList.get_nodes_in_cycle?  s:    FE$2CEEE
 M 	@ 	@L"mL9 @ @
4=6zBIIKKKK;?Jz*<8@ YXXXJXXX	)nnq  $ ( (", < <J*Z"888&z27;w''\\\\
\\\I )nnq   JOO%%&&&r   )r   r   r   __doc__r!   rk   r   r   r   rc   r   r   r   r   r   __classcell__)r   s   @r   r   r      s         , , , , ,@ @ @E E E  F F F2 2 2 2 2/ / /B% % %N# # ## # #' ' ' ' ' ' 'r   r   r   )typingr   r   r^   rX   r   comfy_execution.graph_utilsr   r   comfy.comfy_types.node_typingr   r   r	   	Exceptionr   r   r   r   r   tuplerN   rP   r   r   r   r   <module>r      s                      A A A A A A A A W W W W W W W W W W $ 	 	 	 	 	9 	 	 		 	 	 	 	Y 	 	 		 	 	 	 		 	 	 	)$ )$ )$ )$ )$ )$ )$ )$\ *.(2 (2L!(2(2  $&(2 389;KKLuUeOff	(2 (2 (2 (2TU+ U+ U+ U+ U+ U+ U+ U+nO' O' O' O' O'O O' O' O' O' O'r   