o
    pi,+                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 e	 r%ddl
Z
dd Zd	d
 Zddee fddZdddZdd ZdddZdd Zdd ZdeddfddZdS )z3
PEFT utilities: Utilities related to peft library
    N)Optional)version   )is_peft_availableis_torch_availablec              
   C   s  ddl m} d}|  D ]}t||rt|d} nq|rTddlm} dd |  D }|D ]#}z
|| |\}}}	W n	 tyC   Y q.w t|drQt	||	|
  q.| S ddlm}
 |  D ]\}}tt| dkrpt| d}t||
rt|tjjrtjj|j|j|jd	ud
|jj}|j|_|jd	ur|j|_d}n3t||
rt|tjjrtj|j|j|j|j|j |j!|j"|jj}|j|_|jd	ur|j|_d}|rt	| || ~tj#$ rtj#%  q^| S )zd
    Recursively replace all instances of `LoraLayer` with corresponding new layers in `model`.
    r   BaseTunerLayerF
base_layer)_get_submodulesc                 S   s   g | ]
\}}d |vr|qS )lora ).0key_r   r   X/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/diffusers/utils/peft_utils.py
<listcomp>.   s    z.recurse_remove_peft_layers.<locals>.<listcomp>)	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groupscudais_availableempty_cache)modelr   has_base_layer_patternmoduler
   key_listr   parenttargettarget_namer   namemodule_replaced
new_moduler   r   r   r"      sx   


/






r"   c                 C   s>   ddl m} |dkrdS |  D ]}t||r|| qdS )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)r6   r)   r   r8   r   r   r   scale_lora_layersg   s   


rB   r)   c                 C   sx   ddl m} |dkrdS |  D ])}t||r9|dur%|dkr%|| q|dur9|dkr9|jD ]}||d q0qdS )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   r@   N)r   r   r   r   unscale_layeractive_adapters	set_scale)r6   r)   r   r8   adapter_namer   r   r   unscale_lora_layers{   s   

rG   Tc           	         sL  i }i }t |  d   tt|  dkr;t|   d d ttfdd| 	 }dd |	 D }|d urt|dkrtt| dkrt|  d d  tt fdd|	 }|rudd |	 D }nd	d |	 D }nt| 
  t d
d | D }tdd |D } ||||d}|S )Nr   r   c                       | d  kS Nr   r   x)rr   r   <lambda>       z!get_peft_kwargs.<locals>.<lambda>c                 S   s    i | ]\}}| d d |qS )z.lora_B.r   splitr   kvr   r   r   
<dictcomp>   s     z#get_peft_kwargs.<locals>.<dictcomp>c                    rH   rI   r   rJ   )
lora_alphar   r   rM      rN   c                 S   s4   i | ]\}}d  |dd d dd|qS ).z.lora_A.r   z.alpha )joinrP   replacerQ   r   r   r   rT      s    "c                 S   s4   i | ]\}}d  |dd d dd |qS )rV   z.down.r   N)rX   rP   rQ   r   r   r   rT      s   4 c                 S   s   h | ]	}| d d qS )z.lorar   rO   )r   r=   r   r   r   	<setcomp>   s    z"get_peft_kwargs.<locals>.<setcomp>c                 s   s    | ]}d |v V  qdS )lora_magnitude_vectorNr   )r   rR   r   r   r   	<genexpr>   s    z"get_peft_kwargs.<locals>.<genexpr>)rL   rU   rank_patternalpha_patterntarget_modulesuse_dora)r    valuesr   setcollectionsCountermost_commondictfilteritemspopkeysany)		rank_dictnetwork_alpha_dictpeft_state_dictis_unetr^   r_   r`   ra   lora_config_kwargsr   )rU   rL   r   get_peft_kwargs   s6   rr   c                 C   s<   ddl m} |  D ]}t||rdt|j   S q
dS )Nr   r   default_	default_0)r   r   r   r   r   rL   )r6   r   r8   r   r   r   get_adapter_name   s   
ru   c                 C   sH   ddl m} |  D ]}t||r!t|dr|j|d q
| |_q
d S )Nr   r   enable_adapters)enabled)r   r   r   r   r   rv   disable_adapters)r6   rw   r   r8   r   r   r   set_adapter_layers   s   

ry   c                 C   s   ddl m} |  D ]}t||r t|dr|| q
tdq
t| ddrAt| drC| j	|d  t
| jdkrE| `d | _d S d S d S d S )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   rz   
ValueErrorgetattrr|   rj   r   r{   )r6   rF   r   r8   r   r   r   delete_adapter_layers   s    

	
r   c           	      C   s   ddl m} dd }t||D ])\}}|  D ] \}}t||r7t|dr+|| n||_||||| qq| 	 D ]}t||rRt|drO|| q=||_q=d S )Nr   r   c                 S   sj   t | ts| S |  D ]\}}||v r|  S q|d}|d  d|d  d|d  }| |d}|S )NrV   r   r   z.attentions.   r@   )r   rg   ri   rP   get)weight_for_adaptermodule_name
layer_nameweight_partsr   block_weightr   r   r   get_module_weight   s   

 z<set_weights_and_activate_adapters.<locals>.get_module_weightset_adapter)
r   r   zipr   r   r   r   active_adapterrE   r   )	r6   adapter_namesweightsr   r   rF   r)   r   r8   r   r   r   !set_weights_and_activate_adapters   s$   




r   min_versionreturnc                 C   s@   t  stdttjdt| k}|std|  dS )z
    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_compatibler   r   r   check_peft_version  s   r   )N)T)__doc__rd   r   typingr   	packagingr   import_utilsr   r   r#   r"   rB   floatrG   rr   ru   ry   r   r   strr   r   r   r   r   <module>   s"   H
-
	(