o
    piL                     @   s   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
eZdd Z	dd	d
deeeef  fddZ	ddeeef deeef deeef dddef
ddZdS )    N)TYPE_CHECKINGDictListUnion   )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   a/home/ubuntu/SoloSpeech/.venv/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 ))default_scale))_maybe_expand_lora_scales_for_one_adapter
state_dict)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   r4   scalesr.   r/   r+   r)   c                    sr  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 s.t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 (`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                    s"   i | ]}d | t   qS )r   )copydeepcopy)r$   r%   )r5   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   r5   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   r:   )r$   r   weightr   r   r   r8      s    )sortedkeys
ValueError
isinstancedictr6   r7   listlenranger0   anyitems)r5   r.   r/   r+   r)   r%   tf_idxvaluer   )r   r<   r5   r   r   r*   @   sX   )



(,

r*   )r   )r6   typingr   r   r   r   utilsr   modelsr   
get_logger__name__loggerr   floatr4   strintr*   r   r   r   r   <module>   s2   




