
    wiL                         d dl Z d dlmZmZmZmZ ddlmZ erddlm	Z	  ej
        e          Zd Z	 ddd	d
eeeef                  fdZ	 ddeeef         deeef         deeef         dddef
dZdS )    N)TYPE_CHECKINGDictListUnion   )logging)UNet2DConditionModelc                     | dk    rdS |                      d          \  }}}|                    dd                              dd          }|                    dd	          }d
|z   }d                    |||f          S )z`Translate user-friendly name (e.g. 'mid') into actual layer name (e.g. 'mid_block.attentions.0')midzmid_block.attentions.0.downdown_blocksup	up_blocksblock_ zattentions.)splitreplacejoin)nameupdownblockattns       s/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/diffusers/loaders/unet_loader_utils.py!_translate_into_actual_layer_namer      s    u}}''**S//FE4^^FM22::4MMFMM(B''E4D88VUD)***          ?unetr	   weight_scalesc                      d t           j                  D             d t           j                  D             d j        j         j        j        dz   d fd|D             }|S )Nc                 8    g | ]\  }}t          |d           |S 
attentionshasattr.0ir   s      r   
<listcomp>z-_maybe_expand_lora_scales.<locals>.<listcomp>-   s,    ___xq%'%Q]B^B^____r   c                 8    g | ]\  }}t          |d           |S r"   r$   r&   s      r   r)   z-_maybe_expand_lora_scales.<locals>.<listcomp>.   s+    [[[XQge\>Z>Z[q[[[r   )r   r      c           	      \    g | ](}t          |                                           )S ))default_scale))_maybe_expand_lora_scales_for_one_adapter
state_dict)r'   weight_for_adapterblocks_with_transformerr-   transformer_per_blockr   s     r   r)   z-_maybe_expand_lora_scales.<locals>.<listcomp>2   sS     	 	 	  	2#!OO'	
 	
 	
	 	 	r   )	enumerater   r   configlayers_per_block)r   r   r-   expanded_weight_scalesr1   r2   s   ` ` @@r   _maybe_expand_lora_scalesr7   )   s     `_9T-=#>#>___[[4>!:!:[[[  &*[%AIehiIijj	 	 	 	 	 	 	 #0	 	 	 "!r   scalesr1   r2   r/   r-   c                 @   	
 t          |                                          ddgk    rt          d          t          |                                          ddgk    rt          d          t           t                    s S t          j                    d vr| d<   nlt           d         t                    rQt           d                   dk    r d         d          d<   n&t          dt           d                    d	          d
D ]

 vr| 
<   t           
         t                    s 
fd|
         D              
<   |
         D ]}d|  
         vr| 
         <   t           
                  t                    s- 
fdt          |
                   D              
         <   kt           
                            dk    r! 
                  |
         z   
         <   t           
                            |
         k    r;t          d|
          d
 d	 dt           
                             d		          |
         D ]5}d| t           
                            D ]\  }}| 
 d	 d	| <   6 
=                                  D ]B	t          	fd|                                D                       st          d	 d          Cd                                  D             S )a  
    Expands the inputs into a more granular dictionary. See the example below for more details.

    Parameters:
        scales (`Union[float, Dict]`):
            Scales dict to expand.
        blocks_with_transformer (`Dict[str, int]`):
            Dict with keys 'up' and 'down', showing which blocks have transformer layers
        transformer_per_block (`Dict[str, int]`):
            Dict with keys 'up' and 'down', showing how many transformer layers each block has

    E.g. turns
    ```python
    scales = {"down": 2, "mid": 3, "up": {"block_0": 4, "block_1": [5, 6, 7]}}
    blocks_with_transformer = {"down": [1, 2], "up": [0, 1]}
    transformer_per_block = {"down": 2, "up": 3}
    ```
    into
    ```python
    {
        "down.block_1.0": 2,
        "down.block_1.1": 2,
        "down.block_2.0": 2,
        "down.block_2.1": 2,
        "mid": 3,
        "up.block_0.0": 4,
        "up.block_0.1": 4,
        "up.block_0.2": 4,
        "up.block_1.0": 5,
        "up.block_1.1": 6,
        "up.block_1.2": 7,
    }
    ```
    r   r   zGblocks_with_transformer needs to be a dict with keys `'down' and `'up'`zEtransformer_per_block needs to be a dict with keys `'down' and `'up'`r   r+   r   zExpected 1 scales for mid, got r   )r   r   c                 L    i | ] }d | t          j                           !S )r   )copydeepcopy)r'   r(   r8   r   s     r   
<dictcomp>z=_maybe_expand_lora_scales_for_one_adapter.<locals>.<dictcomp>   s/    sssalqllDM&.,I,Isssr   r   c                 ,    g | ]}                  S  r?   )r'   _r   r8   r   s     r   r)   z=_maybe_expand_lora_scales_for_one_adapter.<locals>.<listcomp>   s"    (m(m(m1)>(m(m(mr   z	Expected z scales for z, got c              3   :   K   | ]}t                    |v V  d S )Nr   )r'   modulelayers     r   	<genexpr>z<_maybe_expand_lora_scales_for_one_adapter.<locals>.<genexpr>   s1      ff&4U;;vEffffffr   zCan't set lora scale for layer z?. It either doesn't exist in this unet or it has no attentions.c                 4    i | ]\  }}t          |          |S r?   rB   )r'   r   weights      r   r=   z=_maybe_expand_lora_scales_for_one_adapter.<locals>.<dictcomp>   s'    ___f-d33V___r   )sortedkeys
ValueError
isinstancedictr;   r<   listlenranger3   anyitems)r8   r1   r2   r/   r-   r(   tf_idxvaluer   rD   r   s   `       @@@r   r.   r.   @   s   R %**,,--&$??bccc#((**++~==`aaafd## ]6""FF%u	F5M4	(	( Vve}"""5M!,F5MMTs6%=?Q?QTTTUUU   *F6N &.$// 	tsssssSjkqSrsssF6N )0 	 	A QLLEF6N**(5vu%fVnU3T:: (m(m(m(m(m(mNcdjNkHlHl(m(m(mvu%%VF^E*++q00(.vu(=@UV\@](]vu%%VF^E*++/DV/LLL ~ 5f =~~6~~TY~~adeklrestyeza{a{~~~   M )0 	= 	=A QLLE!*6&>%+@!A!A = =7<&3353363344= 6NN  ffffT^TcTcTeTefffff 	x%xxx  	
 `_PVP\P\P^P^____r   )r   )r;   typingr   r   r   r   utilsr   modelsr	   
get_logger__name__loggerr   floatr7   strintr.   r?   r   r   <module>r]      sH    3 3 3 3 3 3 3 3 3 3 3 3        .------		H	%	%+ + + Z]" "
 "15eE4K6H1I" " " "8 c` c`%+c`!#s(^c`  S>c` 	c`
 c` c` c` c` c` c`r   