
    +j8                        S SK JrJr  S SKrS SKrS SKrS SKJrJr  S SK	J
r
JrJr  \r " S S\5      r " S S\5      r " S	 S
\5      r " S S5      r SS\\
   S\S\S-  S\\\S   \4   \S   -  4S jjr " S S5      r " S S\5      rg)    )TypeLiteralN)is_linkExecutionBlocker)ComfyNodeABCInputTypeDictInputTypeOptionsc                       \ rS rSrSrg)DependencyCycleError    N__name__
__module____qualname____firstlineno____static_attributes__r       5/home/wildlama/comfy/ComfyUI/comfy_execution/graph.pyr   r          r   r   c                       \ rS rSrSrg)NodeInputError   r   Nr   r   r   r   r   r      r   r   r   c                       \ rS rSrSrg)NodeNotFoundError   r   Nr   r   r   r   r   r      r   r   r   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)DynamicPrompt   c                 :    Xl         0 U l        0 U l        0 U l        g N)original_promptephemeral_promptephemeral_parentsephemeral_display)selfr"   s     r   __init__DynamicPrompt.__init__   s     . "!#!#r   c                     XR                   ;   a  U R                   U   $ XR                  ;   a  U R                  U   $ [        SU S35      e)NNode z
 not found)r#   r"   r   r&   node_ids     r   get_nodeDynamicPrompt.get_node   sP    +++((11***''00%y
 ;<<r   c                 H    XR                   ;   =(       d    XR                  ;   $ r!   )r"   r#   r+   s     r   has_nodeDynamicPrompt.has_node%   s    ...R'=R=R2RRr   c                 X    X R                   U'   X0R                  U'   X@R                  U'   g r!   )r#   r$   r%   )r&   r,   	node_info	parent_id
display_ids        r   add_ephemeral_node DynamicPrompt.add_ephemeral_node(   s,    )2g&*3w'*4w'r   c                 d    XR                   ;   a   U R                   U   nXR                   ;   a  M   U$ r!   )r$   r+   s     r   get_real_node_idDynamicPrompt.get_real_node_id-   1    ///,,W5G ///r   c                 :    U R                   R                  US 5      $ r!   )r$   getr+   s     r   get_parent_node_id DynamicPrompt.get_parent_node_id2   s    %%))'488r   c                 d    XR                   ;   a   U R                   U   nXR                   ;   a  M   U$ r!   )r%   r+   s     r   get_display_node_id!DynamicPrompt.get_display_node_id5   r;   r   c                     [        U R                  R                  5       5      R                  [        U R                  R                  5       5      5      $ r!   )setr"   keysunionr#   r&   s    r   all_node_idsDynamicPrompt.all_node_ids:   s;    4'',,./55c$:O:O:T:T:V6WXXr   c                     U R                   $ r!   )r"   rG   s    r   get_original_prompt!DynamicPrompt.get_original_prompt=   s    ###r   )r%   r$   r#   r"   N)r   r   r   r   r'   r-   r0   r6   r9   r>   rA   rH   rK   r   r   r   r   r   r      s1    $=S5

9
Y$r   r   	class_def
input_namevalid_inputsreturn)requiredoptionalhiddenNNNc                    U=(       d    U R                  5       nSnSnSU;   a  XS   ;   a  SnUS   U   nO1SU;   a  XS   ;   a  SnUS   U   nOSU;   a  XS   ;   a
  SnUS   U   nUc  gUS   n[        U5      S:  a  US   nO0 nXTU4$ )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.
NrQ   rR   rS   rT   r      )INPUT_TYPESlen)rM   rN   rO   
input_infoinput_category
input_type
extra_infos          r   get_input_infor]   @   s       :9#8#8#:LJN\!j4L&L#!*-j9
	|	#
:6N(N#!*-j9
	\	!j4J&J!!(+J7
AJ
:]

 z11r   c                   T    \ rS rSrS rS rS rS rSS jrS r	S	 r
S
 rS rS rSrg)TopologicalSortj   c                 |    Xl         0 U l        0 U l        0 U l        SU l        [
        R                  " 5       U l        g Nr   )	dynpromptpendingNodes
blockCountblockingexternalBlocksasyncioEventunblockedEvent)r&   rc   s     r   r'   TopologicalSort.__init__k   s3    "%mmor   c                 z    U R                   R                  U5      S   n[        R                  U   n[	        XB5      $ N
class_type)rc   r-   nodesNODE_CLASS_MAPPINGSr]   )r&   	unique_idrN   rn   rM   s        r   r]   TopologicalSort.get_input_infos   s6    ^^,,Y7E
--j9	i44r   c                     U R                   R                  U5      S   nX#;  a  [        SU SU S35      eX2   n[        U5      (       d  [        SU SU S35      eUu  pVU R	                  XVU5        g )Ninputsr*   z says it needs input z+, but there is no input to that node at allz, but that value is a constant)rc   r-   r   r   add_strong_link)r&   
to_node_idto_inputrt   valuefrom_node_idfrom_sockets          r   make_input_strong_link&TopologicalSort.make_input_strong_linkx   s    ((4X>! 54I(S~!  A  A u~~ 54I(Sq!rss$)!\
Cr   c                     U R                  U5      (       db  U R                  U5        X0R                  U   ;  a)  0 U R                  U   U'   U R                  U==   S-  ss'   SU R                  U   U   U'   g g )NrV   T)	is_cachedadd_noderf   re   )r&   ry   rz   rv   s       r   ru   TopologicalSort.add_strong_link   sp    ~~l++MM,'|!<<:<l+J7
+q0+CGDMM,'
3K@ ,r   Nc                    U/n/ n[        U5      S:  Ga%  UR                  5       nX`R                  ;   a  M1  SU R                  U'   SU R                  U'   0 U R                  U'   U R
                  R                  U5      S   nU H  nXx   n	[        U	5      (       d  M  U	u  pUb  X;  a  M'  U R                  Xh5      u    pUS L=(       a    SU;   =(       a    US   nU(       d	  U(       a  Mg  U R                  U
5      (       d  UR                  U
5        UR                  XU45        M     [        U5      S:  a  GM%  U H  nU R                  " U6   M     g )Nr   Trt   lazy)rX   poprd   re   rf   rc   r-   r   r]   r~   appendru   )r&   node_unique_idinclude_lazysubgraph_nodesnode_idslinksrq   rt   rN   rx   ry   rz   _rY   is_lazylinks                   r   r   TopologicalSort.add_node   s;   "#(ma I---+/Di()*DOOI&')DMM)$^^,,Y7AF$
*5>>05-L%1l6X '+':':9'Q$Aq(4d:9MdR\]cRdG$GG#~~l;;$OOL9l%KL % (ma. D  $' r   c                    ^ ^ TT R                   ;   d   S5       eT =R                  S-  sl        T R                   T==   S-  ss'   UU 4S jnU$ )Nz5Can't add external block to a node that isn't pendingrV   c                     > T=R                   S-  sl         TR                  T ==   S-  ss'   TR                  R                  5         g NrV   )rg   re   rj   rD   )r,   r&   s   r   unblock3TopologicalSort.add_external_block.<locals>.unblock   s:    1$OOG$)$##%r   )re   rg   )r&   r,   r   s   `` r   add_external_block"TopologicalSort.add_external_block   sL    $//)b+bb)q  A% 	& r   c                     g)NFr   r+   s     r   r~   TopologicalSort.is_cached   s    r   c                 n    U R                    Vs/ s H  oR                  U   S:X  d  M  UPM     sn$ s  snf rb   )rd   re   r+   s     r   get_ready_nodesTopologicalSort.get_ready_nodes   s1    '+'8'8Z'8GOOG<TXY<Y'8ZZZs   22c                     U R                   U	 U R                  U    H  nU R                  U==   S-  ss'   M     U R                  U	 g r   )rd   rf   re   )r&   rq   blocked_node_ids      r   pop_nodeTopologicalSort.pop_node   sC    i(#}}Y7OOOO,1,  8MM)$r   c                 2    [        U R                  5      S:H  $ rb   )rX   rd   rG   s    r   is_emptyTopologicalSort.is_empty   s    4$$%**r   )re   rf   rc   rg   rd   rj   )FN)r   r   r   r   r'   r]   r{   ru   r   r   r~   r   r   r   r   r   r   r   r_   r_   j   s7    .5
DH(<[%+r   r_   c                   n   ^  \ rS rSrSrU 4S jrS rS rS rS r	U 4S jr
S	 rS
 rS rS rS rSrU =r$ )ExecutionList   z
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                 Z   > [         TU ]  U5        X l        S U l        0 U l        0 U l        g r!   )superr'   output_cachestaged_node_idexecution_cacheexecution_cache_listeners)r&   rc   r   	__class__s      r   r'   ExecutionList.__init__   s.    #("!)+&r   c                 <    U R                   R                  U5      S L$ r!   )r   	get_localr+   s     r   r~   ExecutionList.is_cached   s      **734??r   c                    X R                   ;  a  0 U R                   U'   U R                  R                  U5      U R                   U   U'   XR                  ;  a  [	        5       U R                  U'   U R                  U   R                  U5        g r!   )r   r   r   r   rD   add)r&   ry   rv   s      r   
cache_linkExecutionList.cache_link   s|    111/1D  ,9=9J9J9T9TUa9bZ(6===;>5D**<8&&|488Dr   c                     X R                   ;  a  g U R                   U   R                  U5      nUc  g U R                  R                  X5        U$ r!   )r   r=   r   	set_local)r&   ry   rv   rx   s       r   	get_cacheExecutionList.get_cache   sM    111$$Z044\B=##L8r   c                     XR                   ;   a9  U R                   U    H%  nX0R                  ;   d  M  X R                  U   U'   M'     g g r!   )r   r   )r&   r,   rx   rv   s       r   cache_updateExecutionList.cache_update   sH    444"<<WE
!5!55@E((4W= F 5r   c                 H   > [         TU ]  XU5        U R                  X5        g r!   )r   ru   r   )r&   ry   rz   rv   r   s       r   ru   ExecutionList.add_strong_link   s    :F1r   c                   #    U R                   b   eU R                  5       (       a  gU R                  5       n[        U5      S:X  a}  U R                  S:  am  U R
                  R                  5       I S h  vN   U R
                  R                  5         U R                  5       n[        U5      S:X  a  U R                  S:  a  Mm  [        U5      S:X  ab  U R                  5       nUS   nU H'  nU R                  R                  U5      nXT:w  d  M%  Un  O   [        S5      nU[        U5      S/ / S.nS Xv4$ U R                  U5      U l         U R                   S S 4$  N7f)NrT   r   zDependency cycle detectedzgraph.DependencyCycleError)r,   exception_messageexception_type	tracebackcurrent_inputs)r   r   r   rX   rg   rj   waitclearget_nodes_in_cyclerc   rA   r   strux_friendly_pick_node)r&   	availablecycled_nodesblamed_noder,   display_node_idexerror_detailss           r   stage_node_execution"ExecutionList.stage_node_execution   sQ    ""***==??#((*	)n!d&9&9A&=%%**,,,%%',,.I	 )n!d&9&9A&=
 y>Q224L 'q/K'"&.."D"DW"M"-"1K	 (
 &&ABB&%(W">"$M **"88C""D$..1 -s!   A2E4E5AEAEAEc                 l  ^  U 4S jnU 4S jnU H!  nU" U5      (       d  U" U5      (       d  M  Us  $    U H,  nT R                   U    H  nU" U5      (       d  M  Us  s  $    M.     U HD  nT R                   U    H.  nT R                   U    H  nU" U5      (       d  M  Us  s  s  $    M0     MF     US   $ )Nc                    > TR                   R                  U 5      S   n[        R                  U   n[	        US5      (       a  UR
                  S:X  a  gg)Nrn   OUTPUT_NODETF)rc   r-   ro   rp   hasattrr   r,   rn   rM   r&   s      r   	is_output6ExecutionList.ux_friendly_pick_node.<locals>.is_output  sL    009,GJ11*=Iy-00Y5J5Jd5Rr   c                    > TR                   R                  U 5      S   n[        R                  U   n[        R
                  " [        X"R                  5      5      $ rm   )rc   r-   ro   rp   inspectiscoroutinefunctiongetattrFUNCTIONr   s      r   is_async5ExecutionList.ux_friendly_pick_node.<locals>.is_async  sH    009,GJ11*=I..wyBTBT/UVVr   r   )rf   )r&   	node_listr   r   r,   r   blocked_node_id1s   `      r   r   #ExecutionList.ux_friendly_pick_node  s    
		W
 !G!!Xg%6%6 !
 !G#'==#9_--"N $: ! !G#'==#9(,o(F$ !122& )G $: ! |r   c                 0    U R                   c   eS U l         g r!   )r   rG   s    r   unstage_node_execution$ExecutionList.unstage_node_execution4  s    ""..."r   c                     U R                   nU R                  U5        U R                  R                  US 5        U R                  R                  US 5        S U l         g r!   )r   r   r   r   r   r+   s     r   complete_node_execution%ExecutionList.complete_node_execution8  sM    %%g  $/&&**7D9"r   c                 P   U R                    Vs0 s H  o0 _M     nnU R                   HF  nU R                  U    H0  nSU R                  U   U   R                  5       ;   d  M)  SX$   U'   M2     MH     U Vs/ s H  n[        X!   5      S:X  d  M  UPM     nn[        U5      S:  aY  U H  nU H  nXU   ;   d  M  X$   U	 M     X!	 M     U Vs/ s H  n[        X!   5      S:X  d  M  UPM     nn[        U5      S:  a  MY  [	        UR                  5       5      $ s  snf s  snf s  snf )NTr   )rd   rf   valuesrX   listrE   )r&   r,   
blocked_byry   rv   	to_removes         r   r    ExecutionList.get_nodes_in_cycle?  s-    372C2CE2Cw{2C
E MML"mmL9
4==6zBIIKK;?J*<8 : * -7XJ#j>Q:RVW:WWJ	X)nq $",JZ"88&27; #- '	 %
 1;\
Wc*BU>VZ[>[
I\ )nq  JOO%&& F
 Y ]s   D7DDD#'D#)r   r   r   r   )r   r   r   r   __doc__r'   r~   r   r   r   ru   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      sI    ,@EF2/B%N##' 'r   r   r!   )typingr   r   ro   rh   r   comfy_execution.graph_utilsr   r   comfy.comfy_types.node_typingr   r   r	   	Exceptionr   r   r   r   r   tupler]   r_   r   r   r   r   <module>r      s         A W W $ 	9 		Y 			 	)$ )$\ *.(2L!(2(2  $&(2 389;KKLuUeOff	(2TU+ U+nO'O O'r   