
    +h7                        S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
JrJr  SSKJr  \R                  " \5      r\" 5       (       a  SSKrS	 rS
 rSS\\   4S jjr SS jrS rSS jrS rS rS\SS4S jr SS jrS rS r g)z3
PEFT utilities: Utilities related to peft library
    N)Optional)version   )logging)is_peft_availableis_peft_versionis_torch_available)empty_device_cachec           
         SSK Jn  SnU R                  5        H!  n[        X15      (       d  M  [	        US5      n  O   U(       av  SSKJn  U R                  5        VVs/ s H  u  pVSU;  d  M  UPM     nnnU H<  n U" X5      u  pn
[	        U	S5      (       d  M"  [        XU	R                  5       5        M>     U $ SSKJn  U R                  5        GH  u  p[        [        UR!                  5       5      5      S:  a  [#        U5        Sn[        X;5      (       a  [        U[$        R&                  R(                  5      (       a  [$        R&                  R)                  UR*                  UR,                  UR.                  SLS	9R1                  UR2                  R4                  5      nUR2                  Ul        UR.                  b  UR.                  Ul        S
nO[        X;5      (       a  [        U[$        R&                  R6                  5      (       a  [$        R&                  R7                  UR8                  UR:                  UR<                  UR>                  UR@                  URB                  URD                  5      R1                  UR2                  R4                  5      nUR2                  Ul        UR.                  b  UR.                  Ul        S
nU(       d  GM  [        XW5        A[G        5         GM"     U $ s  snnf ! [         a     GM  f = f)z\
Recursively replace all instances of `LoraLayer` with corresponding new layers in `model`.
r   BaseTunerLayerF
base_layer)_get_submoduleslora)	LoraLayerN)biasT)$peft.tuners.tuners_utilsr   modules
isinstancehasattr
peft.utilsr   named_modulesAttributeErrorsetattrget_base_layerpeft.tuners.lorar   named_childrenlenlistchildrenrecurse_remove_peft_layerstorchnnLinearin_featuresout_featuresr   toweightdeviceConv2din_channelsout_channelskernel_sizestridepaddingdilationgroupsr
   )modelr   has_base_layer_patternmoduler   key_key_listparenttargettarget_namer   namemodule_replaced
new_modules                  T/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/utils/peft_utils.pyr!   r!   #   sk    8"--/f--%,V\%B" "
 .&+&9&9&;Q&;FCvS?PC&;QC.=e.I+ v|,,V-B-B-DE h LU 	/!002LD4)*+a/*62#O&,,FEHHOO1T1T"XX__&&''D0 -  "V]]))*	 
 %+MM
!;;*&,kkJO"&F..:fehhoo3V3V"XX__&&''&&MMNNOOMM "V]]))*  %+MM
!;;*&,kkJO"&Z0"$O 3P Lk R " s   K7.K7=K==
LLc                     SSK Jn  US:X  a  gU R                  5        H&  n[        X25      (       d  M  UR	                  U5        M(     g)z
Adjust the weightage given to the LoRA layers of the model.

Args:
    model (`torch.nn.Module`):
        The model to scale.
    weight (`float`):
        The weight to be given to the LoRA layers.
r   r         ?N)r   r   r   r   scale_layer)r2   r(   r   r4   s       r>   scale_lora_layersrB   j   s:     8}--/f--v& "    r(   c                     SSK Jn  Ub  US:X  a  gU R                  5        HS  n[        X25      (       d  M  US:w  a  UR	                  U5        M.  UR
                   H  nUR                  US5        M     MU     g)a  
Removes the previously passed weight given to the LoRA layers of the model.

Args:
    model (`torch.nn.Module`):
        The model to scale.
    weight (`float`, *optional*):
        The weight to be given to the LoRA layers. If no scale is passed the scale of the lora layer will be
        re-initialized to the correct value. If 0.0 is passed, we will re-initialize the scale with the correct
        value.
r   r   Nr@   )r   r   r   r   unscale_layeractive_adapters	set_scale)r2   r(   r   r4   adapter_names        r>   unscale_lora_layersrI   ~   se     8~3--/f--{$$V,$*$:$:L$$\37 %; "rC   c           	        ^^ 0 n0 n[        U R                  5       5      S   =mm[        [        U R                  5       5      5      S:  a  [        R
                  " U R                  5       5      R                  5       S   S   m[        [        U4S jU R                  5       5      5      nUR                  5        VV	s0 s H  u  pUR                  S5      S   U	_M     nnn	UGb  [        U5      S:  Gas  [        [        UR                  5       5      5      S:  Ga%  [        R
                  " UR                  5       5      R                  5       S   S   m[        [        U4S jUR                  5       5      5      nU(       af  UR                  5        VV	s0 s HH  u  pSR                  UR                  S5      S   R                  S5      5      R                  SS	5      U	_MJ     nnn	OUR                  5        VV	s0 s H;  u  pSR                  UR                  S
5      S   R                  S5      S S 5      U	_M=     nnn	O'[        UR                  5       5      R                  5       m[        UR                  5        V
s1 s H  oR                  S5      S   iM     sn
5      n[        S U 5       5      n[        S U 5       5      nTTUUUUUS.nU$ s  sn	nf s  sn	nf s  sn	nf s  sn
f )Nr   r   c                    > U S   T:g  $ Nr    )xrs    r>   <lambda>!get_peft_kwargs.<locals>.<lambda>   s    QqTQYrC   z.lora_B.c                    > U S   T:g  $ rL   rM   )rN   
lora_alphas    r>   rP   rQ      s    !A$*2DrC   .z.lora_A.z.alpha z.down.z.lorac              3   ,   #    U  H
  nS U;   v   M     g7f)lora_magnitude_vectorNrM   .0ks     r>   	<genexpr>"get_peft_kwargs.<locals>.<genexpr>   s     IA*a/s   c              3   \   #    U  H"  nS U;   =(       a    UR                  S5      v   M$     g7f)lora_Bz.biasN)endswithrY   s     r>   r\   r]      s%     S?aHM9ajj&99?s   *,)rO   rS   rank_patternalpha_patterntarget_modulesuse_dora	lora_bias)r   valuesr   setcollectionsCountermost_commondictfilteritemssplitjoinreplacepopkeysany)	rank_dictnetwork_alpha_dictpeft_state_dictis_unetmodel_state_dictrH   ra   rb   r[   vr;   rc   rd   re   lora_config_kwargsrS   rO   s                  @@r>   get_peft_kwargsr{      s    LM)**,-a00A

3y!"#a'	 0 0 23??A!DQG F#6	8IJK>J>P>P>RS>Rda
+A.1>RS%#.@*AA*Es%,,./014$,,-?-F-F-HIUUWXYZ[\]J !(DFXF^F^F`!abM !. 3 3 5! 5 HHQWWZ0399#>?GGRTUWXX 5  !
 `m_r_r_t u_tW[WX!''(*;A*>*D*DS*I#2*N!OQR!R_t u/6689==?Jo>R>R>TU>Td::g.q1>TUVNIIIHS?SSI  $&( E T!
 !v Vs   =!KAK;AK?K%c                     SSK Jn  U R                  5        H-  n[        X!5      (       d  M  S[	        UR
                  5       3s  $    g)Nr   r   default_	default_0)r   r   r   r   r   rO   )r2   r   r4   s      r>   get_adapter_namer      s:    7--/f--c&((m_-- " rC   c                     SSK Jn  U R                  5        HC  n[        X25      (       d  M  [	        US5      (       a  UR                  US9  M7  U(       + Ul        ME     g )Nr   r   enable_adapters)enabled)r   r   r   r   r   r   disable_adapters)r2   r   r   r4   s       r>   set_adapter_layersr      sI    7--/f--v011&&w&7.5+' "rC   c                    SSK Jn  U R                  5        HB  n[        X25      (       d  M  [	        US5      (       a  UR                  U5        M9  [        S5      e   [        U SS5      (       aR  [	        U S5      (       a@  U R                  R                  US 5        [        U R                  5      S:X  a
  U ?S U l        g g g g )Nr   r   delete_adapterzdThe version of PEFT you are using is not compatible, please use a version that is greater than 0.6.1_hf_peft_config_loadedFpeft_config)r   r   r   r   r   r   
ValueErrorgetattrr   rq   r   r   )r2   rH   r   r4   s       r>   delete_adapter_layersr      s    7--/f--v/00%%l3 z  " u.6675-;X;XlD1 u  !Q&!+/E( '	 <Y6rC   c           	         SSK Jn  S nU R                  5        Hk  u  pV[        Xc5      (       d  M  [	        US5      (       a  UR                  U5        OXl        [        X5       H  u  pxUR                  Xt" X5      5        M     Mm     g )Nr   r   c                     [        U [        5      (       d  U $ U R                  5        H  u  p#X!;   d  M  Us  $    UR                  S5      nUS    SUS    SUS    3nU R	                  US5      nU$ )NrT   r   r   z.attentions.   r@   )r   rk   rm   rn   get)weight_for_adaptermodule_name
layer_nameweight_partsr5   block_weights          r>   get_module_weight<set_weights_and_activate_adapters.<locals>.get_module_weight   s    ,d33%%#5#;#;#=J( $> !!#&q
!E!H:\%(<)--c37rC   set_adapter)	r   r   r   r   r   r   active_adapterziprG   )	r2   adapter_namesweightsr   r   r   r4   rH   r(   s	            r>   !set_weights_and_activate_adaptersr      sy    7   %224f--v}--""=1(5% ),M(C$  /@/UV )D  5rC   min_versionreturnc                     [        5       (       d  [        S5      e[        R                  " [        R
                  R                  S5      5      [        R                  " U 5      :  nU(       d  [        SU  35      eg)zx
Checks if the version of PEFT is compatible.

Args:
    version (`str`):
        The version of PEFT to check against.
z@PEFT is not installed. Please install it with `pip install peft`peftz_The version of PEFT you are using is not compatible, please use a version that is greater than N)r   r   r   parse	importlibmetadata)r   is_peft_version_compatibles     r>   check_peft_versionr     so     [\\!(y/A/A/I/I&/Q!RU\UbUbcnUo!o% M#
 	
 &rC   c           	      J   SSK Jn  Ub  UnO[        UUU UUUS9n[        U5        SU;   a&  US   (       a  [	        SS5      (       a  [        S5      eSU;   a&  US   (       a  [	        S	S
5      (       a  [        S5      e U" S0 UD6$ ! [         a  n	[        S5      U	eS n	A	ff = f)Nr   )
LoraConfig)ru   rv   rw   rx   rH   rd   <z0.9.0z,DoRA requires PEFT >= 0.9.0. Please upgrade.re   z<=z0.13.2z2lora_bias requires PEFT >= 0.14.0. Please upgrade.z-`LoraConfig` class could not be instantiated.rM   )r   r   r{   %_maybe_raise_error_for_ambiguous_keysr   r   	TypeError)

state_dictnetwork_alphasr   rank_pattern_dictrw   rx   rH   r   rz   es
             r>   _create_lora_configr   *  s      %,-&-%
 **<= '',>z,J3((KLL((-?-L4**QRRP/.// PGHaOPs   ?B 
B"BB"c                 V   U S   R                  5       nU S   n[        UR                  5       5       Hj  nU Vs/ s H  oDU:X  d  M
  UPM     nnU Vs/ s H  oCU;   d  M
  XC:w  d  M  UPM     nnU(       d  ME  U(       d  MN  [        SS5      (       d  Ma  [	        S5      e   g s  snf s  snf )Nra   rc   r   z0.14.1zzThere are ambiguous keys present in this LoRA. To load it, please update your `peft` installation - `pip install -U peft`.)copyr   rr   r   r   )configra   rc   r5   modexact_matchessubstring_matchess          r>   r   r   L  s    .)..0L,-NL%%'( )7E*E,:XNSSjSSZSNX=..sH--  Q  ) FXs   	B!B!	B&B&&B&c                    SnU b  [        U SS 5      nU(       a=  U Vs/ s H  nSU;   d  M  X;   d  M  UPM     nnU(       a  SSR                  U5       S3n[        U SS 5      nU(       a@  U Vs/ s H  nSU;   d  M  X;   d  M  UPM     nnU(       a  USSR                  U5       S	3-  nU(       a  [        R                  U5        g g s  snf s  snf )
NrU   unexpected_keyslora_zSLoading adapter weights from state_dict led to unexpected keys found in the model: z, z. missing_keyszJLoading adapter weights from state_dict led to missing keys in the model: rT   )r   ro   loggerwarning)incompatible_keysrH   warn_msgr   r[   lora_unexpected_keysr   lora_missing_keyss           r>   _maybe_warn_for_unhandled_keysr   `  s    H$!"35FM/>#e!'Q,AS_SdA #e#		"678<  0.$G,8 _LqGqL\M^L _ 		"345Q8
 x  # $f !`s!   
C	C	C	/
C=CC)N)TNN)T)!__doc__rh   r   typingr   	packagingr   rU   r   import_utilsr   r   r	   torch_utilsr
   
get_logger__name__r   r"   r!   rB   floatrI   r{   r   r   r   r   strr   r   r   r   rM   rC   r>   <module>r      s         P P + 
		H	%DN'(8x 88 gk/d	60,W@
C 
D 
* ptPD(!rC   