o
    GiT                     @   s   d dl Z d dlmZ d dlmZ ddlmZ erddlmZ e	e
Zdd Zdd
ddeeeB  fddZ		ddeeB deeef deeef dejdef
ddZdS )    N)TYPE_CHECKING)nn   )logging)UNet2DConditionModelc                 C   sT   | dkrdS |  d\}}}|dddd}|dd	}d
| }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attn r   W/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/loaders/unet_loader_utils.py!_translate_into_actual_layer_name   s   r         ?unetr   weight_scalesc                    s\   dd t jD dd t jD d jjjjd d fdd|D }|S )Nc                 S      g | ]\}}t |d r|qS 
attentionshasattr.0ir   r   r   r   
<listcomp>-       z-_maybe_expand_lora_scales.<locals>.<listcomp>c                 S   r   r   r   r!   r   r   r   r$   .   r%   )r	   r      c              	      s   g | ]}t | d qS ))modeldefault_scale))_maybe_expand_lora_scales_for_one_adapter)r"   weight_for_adapterblocks_with_transformerr(   transformer_per_blockr   r   r   r$   2   s    )	enumerater
   r   configlayers_per_block)r   r   r(   expanded_weight_scalesr   r+   r   _maybe_expand_lora_scales+   s   r2   scalesr,   r-   r'   r(   c           	         sz  t | ddgkrtdt | ddgkrtdtts#S tdvr1|d< n$td trUtd dkrId d d< ntdtd  d	d
D ]vra|< t tsvfdd| D < | D ]n}d|    vr|  < t   ts fddt	| D   < qzt   dkrÈ   |    < qzt   | krtd|  d d	  dt    d		qz| D ] }d|  t
   D ]\}}| d	  d	| < qq= qW| } D ]tfdd| D s2td dqdd  D S )a  
    Expands the inputs into a more granular dictionary. See the example below for more details.

    Parameters:
        scales (`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                    s"   i | ]}d | t   qS )r   )copydeepcopy)r"   r#   )r3   r   r   r   
<dictcomp>   s   " z=_maybe_expand_lora_scales_for_one_adapter.<locals>.<dictcomp>r   c                    s   g | ]}   qS r   r   )r"   _)r   r3   r   r   r   r$      s    z=_maybe_expand_lora_scales_for_one_adapter.<locals>.<listcomp>z	Expected z scales for z, got c                 3   s    | ]	}t  |v V  qd S )Nr   )r"   module)layerr   r   	<genexpr>   s    z<_maybe_expand_lora_scales_for_one_adapter.<locals>.<genexpr>zCan't set lora scale for layer z?. It either doesn't exist in this unet or it has no attentions.c                 S   s   i | ]	\}}t ||qS r   r8   )r"   r   weightr   r   r   r6      s    )sortedkeys
ValueError
isinstancedictr4   r5   listlenranger.   
state_dictanyitems)	r3   r,   r-   r'   r(   r#   tf_idxvaluerE   r   )r   r:   r3   r   r   r)   @   sZ   )



(,

r)   )r   )r4   typingr   torchr   utilsr   modelsr   
get_logger__name__loggerr   rB   floatrA   r2   strintModuler)   r   r   r   r   <module>   s*   


