o
    8wÖiz	  ã                
   @   s°   d Z ddlmZ ddlmZ dejdee fdd„Zddejd
ee	 dedee fdd„Z
dejdedejfdd„Zdejdedejfdd„Zdejdedejddfdd„ZdS )z©Utilities for automatic parameters tying.

Reference:
    https://github.com/pytorch/fairseq/blob/1f7ef9ed1e1061f8c7f88f8b94c7186834398690/fairseq/trainer.py#L110-L118

é    )Ú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   úh/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/pytorch_lightning/utilities/parameter_tying.pyÚfind_shared_parameters   s   r	   NÚ Útied_parametersÚprefixc                 C   s¬   |d u ri }| j  ¡ D ]"\}}||rdnd | }|d u rq||vr&g ||< ||  |¡ q| j ¡ D ]\}}|d u r<q3||rAdnd | }t|||ƒ q3dd„ | ¡ D ƒS )NÚ.r
   c                 S   s   g | ]
}t |ƒd kr|‘qS )é   )Úlen)Ú.0Úxr   r   r   Ú
<listcomp>.   s    z+_find_shared_parameters.<locals>.<listcomp>)Ú_parametersÚitemsÚappendÚ_modulesr   Úvalues)r   r   r   ÚnameÚparamÚparam_prefixÚmÚsubmodule_prefixr   r   r   r      s   r   Úshared_paramsc                 C   s:   |D ]}t | |d ƒ}|dd … D ]}t| ||ƒ qq| S )Nr   r   )Ú_get_module_by_pathÚ_set_module_by_path)r   r   Úshared_paramÚrefÚpathr   r   r   Úset_shared_parameters1   s   ÿr#   r"   c                 C   s"   |  d¡}|D ]}t| |ƒ} q| S )Nr   )ÚsplitÚgetattr)r   r"   r   r   r   r   r   9   s   
r   Úvaluec                 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   Útorchr   ÚModuleÚlistÚstrr	   Údictr   r#   r   r   r   r   r   r   Ú<module>   s   &"