a
    þd„	  ã                   @   s¢   d Z ddlmZmZmZ ddlmZ ejee dœdd„Z	dejee eee d	œd
d„Z
ejeejdœdd„Zejeejdœdd„Zejeejddœdd„ZdS )z¨Utilities for automatic parameters tying.

Reference:
    https://github.com/pytorch/fairseq/blob/1f7ef9ed1e1061f8c7f88f8b94c7186834398690/fairseq/trainer.py#L110-L118
é    )ÚDictÚListÚOptional)Únn)ÚmoduleÚreturnc                 C   s   t | ƒS )z?Returns a list of names of shared parameters set in the module.)Ú_find_shared_parameters)r   © r	   út/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/pytorch_lightning/utilities/parameter_tying.pyÚfind_shared_parameters   s    r   NÚ )r   Útied_parametersÚprefixr   c                 C   s¬   |d u ri }| j  ¡ D ]D\}}||r(dnd | }|d u r<q||vrLg ||< ||  |¡ q| j ¡ D ]2\}}|d u rxqf||r‚dnd | }t|||ƒ qfdd„ | ¡ D ƒS )NÚ.r   c                 S   s   g | ]}t |ƒd kr|‘qS )é   )Úlen)Ú.0Úxr	   r	   r
   Ú
<listcomp>,   ó    z+_find_shared_parameters.<locals>.<listcomp>)Ú_parametersÚitemsÚappendZ_modulesr   Úvalues)r   r   r   ÚnameÚparamZparam_prefixÚmZsubmodule_prefixr	   r	   r
   r      s    r   )r   Úshared_paramsr   c                 C   s:   |D ]0}t | |d ƒ}|dd … D ]}t| ||ƒ q"q| S )Nr   r   )Ú_get_module_by_pathÚ_set_module_by_path)r   r   Zshared_paramÚrefÚpathr	   r	   r
   Úset_shared_parameters/   s
    r"   )r   r!   r   c                 C   s"   |  d¡}|D ]}t| |ƒ} q| S )Nr   )ÚsplitÚgetattr)r   r!   r   r	   r	   r
   r   7   s    
r   )r   r!   Úvaluer   c                 C   s:   |  d¡}|d d… D ]}t| |ƒ} qt| |d |ƒ d S )Nr   éÿÿÿÿ)r#   r$   Úsetattr)r   r!   r%   r   r	   r	   r
   r   >   s    
r   )Nr   )Ú__doc__Útypingr   r   r   Ztorchr   ÚModuleÚstrr   r   Úlistr"   r   r   r	   r	   r	   r
   Ú<module>   s    