
    3j
j                        S SK Jr  S SKJrJr  S SKJrJr  S SKr	S SK
r
S SKrS SKr	\(       a  S SKJr  S rS rS rS	 rS
 r " S S5      r " S S\R*                  5      r " S S5      r " S S\R*                  5      r " S S\5      rS rg)    )annotations)TYPE_CHECKINGUnion)ioComfyExtensionN)UUIDc                ~    [        U [        5      (       a  U S   SS2SU24   U S   SS2SU24   4$ U SS2SU24   S4$ )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      s]    $Awq*?**+T!WQ8H8H5H-III#O##$d**    c                
   US   n[        U[        5      (       d  UR                  S5      nU(       d  US   nUS   n[        US   UR                  5      u  pVUS   nUS   nUb  UR                  U5      (       a  U " U0 UD6$ UR                  U5      n	Un
S nUR                  U5      nU(       Gah  UR                  U5        UR                  U5      nUR                  (       ag  U(       a`  UR                  (       a&  [        R                  " SUR                   S	U 35        UR                  XX5      nUb  UR                  XhS
S9nX/$ U$ UR                   (       a"  US   Ul        UR                  U5      n	SUl        U	(       Ga  UR#                  5       (       aG  UR%                  XXSS9UR&                  -
  R)                  5       R+                  5       R-                  5       nUR/                  5       (       Ga!  UR1                  5       (       Ga  UR2                  U-  UR4                  -  nU=R6                  U-  sl        UR6                  UR8                  :  ax  U(       aq  UR                  (       a0  [        R                  " SUR6                   SUR8                   35        S
Ul
        UR                  XX5      nUb  UR                  XhS
S9nX/$ U$ UR                  (       a0  [        R                  " SUR6                   SUR8                   35        SUl        U " U0 UD6n[        UUR                  5      u  nnU	(       Gab  UR/                  5       (       GaL  UR%                  UUSS9UR:                  -
  R)                  5       R+                  5       R-                  5       nUR                  (       a8  UUR4                  -  nUR<                  R?                  URA                  5       5        UR1                  5       (       ao  UR2                  U-  UR4                  -  nURB                  R?                  URA                  5       5        UR                  (       a  [        R                  " SU 35        Ub
  UU-  Ul        UR                  (       a  [        R                  " SW 35        URE                  UX5        Ub  URE                  UXhS
S9  U	(       a  UR%                  X5      Ul        UR%                  UU5      Ul        UR)                  5       R+                  5       R-                  5       Ul        UR                  (       a-  [        R                  " SUR&                  RF                   35        U$ )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      sF   %)"X)400$jj)>?""&r(!4[!AIDGY%>%>?EA *F(Ei<<VDD(((#77>KL008L  #(==eD&&+?  UV_VoVoUp  qB  CH  BI  J  K//9F~(99"d9S--M!!(-aI%"+"?"?"F%*I"..00 ) 3 3AE 3 JYMhMh hqqswwy~~   A--//I4^4^4`4`-6-S-SVb-bfo  gA  gA  -A)004MM033i6O6OOTh (('den  fF  fF  eG  GZ  [d  [t  [t  Zu  &v  w26I/&77AF~'0'A'A"VZ'A'[ &55!M (('hir  jJ  jJ  iK  K^  _h  _x  _x  ^y  &z  {7:I4 ($ 9& 9K*;	8Q8QRFLy==??",,VU%,H9KkKkkttvzz|  B  B  D!.1K1K!K))001C1H1H1JK5577)2)O)OR^)^bkb|b|(|%00778Q8V8V8XY  PQjPklm#5B\5QI2LLEFXEYZ[;##L"d#K&/&9&9+&M	#+4+>+>vu+M	(%+^^%5%9%9%;%@%@%B	"LLDYE`E`EfEfDghir   c                *   US   nUS   nUS   S   nUR                  U5      (       a  U " U0 UD6$ US   S S 2S UR                  24   nUnS nUR                  U5      n	U	(       Ga  UR                  U5        UR	                  5       (       Gas  UR	                  5       (       aG  UR                  USS9UR                  -
  R                  5       R                  5       R                  5       nUR                  5       (       Ga  UR                  5       (       a  UR                  U-  UR                  -  n
U=R                  U
-  sl        UR                  UR                  :  aY  UR                   (       a0  ["        R$                  " SUR                   S	UR                   35        S
Ul        UR)                  U5      $ UR                   (       a0  ["        R$                  " SUR                   S	UR                   35        SUl        U " U0 UD6nUR                  5       (       GaI  UR                  USS9UR*                  -
  R                  5       R                  5       R                  5       nUR                   (       a7  XR                  -  nUR,                  R/                  UR1                  5       5        UR                  5       (       ao  UR                  U-  UR                  -  n
UR2                  R/                  U
R1                  5       5        UR                   (       a  ["        R$                  " SU
 35        Ub	  X-  Ul        UR                   (       a  ["        R$                  " SW 35        UR5                  X5        UR                  U5      Ul        UR                  U5      Ul        UR                  5       R                  5       R                  5       Ul        UR                   (       a-  ["        R$                  " SUR                  R6                   35        U$ )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   s   1gH#AwM!./D!Ek!RI%%h//(((1ga!;)";";!;;<AKL00:L  #**,,..00 ) 3 3AU 3 CiFaFa ajjlpprwwy--//I4^4^4`4`-6-S-SVb-bfo  gA  gA  -A)004MM033i6O6OO (('den  fF  fF  eG  GZ  [d  [t  [t  Zu  &v  w26I/$55a88 (('hir  jJ  jJ  iK  K^  _h  _x  _x  ^y  &z  {7:I4#T4V4F%%''",,V5,AIDdDddmmossuzz|!.1K1K!K))001C1H1H1JK5577)2)O)OR^)^bkb|b|(|%00778Q8V8V8XY  PQjPklm#5B5QI2LLEFXEYZ[4"+"5"5k"BI'0':':6'BI$!'!1!5!5!7!<!<!>I@A\A\AbAb@cdeMr   c                :    US   nUS   S   nSUl         U " U0 UD6$ )Nr   r   r   F)r%   )r?   r@   rA   rS   r   s        r   !easycache_calc_cond_batch_wrapperrV      s3    HM!./D!Ek!RI"'IT$V$$r   c                    U R                   nUR                  n[        R                  R	                  U5      Ul        UR                  S   S   R                  5       R                  UR                  R                  R                  5      UR                  S   S'   UR                  S   S   n[        R                  " UR                   SUR                   SUR                   SUR                   35        U " U0 UD6UR                  S   S   nUR                  nUR                   nUR"                  (       ab  [        R                  " UR                   S[%        U5       SU 35        [        R                  " UR                   S[%        U5       SU 35        [%        US	   5      S
-
  n XUR&                  -
  -  n	[        R                  " UR                   SUR&                   SU SU	S S35        UR+                  5         XCl        $ ! [(         a    Sn	 N\f = f! WR                  S   S   nUR                  nUR                   nUR"                  (       ab  [        R                  " UR                   S[%        U5       SU 35        [        R                  " UR                   S[%        U5       SU 35        [%        US	   5      S
-
  n XUR&                  -
  -  n	O! [(         a    Sn	 Of = f[        R                  " UR                   SUR&                   SU SU	S S35        UR+                  5         WUl        f = f)zx
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      s   2###11$22MMN`aCICWCWXmCnozC{  DB  DB  DD  DV  DV  W]  Wk  Wk  Wq  Wq  W@  W@  DA23K@=C=Q=QRg=hit=u		''=i>W>W=XXijs  kB  kB  jC  CR  S\  Sh  Sh  Ri  j  	k(((()>?L	';;%.%I%I"LLINN++LSQdMeLffhi|h}~LLINN++STWXrTsSttv  xR  wS  T  U$q'l1n	!y/L/L#LMG 		'{93P3P2QQRS^R__ghopsgtt  A  	B1	 ! 	G	 (()>?L	';;%.%I%I"LLINN++LSQdMeLffhi|h}~LLINN++STWXrTsSttv  xR  wS  T  U$q'l1n	!y/L/L#LMG  	G		'{93P3P2QQRS^R__ghopsgtt  A  	B1sD   C;H ,HHHB/M KM K.+M -K..AM c                      \ rS rSrSSS jjrSS jrSS jrSS jrSS jrSS jr	SS	 jr
S
 rSSS jjrSS jrSSS jjrSSS jjrSS jrSS jrS rS rSrg)EasyCacheHolder   Nc                b   SU l         Xl        X l        X0l        X@l        XPl        X`l        SU l        SU l        S U l	        SU l
        SU l        SU l        S U l        S U l        S U l        S U l        0 U l        0 U l        / U l        / U l        SU l        SU l        SU l        S U l        Xpl        g )N	EasyCacher   TFr   )rb   r7   rc   rd   subsample_factoroffload_cache_diffr&   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   rs   rt   r&   r   s           r   __init__EasyCacheHolder.__init__   s    	.*& 0"4
37)&)# !&#/348#.2:<@B##% *,'#$ """.r   c                L    US   U R                   :  R                  5       (       + $ Nr   rv   r;   r}   rR   s     r   r    $EasyCacheHolder.is_past_end_timestep   !    QK$**,22444r   c                B    US   U R                   :*  R                  5       $ r   ru   r;   r   s     r   r"   #EasyCacheHolder.should_do_easycache       t||+1133r   c                    U R                   S L$ Nr.   r}   s    r   r,   %EasyCacheHolder.has_x_prev_subsampled       %%T11r   c                    U R                   S L$ r   r8   r   s    r   has_output_prev_subsampled*EasyCacheHolder.has_output_prev_subsampled       **$66r   c                    U R                   S L$ r   r5   r   s    r   r2   $EasyCacheHolder.has_output_prev_norm       $$D00r   c                    U R                   S L$ r   r4   r   s    r   r3   0EasyCacheHolder.has_relative_transformation_rate       00<<r   c                    UR                  U R                  5      U l        UR                  U R                  5      U l        U $ r   percent_to_sigmarc   ru   rd   rv   r}   ra   s     r   r_   !EasyCacheHolder.prepare_timesteps   7    %66t7I7IJ#44T5E5EF
r   c                n   UR                   S   [        U5      -  nUR                  U R                  5      nU R                  S:  aF  XU-  US-   U-  2SS S U R                  2S S U R                  24   nU(       a  UR                  5       $ U$ XU-  US-   U-  2S4   nU(       a  UR                  5       $ U$ )Nr   r
   .)r>   re   indexr)   rs   r   )r}   rB   r   r   batch_offsetuuid_idx	to_returns          r   r-   EasyCacheHolder.subsample   s    wwqzSZ/;;t334  1$</!\0II3PgRVRgRgPg  jAko  lA  lA  jA  A  BI ((|+XaZ,EEsJK	??$$r   c                .   ^  [        U 4S jU 5       5      $ )Nc              3  @   >#    U  H  oTR                   ;   v   M     g 7fr   )rw   ).0uuidr}   s     r   	<genexpr>7EasyCacheHolder.can_apply_cache_diff.<locals>.<genexpr>
  s     CUT4000Us   )allr}   r   s   ` r   r$   $EasyCacheHolder.can_apply_cache_diff	  s    CUCCCr   c                   U R                   U;   a  U(       d  U =R                  S-  sl        U(       a  U R                  OU R                  nUR                  S   [        U5      -  n[        U5       GH\  u  pg[        Xe-  US-   U-  5      /nUR                  SS  XG   R                  SS  :w  a  U R                  (       d3  [        SU R                  U   R                   SUR                   S35      e/ n	Sn
[        XG   R                  UR                  5       H|  u  pU
(       a  Sn
M  X:w  aM  U R                  (       a  U	R                  [        X-
  S 5      5        ME  U	R                  [        S U5      5        Mb  U	R                  [        S 5      5        M~     X-   nU[        U5      ==   XG   R                  UR                  5      -  ss'   GM_     U$ )Nr
   r   zCached dims  don't match x dims  - this is no goodTF)r)   rf   rx   rw   r>   re   	enumerateslicery   
ValueErrorziprz   r:   tupletodevice)r}   rB   r   r   cache_diffsr   ir   batch_sliceslicingskip_this_dimdim_udim_xs                r   r*    EasyCacheHolder.apply_cache_diff  s   5($$)$5=d114CXCXwwqzSZ/ 'GA 1l0BCDKwwqr{k/55ab99**$|D4I4I$4O4U4U3VVjklkrkrjs  tF  &G  H  H $$'(9(?(?$ILE$(- ~..#NN5d+CD#NN5u+=>uT{3 %J *3eK ![%6%9%9!((%CC!+ (, r   c                   U(       a  U R                   OU R                  nUR                  SS  UR                  SS  :w  a  U R                  (       d&  [	        SUR                   SUR                   S35      e/ nSn[        UR                  UR                  5       Hx  u  pU(       dP  X:w  aK  U R                  (       a  UR                  [        X-
  S 5      5        O6UR                  [        S U5      5        OUR                  [        S 5      5        SnMz     U[        U5         nX-
  n
U
R                  S   [        U5      -  n[        U5       H  u  pXU-  US-   U-  2S4   X]'   M     g )	Nr
   zOutput dims r   r   TFr   .)rx   rw   r>   ry   r   r   rz   r:   r   r   re   r   )r}   rK   rB   r   r   r   r   skip_dimdim_or   diffr   r   r   s                 r   r=   !EasyCacheHolder.update_cache_diff)  s7   5=d114CXCX<<qwwqr{*&& <~=QRSRYRYQZZl!mnnGH #FLL!'' :EN**uU[$'?@uT5'9:NN5;/  !; %.!Azzz!}E
2 'GA $|^QqS,4F%F%K LK (r   c                     U R                   U;   $ r   )r)   r   s     r   r!   #EasyCacheHolder.has_first_cond_uuid@  s    ##u,,r   c                    UR                   UR                  UR                  SS  4nU R                  c  X l        gX R                  :X  a  g[        R
                  " U R                   S35        U R                  5         g)Nr
   T9 - Tensor shape, dtype or device changed, resetting stateFr   dtyper>   r{   r'   warnrb   rh   r}   rB   metadatas      r   r#   EasyCacheHolder.check_metadataC  sh    HHaggqwwqr{3&"****		{"[\]

r   c                    SU l         SU l        SU l        SU l        / U l        S U l        U ?S U l        U ?S U l        U ?S U l        U ?	0 U l	        U ?
0 U l
        SU l        S U l        U $ )Nr   TFr   )r4   r6   r+   r%   r9   r)   r.   r8   r5   rw   rx   rf   r{   r   s    r   rh   EasyCacheHolder.resetN  s    ,/)&)# !&#% #"!%'&*#! $! "'&(##$ "r   c           
         [        U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S9$ N)r   )ro   r7   rc   rd   rs   rt   r&   r   r   s    r   r   EasyCacheHolder.clonec  m    t33T5G5GIYIY[_[p[prv  sJ  sJ  LP  LX  LX  jn  j~  j~    	r   )ry   r<   r6   rz   rd   rv   r)   r+   rb   rt   r9   r   r5   r8   r4   r7   r%   rc   ru   r{   rs   rf   rw   rx   r&   r.   FNr7   floatrc   r   rd   r   rs   intrt   boolr&   r   r   r   rR   r   returnr   r   r   T)rB   torch.Tensorr   
list[UUID]r   r   r   r   )r   r   r   r   )F)rB   r   r   r   r   r   )rK   r   rB   r   r   r   r   r   rB   r   r   r   )__name__
__module____qualname____firstlineno__r~   r    r"   r,   r   r2   r3   r_   r-   r$   r*   r=   r!   r#   rh   r   __static_attributes__ r   r   ro   ro      sV    /@54271=
D:M.-	*r   ro   c                  <    \ rS rSr\SS j5       r\SS j5       rSrg)EasyCacheNodeig  c                   [         R                  " SSSSS[         R                  R                  SSS9[         R                  R                  SS	S
SSSSS9[         R                  R                  SS	SSSSSS9[         R                  R                  SS	SSSSSS9[         R
                  R                  SSSSS9/[         R                  R                  SS9/S9$ )Nrr   z Native EasyCache implementation.advanced/debugTr`   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_schemaEasyCacheNode.define_schemah  s    yy$:% w0PQ0c3CVZ  eN  Y]  ^C3UY  d[  fj  k}#tSW  bW  bf  g

  EChsw x (CD
 	
r   c           
        UR                  5       n[        X#USSXQR                  R                  R                  S9UR
                  S   S'   UR                  [        R                  R                  R                  S[        5        UR                  [        R                  R                  R                  S[        5        UR                  [        R                  R                  R                  S[        5        [         R"                  " U5      $ )N   Frs   rt   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   executeEasyCacheNode.execute|  s    BQRar}  QR  gl  v}  OZ  OZ  Oh  Oh  Ox  Ox  Cy12;?""5#:#:#E#E#R#RT_ayz""5#:#:#E#E#U#UWb  eF  	G""5#:#:#E#E#U#UWbd}~}}U##r   r   Nr   z	io.Schemar`   zio.Model.Typer7   r   rc   r   rd   r   r&   r   r   zio.NodeOutputr   r   r   r   classmethodr  r  r   r   r   r   r   r   g  s(    
 
& $ $r   r   c                      \ rS rSrSSS jjrSS jrSS jrSS jrSS jrSS jr	SS	 jr
SS
 jrS rSSS jjrSS jrSS jrSS jrS rS rSrg)LazyCacheHolderi  Nc                   SU l         Xl        X l        X0l        X@l        XPl        X`l        SU l        SU l        S U l	        SU l
        SU l        S U l        S U l        S U l        S U l        / U l        / U l        SU l        S U l        Xpl        g )N	LazyCacher   Tr   )rb   r7   rc   rd   rs   rt   r&   ru   rv   r4   r6   r+   r.   r8   r5   
cache_diffr9   r<   rf   r{   r   r|   s           r   r~   LazyCacheHolder.__init__  s    	.*& 0"4
37)&)# /348#.2(,#% *,'#$ ".r   c                    U R                   S L$ r   r)  r   s    r   has_cache_diffLazyCacheHolder.has_cache_diff  s    d**r   c                L    US   U R                   :  R                  5       (       + $ r   r   r   s     r   r    $LazyCacheHolder.is_past_end_timestep  r   r   c                B    US   U R                   :*  R                  5       $ r   r   r   s     r   r"   #LazyCacheHolder.should_do_easycache  r   r   c                    U R                   S L$ r   r   r   s    r   r,   %LazyCacheHolder.has_x_prev_subsampled  r   r   c                    U R                   S L$ r   r   r   s    r   r   *LazyCacheHolder.has_output_prev_subsampled  r   r   c                    U R                   S L$ r   r   r   s    r   r2   $LazyCacheHolder.has_output_prev_norm  r   r   c                    U R                   S L$ r   r   r   s    r   r3   0LazyCacheHolder.has_relative_transformation_rate  r   r   c                    UR                  U R                  5      U l        UR                  U R                  5      U l        U $ r   r   r   s     r   r_   !LazyCacheHolder.prepare_timesteps  r   r   c                    U R                   S:  a;  USS S U R                   2S S U R                   24   nU(       a  UR                  5       $ U$ U(       a  UR                  5       $ U$ )Nr
   .)rs   r   )r}   rB   r   r   s       r   r-   LazyCacheHolder.subsample  sc      1$#6!6!668O$:O:O8OOPI ((779r   c                z    U =R                   S-  sl         XR                  R                  UR                  5      -   $ )Nr
   )rf   r)  r   r   )r}   rB   s     r   r*    LazyCacheHolder.apply_cache_diff  s/      A% ??%%ahh///r   c                    X-
  U l         g r   r,  )r}   rK   rB   s      r   r=   !LazyCacheHolder.update_cache_diff  s     *r   c                    UR                   UR                  UR                  4nU R                  c  X l        gX R                  :X  a  g[        R
                  " U R                   S35        U R                  5         g)NTr   Fr   r   s      r   r#   LazyCacheHolder.check_metadata  sb    HHaggqww/&"****		{"[\]

r   c                    SU l         SU l        SU l        / U l        / U l        U ?S U l        U ?S U l        U ?S U l        U ?S U l        SU l	        S U l
        U $ )Nr   Tr   )r4   r6   r+   r9   r<   r)  r.   r8   r5   rf   r{   r   s    r   rh   LazyCacheHolder.reset  su    ,/)&)# #% *,'O"!%'&*#! $#$ "r   c           
         [        U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S9$ r   )r&  r7   rc   rd   rs   rt   r&   r   r   s    r   r   LazyCacheHolder.clone  r   r   )r<   r)  r6   rd   rv   r+   rb   rt   r9   r   r5   r8   r4   r7   rc   ru   r{   rs   rf   r&   r.   r   r   r   r   r   )rB   r   r   r   r   r   )rB   r   )rK   r   rB   r   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&  r&    sN    /4+54271=
0%	$r   r&  c                  <    \ rS rSr\SS j5       r\SS j5       rSrg)LazyCacheNodei  c                   [         R                  " SSSSS[         R                  R                  SSS9[         R                  R                  SS	S
SSSSS9[         R                  R                  SS	SSSSSS9[         R                  R                  SS	SSSSSS9[         R
                  R                  SSSSS9/[         R                  R                  SS9/S9$ )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  LazyCacheNode.define_schema  s    yy$ g% w0PQ0c3CVZ  eN  Y]  ^C3UY  d[  fj  k}#tSW  bW  bf  g

  EChsw x (CD
 	
r   c           
        UR                  5       n[        X#USSXQR                  R                  R                  S9UR
                  S   S'   UR                  [        R                  R                  R                  S[        5        UR                  [        R                  R                  R                  S[        5        [        R                  " U5      $ )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  LazyCacheNode.execute  s    BQRar}  QR  gl  v}  OZ  OZ  Oh  Oh  Ox  Ox  Cy12;?""5#:#:#E#E#R#RT_ayz""5#:#:#E#E#S#SU`  cB  	C}}U##r   r   Nr!  r"  r#  r   r   r   rJ  rJ    s(    
 
& $ $r   rJ  c                      \ rS rSrSS jrSrg)EasyCacheExtensioni
  c                "   #    [         [        /$ 7fr   )r   rJ  r   s    r   get_node_list EasyCacheExtension.get_node_list  s     
 	
s   r   N)r   zlist[type[io.ComfyNode]])r   r   r   r   rT  r   r   r   r   rR  rR  
  s    
r   rR  c                     [        5       $ r   )rR  r   r   r   comfy_entrypointrW    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&  rJ  rR  rW  r   r   r   <module>r_     s    " ' /    +Rh4l%2>` `F$BLL $>d dL$BLL $<
 
 r   