
    
3jGZ                        S r SSKrSSKrSSKJr  SSKJr  \" 5       (       a  SSKr\" \5      r	 " S S\R                  5      rSS	S
SSSSSSSSS.r0 SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S)_S*S+_S,S-_S.S/_S0S1_S2S3_S4S5_S6S70E\" SS85       V s0 s H  n S9U  S:3S9U  S;3_M     sn E\" SS85       V s0 s H  n S9U  S<3S9U  S=3_M     sn ES>S?S@SASB.E\" SS85       V s0 s H  n SCU  S:3SCU  S;3_M     sn E\" SS85       V s0 s H  n SCU  S<3SCU  S=3_M     sn ESDSESF.ErSGSHSISJSKSLSMSNSSSOSPSQ.rSGSHSISJSKSLSMSNSSSR.
r0 SGSS_SHST_SISU_SJSV_SKSW_SLSX_SMSY_SNSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_rSSSTSUSVSWSXSYSZSkSlSmSnSo.rSpSqSr.r\R(                  \\R*                  \0r\R(                  \\R.                  \0r\R.                  \0rSsSt0rSu rSSv jrSSw jrSx rSy rSz r SS{ jr!SS| jr"S}\#4S~ jr$gs  sn f s  sn f s  sn f s  sn f )zI
State dict utilities: utility methods for converting state dicts easily
    N   )is_torch_available)
get_loggerc                   (    \ rS rSrSrSrSrSrSrSr	g)	StateDictType    z.
The mode to use when converting state dicts.
diffusers_oldkohya_sspeft	diffusers N)
__name__
__module____qualname____firstlineno____doc__DIFFUSERS_OLDKOHYA_SSPEFT	DIFFUSERS__static_attributes__r       Z/home/wildlama/miniconda3/lib/python3.13/site-packages/diffusers/utils/state_dict_utils.pyr   r       s     $MHDIr   r   z.to_out.0.lora_Bz.to_out.0.lora_Az.to_q.lora_Az.to_q.lora_Bz.to_k.lora_Az.to_k.lora_Bz.to_v.lora_Az.to_v.lora_Bz.lora_B.lora_Az.to_out.0.lora_magnitude_vector).to_out_lora.up.to_out_lora.down.to_q_lora.down.to_q_lora.up.to_k_lora.down.to_k_lora.up.to_v_lora.down.to_v_lora.upz.lora.upz
.lora.down.to_out.lora_magnitude_vectorz
.to_q.downz.to_q.lora_A.weightz.to_q.upz.to_q.lora_B.weightz
.to_k.downz.to_k.lora_A.weightz.to_k.upz.to_k.lora_B.weightz
.to_v.downz.to_v.lora_A.weightz.to_v.upz.to_v.lora_B.weightz.to_out.0.downz.to_out.0.lora_A.weightz.to_out.0.upz.to_out.0.lora_B.weightz.ff.net.0.proj.downz.ff.net.0.proj.lora_A.weightz.ff.net.0.proj.upz.ff.net.0.proj.lora_B.weightz.ff.net.2.downz.ff.net.2.lora_A.weightz.ff.net.2.upz.ff.net.2.lora_B.weightz.proj_in.downz.proj_in.lora_A.weightz.proj_in.upz.proj_in.lora_B.weightz.proj_out.downz.proj_out.lora_A.weightz.proj_out.upz.proj_out.lora_B.weightz
.conv.downz.conv.lora_A.weightz.conv.upz.conv.lora_B.weight   z.convz.downz.lora_A.weightz.upz.lora_B.weightzconv_in.lora_A.weightzconv_in.lora_B.weightz.conv_shortcut.lora_A.weightz.conv_shortcut.lora_B.weight)zconv_in.downz
conv_in.upz.conv_shortcut.downz.conv_shortcut.upz.linear_ztime_emb_proj.lora_A.weightztime_emb_proj.lora_B.weight)ztime_emb_proj.downztime_emb_proj.upz.q_proj.lora_Bz.q_proj.lora_Az.k_proj.lora_Bz.k_proj.lora_Az.v_proj.lora_Bz.v_proj.lora_Az.out_proj.lora_Bz.out_proj.lora_Aztext_projection.lora_A.weightztext_projection.lora_B.weight).q_proj.lora_linear_layer.up.q_proj.lora_linear_layer.down.k_proj.lora_linear_layer.up.k_proj.lora_linear_layer.down.v_proj.lora_linear_layer.up.v_proj.lora_linear_layer.down.out_proj.lora_linear_layer.up .out_proj.lora_linear_layer.down.lora_linear_layer.up.lora_linear_layer.downz text_projection.lora.down.weightztext_projection.lora.up.weight)
r   r   r    r   r"   r!   r   r   r-   r.   r%   r&   r'   r(   r)   r*   r+   r,   zto_k.lora_Azto_k.lora.downzto_k.lora_Bzto_k.lora.upzto_q.lora_Azto_q.lora.downzto_q.lora_Bzto_q.lora.upzto_v.lora_Azto_v.lora.downzto_v.lora_Bzto_v.lora.upzto_out.0.lora_Azto_out.0.lora.downzto_out.0.lora_Bzto_out.0.lora.upz.k_proj.lora_magnitude_vectorz.v_proj.lora_magnitude_vectorz.q_proj.lora_magnitude_vectorz.out_proj.lora_magnitude_vector)r   r   r    r   r"   r!   r   r   z.to_k.lora_magnitude_vectorz.to_v.lora_magnitude_vectorz.to_q.lora_magnitude_vectorr#   	lora_downlora_up)lora_Alora_Bz.processor..c                 "   0 nU R                  5        Hx  u  p4[        R                  5        H$  nXS;   d  M
  [        U   nUR                  XV5      nM&     UR                  5        H  nXS;   d  M
  X   nUR                  XV5      n  O   XBU'   Mz     U$ )a  
Simply iterates over the state dict and replaces the patterns in `mapping` with the corresponding values.

Args:
    state_dict (`dict[str, torch.Tensor]`):
        The state dict to convert.
    mapping (`dict[str, str]`):
        The mapping to use for conversion, the mapping should be a dictionary with the following structure:
            - key: the pattern to replace
            - value: the pattern to replace with

Returns:
    converted_state_dict (`dict`)
        The converted state dict.
)itemsKEYS_TO_ALWAYS_REPLACEkeysreplace)
state_dictmappingconverted_state_dictkvpatternnew_patterns          r   convert_state_dictr@      s        "-224G|4W=IIg3 5
 ||~G|%.IIg3	 &
 #$Q #  r   c                 l   Ucw  [        S U R                  5        5       5      (       a  [        R                  nOA[        S U R                  5        5       5      (       a  [        R                  nO[        S5      eU[        R                  5       ;  a  [        SU S35      e[        U   n[        X5      $ )a  
Converts a state dict to the PEFT format The state dict can be from previous diffusers format (`OLD_DIFFUSERS`), or
new diffusers format (`DIFFUSERS`). The method only supports the conversion from diffusers old/new to PEFT for now.

Args:
    state_dict (`dict[str, torch.Tensor]`):
        The state dict to convert.
    original_type (`StateDictType`, *optional*):
        The original type of the state dict, if not provided, the method will try to infer it automatically.
c              3   ,   #    U  H
  nS U;   v   M     g7fto_out_loraNr   .0r<   s     r   	<genexpr>-convert_state_dict_to_peft.<locals>.<genexpr>        =+<a}!+<   c              3   ,   #    U  H
  nS U;   v   M     g7flora_linear_layerNr   rE   s     r   rG   rH           E3Da$)3DrJ   -Could not automatically infer state dict typeOriginal type  is not supported)anyr7   r   r   r   
ValueErrorPEFT_STATE_DICT_MAPPINGSr@   )r9   original_typekwargsr:   s       r   convert_state_dict_to_peftrW      s     =:??+<===)77ME:??3DEEE)33MLMM499;;>-8IJKK&}5Gj22r   c                   ^ UR                  SS5      mTb  ST-   mOSmUc  [        S U R                  5        5       5      (       a  [        R                  nOk[        U4S jU R                  5        5       5      (       a  [        R
                  nO2[        S U R                  5        5       5      (       a  U $ [        S5      eU[        R                  5       ;  a  [        S	U S
35      e[        U   n[        X5      $ )a^  
Converts a state dict to new diffusers format. The state dict can be from previous diffusers format
(`OLD_DIFFUSERS`), or PEFT format (`PEFT`) or new diffusers format (`DIFFUSERS`). In the last case the method will
return the state dict as is.

The method only supports the conversion from diffusers old, PEFT to diffusers new for now.

Args:
    state_dict (`dict[str, torch.Tensor]`):
        The state dict to convert.
    original_type (`StateDictType`, *optional*):
        The original type of the state dict, if not provided, the method will try to infer it automatically.
    kwargs (`dict`, *args*):
        Additional arguments to pass to the method.

        - **adapter_name**: For example, in case of PEFT, some keys will be prepended
            with the adapter name, therefore needs a special handling. By default PEFT also takes care of that in
            `get_peft_model_state_dict` method:
            https://github.com/huggingface/peft/blob/ba0477f2985b1ba311b83459d29895c809404e99/src/peft/utils/save_and_load.py#L92
            but we add it here in case we don't want to rely on that method.
adapter_nameNr3    c              3   ,   #    U  H
  nS U;   v   M     g7frC   r   rE   s     r   rG   2convert_state_dict_to_diffusers.<locals>.<genexpr>  rI   rJ   c              3   6   >#    U  H  nS T S3U;   v   M     g7fr   .weightNr   rF   r<   peft_adapter_names     r   rG   r\     s#     VDUq7,-W5:DU   c              3   ,   #    U  H
  nS U;   v   M     g7frL   r   rE   s     r   rG   r\     rN   rJ   rO   rP   rQ   )	poprR   r7   r   r   r   rS   DIFFUSERS_STATE_DICT_MAPPINGSr@   )r9   rU   rV   r:   ra   s       @r   convert_state_dict_to_diffusersrf      s    , 

>48$"33=:??+<===)77MVJOODUVVV)..ME:??3DEEELMM9>>@@>-8IJKK+M:Gj22r   c                 $    [         n[        X5      $ )zY
Converts a state dict from UNet format to diffusers format - i.e. by removing some keys
)UNET_TO_DIFFUSERSr@   )r9   r:   s     r   convert_unet_state_dict_to_peftri     s      Gj22r   c                 :    S nU" U 5      n [         n[        X5      $ )Nc           
         SU ;  n[         R                  SU(       a  SOS S35        [        U  Vs1 s H.  nSU;   d  M  SR                  UR	                  S5      S S 5      iM0     sn5      n[        U5       VVs0 s H!  nX@ Vs/ s H  nS	U 3U;   d  M  UPM     sn_M#     nnnSnU  Vs/ s H  nS
U;   d  M  UPM     nn0 n	US    H(  nUR                  SS5      n
U R                  U5      X'   M*     U  Vs/ s H  nSU;   d  M  UPM     nnU H8  nUR                  SS5      R                  SS5      n
U R                  U5      X'   M:     U  Vs/ s H  nSU;   d  M  UPM     nnU H8  nUR                  SS5      R                  SS5      n
U R                  U5      X'   M:     [        SU5       GH  nUS-
  US-   -  nUS-
  US-   -  nXm    Vs/ s H  nS	U S3U;   d  M  S	U S3U;  d  M  UPM     nnU H  nUR                  SS5      R                  SS5      R                  SS 5      R                  S!S"5      R                  S#S$5      R                  S%S&5      n
U
R                  S	U S3S'U S(U 35      n
U R                  U5      X'   M     S	U S)3U ;   aS  U Vs/ s H  nS	U S3U;   d  M  UPM     sn H0  nUR                  S	U S3S'U S*35      n
U R                  U5      X'   M2     Xm    Vs/ s H  nS	U S+3U;   d  M  UPM     nnU(       d  GMg  U H2  nUR                  S	U S+3S'U S,U 35      n
U R                  U5      X'   M4     GM     [        U5       H;  nU R                  S-U S.35      U	S/U S03'   U R                  S-U S135      U	S/U S23'   M=     [        U  Vs1 s H.  nS3U;   d  M  SR                  UR	                  S5      S S 5      iM0     sn5      n[        U5       VVs0 s H!  nX@ Vs/ s H  nS4U 3U;   d  M  UPM     sn_M#     nnnUR                  5        H  n[        US-
  S5      n
US-  S:X  a  UU    H  nUR                  SS5      R                  SS5      R                  SS 5      R                  S!S"5      R                  S#S$5      R                  S%S&5      nUR                  S4U 3S5U
 35      nU R                  U5      U	U'   M     M  UU    H/  nUR                  S4U 3S6U
 35      nU R                  U5      U	U'   M1     M     U R                  S75      U	S8'   U R                  S95      U	S:'   U  Vs1 s H>  nS;U;   d  M  S<U;  d  M  S=U;  d  M  SR                  UR	                  S5      S S 5      iM@     nn[        U5      n[        SUS-   5       HE  nUS-
  nSU-  nU R                  S>U S035      U	S?U S03'   U R                  S>U S235      U	S?U S23'   MG     U  Vs/ s H  nS<U;   d  M  UPM     sn H(  nUR                  S<S@5      n
U R                  U5      X'   M*     U  Vs/ s H  nS=U;   d  M  UPM     sn H(  nUR                  S=SA5      n
U R                  U5      X'   M*     U	$ s  snf s  snf s  snnf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snnf s  snf s  snf s  snf )BNz$input_blocks.11.0.in_layers.0.weightzUsing ControlNet lora (SDXLSD15)input_blocksr3      zinput_blocks.z0.opr   zinput_blocks.0.0conv_in
time_embedztime_embed.0ztime_embedding.linear_1ztime_embed.2ztime_embedding.linear_2	label_embzlabel_emb.0.0zadd_embedding.linear_1zlabel_emb.0.2zadd_embedding.linear_2r   z.0z.0.opzin_layers.0norm1zin_layers.2conv1zout_layers.0norm2zout_layers.3conv2zemb_layers.1time_emb_projskip_connectionconv_shortcutzdown_blocks.z	.resnets.z
.0.op.biasz.downsamplers.0.convz.1z.attentions.zzero_convs.z	.0.weightzcontrolnet_down_blocks.r_   z.0.biasz.biasmiddle_blockzmiddle_block.zmid_block.resnets.zmid_block.attentions.zmiddle_block_out.0.weightzcontrolnet_mid_block.weightzmiddle_block_out.0.biaszcontrolnet_mid_block.biasinput_hint_blockzinput_hint_block.0zinput_hint_block.14zinput_hint_block.z!controlnet_cond_embedding.blocks.z!controlnet_cond_embedding.conv_inz"controlnet_cond_embedding.conv_out)
loggerinfolenjoinsplitranger8   getr7   max)r9   is_sdxllayernum_input_blockslayer_idkeyro   layers_per_block	op_blocksr;   diffusers_keytime_embedding_blockslabel_embedding_blocksiblock_idlayer_in_block_idresnets
attentionsnum_middle_blocksmiddle_blocksr<   diffusers_key_hfcond_embedding_blocksnum_cond_embedding_blocksidxdiffusers_idxcond_block_ids                              r    _convert_controlnet_to_diffusersXconvert_sai_sd_control_lora_state_dict_to_peft.<locals>._convert_controlnet_to_diffusers%  s   8
J-fV-LANO JrJ5ZhlqZq >S)9"1)= >Jrs ""23
3 jVjsmH:4NRU4UsjVV3 	 
  %/@JS&C-SJ	@!?CKK(:IFM2<..2E / #
 1; R
lc>Q
 R(CKK8QRZZ 9M 3=..2E /	 ) 2<!R#{c?Q#!R)CKK9QRZZ!9M 3=..2E /	 * q*+AA#3a#78H!"Q+;a+? @  ,.M!B2G32NUbcdbeejSksvSv   KKw7W]G4W^W5W^W5W^_=W.@  !. 5 5#A3b)\(9M^L_+`! 7AnnS6I$3  qc,
:+4X9C-s%8PTW8WC9XC$'KK's%0L
J^2_%M ;E..:M(7	 Y *6Y#mA3b<QUX<X#JYz%C$'KK's"-hZ|TeSf/g%M ;E..:M(7	 &= ,J '(AISZefgehhqXrIs #:1#W!EFGQ~~XcdecffmVnGo #:1#U!CD )
  Z sZE[imr[r!?%++c*:2A*>!?Z st ""34
4 jVjsmH:4NRU4UsjVV4 	 
 !%%'CaOMQw!|&s+A		-9 8 9 9 A !2OD % (8'?'?'u-1CM?/S($ >H^^A=N()9: , 's+A'(yy=1FJ_`m_nHo'p$=G^^A=N()9: ,# (, ?InnMh>i:;<FNNKd<e89
 $!
#!U* + &U2 + 'e3	 +CHHU[[%bq)*# 	 !
 %((=$>!59:C!GMGM_i_m_m#M?':` #D]OSZ![\ ^h]k]k#M?%8^ #D]OSX!YZ ; $.M:C1E1LC:MCKK(<>abM2<..2E / N $.N:C1F#1MC:NCKK(=?cdM2<..2E / O $#Q  sV
 A !S "S$ Y Z !tV
@!
( N Os   
Z'Z;
ZZZZ,
Z:Z9
ZZ
Z Z Z%#Z%/Z%Z*1Z*4Z/Z/(
Z46'Z42
Z><Z9Z9Z>
[["[*'[:
[	[	
[[Z9Z>)CONTROL_LORA_TO_DIFFUSERSr@   )r9   r   r:   s      r   .convert_sai_sd_control_lora_state_dict_to_peftr   $  s%    M$^ 2*=J'Gj22r   c                      [        U 5      n[	        S UR                  5        5       5      (       d  [        S5      eU$ ! [         a%  n[        U5      S:X  a  [        U 5      n SnAN[e SnAff = f)z
Attempts to first `convert_state_dict_to_peft`, and if it doesn't detect `lora_linear_layer` for a valid
`DIFFUSERS` LoRA for example, attempts to exclusively convert the Unet `convert_unet_state_dict_to_peft`
rO   Nc              3   D   #    U  H  nS U;   =(       d    SU;   v   M     g7f)r1   r2   Nr   )rF   r   s     r   rG   1convert_all_state_dict_to_peft.<locals>.<genexpr>  s"     N=Mcx31(c/1=Ms    z#Your LoRA was not converted to PEFT)rW   	Exceptionstrri   rR   r7   rS   )r9   	peft_dictes      r   convert_all_state_dict_to_peftr     si    
.z:	 NY^^=MNNN>??  q6DD7
CI	s   ? 
A.	A)(A))A.c                   ^	  SSK nUR	                  SS5      m	T	b  ST	-   m	OSm	Uc8  [        U	4S jU R                  5        5       5      (       a  [        R                  nU[        R                  5       ;  a  [        SU S	35      e[        U [        [        R                     5      n0 nUR                  5        H  u  pgS
U;   a  UR                  S
S5      nOJSU;   a  UR                  SS5      nO1SU;   a  UR                  SS5      nOSU;   a  UR                  SS5      nUR                  SSUR                  S5      S-
  5      nUR                  T	S5      nXuU'   SU;   d  M  UR                  S5      S    S3nUR                   " [#        U5      5      XX'   M     U$ ! [         a    [        R                  S5        e f = f)a  
Converts a `PEFT` state dict to `Kohya` format that can be used in AUTOMATIC1111, ComfyUI, SD.Next, InvokeAI, etc.
The method only supports the conversion from PEFT to Kohya for now.

Args:
    state_dict (`dict[str, torch.Tensor]`):
        The state dict to convert.
    original_type (`StateDictType`, *optional*):
        The original type of the state dict, if not provided, the method will try to infer it automatically.
    kwargs (`dict`, *args*):
        Additional arguments to pass to the method.

        - **adapter_name**: For example, in case of PEFT, some keys will be prepended
            with the adapter name, therefore needs a special handling. By default PEFT also takes care of that in
            `get_peft_model_state_dict` method:
            https://github.com/huggingface/peft/blob/ba0477f2985b1ba311b83459d29895c809404e99/src/peft/utils/save_and_load.py#L92
            but we add it here in case we don't want to rely on that method.
r   NzDConverting PEFT state dicts to Kohya requires torch to be installed.rY   r3   rZ   c              3   6   >#    U  H  nS T S3U;   v   M     g7fr^   r   r`   s     r   rG   .convert_state_dict_to_kohya.<locals>.<genexpr>  s#     TBSQ*+73q8BSrb   rP   rQ   ztext_encoder_2.z	lora_te2.ztext_encoder.z	lora_te1.unet	lora_unetlora_magnitude_vector
dora_scale_rp   r/   z.alpha)torchImportErrorr}   errorrd   rR   r7   r   r   KOHYA_STATE_DICT_MAPPINGSrS   r@   r5   r8   countr   tensorr   )
r9   rU   rV   r   kohya_ss_partial_state_dictkohya_ss_state_dict	kohya_keyweight	alpha_keyra   s
            @r   convert_state_dict_to_kohyar     s   &
 

>48$"33T*//BSTTT)..M5::<<>-8IJKK #5ZAZ[h[m[mAn"o 9>>@		)!))*;[II	)!))/;GIy !))&+>I$	1!))*A<PI%%c3	0Dq0HI	%%&7<	)/I&)#$??3/236:I-2\\#f+-F* A" O  [\s   F !F?c                   ^ Ub[  [        U[        5      (       a  U/nU R                  5        V^Vs0 s H%  u  mn[        U4S jU 5       5      (       d  M"  TU_M'     n nn[	        S U R                  5        5       5      $ s  snnf )Nc              3   ,   >#    U  H	  oT;   v   M     g 7fNr   )rF   fr<   s     r   rG   &state_dict_all_zero.<locals>.<genexpr>  s     @\Q[AaQ[s   c              3   p   #    U  H,  n[         R                  " US :H  5      R                  5       v   M.     g7f)r   N)r   allitem)rF   params     r   rG   r     s+     M9Luyy!$))++9Ls   46)
isinstancer   r5   rR   r   values)r9   
filter_strr<   r=   s     ` r   state_dict_all_zeror     st    j#&&$J'1'7'7'9]'9tq!S@\Q[@\=\dad'9
]M9J9J9LMMM ^s   !B B 
model_filec                 F   SS K nSSKJn  UR                  R	                  U SSS9 nUR                  5       =(       d    0 nS S S 5        WR                  SS 5        U(       a0  UR                  U5      nU(       a  [        R                  " U5      $ S $ g ! , (       d  f       NX= f)Nr   rp   )LORA_ADAPTER_METADATA_KEYptcpu)	frameworkdeviceformat)
safetensors.torchloaders.lora_baser   r   	safe_openmetadatard   r   jsonloads)r   safetensorsr   r   r   raws         r   _load_sft_state_dict_metadatar     s    =				$	$Z4	$	NRS::<%2 
O LL4 ll45"%tzz#/4/ 
O	Ns   B
B r   )%r   enumr   import_utilsr   loggingr   r   r   r}   Enumr   rh   r   r   DIFFUSERS_TO_PEFTDIFFUSERS_OLD_TO_PEFTPEFT_TO_DIFFUSERSDIFFUSERS_OLD_TO_DIFFUSERSPEFT_TO_KOHYA_SSr   r   rT   r   re   r   r6   r@   rW   rf   ri   r   r   r   r   r   r   )r   s   0r   <module>r      sr     ,   
H	DII  *+%#%#%#%F '% ' %	
 ' % / - 9 7 / - - + /  -!" '#$ %%& =B!QKHKqqc5>22KH'( ;@1+F+Qqc~qc00+F)* ,)9712 CH1+N+Q!Ehqc88+N34 AFaL1!CHQC~66L56 859 @ %5&6$4&6$4&6&8(:&((G&E   &'%'%')+&( 46 4 6	
 4 6 8 : # > # > # > +  )! ( 4737377;#B#B#B%F     !6.  !;)! 
 +//1AB  3 
 B36,3^3R3j&<~Nc M IF
 OLs   G38G8"G=H