
    ^(j                       d dl 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	d dl
Z
d dlZerd dlmZmZ d dlmZ d dlmZ d dlZd dlZd dlZd dlmZ  G d d	ej2                        Z G d
 dej2                        Z G d dej2                        Z G d dej2                        Z G d d      Zd9dZd:d;dZ  G d d      Z! G d de!      Z" G d de!      Z# G d de!      Z$ G d de!      Z%e%Z&	  G d d e!      Z' G d! d      Z( G d" d#      Z) G d$ d%      Z* G d& d'      Z+d<d(Z,d:d=d)Z-d>d*Z.d?d+Z/d@dAd-Z0	 	 	 	 dBd.Z1dCd/Z2i d,df	 dDd0Z3dEdFd1Z4dGd2Z5dHd3Z6dId4Z7dJd5Z8	 dK	 	 	 	 	 dLd6Z9	 	 dM	 	 	 	 	 dNd7Z:	 dO	 	 	 dPd8Z;y)Q    )annotations)TYPE_CHECKINGCallableN)ModelPatcherPatcherInjection)	BaseModel)CLIPconditioning_set_valuesc                      e Zd ZdZdZdZy)EnumHookModea(  
    Priority of hook memory optimization vs. speed, mostly related to WeightHooks.

    MinVram: No caching will occur for any operations related to hooks.
    MaxSpeed: Excess VRAM (and RAM, once VRAM is sufficiently depleted) will be used to cache hook weights when switching hook groups.
    minvrammaxspeedN)__name__
__module____qualname____doc__MinVramMaxSpeed     5/Users/danicosta/Desktop/Flux2/ComfyUI/comfy/hooks.pyr   r      s     GHr   r   c                  $    e Zd ZdZdZdZdZdZdZy)EnumHookTypezD
    Hook types, each of which has different expected behavior.
    weightobject_patch
add_modelstransformer_optionsadd_injectionsN)	r   r   r   r   WeightObjectPatchAdditionalModelsTransformerOptions
Injectionsr   r   r   r   r   '   s$     F K#.!Jr   r   c                      e Zd ZdZdZy)EnumWeightTargetmodelclipN)r   r   r   ModelClipr   r   r   r&   r&   1   s    EDr   r&   c                      e Zd ZdZdZdZy)EnumHookScopez
    Determines if hook should be limited in its influence over sampling.

    AllConditioning: hook will affect all conds used in sampling.
    HookedOnly: hook will only affect the conds it was attached to.
    all_conditioninghooked_onlyN)r   r   r   r   AllConditioning
HookedOnlyr   r   r   r,   r,   5   s     )OJr   r,   c                      e Zd Zy)_HookRefN)r   r   r   r   r   r   r2   r2   @   s    r   r2   Hook	HookGroupc                     y)z>Example for how custom_should_register function can look like.Tr   )hookr'   model_optionstarget_dict
registereds        r   default_should_registerr:   D   s    r   c                :    i }| | |d<   |j                  |       |S )z9Creates base dictionary for use with Hooks' target param.target)update)r<   kwargsds      r   create_target_dictr@   I   s'    
A(HHVHr   c                  x    e Zd Zddddej                  f	 ddZed        ZddZd Z	d Z
ddZddZdd	Zd
 Zy)r3   Nc                    || _         	 |r|n	t               | _        	 || _        	 |r|n	t	               | _        	 || _        	 t        | _        y N)		hook_typer2   hook_refhook_idHookKeyframeGrouphook_keyframe
hook_scoper:   custom_should_register)selfrD   rE   rF   rH   rI   s         r   __init__zHook.__init__S   sQ    ">$,(*dq.;]ARAT`$_&=# 	Ur   c                .    | j                   j                  S rC   )rH   strengthrK   s    r   rN   zHook.strengthb   s    !!***r   c                Z    | j                          | j                  j                  |       y rC   )resetrH   initialize_timesteps)rK   r'   s     r   rR   zHook.initialize_timestepsf   s    

//6r   c                8    | j                   j                          y rC   )rH   rQ   rO   s    r   rQ   z
Hook.resetj   s      "r   c                    | j                         }| j                  |_        | j                  |_        | j                  |_        | j                  |_        | j
                  |_        | j                  |_        |S rC   )	__class__rD   rE   rF   rH   rI   rJ   rK   cs     r   clonez
Hook.clonem   sZ    .."nn]]
LL	,,#'#>#> r   c                ,    | j                  | ||||      S rC   )rJ   rK   r'   r7   r8   r9   s        r   should_registerzHook.should_registerw   s    **4{T^__r   c                    t        d      )Nz6add_hook_patches should be defined for Hook subclassesNotImplementedErrorrZ   s        r   add_hook_patcheszHook.add_hook_patchesz   s    !"Z[[r   c                j    | j                   |j                   k(  xr | j                  |j                  k(  S rC   )rU   rE   )rK   others     r   __eq__zHook.__eq__}   s'    ~~0TT]]enn5TTr   c                ,    t        | j                        S rC   )hashrE   rO   s    r   __hash__zHook.__hash__   s    DMM""r   )rD   r   rE   r2   rF   strrH   rG   r'   r   r'   r   r7   dictr8   	dict[str]r9   r4   )ra   r3   )r   r   r   r,   r/   rL   propertyrN   rR   rQ   rX   r[   r_   rb   re   r   r   r   r3   r3   R   s^    /3[_26=C`C`U 1U + +7#`\U#r   c                  V     e Zd ZdZd fd	Zed        Zed        ZddZ fdZ	 xZ
S )	
WeightHookz
    Hook responsible for tracking weights to be applied to some model/clip.

    Note, value of hook_scope is ignored and is treated as HookedOnly.
    c                    t         |   t        j                  t        j
                         d | _        d | _        d| _        || _	        || _
        t        j
                  | _        y )N)rD   rI   T)superrL   r   r    r,   r0   weightsweights_clipneed_weight_init_strength_model_strength_cliprI   )rK   strength_modelstrength_cliprU   s      r   rL   zWeightHook.__init__   sU    <#6#6=C[C[\!"& $-+'22r   c                4    | j                   | j                  z  S rC   )rs   rN   rO   s    r   ru   zWeightHook.strength_model   s    ##dmm33r   c                4    | j                   | j                  z  S rC   )rt   rN   rO   s    r   rv   zWeightHook.strength_clip   s    ""T]]22r   c                   | j                  ||||      syd }|j                  dd       }|t        j                  k(  r| j                  }n| j
                  }| j                  ri }|t        j                  k(  r+t        j                  j                  |j                  |      }n*t        j                  j                  |j                  |      }t        j                  j                  | j                  |d      }n,|t        j                  k(  r| j                  }n| j                  }|j                  | ||       |j!                  |        y)NFr<   )log_missingr6   patchesstrength_patchT)r[   getr&   r*   rt   rs   rr   comfyloramodel_lora_keys_clipr'   model_lora_keys_unet	load_lorarp   rq   r_   add)	rK   r'   r7   r8   r9   rp   r<   rN   key_maps	            r   r_   zWeightHook.add_hook_patches   s
   ##E=+zR40%*****H++H  G)...**99%++wO**99%++wOjj**4<<e*TG)...++,,D'(Str   c                    t         |          }| j                  |_        | j                  |_        | j                  |_        | j
                  |_        | j                  |_        |S rC   )ro   rX   rp   rq   rr   rs   rt   rK   rW   rU   s     r   rX   zWeightHook.clone   sU    LL	**!22 00..r   )      ?r   rh   )r   r   r   r   rL   rk   ru   rv   r_   rX   __classcell__rU   s   @r   rm   rm      sD    
3 4 4 3 38 r   rm   c                  L     e Zd Zdej                  fd fdZ fdZddZ xZS )ObjectPatchHookNc                ^    t         |   t        j                         || _        || _        y NrD   )ro   rL   r   r!   object_patchesrI   )rK   r   rI   rU   s      r   rL   zObjectPatchHook.__init__   s(    <#;#;<,$r   c                F    t         |          }| j                  |_        |S rC   )ro   rX   r   r   s     r   rX   zObjectPatchHook.clone   s!    "W]_..r   c                    t        d      )Nz0ObjectPatchHook is not supported yet in ComfyUI.r]   rZ   s        r   r_   z ObjectPatchHook.add_hook_patches   s    !"TUUr   )r   rj   rh   	r   r   r   r,   r/   rL   rX   r_   r   r   s   @r   r   r      s    15)99%
Vr   r   c                  8     e Zd ZdZdd fdZ fdZddZ xZS )AdditionalModelsHookz
    Hook responsible for telling model management any additional models that should be loaded.

    Note, value of hook_scope is ignored and is treated as AllConditioning.
    c                ^    t         |   t        j                         || _        || _        y r   )ro   rL   r   r"   modelskey)rK   r   r   rU   s      r   rL   zAdditionalModelsHook.__init__   s'    <#@#@Ar   c                    t         |          }| j                  r| j                  j                         n| j                  |_        | j                  |_        |S rC   )ro   rX   r   copyr   r   s     r   rX   zAdditionalModelsHook.clone   s>    "''-/)-4;;##%$++r   c                P    | j                  ||||      sy|j                  |        y)NFT)r[   r   rZ   s        r   r_   z%AdditionalModelsHook.add_hook_patches   s(    ##E=+zRtr   )NN)r   zlist[ModelPatcher]r   rf   rh   )r   r   r   r   rL   rX   r_   r   r   s   @r   r   r      s    

r   r   c                  X     e Zd ZdZdej
                  fd fdZ fdZddZd	dZ	 xZ
S )
TransformerOptionsHookzt
    Hook responsible for adding wrappers, callbacks, patches, or anything else related to transformer_options.
    Nc                l    t         |   t        j                         || _        || _        d| _        y )Nr   F)ro   rL   r   r#   transformers_dictrI   _skip_adding)rK   r   rI   rU   s      r   rL   zTransformerOptionsHook.__init__   s3    <#B#BC!2$!qr   c                h    t         |          }| j                  |_        | j                  |_        |S rC   )ro   rX   r   r   r   s     r   rX   zTransformerOptionsHook.clone   s.    $)GMO"44**r   c                :   | j                  ||||      syd| _        | j                  t        j                  k(  r!| j
                  | j
                  d}d| _        nd| j
                  i}|j                  |        t        j                  j                  ||d       y)NF)r   to_load_optionsTr   
copy_dict1)
r[   r   rI   r,   r/   r   r   r   patcher_extensionmerge_nested_dicts)rK   r'   r7   r8   r9   add_model_optionss         r   r_   z'TransformerOptionsHook.add_hook_patches   s    ##E=+zR!??m;;;8<8N8N484J4J!L !%D!2D4J4J Kt22=BS`e2fr   c                v    | j                   s-t        j                  j                  || j                  d       y y )NFr   )r   r   r   r   r   )rK   r'   r   s      r   on_apply_hooksz%TransformerOptionsHook.on_apply_hooks  s3      ##667JDLbLbot6u !r   )r   z/dict[str, dict[str, dict[str, list[Callable]]]]rh   )r'   r   r   rj   )r   r   r   r   r,   r/   rL   rX   r_   r   r   r   s   @r   r   r      s.     [_)99r vr   r   c                  N     e Zd Zddej                  fd fdZ fdZddZ xZS )InjectionsHookNc                l    t         |   t        j                         || _        || _        || _        y r   )ro   rL   r   r$   r   
injectionsrI   )rK   r   r   rI   rU   s       r   rL   zInjectionsHook.__init__  s.    <#:#:;$$r   c                    t         |          }| j                  |_        | j                  r!| j                  j	                         |_        |S | j                  |_        |S rC   )ro   rX   r   r   r   r   s     r   rX   zInjectionsHook.clone  sL    !GMO15t++- GKoor   c                    t        d      )Nz/InjectionsHook is not supported yet in ComfyUI.r]   rZ   s        r   r_   zInjectionsHook.add_hook_patches  s    !"STTr   )r   rf   r   zlist[PatcherInjection]rh   r   r   s   @r   r   r     s!     $)99%Ur   r   c                      e Zd ZdZd Zd ZddZddZddZddZ	ddZ
dd	Zd
 ZddZddZd Zd Zeddd       Zy)r4   z
    Stores groups of hooks, and allows them to be queried by type.

    To prevent breaking their functionality, never modify the underlying self.hooks or self._hook_dict vars directly;
    always use the provided functions on HookGroup.
    c                     g | _         i | _        y rC   )hooks
_hook_dictrO   s    r   rL   zHookGroup.__init__&  s    !#
:<r   c                ,    t        | j                        S rC   )lenr   rO   s    r   __len__zHookGroup.__len__*  s    4::r   c                    || j                   vrQ| j                   j                  |       | j                  j                  |j                  g       j                  |       y y rC   )r   appendr   
setdefaultrD   rK   r6   s     r   r   zHookGroup.add-  sH    tzz!JJd#OO&&t~~r:AA$G "r   c                    || j                   v rD| j                   j                  |       | j                  |j                     j                  |       y y rC   )r   remover   rD   r   s     r   r   zHookGroup.remove2  s@    4::JJd#OODNN+2248 r   c                :    | j                   j                  |g       S rC   )r   r~   )rK   rD   s     r   get_typezHookGroup.get_type7  s    ""9b11r   c                    || j                   v S rC   )r   r   s     r   containszHookGroup.contains:  s    tzz!!r   c                x    t        | j                        }t        |j                        }|j                  |      S rC   )setr   issubset)rK   ra   
self_hooksother_hookss       r   is_subset_ofzHookGroup.is_subset_of=  s.    _
%++&"";//r   c                    t               }| j                  D ]3  }|j                  |      s|j                  |j	                                5 |S rC   )r4   r   r   r   rX   rK   ra   rW   r6   s       r   new_with_common_hookszHookGroup.new_with_common_hooksB  s<    KJJD~~d#djjl#  r   c                z    t               }| j                  D ]!  }|j                  |j                                # |S rC   )r4   r   r   rX   )rK   rW   r6   s      r   rX   zHookGroup.cloneI  s.    KJJDEE$**, r   c                    | j                         }|0|j                  D ]!  }|j                  |j                                # |S rC   )rX   r   r   r   s       r   clone_and_combinezHookGroup.clone_and_combineO  s8    JJLdjjl# $r   c                n    |t               }n|j                         }| j                  D ]	  }||_         y rC   )rG   rX   r   rH   )rK   hook_kfr6   s      r   set_keyframes_on_hooksz HookGroup.set_keyframes_on_hooksV  s0    ?')GmmoGJJD!(D r   c                   i }| j                  t        j                        D ]A  }g }t        |j                  j
                        dk(  r|j                  d       |||<   ?|j                  j
                  d   }|j                  j
                  D ]  }|j                  |j                  kD  rVt        j                  |j                  |j                        s,|j                  |j                  |j                  f|f       |}r|j                  |j                  k(  s|} t        j                  |j                  d      s|j                  |j                  df|f       |||<   D g }|j                         D ]  }|D ]  \  }}|j                  |         t        t        j                  j                  |            }	|	j!                  d       t#        |	      }
t%        t        |
      dz
        D cg c]  }|
|   |
|dz      f }}g }|D ]i  }g }|j'                         D ]?  \  }}d }|D ]   \  }}|d   |d   k  s|d   |d   kD  s|} n |j                  ||f       A |j                  ||f       k |S c c}w )Nr   ))        r   Nr   r      )r   r   r    r   rH   	keyframesr   start_percentmathiscloserN   valuesr   	itertoolschainfrom_iterabler   sortedrangeitems)rK   scheduled_hooksr6   hook_scheduleprev_keyframekeyframe
all_ranges	range_kfst_rangeboundaries_set
boundariesireal_rangesscheduled_keyframeshooks_schedulevalstored_range	stored_kfs                     r   get_hooks_for_clip_schedulez%HookGroup.get_hooks_for_clip_schedule^  s   []MM,"5"56DM4%%//0A5$$%78(5% ..88;M ..88))M,G,GGPTP\P\]e]n]np}  qG  qG  QH!((=+F+FH^H^*_an)op$,M++}/J/JJ$,M 9 << ; ;SA$$}'B'BC&H-%XY$1OD!' 7* 13
(//1I%.!!!'* &/ 2 Y__:::FG3N+
CHZ[\I\C]^C]a
1z!a%'89C]^fh"GN,224	c/2+L)#A3Q'RS*8T#,	 03
 %%tX&67 5  &&'@A # #" _s   6I>c                F    | j                   D ]  }|j                           y rC   )r   rQ   r   s     r   rQ   zHookGroup.reset  s    JJDJJL r   c                0   g }| D ]  }||j                  |        t        |      |k  rt        d| dt        |       d      t        |      dk(  ry t        |      dk(  r|d   S d }|D ]&  }||j                         }|j	                  |      }( |S )NzNeed at least z  hooks to combine, but only had .r   r   )r   r   	ExceptionrX   r   )
hooks_listrequire_countactualgroup
final_hookr6   s         r   combine_all_hookszHookGroup.combine_all_hooks  s    "$E e$   v;&n]O;[\_`f\g[hhijkkv;![A!9 $
D!!ZZ\
'99$?
	 
 r   N)r6   r3   )rD   r   )ra   r4   )r   rG   r   )r   zlist[HookGroup]returnr4   )r   r   r   r   rL   r   r   r   r   r   r   r   rX   r   r   r   rQ   staticmethodr   r   r   r   r4   r4     s^    =H
9
2"0
)/#b  r   c                  $    e Zd ZdddZddZd Zy)HookKeyframec                N    || _         t        |      | _        d| _        || _        y )Ng33dA)rN   floatr   start_tguarantee_steps)rK   rN   r   r  s       r   rL   zHookKeyframe.__init__  s%     "=1".r   c                :    | j                   |kD  ry| j                  S )zIIf keyframe starts before current sampling range (max_sigma), treat as 0.r   )r  r  )rK   	max_sigmas     r   get_effective_guarantee_stepsz*HookKeyframe.get_effective_guarantee_steps  s    <<)####r   c                    t        | j                  | j                  | j                        }| j                  |_        |S )N)rN   r   r  )r   rN   r   r  r  rV   s     r   rX   zHookKeyframe.clone  s4    $--'+'9'94K_K_aLL	r   N)r   r   )rN   r   )r  torch.Tensor)r   r   r   rL   r  rX   r   r   r   r   r     s    /$r   r   c                  `    e Zd Zd Zed        Zd ZddZd Zd Z	ddZ
d Zd	 Zdd
ZddZy)rG   c                X    g | _         d | _        d| _        d| _        d | _        d| _        y Nr   g      )r   _current_keyframe_current_used_steps_current_index_current_strength_curr_trO   s    r   rL   zHookKeyframeGroup.__init__  s0    -//3#$ !%r   c                H    | j                   | j                   j                  S y)Nr   )r  rN   rO   s    r   rN   zHookKeyframeGroup.strength  s#    !!-))222r   c                j    d | _         d| _        d| _        d | _        d| _        | j                          y r
  )r  r  r  r  curr_t_set_first_as_currentrO   s    r   rQ   zHookKeyframeGroup.reset  s5    !%#$ !%""$r   c                    | j                   j                  |       t        | j                   d      | _         | j                          y )Nr   )r   r   get_sorted_list_via_attrr  )rK   r   s     r   r   zHookKeyframeGroup.add  s2    h'1$../R""$r   c                l    t        | j                        dkD  r| j                  d   | _        y d | _        y Nr   )r   r   r  rO   s    r   r  z'HookKeyframeGroup._set_first_as_current  s,    t~~"%)^^A%6D"%)D"r   c                H    | j                   D ]  }|j                  dkD  s y y)Nr   TF)r   r  )rK   kfs     r   has_guarantee_stepsz%HookKeyframeGroup.has_guarantee_steps  s&    ..B!!A% ! r   c                @    |dk\  xr |t        | j                        k  S r  r   r   )rK   indexs     r   	has_indexzHookKeyframeGroup.has_index  s    z9ec$..&999r   c                2    t        | j                        dk(  S r  r  rO   s    r   is_emptyzHookKeyframeGroup.is_empty  s    4>>"a''r   c                    t               }| j                  D ]+  }|j                  j                  |j                                - |j	                          |S rC   )rG   r   r   rX   r  )rK   rW   r   s      r   rX   zHookKeyframeGroup.clone  sB    HKKx~~/0 '	!r   c                z    | j                   D ],  }|j                  j                  |j                        |_        . y rC   )r   model_samplingpercent_to_sigmar   r  )rK   r'   r   s      r   rR   z&HookKeyframeGroup.initialize_timesteps  s/    H$33DDXE[E[\H 'r   c                   | j                         ry|| j                  k(  ryt        j                  |d         }| j                  }| j
                  }| j                  | j                  j                  |      k\  r| j                  | j                  dz         rt        | j                  dz   t        | j                              D ]h  }| j                  |   }|j                  |k\  rG|| _        |j                  | _        || _        d| _        | j                  j                  |      dkD  sf n n | xj                  dz  c_        || _        || j                  k7  xr || j
                  k7  S )NFsample_sigmasr   r   )r   r  torchmaxr  r  r  r  r  r  r   r   r   r  rN   )rK   r  r   r  
prev_indexprev_strengthr   eval_cs           r   prepare_current_keyframez*HookKeyframeGroup.prepare_current_keyframe  sB   ==?T\\!II1/BC	((
..##t'='='['[\e'ff~~d11!34t2214c$..6IJA!^^A.F ~~/./+17.17.34011OOPYZ]^^!  K  	  A% T000\]dF\F\5\\r   N)r   r   )r  intrg   )r  r   r   dict[str, torch.Tensor]r   bool)r   r   r   rL   rk   rN   rQ   r   r  r  r  r   rX   rR   r,  r   r   r   rG   rG     sJ      
%%*:(] ]r   rG   c                  <    e Zd ZdZdZdZdZeeeegZeddd       Z	y)	InterpolationMethodlinearease_inease_outease_in_outc                n   ||z
  }|| j                   k(  rt        j                  |||      }n|| j                  k(  r4t        j                  dd|      }|t	        j
                  |d      z  |z   }n|| j                  k(  r:t        j                  dd|      }|dt	        j
                  d|z
  d      z
  z  |z   }nh|| j                  k(  rJt        j                  dd|      }|dt	        j                  |t        j                  z        z
  dz  z  |z   }nt        d| d      |r|j                  d      }|S )Nr   r      z#Unrecognized interpolation method 'z'.r   )dims)LINEARr'  linspaceEASE_INnppowerEASE_OUTEASE_IN_OUTcospi
ValueErrorflip)	clsnum_fromnum_tolengthmethodreversediffrp   r  s	            r   get_weightszInterpolationMethod.get_weights$  s    SZZnnXvv>Gs{{"NN1a0ERXXeQ//(:Gs||#NN1a0Ea"((1u9a"889HDGs&NN1a0Eq266%"%%-#88A=>IGB6("MNNlll-Gr   N)F)rE  r   rF  r   rG  r-  rH  rf   )
r   r   r   r9  r;  r>  r?  _LISTclassmethodrK  r   r   r   r1  r1    s6    FGHKWh4E r   r1  c                |   | s| S t        |       dk  r| D cg c]  }| c}S i }| D ]C  }t        ||      }|j                  |t                     }|j	                  |       ||vs?|||<   E t        t        |j                                     }g }|j                         D ]  }	|j                  |	        |S c c}w )Nr   )
r   getattrr~   listr   ri   r   r   r   extend)
objectsattrxunique_attrsoval_attr	attr_listsorted_attrssorted_listobject_lists
             r   r  r  8  s    	W	"#7a7## L1d#&**8TV<	<'%.L"  |11345LK#**,;' -# $s   	B9c                    || j                   ri S |i }|j                  t        j                        D ]  }|j	                  | |        |S rC   )is_clipr   r   r#   r   )r'   r   r   r6   s       r   %create_transformer_options_from_hooksr^  O  sQ    }	" |>>?E#67 @ r   c                d    t               }t        ||      }|j                  |       | |_        |S )Nru   rv   )r4   rm   r   rp   )r   ru   rv   
hook_groupr6   s        r   create_hook_lorarb  Z  s.    J^=QDNN4DLr   c                    t               }t        ||      }|j                  |       d }d }| i }| D ]  }d| |   ff||<    |i }|D ]  }d||   ff||<    ||_        ||_        d|_        |S )Nr`  model_as_loraF)r4   rm   r   rp   rq   rr   )	weights_modelrq   ru   rv   ra  r6   patches_modelpatches_clipr   s	            r   create_hook_model_as_lorarh  a  s    J^=QDNN4ML  C"1M#4F3H!IM# !C!0<3D2F GL   DL$D!Dr   Tc                    | y | j                   j                         }|rBt        |j                               D ]&  }|j	                  d      s|j                  |d        ( |S )Nr#  )r'   
state_dictrP  keys
startswithpop)r'   discard_model_samplingrf  r   s       r   get_patch_weights_from_modelro  t  s\    }-2[[-C-C-EM**,-C~~./!!#t, . r   c                   i }| *t         j                  j                  | j                  |      }|*t         j                  j	                  |j
                  |      }t               }t               }|j                  |       t         j                  j                  ||      }| %| j                         }	|	j                  |||      }
nd}
d }	|/|j                         }|j                  j                  |||      }nd}d }t        |
      }
t        |      }|D ]$  }||
vs||vst        j                  d|        & |	||fS )Nr{   r   zNOT LOADED )r   r   r   r'   r   cond_stage_modelr4   rm   r   r   rX   r_   patcherr   loggingwarning)r'   r(   r   ru   rv   r   ra  r6   loadednew_modelpatcherknew_clipk1rT  s                 r   load_hook_lora_for_modelsrz    s2   G**11%++wG**11$2G2GQJ<DNN4

,,T7;F ;;=--4Xf-g::<..D&Yf.gAA	RBQJQb[OOk!-.  h
33r   c                    d}||vry || vr|j                  |d       }||| |<   y | |   ||   f}|j                  |d       }|"|d   j                  |d         }|||<   || |<   y ||   | |<   y )Nr   r   r   )r~   r   )c_dictr   cache	hooks_keyhooks_valuehooks_tuplecached_hooks	new_hookss           r   _combine_hooks_from_valuesr    s    IjjD1" +F9)$fY&78K99[$/LN44[^D	&k%y!+.yr   c                    g }|i }| D ]U  }|d   |d   j                         g}|D ]%  }|r|dk(  rt        |d   ||       ||   |d   |<   ' |j                  |       W |S )Nr   r   r   )r   r  r   )conditioningr   append_hooksr}  rW   tnrw  s           r   "conditioning_set_values_with_hooksr    s{    
A}qT1Q499;AW*1Q4? )!Q	 
 	
  Hr   c                ,    || S t        | d|i||      S )Nr   r  r}  )r  )condr   r  r}  s       r   set_hooks_for_conditioningr    s$    }-dWe4DS_glmmr   c                4    || S t        | |d   |d   d      S )Nr   r   )r   end_percentr
   r  timestep_ranges     r   set_timesteps_for_conditioningr    s3    "4>!;L9G9J*L M Mr   c                    || S d}|dk7  rd}t        |j                        dk  r|j                  d      }t        | |||d      S )NFdefaultT   r   )maskset_area_to_boundsmask_strength)r   shape	unsqueezer   )r  r  set_cond_arearN   r  s        r   set_mask_for_conditioningr    s]    |	!!
4::~~a "4$@R;C*E F Fr   c                :    g }| D ]  }|j                  |        |S rC   )rQ  )condscombined_condsr  s      r   combine_conditioningr    s%    Nd# r   c                j    g }t        | |      D ]!  \  }}|j                  t        ||g             # |S rC   )zipr   r  )r  	new_condsr  rW   new_cs        r   combine_with_new_condsr    s:    Ny)52Au:>? *r   c                    g }i }| D ]>  }	t        |	|||      }	t        |	|||      }	t        |	|      }	|j                  |	       @ |S )Nr  )r  r  rN   r  r  )r  r  r  r   )
r  rN   r  r  r   timesteps_ranger  final_condsr}  rW   s
             r   set_conds_propsr    sZ    KE&q%lRWX%14(Zgh*/R1  r   c                    g }i }	t        | |      D ]L  \  }
}t        ||||	      }t        ||||      }t        ||      }|j	                  t        |
|g             N |S )Nr  )r  r  r  rN   r  )r  r  r  r  r   r  )r  r  rN   r  r  r   r  r  r  r}  rW   masked_cs               r   set_conds_props_and_combiner    sq    NE5),8-hL`ef,(Ubmuv1xP_`2Ax=AB - r   c                    g }i }t        | |      D ]K  \  }}t        ||||      }t        |ddi      }t        ||      }|j	                  t        ||g             M |S )Nr  r  Tr  )r  r  r   r  r   r  )	r  r  r   r  r  r  r}  rW   r  s	            r   set_default_conds_and_combiner    so    NEy)5*5%lZ_`'	4/@A.E/Z2Au:>? * r   )
r6   r3   r'   r   r7   ri   r8   rj   r9   r4   rC   )r<   r&   r   rj   )rR  rP  rS  rf   r   rP  )r'   r   r   r4   r   rj   )r   r.  ru   r   rv   r   )ru   r   rv   r   )T)r'   r   )
r'   r   r(   r	   r   r.  ru   r   rv   r   )r|  dict[str, HookGroup]r   r  r}  ,dict[tuple[HookGroup, HookGroup], HookGroup])r}  r  )TN)r   r4   r}  r  )r  tuple[float, float])r  r  r  rf   rN   r   )r  rP  )r  rP  r  rP  )NNNT)r  rP  rN   r   r  rf   r  r  r   r4   r  r  )r   r  NNNT)r  rP  r  rP  rN   r   r  rf   r  r  r   r4   r  r  )NNT)r  rP  r  rP  r   r4   r  r  )<
__future__r   typingr   r   enumr   r'  numpyr<  r   rs  comfy.model_patcherr   r   comfy.model_baser   comfy.sdr	   
comfy.lorar   comfy.model_managementcomfy.patcher_extensionnode_helpersr   Enumr   r   r&   r,   r2   r:   r@   r3   rm   r   r   r   WrapperHookr   r4   r   rG   r1  r  r^  rb  rh  ro  rz  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s   " *      B*    0499 "499 "tyy DII 	 	
/# /#b: :xVd V4 .$vT $vL % `UT U"H HV ([] []| 8.	&	4.34DI4@/( =?T[_.Z n
M
F {%3<Tf gp GK%1?H`r  rv*3K]r   