o
    z“©i†	  ã                
   @   s¸   d Z ddlmZmZ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

é    )Ú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	   ú_/home/ubuntu/.local/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   r   r   Útorchr   ÚModuleÚstrr   r   Úlistr%   r    r!   r	   r	   r	   r
   Ú<module>   s   &"