
    +jj                    "   d dl mZ d dlmZmZ d dlmZmZ d dlZ	d dl
Z
d dlZd dlZ	erd dlmZ d Zd Zd Zd	 Zd
 Z G d d          Z G d dej                  Z G d d          Z G d dej                  Z G d de          Zd ZdS )    )annotations)TYPE_CHECKINGUnion)ioComfyExtensionN)UUIDc                    t          | t                    r(| d         ddd|f         | d         ddd|f         fS | ddd|f         dfS )zAExtract tensor from data, handling both single tensors and lists.r   N   )
isinstancelist)dataoutput_channelss     </home/wildlama/comfy/ComfyUI/comfy_extras/nodes_easycache.py_extract_tensorr      so    $ JAwqqq*?**+T!WQQQ8H8H5H-III#O##$d**    c                6
   |d         }t          |t                    s|                    d          }|s|d         }|d         }t          |d         |j                  \  }}|d         }|d         }||                    |          r | |i |S |                    |          }	|}
d }|                    |          }|r"|                    |           |	                    |          }|j
        r^|r\|j        rt          j        d|j         d	|            |                    ||          }||                    ||d
          }||gS |S |j        r)|d         |_        |                    |          }	d|_        |	r`|                                rV|                    ||d          |j        z
                                                                                                  }|                                r|                                r|j        |z  |j        z  }|xj        |z  c_        |j        |j        k     rj|rh|j        r$t          j        d|j         d|j                    d
|_
        |                    ||          }||                    ||d
          }||gS |S |j        r$t          j        d|j         d|j                    d|_         | |i |}t          ||j                  \  }}|	rB|                                r-|                    ||d          |j        z
                                                                                                  }|j        r6||j        z  }|j                            |                                            |                                r\|j        |z  |j        z  }|j!                            |                                            |j        rt          j        d|            |
||z  |_        |j        rt          j        d|            |"                    ||
|           ||"                    |||d
           |	r|                    |
|          |_        |                    ||          |_        |                                                                                                |_        |j        r!t          j        d|j        j#                    |S )Ntransformer_options	easycacher   sigmasuuidsz6EasyCache [verbose] - was marked to skip this step by z. Present uuids: T)is_audioFclonez=EasyCache [verbose] - skipping step; cumulative_change_rate: , reuse_threshold: zAEasyCache [verbose] - NOT skipping step; cumulative_change_rate:         z1EasyCache [verbose] - approx_output_change_rate: z*EasyCache [verbose] - output_change_rate: z)EasyCache [verbose] - x_prev_subsampled: )$r   dictgetr   r   is_past_end_timestephas_first_cond_uuidshould_do_easycachecheck_metadatacan_apply_cache_diffskip_current_stepverboselogginginfofirst_cond_uuidapply_cache_diffinitial_stephas_x_prev_subsampled	subsamplex_prev_subsampledflattenabsmeanhas_output_prev_norm has_relative_transformation_raterelative_transformation_rateoutput_prev_normcumulative_change_ratereuse_thresholdoutput_prev_subsampledoutput_change_ratesappenditemapprox_output_change_ratesupdate_cache_diffshape)executorargskwargsr   r   xaxr   r   r!   next_x_previnput_changedo_easycacher$   resultresult_audioapprox_output_change_ratefull_outputoutputaudio_outputoutput_changeoutput_change_rates                         r   easycache_forward_wrapperrO      s   %)"X)400 +$jj)>??" 	+"&r(!4[!AIDGY%>??EAr *F(Ei<<VDDx((((#77>>KL0088L $;  ###(==eDD& 	+? 	  K  JV_Vo  J  J  CH  J  J  K  K  K//599F~(99"ed9SS--M! 	+(-aI%"+"?"?"F"F%*I" 	;..00 A ) 3 3AuE 3 J JYMh hqqsswwyy~~   A   A--// ;I4^4^4`4` ;-6-SVb-bfo  gA  -A)004MM003i6OOOThO ( w  &ven  fF  &v  &v  [d  [t  &v  &v  w  w  w26I/&775AAF~'0'A'A"eVZ'A'['[ &55!M ( {  &zir  jJ  &z  &z  _h  _x  &z  &z  {  {  {7:I4 ($ 9& 9 9K*;	8QRRFL \y==?? \",,VU%,HH9Kkkttvvzz||  B  B  D  D 	L!.1K!K)001C1H1H1J1JKKK5577 	n)2)OR^)^bkb|(|%0778Q8V8V8X8XYYY  nlQjllmmm#5B\5QI2 	\LZFXZZ[[[U;;;##L"ed#KKK j&/&9&9+u&M&M	#+4+>+>vu+M+M	(%+^^%5%5%9%9%;%;%@%@%B%B	" 	jLhYE`Efhhiiir   c                   |d         }|d         }|d         d         }|                     |          r | |i |S |d         d d d |j        f         }|}d }|                    |          }	|	rf|                    |           |                                r<|                                rU|                    |d          |j        z
                                                                  	                                }|
                                r|                                r|j        |z  |j        z  }
|xj        |
z  c_        |j        |j        k     rG|j        r$t#          j        d|j         d	|j                    d
|_        |                    |          S |j        r$t#          j        d|j         d	|j                    d|_         | |i |}|
                                r,|                    |d          |j        z
                                                                  	                                }|j        r6||j        z  }|j                            |                                           |                                r\|j        |z  |j        z  }
|j                            |
                                           |j        rt#          j        d|
            |
||z  |_        |j        rt#          j        d|            |                    ||           |                    |          |_        |                    |          |_        |                                                                	                                |_        |j        r!t#          j        d|j        j                    |S )Nr
      r   r   r   Fr   z=LazyCache [verbose] - skipping step; cumulative_change_rate: r   TzALazyCache [verbose] - NOT skipping step; cumulative_change_rate: r   z1LazyCache [verbose] - approx_output_change_rate: z*LazyCache [verbose] - output_change_rate: z)LazyCache [verbose] - x_prev_subsampled: )r    r   r"   r#   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r&   r'   r(   r%   r*   r8   r9   r:   r;   r<   r=   r>   )r?   r@   rA   timestepmodel_optionsr   rB   rD   rE   rF   rI   rK   rM   rN   s                 r   lazycache_predict_noise_wrapperrT   h   sN   1gH#AwM!./D!Ek!RI%%h// )x((((1gaaa!;)";!;;<AKL00::L ;  ###**,, 	;..00 z ) 3 3AU 3 C CiFa ajjllpprrwwyy--// ;I4^4^4`4` ;-6-SVb-bfo  gA  -A)004MM003i6OOO ( w  &ven  fF  &v  &v  [d  [t  &v  &v  w  w  w26I/$55a888 ( {  &zir  jJ  &z  &z  _h  _x  &z  &z  {  {  {7:I4#8T4V44F%%'' \",,V5,AAIDddmmoossuuzz|| 	L!.1K!K)001C1H1H1J1JKKK5577 	n)2)OR^)^bkb|(|%0778Q8V8V8X8XYYY  nlQjllmmm#5B\5QI2 	\LZFXZZ[[[444"+"5"5k"B"BI'0':':6'B'BI$!'!1!1!5!5!7!7!<!<!>!>I fdA\AbddeeeMr   c                L    |d         }|d         d         }d|_          | |i |S )Nr   r   r   F)r%   )r?   r@   rA   rS   r   s        r   !easycache_calc_cond_batch_wrapperrV      s8    HM!./D!Ek!RI"'I8T$V$$$r   c                   	 | j         }|j        }t          j                            |          |_        |j        d         d                                                             |j        j        j                  |j        d         d<   |j        d         d         }t          j
        |j         d|j         d|j         d|j                     | |i ||j        d         d         }|j        }|j        }|j        r\t          j
        |j         dt%          |           d|            t          j
        |j         dt%          |           d|            t%          |d	                   d
z
  }	 |||j        z
  z  }	n# t(          $ r d}	Y nw xY wt          j
        |j         d|j         d| d|	dd           |                                 ||_        S # |j        d         d         }|j        }|j        }|j        r\t          j
        |j         dt%          |           d|            t          j
        |j         dt%          |           d|            t%          |d	                   d
z
  }	 |||j        z
  z  }	n# t(          $ r d}	Y nw xY wt          j
        |j         d|j         d| d|	dd           |                                 ||_        w xY w)z
    This OUTER_SAMPLE wrapper makes sure easycache is prepped for current run, and all memory usage is cleared at the end.
    r   r   z enabled - threshold: z, start_percent: z, end_percent: z! [verbose] - output_change_rates z: z( [verbose] - approx_output_change_rates    r
         ?z - skipped /z steps (z.2fzx speedup).)	class_objrS   comfymodel_patchercreate_model_options_cloner   prepare_timestepsmodelmodel_samplingr'   r(   namer7   start_percentend_percentr9   r<   r&   lentotal_steps_skippedZeroDivisionErrorreset)
r?   r@   rA   guiderorig_model_optionsr   r9   r<   total_stepsspeedups
             r   easycache_sample_wrapperrm      sF   2##1$2MMN`aaCICWXmCnozC{  DB  DB  DD  DD  DV  DV  W]  Wk  Wq  W@  DA  DA23K@=C=QRg=hit=u		  j  ji>W  j  jjs  kB  j  j  S\  Sh  j  j  	k  	k  	kx(((()>?L	';%.%I" 	ULIN~~SQdMeMe~~i|~~LIN  T  TTWXrTsTs  T  T  xR  T  T  U  U  U$q'll1n	!;y/L#LMGG  	 	 	GGG		  A  A93P  A  AS^  A  Aho  A  A  A  A  	B  	B  	B1 ()>?L	';%.%I" 	ULIN~~SQdMeMe~~i|~~LIN  T  TTWXrTsTs  T  T  xR  T  T  U  U  U$q'll1n	!;y/L#LMGG  	 	 	GGG		  A  A93P  A  AS^  A  Aho  A  A  A  A  	B  	B  	B11111sD   CG 3FFFBK8JKJKJA
Kc                      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 Z
d+d,dZd-dZd.d/d Zd.d0d"Zd-d#Zd1d$Zd% Zd& ZdS )2EasyCacheHolderFNr7   floatrc   rd   subsample_factorintoffload_cache_diffboolr&   r   c                r   d| _         || _        || _        || _        || _        || _        || _        d| _        d| _        d | _	        d| _
        d| _        d| _        d | _        d | _        d | _        d | _        i | _        i | _        g | _        g | _        d| _        d| _        d| _        d | _        || _        d S )N	EasyCacher   TFr   )rb   r7   rc   rd   rq   rs   r&   start_tend_tr4   r6   r+   r%   r)   r.   r8   r5   uuid_cache_diffsuuid_cache_diffs_audior9   r<   rf   allow_mismatchcut_from_startstate_metadatar   selfr7   rc   rd   rq   rs   r&   r   s           r   __init__zEasyCacheHolder.__init__   s    	.*& 0"4
37)&)# !&#/348#.2:<@B##% *,'#$ """.r   rR   returnc                J    |d         | j         k                                     S Nr   rx   r;   r   rR   s     r   r    z$EasyCacheHolder.is_past_end_timestep   "    QK$*,224444r   c                H    |d         | j         k                                    S r   rw   r;   r   s     r   r"   z#EasyCacheHolder.should_do_easycache       t|+11333r   c                    | j         d uS Nr.   r   s    r   r,   z%EasyCacheHolder.has_x_prev_subsampled       %T11r   c                    | j         d uS r   r8   r   s    r   has_output_prev_subsampledz*EasyCacheHolder.has_output_prev_subsampled       *$66r   c                    | j         d uS r   r5   r   s    r   r2   z$EasyCacheHolder.has_output_prev_norm       $D00r   c                    | j         d uS r   r4   r   s    r   r3   z0EasyCacheHolder.has_relative_transformation_rate       0<<r   c                    |                     | j                  | _        |                     | j                  | _        | S r   percent_to_sigmarc   rw   rd   rx   r   ra   s     r   r_   z!EasyCacheHolder.prepare_timesteps   7    %66t7IJJ#44T5EFF
r   TrB   torch.Tensorr   
list[UUID]r   c                ^   |j         d         t          |          z  }|                    | j                  }| j        dk    r?|||z  |dz   |z  dd d | j        d d | j        f         }|r|                                S |S |||z  |dz   |z  df         }|r|                                S |S )Nr   r
   .)r>   re   indexr)   rq   r   )r   rB   r   r   batch_offsetuuid_idx	to_returns          r   r-   zEasyCacheHolder.subsample   s    wqzSZZ/;;t344 1$$(</!\0II3PgPgRVRgPg  jA  jAko  lA  jA  A  BI ) (((h|+XaZ,EEsJK	 	%??$$$r   c                :     t           fd|D                       S )Nc              3  *   K   | ]}|j         v V  d S r   )ry   ).0uuidr   s     r   	<genexpr>z7EasyCacheHolder.can_apply_cache_diff.<locals>.<genexpr>
  s+      CCT4400CCCCCCr   )allr   r   s   ` r   r$   z$EasyCacheHolder.can_apply_cache_diff	  s&    CCCCUCCCCCCr   r   c                z   | j         |v r|s| xj        dz  c_        |r| j        n| j        }|j        d         t          |          z  }t          |          D ]a\  }}t          ||z  |dz   |z            g}|j        dd          ||         j        dd          k    r| j        s+t          d| j        |         j         d|j         d          g }	d}
t          ||         j        |j                  D ]\  }}|
rd}

||k    rR| j        r'|	                    t          ||z
  d                      >|	                    t          d |                     b|	                    t          d                      ||	z   }|t          |          xx         ||                             |j                  z  cc<   c|S )Nr
   r   zCached dims  don't match x dims  - this is no goodTF)r)   rf   rz   ry   r>   re   	enumerateslicer{   
ValueErrorzipr|   r:   tupletodevice)r   rB   r   r   cache_diffsr   ir   batch_sliceslicingskip_this_dimdim_udim_xs                r   r*   z EasyCacheHolder.apply_cache_diff  s   5((($$)$$5=Xd114CXwqzSZZ/ '' 	D 	DGAt <1l0BCCDKwqrr{k$/5abb999* H$  &GD4I$4O4U  &G  &Gklkr  &G  &G  &G  H  H  H $$'D(9(?$I$I 
4 
4LE5$ !(- ~~. ?#NN5ud+C+CDDDD#NN5u+=+=>>>>uT{{3333)G3eK  !!![%6%9%9!(%C%CC!!!!r   rK   c                   |r| j         n| j        }|j        dd          |j        dd          k    r| j        s t	          d|j         d|j         d          g }d}t          |j        |j                  D ]\  }}	|sX||	k    rR| j        r'|                    t          |	|z
  d                      nF|                    t          d |                     n"|                    t          d                      d}|t          |                   }||z
  }
|
j        d         t          |          z  }t          |          D ]\  }}|
||z  |dz   |z  df         ||<   d S )	Nr
   zOutput dims r   r   TFr   .)rz   ry   r>   r{   r   r   r|   r:   r   r   re   r   )r   rK   rB   r   r   r   r   skip_dimdim_or   diffr   r   r   s                 r   r=   z!EasyCacheHolder.update_cache_diff)  s   5=Xd114CX<qwqrr{**& o !m!m!mRSRY!m!m!mnnnGH #FL!' : : ! !u 0EUNN* ;uU5[$'?'?@@@@uT5'9'9::::NN5;;/// %..!Azz!}E

2 '' 	M 	MGAt $Q|^QqS,4F%F%K LK	M 	Mr   c                    | j         |v S r   )r)   r   s     r   r!   z#EasyCacheHolder.has_first_cond_uuid@  s    #u,,r   c                    |j         |j        |j        dd          f}| j        	|| _        dS || j        k    rdS t	          j        | j         d           |                                  dS )Nr
   T9 - Tensor shape, dtype or device changed, resetting stateFr   dtyper>   r}   r'   warnrb   rh   r   rB   metadatas      r   r#   zEasyCacheHolder.check_metadataC  sr    Hagqwqrr{3&"*D4t***4	\\\]]]

ur   c                    d| _         d| _        d| _        d| _        g | _        d | _        | `d | _        | `d | _        | `d | _        | `	i | _	        | `
i | _
        d| _        d | _        | S )Nr   TFr   )r4   r6   r+   r%   r9   r)   r.   r8   r5   ry   rz   rf   r}   r   s    r   rh   zEasyCacheHolder.resetN  s    ,/)&)# !&#% #"!%'&*#! $! "'&(##$ "r   c           	     t    t          | j        | j        | j        | j        | j        | j        | j                  S N)r   )ro   r7   rc   rd   rq   rs   r&   r   r   s    r   r   zEasyCacheHolder.clonec  X    t3T5GIY[_[prv  sJ  LP  LX  jn  j~        	r   FNr7   rp   rc   rp   rd   rp   rq   rr   rs   rt   r&   rt   r   rr   rR   rp   r   rt   r   rt   T)rB   r   r   r   r   rt   r   r   )r   r   r   rt   )F)rB   r   r   r   r   rt   )rK   r   rB   r   r   r   r   rt   rB   r   r   rt   )__name__
__module____qualname__r   r    r"   r,   r   r2   r3   r_   r-   r$   r*   r=   r!   r#   rh   r    r   r   ro   ro      sh       / / / / /@5 5 5 54 4 4 42 2 2 27 7 7 71 1 1 1= = = =  
    D D D D    :M M M M M.- - - -	 	 	 	  *    r   ro   c                  >    e Zd Zedd            Zedd            ZdS )EasyCacheNoder   	io.Schemac                   t          j        dddddt           j                            dd          t           j                            dd	d
dddd          t           j                            dd	ddddd          t           j                            dd	ddddd          t           j                            dddd          gt           j                            d          g          S )Nrv   z Native EasyCache implementation.advanced/debug/modelTr`   zThe model to add EasyCache to.tooltipr7   r   皙?      @{Gz?'The threshold for reusing cached steps.mindefaultmaxstepr   advancedrc   333333?rY   z5The relative sampling step to begin use of EasyCache.rd   ffffff?z3The relative sampling step to end use of EasyCache.r&   F#Whether to log verbose information.r   r   r   zThe model with EasyCache.node_iddisplay_namedescriptioncategoryis_experimentalinputsoutputsr   SchemaModelInputFloatBooleanOutputclss    r   define_schemazEasyCacheNode.define_schemah  s   y$:+ w0PQQ0c3CVZ  eN  Y]  ^  ^C3UY  d[  fj  k  k}#tSW  bW  bf  g  g
  EChsw xx (CDD
 
 
 	
r   r`   io.Model.Typer7   rp   rc   rd   r&   rt   io.NodeOutputc           	        |                                 }t          |||dd||j        j        j                  |j        d         d<   |                    t          j        j	        j
        dt                     |                    t          j        j	        j        dt                     |                    t          j        j	        j        dt                     t!          j        |          S )N   Frq   rs   r&   r   r   r   )r   ro   r`   latent_formatlatent_channelsrS   add_wrapper_with_keyr\   patcher_extension
WrappersMPOUTER_SAMPLErm   CALC_COND_BATCHrV   DIFFUSION_MODELrO   r   
NodeOutputr   r`   r7   rc   rd   r&   s         r   executezEasyCacheNode.execute|  s    BQRacpr}  QR  gl  v}  OT  OZ  Oh  Ox  Cy  Cy  Cy12;?""5#:#E#RT_ayzzz""5#:#E#UWb  eF  	G  	G  	G""5#:#E#UWbd}~~~}U###r   Nr   r   r`   r   r7   rp   rc   rp   rd   rp   r&   rt   r   r   r   r   r   classmethodr   r  r   r   r   r   r   g  sR        
 
 
 [
& $ $ $ [$ $ $r   r   c                      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 Zd'd(dZd)dZd*dZd+d Zd! Zd" ZdS ),LazyCacheHolderFNr7   rp   rc   rd   rq   rr   rs   rt   r&   r   c                ,   d| _         || _        || _        || _        || _        || _        || _        d| _        d| _        d | _	        d| _
        d| _        d | _        d | _        d | _        d | _        g | _        g | _        d| _        d | _        || _        d S )N	LazyCacher   Tr   )rb   r7   rc   rd   rq   rs   r&   rw   rx   r4   r6   r+   r.   r8   r5   
cache_diffr9   r<   rf   r}   r   r~   s           r   r   zLazyCacheHolder.__init__  s    	.*& 0"4
37)&)# /348#.2(,#% *,'#$ ".r   r   c                    | j         d uS r   r  r   s    r   has_cache_diffzLazyCacheHolder.has_cache_diff  s    d**r   rR   c                J    |d         | j         k                                     S r   r   r   s     r   r    z$LazyCacheHolder.is_past_end_timestep  r   r   c                H    |d         | j         k                                    S r   r   r   s     r   r"   z#LazyCacheHolder.should_do_easycache  r   r   c                    | j         d uS r   r   r   s    r   r,   z%LazyCacheHolder.has_x_prev_subsampled  r   r   c                    | j         d uS r   r   r   s    r   r   z*LazyCacheHolder.has_output_prev_subsampled  r   r   c                    | j         d uS r   r   r   s    r   r2   z$LazyCacheHolder.has_output_prev_norm  r   r   c                    | j         d uS r   r   r   s    r   r3   z0LazyCacheHolder.has_relative_transformation_rate  r   r   c                    |                     | j                  | _        |                     | j                  | _        | S r   r   r   s     r   r_   z!LazyCacheHolder.prepare_timesteps  r   r   TrB   r   r   c                    | j         dk    r3|dd d | j         d d | j         f         }|r|                                S |S |r|                                S |S )Nr
   .)rq   r   )r   rB   r   r   s       r   r-   zLazyCacheHolder.subsample  sr     1$$#66!668O8O$:O8OOPI ) ((( 	7799r   c                f    | xj         dz  c_         || j                            |j                  z   S )Nr
   )rf   r  r   r   )r   rB   s     r   r*   z LazyCacheHolder.apply_cache_diff  s3      A%  4?%%ah////r   rK   c                    ||z
  | _         d S r   r  )r   rK   rB   s      r   r=   z!LazyCacheHolder.update_cache_diff  s     1*r   c                    |j         |j        |j        f}| j        	|| _        dS || j        k    rdS t	          j        | j         d           |                                  dS )NTr   Fr   r   s      r   r#   zLazyCacheHolder.check_metadata  sj    Hagqw/&"*D4t***4	\\\]]]

ur   c                    d| _         d| _        d| _        g | _        g | _        | `d | _        | `d | _        | `d | _        | `d | _        d| _	        d | _
        | S )Nr   Tr   )r4   r6   r+   r9   r<   r  r.   r8   r5   rf   r}   r   s    r   rh   zLazyCacheHolder.reset  su    ,/)&)# #% *,'O"!%'&*#! $#$ "r   c           	     t    t          | j        | j        | j        | j        | j        | j        | j                  S r   )r  r7   rc   rd   rq   rs   r&   r   r   s    r   r   zLazyCacheHolder.clone  r   r   r   r   r   r   r   )rB   r   r   rt   r   r   )rB   r   )rK   r   rB   r   r   )r   r   r   r   r  r    r"   r,   r   r2   r3   r_   r-   r*   r=   r#   rh   r   r   r   r   r  r    s@       / / / / /4+ + + +5 5 5 54 4 4 42 2 2 27 7 7 71 1 1 1= = = =  
    0 0 0 0% % % %	 	 	 	  $    r   r  c                  >    e Zd Zedd            Zedd            ZdS )LazyCacheNoder   r   c                   t          j        dddddt           j                            dd          t           j                            dd	d
dddd          t           j                            dd	ddddd          t           j                            dd	ddddd          t           j                            dddd          gt           j                            d          g          S )Nr  zA homebrew version of EasyCache - even 'easier' version of EasyCache to implement. Overall works worse than EasyCache, but better in some rare cases AND universal compatibility with everything in ComfyUI.r   Tr`   zThe model to add LazyCache to.r   r7   r   r   r   r   r   r   rc   r   rY   z5The relative sampling step to begin use of LazyCache.rd   r   z3The relative sampling step to end use of LazyCache.r&   Fr   r   zThe model with LazyCache.r   r   r   s    r   r   zLazyCacheNode.define_schema  s   y$ g+ w0PQQ0c3CVZ  eN  Y]  ^  ^C3UY  d[  fj  k  k}#tSW  bW  bf  g  g
  EChsw xx (CDD
 
 
 	
r   r`   r   r7   rp   rc   rd   r&   rt   r   c           	     x   |                                 }t          |||dd||j        j        j                  |j        d         d<   |                    t          j        j	        j
        dt                     |                    t          j        j	        j        dt                     t          j        |          S )Nr  Fr  r   r   	lazycache)r   r  r`   r  r  rS   r  r\   r  r  r  rm   PREDICT_NOISErT   r   r  r  s         r   r  zLazyCacheNode.execute  s    BQRacpr}  QR  gl  v}  OT  OZ  Oh  Ox  Cy  Cy  Cy12;?""5#:#E#RT_ayzzz""5#:#E#SU`  cB  	C  	C  	C}U###r   Nr  r  r  r   r   r   r(  r(    sR        
 
 
 [
& $ $ $ [$ $ $r   r(  c                      e Zd ZddZdS )EasyCacheExtensionr   list[type[io.ComfyNode]]c                "   K   t           t          gS r   )r   r(  r   s    r   get_node_listz EasyCacheExtension.get_node_list  s      
 	
r   N)r   r/  )r   r   r   r1  r   r   r   r.  r.  
  s(        
 
 
 
 
 
r   r.  c                     t                      S r   )r.  r   r   r   comfy_entrypointr3    s    r   )
__future__r   typingr   r   comfy_api.latestr   r   comfy.patcher_extensionr\   r'   torchcomfy.model_patcherr   r   r   rO   rT   rV   rm   ro   	ComfyNoder   r  r(  r.  r3  r   r   r   <module>r;     s   " " " " " " ' ' ' ' ' ' ' ' / / / / / / / /           + + +R R Rh4 4 4l% % %2 2 2>` ` ` ` ` ` ` `F$ $ $ $ $BL $ $ $>d d d d d d d dL$ $ $ $ $BL $ $ $<
 
 
 
 
 
 
 
         r   