
    
3jb                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
rS SKrS SKrS SKJr  SSKJr  S r " S S	5      rS
\R(                  S\R(                  4S jr  S,S\R(                  S\R(                  S\S\S\4
S jjr\" SS9 " S S5      5       r\ " S S5      5       r " S S\ R4                  5      r " S S5      r " S S\R:                  R<                  5      r " S S\R:                  R<                  5      r \" SS9 " S  S!5      5       r!S" r"\"" 5       u  r#r$\" SS9 " S# S$5      5       r%\" S%S9 " S& S'5      5       r& " S( S)\R:                  R<                  5      r'\" S)S9 " S* S+5      5       r(g)-    N)	dataclass)ListOptionalUnion)ModelPatcher   )
comfy_nodec                     U US-
  X-
  -  -   X@U-
  -  -   nUS:w  a/  U R                  5       UR                  5       -  nXW-  SU-
  -   nXg-  nU$ )Nr   r   )std)noise_pred_posnoise_pred_negnoise_pred_pertubed	cfg_scale	stg_scalerescale_scale
noise_predfactors           A/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-LTXVideo/stg.pystgr      su     	q=^<
=	>
(;;
<	= 
 ##%
(88'1}+<=(
    c                   D    \ rS rSrS\4S jrS\R                  4S jrSr	g)MomentumBuffer$   momentumc                     Xl         SU l        g )Nr   r   running_average)selfr   s     r   __init__MomentumBuffer.__init__%   s      r   update_valuec                 H    U R                   U R                  -  nX-   U l        g Nr   )r   r!   new_averages      r   updateMomentumBuffer.update)   s!    mmd&:&::+9r   r   N)
__name__
__module____qualname____firstlineno__floatr   torchTensorr%   __static_attributes__ r   r   r   r   $   s    ! !:5<< :r   r   v0v1c                 &   U R                   nU R                  5       UR                  5       p[        R                  R                  R                  U/ SQS9nX-  R                  / SQSS9U-  nX-
  nUR                  U5      UR                  U5      4$ )N)dimTr7   keepdim)dtypedoubler,   nn
functional	normalizesumto)r0   r1   r:   v0_parallelv0_orthogonals        r   projectrC   .   s}    HHEYY["))+				&	&r|	&	<B7--L$-?"DK$M>>% -"2"25"999r   r   r   r   etanorm_thresholdc                     X-
  nUS:  aF  [         R                  " U5      nUR                  S/ SQSS9n[         R                  " XdU-  5      nXX-  n[	        XP5      u  pXU	-  -   nXS-
  U-  -   nU$ )Nr      r3   T)pr7   r9   r   )r,   	ones_likenormminimumrC   )r   r   r   rD   rE   diffones	diff_normscale_factordiff_paralleldiff_orthogonalnormalized_updater   s                r   apgrS   7   s     *Dt$II|TIB	}}TI+EF"%,T%B"M'*==q=4E"EEJr   LTXVApplySTG)namec                   J    \ rS rSr\S 5       rSrSrSrSr	Sr
S\S	\4S
 jrSrg)rT   J   c                 "    SSSS04SSSS.4S	.0$ )
NrequiredMODELtooltipzThe model to apply the STG to.STRINGz14, 19z:Comma-separated indices of the blocks to apply the STG to.defaultr[   )modelblock_indicesr/   ss    r   INPUT_TYPESLTXVApplySTG.INPUT_TYPESL   s<      @A
 #+#_"
 	
r   	apply_stgrZ   )r_   lightricks/LTXVz'Defines the blocks to apply the STG to.r_   r`   c                 .   UR                  S5       Vs/ s H  n[        UR                  5       5      PM     nnUR                  5       nSUR                  S   ;   a!  UR                  UR                  S   S   5        UUR                  S   S'   U4$ s  snf )N,skip_block_listtransformer_options)splitintstripclonemodel_optionsextend)r   r_   r`   irj   	new_models         r   re   LTXVApplySTG.apply_stge   s    3@3F3Fs3KL3Ka3qwwy>3KLKKM		 7 78M NN""''(=>?PQ
  	 56	
 | Ms   #Br/   N)r'   r(   r)   r*   classmethodrc   FUNCTIONRETURN_TYPESRETURN_NAMESCATEGORYDESCRIPTIONr   strre   r.   r/   r   r   rT   rT   J   sB    
 
" HLL H;K| C r   c                   8    \ rS rSr% Sr\\S'   Sr\\	   \S'   Sr
g)STGFlagt   Fdo_skipNskip_layersr/   )r'   r(   r)   r*   r   bool__annotations__r   r   rm   r.   r/   r   r   r}   r}   t   s    GT!Kc!r   r}   c                   T    \ rS rSrS
S\\\\\   4      4S jjrS r	S r
S rS rS	rg)PatchAttention{   Nattn_idxc                     SU l         [        U[        5      (       a	  U/U l        g Uc	  S/U l        g [	        U5      U l        g )Nr4   r   )current_idx
isinstancerm   r   list)r   r   s     r   r   PatchAttention.__init__|   s:    h$$%JDMCDM NDMr   c                    [         R                  R                  R                  R                  U l        [         R                  R                  R                  R                  U l        U R                  [         R                  R                  R                  l        U R                  [         R                  R                  R                  l        g r#   )
comfyldmmodules	attentionoptimized_attentionoriginal_attentionoptimized_attention_maskedoriginal_attention_maskedstg_attentionstg_attention_masked)r   s    r   	__enter__PatchAttention.__enter__   s    "'))"3"3"="="Q"QII''BB 	& ;?:L:L		##7%% 			##>r   c                     U R                   [        R                  R                  R                  l        U R                  [        R                  R                  R                  l        S U l         S U l        g r#   )r   r   r   r   r   r   r   r   )r   exc_type	exc_value	tracebacks       r   __exit__PatchAttention.__exit__   sS    :>:Q:Q		##7** 			##> #')-&r   c                     U =R                   S-  sl         U R                   U R                  ;   a  U$ U R                  " XX4/UQ70 UD6$ Nr   )r   r   r   r   qkvheadsargskwargss          r   r   PatchAttention.stg_attention   sG    At}},H**1KDKFKKr   c                     U =R                   S-  sl         U R                   U R                  ;   a  U$ U R                  " XX4/UQ70 UD6$ r   )r   r   r   r   s          r   r   #PatchAttention.stg_attention_masked   sG    At}},H11!R4R6RRr   )r   r   r   r   r#   )r'   r(   r)   r*   r   r   rm   r   r   r   r   r   r   r.   r/   r   r   r   r   {   s6    +%T#Y*?!@ +	
.LSr   r   c                   0    \ rS rSrSrS\S\4S jrS rSr	g)	STGBlockWrapper   z=Wraps transformer blocks to be able to skip attention layers.stg_flagidxc                 (    X l         X0l        Xl        g r#   )flagr   block)r   r   r   r   s       r   r   STGBlockWrapper.__init__   s    	
r   c                 @   [         R                  " 5       nUS   R                  SS/5      nU R                  R                  (       a/  U R
                  U R                  R                  ;   a  [        U5      nU   US   " U5      nS S S 5        U$ ! , (       d  f       W$ = f)Nrk   stg_indexesr   original_block)
contextlibnullcontextgetr   r   r   r   r   )r   r   
extra_argscontext_managerr   hidden_states         r   __call__STGBlockWrapper.__call__   s    $0020155maSI99TYY-B-B!B,[9O%&67=L  _s   8B
B)r   r   r   N)
r'   r(   r)   r*   __doc__r}   rm   r   r   r.   r/   r   r   r   r      s    G c 
	r   r   c                      ^  \ rS rSr SS\S\4U 4S jjjr\S\S\4S j5       r	\
S\4S j5       rS	 r0 S4S
\R                  S\R                  S\4S jjrSrU =r$ )	STGGuider   Nr_   r   c                    > UR                  5       n[        TU ]	  U5        [        SUR                  S   S   S9U l        U R                  XR
                  5        X l        X0l        X@l	        g NFrk   rj   )r   r   )
ro   superr   r}   rp   r   patch_modelcfgr   r   )r   r_   r   r   r   	__class__s        r   r   STGGuider.__init__   se     ++,ABCTU

 	."*r   r   c                     U R                  U5      n[        U5       H#  u  pEUR                  [        XRU5      SSU5        M%     g )Nditdouble_block)get_transformer_blocks	enumerateset_model_patch_replacer   )clsr_   r   transformer_blocksrr   r   s         r   r   STGGuider.patch_model   sC     77>!"45HA))3UNA 6r   c                     U R                  S5      nSnUR                  R                  S:X  a  SnU R                  U5      $ )Ndiffusion_modelz"diffusion_model.transformer_blocksLTXVTransformer3Dz.diffusion_model.transformer.transformer_blocks)get_model_objectr   r'   )r_   r   keys      r   r    STGGuider.get_transformer_blocks   sC    001BC2$$--1DDBC%%c**r   c                 *    U R                  XS.5        g N)positivenegativeinner_set_condsr   r   r   s      r   	set_condsSTGGuider.set_conds       (IJr   xtimesteprp   c                 8   U R                   R                  SS 5      nU R                   R                  SS 5      nUR                  SS 5      bE  US   " U5      u  pxpXR                  l        U R	                  U R
                  U R                  5        O$U R                  nU R                  nU R                  n
[        R                  R                  U R                  U/UUU5      S   nSnSn[        R                  " US5      (       d1  [        R                  R                  U R                  U/UUU5      S   n[        R                  " US5      (       db   SUS   S'   S	U R                  l        [        R                  R                  U R                  U/UUU5      S   nS
U R                  l        US   S	 [!        UUUUUU
5      nUR                  S/ 5       H#  nUUUU R                  UUUUUUUS.nU" U5      nM%     U$ ! S
U R                  l        US   S	 f = f)Nr   r   sigma_to_params_mappingr         ?        rk   	ptb_indexTFsampler_post_cfg_functiondenoisedconduncondr_   uncond_denoisedcond_denoisedsigmarp   inputperturbed_condperturbed_cond_denoised)condsr   r   r   r   model_patcherr   r   r   r   samplerscalc_cond_batchinner_modelmathiscloser   r   )r   r   r   rp   seedpositive_condnegative_cond	cfg_valuer   stg_layer_skip_layer_indicesstg_rescaler   r   noise_pred_perturbed
stg_resultfnr   s                    r   predict_noiseSTGGuider.predict_noise   sE    

z48

z486=I78B LI"> )EMM%T//? II,,K77O
   ||Is++"^^;;   N ||Is++FDE34[A(,%',~~'E'E$$"O!( ($ ).%!"78E 

  ##$?DB&%'))#1!/!!."/+?D DJ E" C ).%!"78Es   A
H   H)r   r   r   r   r#   )r'   r(   r)   r*   r   r+   r   ru   r}   r   staticmethodr   r   r,   r-   dictr  r.   __classcell__r   s   @r   r   r      s    JN+!+BG+ +"     +l + +K !Z<<Z ,,Z 	Z Zr   r   c                      ^  \ rS rSrS\4U 4S jjrS rS r0 S4S\R                  S\R                  S	\
4S
 jjrSrU =r$ )STGGuiderAdvancedi@  r_   c                 \  > UR                  5       n[        TU ]	  U5        [        SUR                  S   R                  S5      S9U l        X l        X0l        X@l	        XPl
        X`l        Xpl        Xl        Xl        Xl        Xl        Xl        [$        R'                  XR                  5        g r   )ro   r   r   r}   rp   r   r   
sigma_listcfg_liststg_scale_liststg_rescale_liststg_layers_indices_listskip_steps_sigma_thresholdcfg_star_rescale	apply_apgapg_cfg_scalerD   rE   r   r   )r   r_   r  r  r  r  r  r  r  r  r  rD   rE   r   s                r   r   STGGuiderAdvanced.__init__A  s     ++,ABFF!
 % , 0'>$*D' 0"*,e]]3r   c                 &   U R                    Vs/ s H  o"U:  d  M
  UPM     nnU(       d  SnO&[        U5      nU R                   R                  U5      nU R                  U   U R                  U   U R
                  U   U R                  U   4$ s  snf )Nr4   )r  minindexr  r  r  r  )r   r   rb   higher_sigmasclosest_idxclosest_highers         r   r   )STGGuiderAdvanced.sigma_to_params_mappingg  s    $(OOBOqEzOBK /N////?KMM+&,!!+.((5	
 	
 Cs
   	BBc                 *    U R                  XS.5        g r   r   r   s      r   r   STGGuiderAdvanced.set_condsv  r   r   Nr   r   rp   c                    X R                   :  a  [        R                  " U5      $ U R                  R	                  SS 5      nU R                  R	                  SS 5      nU R                  U5      u  pxpU
b:  XR                  l        [        R                  U R                  U R                  5        [        R                  R                  U R                  U/UUU5      S   nSnSn[        R                   " US5      (       a7  U R"                  (       a  [        R                   " U R$                  S5      (       d  [        R                  R                  U R                  U/UUU5      S   nU R&                  (       ar  UR(                  S   nUR+                  US5      nUR+                  US5      n[        R,                  " UU-  SSS9n[        R,                  " US	-  SSS9S
-   nUU-  nUU-  n[        R                   " US5      (       db   SUS   S'   SU R                  l        [        R                  R                  U R                  U/UUU5      S   nSU R                  l        US   S	 [1        UUUUUU	5      nU R"                  (       a,  [3        UUU R$                  S U R4                  U R6                  S9nUR	                  S/ 5       H#  nUUUU R                  UUUUUUUS.nU" U5      nM%     U$ ! SU R                  l        US   S	 f = f)Nr   r   r   r   r4   r   Tr8   rG   g:0yE>r   rk   r   F)r   momentum_bufferrD   rE   r   r   )r  r,   
zeros_liker   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  shapeviewr?   r   r   rS   rD   rE   )r   r   r   rp   r   r   r   r   r   r  r   r   r   r  
batch_sizepositive_flatnegative_flatdot_productsquared_normalphar  r  r   s                          r   r  STGGuiderAdvanced.predict_noisey  s    555##A&& 

z48

z48 ((2 	H	k (3(DMM%!!$"4"4dmmD77O
   ||Is++NN4<<0B0BC#H#H"^^;;   N $$+11!4
 . 3 3J C . 3 3J C#ii!M1q$  %yy)9q$ORVV#l2!&!7||Is++FDE34[A(,%',~~'E'E$$"O!( ($ ).%!"78E 

 >>,, $HH#22J  ##$?DB&%'))#1!/!!."/+?D DJ E" W ).%!"78Es   A
K1 1L
)r  r  r  r  rD   rE   r  r  r   r  r  r  )r'   r(   r)   r*   r   r   r   r   r,   r-   r  r  r.   r	  r
  s   @r   r  r  @  sW    $4$4L
K !q<<q ,,q 	q qr   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
STGGuiderNodei  c                 D    SSSSSSSSSS	S
.4SSSSS	S.4SSSSS	S.4S.0$ )NrY   rf   CONDITIONINGFLOATr   r         Y@g?{Gz?)r^   r  maxsteproundr^   r  r5  r6  gffffff?)r_   r   r   r   r   rescaler/   ra   s    r   rc   STGGuiderNode.INPUT_TYPES  sg     #--#&"$ #!%	  #CtL
  #CTJ%
 	
r   GUIDER
get_guiderrg   a+  Implements Spatiotemporal Skip Guidance (STG), a training-free method enhancing transformer-based video diffusion models by selectively skipping layers during sampling. This approach improves video quality without sacrificing diversity or motion fidelity.Reference: https://arxiv.org/abs/2411.18664.c                 B    [        XXV5      nUR                  X#5        U4$ r#   )r   r   )r   r_   r   r   r   r   r9  guiders           r   r=  STGGuiderNode.get_guider  s$    5s4,yr   r/   Nr'   r(   r)   r*   ru   rc   rw   rv   ry   rz   r=  r.   r/   r   r   r.  r.    s4    
 
6 LH H	7 r   r.  c                  T   [         R                  R                  [         R                  R                  [        5      SS5      n [         R                  R                  U 5      (       a6  [        R                  " [        U 5      5      nU Vs/ s H  o"S   PM	     nnX4$ / nS/nX4$ s  snf )Npresetszstg_advanced_presets.jsonrU   Custom)	ospathjoindirname__file__existsjsonloadopen)preset_file_pathrC  presetpreset_namess       r   load_stg_presetsrQ    s    ww||
!9.I 
ww~~&''))D!1235<=W6vW=     z  	 >s   
B%c                   p    \ rS rSr\S 5       rSrSrSrSr	\S\
S\\\      4S	 j5       r     SS jrSrg
)STGGuiderAdvancedNodei-  c                     SSSSSSSSSS	.4S
SSS.4SSSS.4SSSS.4SSSS.4SSSS.4SSSS.4S.
SSS04S
SSS.4SSSSS S!.4SSSSS S!.4SSSSS S!.4S".S#.$ )$Nrf   r0  r2  gV-?r   r3  gMbP?z:Steps with sigma greater than this values will be skipped.)r^   r  r5  r6  r[   BOOLEANTz}If true, applies the cfg star rescale, scales the negative prediction according to dot product between positive and negative.r]   r\   z+1.0, 0.9933, 0.9850, 0.9767, 0.9008, 0.6180zComma-separated list sigmas, the actual parameters will be selected according to the closest sigma from this list to current timestep sigma.z8, 6, 6, 4, 3, 1zIComma-separated list of cfg values. Should be same length as sigmas list.z4, 4, 3, 2, 1, 0zOComma-separated list of stg scale values. Should be same length as sigmas list.z1, 1, 1, 1, 1, 1zQComma-separated list of stg rescale values. Should be same length as sigmas list.z"[29], [29], [29], [29], [29], [29]zTComma-separated list of list of layer indices. Should be same length as sigmas list.)
r_   r   r   r  r  sigmas
cfg_valuesstg_scale_valuesstg_rescale_valuesstg_layers_indicesSTG_ADVANCED_PRESETr[   >Preset resolution and frame count. Custom allows manual input.FzDIf true, applies the APG (Adaptive Projections Guidance) to the STG.r   r4  r8  )rO  r  r  rD   rE   )rY   optionalr/   ra   s    r   rc   !STGGuiderAdvancedNode.INPUT_TYPES/  s2    $--#("$ %#_	/ #' $c% #P $r #5#n #5#t% #5#v' #G#y'c8v *!#c #(#i  #CtL"
  #CtL
  #CtL#-uU
 U	
r   r;  r=  rg   u  
    The Advanced STG Guider implements sophisticated techniques for controlling the denoising process:

    It creates a dynamic mapping from scheduler-defined sigma values to CFG and STG (Spatio-Temporal Skip Guidance [1]) parameters.
    This approach establishes distinct sigma value ranges that operate independently of step numbers, allowing precise control over:
    • CFG scale
    • STG scale and rescale factors
    • STG attention layer skipping patterns

    The guider also supports:
    • CFG-Zero* [2] rescaling, which dynamically adjusts negative predictions based on the dot product between positive and negative signals
    • Threshold-based noise prediction zeroing for steps with sigma values exceeding a specified threshold

    For example if the sigma ranges are defined as [1.0, 0.9, 0.85, 0.6] and the CFG values are defined as [4, 3, 2, 1] and STG scale values
    are defined as [2, 2, 2, 1] and STG rescale values are defined as [1, 1, 1, 1] and STG layers indices are defined as [[14, 17], [14, 16], [14], [14]], then the guider will:
    - use CFG=4, STG scale=2, STG rescale=1 and STG layers indices = [14, 17] for sigma in the range (0.9, 1.0]
    - use CFG=3, STG scale=2, STG rescale=1 and STG layers indices = [14, 16] for sigma in the range (0.85, 0.9]
    - use CFG=2, STG scale=2, STG rescale=1 and STG layers indices = [14] for sigma in the range (0.8, 0.85]
    - use CFG=1, STG scale=1, STG rescale=1 and STG layers indices = [14] for sigma in the range (0.6, 0.8]

    The guider will use the same parameters for the same sigma values, regardless of the step number.

    References:
    [1] https://arxiv.org/abs/2411.18664
    [2] https://arxiv.org/abs/2503.18886

    rZ  returnc                 n   UR                  S5      S S  Vs/ s H  o"S-   PM	     nnUR                  5       (       a#  UR                  UR                  S5      S   5        / nU H  nUR                  5       nUS:X  a  UR                  / 5        M,  UR                  S5      R                  5       nU(       d  UR                  / 5        Me  UR                  S5       Vs/ s H2  oUR                  5       (       d  M  [        UR                  5       5      PM4     nnUR                  U5        M     U$ s  snf s  snf )Nz],r4   ]z[]ri   )rl   rn   appendrm   )r   rZ  rb   listsresultnnumberss          r   parse_stg_layers_indices.STGGuiderAdvancedNode.parse_stg_layers_indices  s     #5":":4"@""EF"EQS"EF##%%LL+11$7;<A	ADyb! GGDM'')MM"% 89wws|Q|!wwy~s1779~|GQMM'*  ) G" Rs   D-D27D2Nc                   ^ T(       a[  TS:w  aU  [        U4S j[         5       S 5      nU(       a%  US   nUS   nUS   nUS   nUS   nUS   nUS	   nGO [        S
T S35      eUR                  S5       Vs/ s H  n[	        UR                  5       5      PM     nnUR                  S5       Vs/ s H  n[	        UR                  5       5      PM     nnUR                  S5       Vs/ s H  n[	        UR                  5       5      PM     nnU	R                  S5       Vs/ s H  n[	        UR                  5       5      PM     nnU R                  U
5      n[        ST5        [        SU5        [        SU5        [        SU5        [        SU5        [        SU5        [        SU5        [        SU5        [        UUUUUUUUUUUUS9nUR                  X#5        X#4Ul
        U4$ s  snf s  snf s  snf s  snf )NrD  c              3   <   >#    U  H  oS    T:X  d  M  Uv   M     g7f)rU   Nr/   ).0itemrO  s     r   	<genexpr>3STGGuiderAdvancedNode.get_guider.<locals>.<genexpr>  s     Q"6$v,&:P"6s   	r  r  rV  rW  rX  rY  rZ  zPreset z not found in the presets list.ri   zUsing preset: zSkip steps sigma threshold: zCfg star rescale: zSigma list: z
Cfg list: zStg scale list: zStg rescale list: zStg layers indices list: )r  rD   rE   )nextSTG_ADVANCED_PRESETS
ValueErrorrl   r+   rn   rg  printr  r   	raw_conds)r   r_   r   r   r  r  rV  rW  rX  rY  rZ  rO  r  r  rD   rE   preset_datar  r  r  r  r  rb   cr?  s              `             r   r=   STGGuiderAdvancedNode.get_guider  s   $ f(Q"6QSWK -89U-V*#./A#B (2
&|4!,-?!@#./C#D *56J*K' 76(2Q!RSS 5;LL4EF4Eq%	*4EJF2<2B2B32GH2GQaggi(2GHH8H8N8Ns8ST8S1eAGGI.8SNT:L:R:RSV:WX:WQaggi 0:WX&*&C&CDV&W#',.HI"$45nj)lH% .1"$45)+BC"#&')
 	,$/y= GHTXs   7#G%/#G*'#G/#G4r/   )NFr   r   r   )r'   r(   r)   r*   ru   rc   rw   rv   ry   rz   r{   r   rm   rg  r=  r.   r/   r   r   rS  rS  -  sq    V
 V
p LH HK8 # $tCy/  H !@r   rS  STGAdvancedPresetsc                   :    \ rS rSr\S 5       rSrSrSrS	S jr	Sr
g)
STGAdvancedPresetsNodei  c                      SS[         SSS.400$ )NrY   rO  z13b Balancedr\  r]   )STG_ADVANCED_PRESET_NAMESra   s    r   rc   "STGAdvancedPresetsNode.INPUT_TYPES  s,     -#1#c

 
	
r   )r[  
get_presetrg   Nc                     U4$ r#   r/   )r   rO  s     r   r}  !STGAdvancedPresetsNode.get_preset  s
    yr   r/   r#   )r'   r(   r)   r*   ru   rc   rw   rv   ry   r}  r.   r/   r   r   ry  ry    s*    
 
 ,LH Hr   ry  c                      ^  \ rS rSr SS\S\4U 4S jjjrS r0 S4S\R                  S\R                  S	\
4S
 jjrSrU =r$ )	APGGuideri  r_   momentum_coefficientc                    > UR                  5       U l        [        TU ]  U R                  5        XPl        [        U R                  5      U l        X0l        X@l        X l	        S U l
        g r#   )ro   r_   r   r   r  r   r"  rD   rE   r   previous_timestep)r   r_   r   rD   rE   r  r   s         r   r   APGGuider.__init__  sT     [[]
$$8!-d.G.GH,"!%r   c                 *    U R                  XS.5        g r   r   r   s      r   r   APGGuider.set_conds/  r   r   Nr   r   rp   c                    U R                   R                  SS 5      nU R                   R                  SS 5      n[        R                  R	                  U R
                  U/UUU5      S   nU R                  bC  UR                  5       U R                  :  a%  [        S5        [        U R                  5      U l        Sn[        R                  " U R                  S5      (       d1  [        R                  R	                  U R
                  U/UUU5      S   n[        UUU R                  U R                   U R"                  5      n	UR                  S/ 5       H!  n
U	UUU R
                  UUUUUS.	nU
" U5      n	M#     UR                  5       U l        U	$ )Nr   r   r   zResetting momentum bufferr   r   )	r   r   r   r_   r   r   r   rp   r   )r   r   r   r   r   r   r  rl  rr  r   r  r"  r   r   r   rS   rD   rE   )r   r   r   rp   r   r   r   r   r   
apg_resultr  r   s               r   r  APGGuider.predict_noise2  s{    

z48

z4877O
  "".$"8"88-.#1$2K2K#LD ||DNNC00"^^;;   N NNHH

  ##$?DB&%'))#1!/!!.
D DJ E "*r   )r   rD   r_   r"  r  rE   r  ))r'   r(   r)   r*   r   r+   r   r   r,   r-   r  r  r.   r	  r
  s   @r   r  r    se     '+&& $& &"K !B<<B ,,B 	B Br   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
APGGuiderNodeiw  c                 R    SSSSSSSSSS	.4SSSSSS	.4SSSSSS	.4SS
SSSS	.4S.0$ )NrY   rf   r0  r2  r   r   r3  r4  r8  r  g      g      @)r_   r   r   r   rD   rE   r  r/   ra   s    r   rc   APGGuiderNode.INPUT_TYPESy  su     #-- #CtL
  #CtL
  #CtL#
  $T#tL)!
 	
r   r;  r=  rg   zw
    The APG Guider implements Adaptive Projected Guidance (APG).
    Reference: https://arxiv.org/abs/2410.02416.
    c                 X    [        UUUUU5      nUR                  X#5        X#4Ul        U4$ r#   )r  r   rs  )	r   r_   r   r   r   rD   rE   r  r?  s	            r   r=  APGGuiderNode.get_guider  s@      
 	,$/yr   r/   NrA  r/   r   r   r  r  w  s1    
 
2 LH HK
r   r  )r   r   ))r   rK  r   rE  dataclassesr   typingr   r   r   comfy.ldm.modules.attentionr   comfy.samplersr,   comfy.model_patcherr   nodes_registryr	   r   r   r-   rC   r+   rS   rT   r}   AbstractContextManagerr   r   r   	CFGGuiderr   r  r.  rQ  rp  r{  rS  ry  r  r  r/   r   r   <module>r     s      	 ! ( ( "   , &(: :: :%,, : LLLL  
	
 &  & & !&R " " "+SZ66 +S\ (@(( @Fj00 jZ , , ,^
! 3C2D / / $%S S &Sl %&  '0W(( Wt 8 8 8r   