o
    i                  	   @   s   d dl Z d dlmZmZmZ d dlZd dlZd dlZdeeee	ej
f f deeee	ej
f f fddZ	dded	ejjd
edefddZdS )    N)AnyDictUnion	dst_state	src_statec              	   C   s   i }|  D ]E\}}|| v r| |  ||  kr|||< q|| vr/td| dd  qtd| dd d| |   d||   d  q|S )zFilter name, size mismatch instances between dicts.

    Args:
        dst_state: reference state dict for filtering
        src_state: target state dict for filtering

    zFilter out z from pretrained dictz) because of name not found in target dictz because of size mismatch(-))itemssizeloggingwarning)r   r   match_statekeyvalue r   ]/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/torch_utils/load_pretrained_model.pyfilter_state_dict	   s$    


 r   cpu
init_parammodelignore_init_mismatchmap_locationc                    s:  |  dd}t|dkr|\}}}n%t|dkr!|\}}d}nt|dkr0|\}d\}}n|\}d\}}dkr>d|dkrDd}|du rK|}nd	td
tfdd}	|	||}tj||d}
|durw| dD ]  fdd|
 D }
qidurfdd|
 D }
| }|rt||
}
|	|
 |
| dS )a5  Load a model state and set it to the model.

    Args:
        init_param: <file_path>:<src_key>:<dst_key>:<exclude_Keys>

    Examples:
        >>> load_pretrained_model("somewhere/model.pth", model)
        >>> load_pretrained_model("somewhere/model.pth:decoder:decoder", model)
        >>> load_pretrained_model("somewhere/model.pth:decoder:decoder:", model)
        >>> load_pretrained_model(
        ...     "somewhere/model.pth:decoder:decoder:decoder.embed", model
        ... )
        >>> load_pretrained_model("somewhere/decoder.pth::decoder", model)
    :      N   )NN)NNN objr   c                 S   s.   |  dkr| S |dD ]}t| |} q| S )aA  Get an nested attribute.

            >>> class A(torch.nn.Module):
            ...     def __init__(self):
            ...         super().__init__()
            ...         self.linear = torch.nn.Linear(10, 10)
            >>> a = A()
            >>> assert A.linear.weight is get_attr(A, 'linear.weight')

            r   .)stripsplitgetattr)r   r   kr   r   r   get_attrP   s
   z'load_pretrained_model.<locals>.get_attr)r   ,c                    s    i | ]\}}|  s||qS r   )
startswith.0r#   v)er   r   
<dictcomp>f   s     z)load_pretrained_model.<locals>.<dictcomp>c                    s0   i | ]\}}|  r|t d  d |qS )   N)r&   lenr'   )src_keyr   r   r+   i   s    )r!   r-   r   strtorchloadr
   
state_dictr   updateload_state_dict)r   r   r   r   spspathdst_keyexcludesr   r$   r   r   r   )r*   r.   r   load_pretrained_model'   s@   






r9   )r   )r   typingr   r   r   r0   torch.nntorch.optimr/   floatTensorr   nnModuleboolr9   r   r   r   r   <module>   s(    
"