o
    si3+                     @   s   d dl Z d dlZd dlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlmZmZ e
d	d
 ZG dd de jjZG dd deZe
dd ZeZdS )    N)Optional   separate)activations)
pad_x_to_yscript_if_tracingjitable_shape)cached_downloadSR_HASHTABLE)is_overriddenmark_deprecatedc                 C   s0   | j dkr| dddS | j dkr| dS | S )z0Normalize shape of `x` to [batch, n_chan, time].   r   )ndimreshape	unsqueeze)x r   O/home/ubuntu/.local/lib/python3.10/site-packages/asteroid/models/base_models.py_unsqueeze_to_3d   s
   


r   c                       s   e Zd ZdZddedee f fddZdd Ze	d	d
 Z
e
jdefdd
Z
dd Zdd Zdd Zdd Zdd Zedd Zdd Zdd Zdd Z  ZS ) 	BaseModelao  Base class for serializable models.

    Defines saving/loading procedures, and separation interface to `separate`.
    Need to overwrite the `forward` and `get_model_args` methods.

    Models inheriting from `BaseModel` can be used by :mod:`asteroid.separate`
    and by the `asteroid-infer` CLI. For models whose `forward` doesn't go from
    waveform to waveform tensors, overwrite `forward_wav` to return
    waveform tensors.

    Args:
        sample_rate (float): Operating sample rate of the model.
        in_channels: Number of input channels in the signal.
            If None, no checks will be performed.
    r   sample_ratein_channelsc                    s   t    || _|| _d S N)super__init___BaseModel__sample_rater   )selfr   r   	__class__r   r   r   (   s   

zBaseModel.__init__c                 O      t r   NotImplementedErrorr   argskwargsr   r   r   forward-   s   zBaseModel.forwardc                 C   s   | j S )z+Operating sample rate of the model (float).)r   r   r   r   r   r   0   s   zBaseModel.sample_ratenew_sample_ratec                 C   s   t dt || _d S )NzoOther sub-components of the model might have a `sample_rate` attribute, be sure to modify them for consistency.)warningswarnUserWarningr   )r   r)   r   r   r   r   5   s
   
c                 O   s   t j | g|R i |S )z4Convenience for :func:`~asteroid.separate.separate`.r   r$   r   r   r   r   >      zBaseModel.separatec                 O      t j| g|R i |S )z:Convenience for :func:`~asteroid.separate.torch_separate`.)r   torch_separater$   r   r   r   r/   B   r-   zBaseModel.torch_separatec                 O   r.   )z:Convenience for :func:`~asteroid.separate.numpy_separate`.)r   numpy_separater$   r   r   r   r0   F   r-   zBaseModel.numpy_separatec                 O   r.   )z9Convenience for :func:`~asteroid.separate.file_separate`.)r   file_separater$   r   r   r   r1   J   r-   zBaseModel.file_separatec                 O   s   | |g|R i |S )a  Separation method for waveforms.

        In case the network's `forward` doesn't have waveforms as input/output,
        overwrite this method to separate from waveform to waveform.
        Should return a single torch.Tensor, the separated waveforms.

        Args:
            wav (torch.Tensor): waveform array/tensor.
                Shape: 1D, 2D or 3D tensor, time last.
        r   )r   wavr%   r&   r   r   r   forward_wavN   s   zBaseModel.forward_wavc           	      O   s  ddl m} t|trt|}tj|dd}n|}d| vr(td	| d| vr7td	| d	| vrFtd
	| |d	 
| d|d	 vrbt|trbt|d|d	 d< z||d }W n ty|   | |i |d	 }Y n
w ||i |d	 }||d  |S )a  Instantiate separation model from a model config (file or dict).

        Args:
            pretrained_model_conf_or_path (Union[dict, str]): model conf as
                returned by `serialize`, or path to it. Need to contain
                `model_args` and `state_dict` keys.
            *args: Positional arguments to be passed to the model.
            **kwargs: Keyword arguments to be passed to the model.
                They overwrite the ones in the model package.

        Returns:
            nn.Module corresponding to the pretrained model conf/URL.

        Raises:
            ValueError if the input config file doesn't contain the keys
                `model_name`, `model_args` or `state_dict`.
        r   )getcpu)map_location
model_namezDExpected config dictionary to have field model_name`. Found only: {}
state_dictzDExpected config dictionary to have field state_dict`. Found only: {}
model_argszDExpected config dictionary to have field model_args`. Found only: {}r   N) r4   
isinstancestrr
   torchloadkeys
ValueErrorformatupdater   load_state_dict)	clspretrained_model_conf_or_pathr%   r&   r4   cached_modelconfmodel_classmodelr   r   r   from_pretrained[   sF   



zBaseModel.from_pretrainedc                 C   sV   ddl }ddlm} t| jj|  |  d}t }ttj|j|d|d< ||d< |S )	zSerialize model and output dictionary.

        Returns:
            dict, serialized model with keys `model_args` and `state_dict`.
        r   Nr   )__version__)r7   r8   r9   )torch_versionpytorch_lightning_versionasteroid_versionsoftware_versionsinfos)	pytorch_lightningr:   rK   dictr    __name__get_state_dictget_model_argsr=   )r   plrN   
model_confrP   r   r   r   	serialize   s   
zBaseModel.serializec                 C   s   |   S )zEIn case the state dict needs to be modified before sharing the model.)r8   r(   r   r   r   rT      s   zBaseModel.get_state_dictc                 C   r!   )z/Should return args to re-instantiate the class.r"   r(   r   r   r   rU      s   zBaseModel.get_model_args)r   )rS   
__module____qualname____doc__floatr   intr   r'   propertyr   setterr   r/   r0   r1   r3   classmethodrJ   rX   rT   rU   __classcell__r   r   r   r   r      s$    

:r   c                       s   e Zd ZdZd fdd	Zdd Zdejdejfd	d
ZdejdejfddZ	dejdejdejfddZ
dejdejfddZdd Z  ZS )BaseEncoderMaskerDecoderai  Base class for encoder-masker-decoder separation models.

    Args:
        encoder (Encoder): Encoder instance.
        masker (nn.Module): masker network.
        decoder (Decoder): Decoder instance.
        encoder_activation (Optional[str], optional): Activation to apply after encoder.
            See ``asteroid.masknn.activations`` for valid values.
    Nc                    sD   t  jt|dd d || _|| _|| _|| _t|pd | _	d S )Nr   )r   linear)
r   r   getattrencodermaskerdecoderencoder_activationr   r4   enc_activation)r   re   rf   rg   rh   r   r   r   r      s   z!BaseEncoderMaskerDecoder.__init__c                 C   sN   t |}t|}| |}| |}| ||}| |}t||}t||S )zEnc/Mask/Dec model forward

        Args:
            wav (torch.Tensor): waveform tensor. 1D, 2D or 3D tensor, time last.

        Returns:
            torch.Tensor, of shape (batch, n_src, time) or (n_src, time).
        )r	   r   forward_encoderforward_maskerapply_masksforward_decoderr   _shape_reconstructed)r   r2   shapetf_rep	est_masksmasked_tf_repdecodedreconstructedr   r   r   r'      s   





z BaseEncoderMaskerDecoder.forwardr2   returnc                 C   s   |  |}| |S )zComputes time-frequency representation of `wav`.

        Args:
            wav (torch.Tensor): waveform tensor in 3D shape, time last.

        Returns:
            torch.Tensor, of shape (batch, feat, seq).
        )re   ri   )r   r2   rp   r   r   r   rj      s   
	
z(BaseEncoderMaskerDecoder.forward_encoderrp   c                 C   
   |  |S )zEstimates masks from time-frequency representation.

        Args:
            tf_rep (torch.Tensor): Time-frequency representation in (batch,
                feat, seq).

        Returns:
            torch.Tensor: Estimated masks
        )rf   )r   rp   r   r   r   rk      s   

z'BaseEncoderMaskerDecoder.forward_maskerrq   c                 C   s   || d S )a?  Applies masks to time-frequency representation.

        Args:
            tf_rep (torch.Tensor): Time-frequency representation in (batch,
                feat, seq) shape.
            est_masks (torch.Tensor): Estimated masks.

        Returns:
            torch.Tensor: Masked time-frequency representations.
        r   )r   )r   rp   rq   r   r   r   rl      s   z$BaseEncoderMaskerDecoder.apply_masksrr   c                 C   rv   )zReconstructs time-domain waveforms from masked representations.

        Args:
            masked_tf_rep (torch.Tensor): Masked time-frequency representation.

        Returns:
            torch.Tensor: Time-domain waveforms.
        )rg   )r   rr   r   r   r   rm     s   
	z(BaseEncoderMaskerDecoder.forward_decoderc                    sN   | j j  | j }t fdd|D stdi  |d| ji}|S )z-Arguments needed to re-instantiate the model.c                 3   s    | ]}| vV  qd S r   r   ).0k	fb_configr   r   	<genexpr>  s    z:BaseEncoderMaskerDecoder.get_model_args.<locals>.<genexpr>zOFilterbank and Mask network config share common keys. Merging them is not safe.rh   )re   
filterbank
get_configrf   allAssertionErrorrh   )r   masknet_configr9   r   ry   r   rU     s   
z'BaseEncoderMaskerDecoder.get_model_argsr   )rS   rY   rZ   r[   r   r'   r=   Tensorrj   rk   rl   rm   rU   ra   r   r   r   r   rb      s    
rb   c                 C   s   t |dkr| dS | S )zReshape `reconstructed` to have same size as `size`

    Args:
        reconstructed (torch.Tensor): Reconstructed waveform
        size (torch.Tensor): Size of desired waveform

    Returns:
        torch.Tensor: Reshaped waveform

    r   r   )lensqueeze)rt   sizer   r   r   rn   $  s   
rn   )r=   r*   typingr   r:   r   masknnr   utils.torch_utilsr   r   r	   utils.hub_utilsr
   r   utils.deprecation_utilsr   r   r   nnModuler   rb   rn   
BaseTasNetr   r   r   r   <module>   s     

 "l
