o
    i                     @   s   d dl mZ d dl mZ d dl mZ d dl mZ d dl mZ d dlZd dlZd dlm	Z	 d dlm
Z d dlZd dlmZ d d	lmZ d d
lmZ d dlZd dlmZ d dlmZ G dd dej	jZG dd dej	jZG dd deZdS )    )List)Optional)Sequence)Tuple)UnionN)
functional)make_pad_mask)	LayerNorm)
AbsEncoder)repeatFsmnFeedForwardc                       s*   e Zd Z	d fdd	ZdddZ  ZS )		FsmnBlockr   c              	      sp   t    tj|d| _tj|||dd|dd| _|d d }|dkr'|| }|d | }t||fd| _d S )N)p   r   F)stridepaddinggroupsbias           )	super__init__nnDropoutdropoutConv1d
fsmn_blockConstantPad1dpad_fn)selfn_featdropout_ratekernel_size
fsmn_shiftleft_paddingright_padding	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/sond/encoder/fsmn_encoder.pyr      s   
zFsmnBlock.__init__Nc                 C   s   |  \}}}|d urt||ddf}|d ur|| }|| }|dd}| |}| |}|dd}|| }| |}|| S )Nr   r   )sizetorchreshape	transposer   r   r   )r    inputsmaskmask_shfit_chunkbtdxr)   r)   r*   forward'   s   


zFsmnBlock.forward)r   N)__name__
__module____qualname__r   r7   __classcell__r)   r)   r'   r*   r      s    r   c                       sD   e Zd Zd	 fdd	Zdejdejdeejejf fddZ  ZS )
EncoderLayerr   c                    s2   t    || _|| _|| _|| _t|| _d S r8   )	r   r   in_sizer,   ffnmemoryr   r   r   )r    r>   r,   feed_forwardr   r"   r'   r)   r*   r   9   s   
zEncoderLayer.__init__xs_padr1   returnc                 C   sD   |  |d }| ||}| |}| j| jkr|| |fS ||fS )Nr   )r?   r@   r   r>   r,   )r    rB   r1   contextr@   r)   r)   r*   r7   A   s   
zEncoderLayer.forward)r   )	r9   r:   r;   r   r-   Tensorr   r7   r<   r)   r)   r'   r*   r=   8   s    r=   c                       sz   e Zd ZdZ										d fd
d	ZdefddZ	ddejdejdejde	ejeje
ej f fddZ  ZS )FsmnEncoderzEncoder using Fsmn      r   r   Nr   post_netEAND/post_netc                    s
  t t  __|_|___ _	_
tts1fddtjD _
_ttsFfddtjD _|	_t _|_|_|_tj fdd_t| fdd_|durt|dd_dS dS )	a  Initializes the parameters of the encoder.

        Args:
          filter_size: the total order of memory block
          fsmn_num_layers: The number of fsmn layers.
          dnn_num_layers: The number of dnn layers
          num_units: The number of memory units.
          ffn_inner_dim: The number of units of the inner linear transformation
            in the feed forward layer.
          dropout_rate: The probability to drop units from the outputs.
          shift: left padding, to control delay
          position_encoder: The :class:`opennmt.layers.position.PositionEncoder` to
            apply on inputs or ``None``.
        c                       g | ]} qS r)   r)   .0_)shiftr)   r*   
<listcomp>{       z(FsmnEncoder.__init__.<locals>.<listcomp>c                    rK   r)   r)   rL   )sample_rater)   r*   rP   ~   rQ   c              
      sB   t | dkrnt| dkrnd t j|  S )Nr   r   )r=   r   r   rO   lnum)r"   ffn_inner_dimfilter_sizein_unitsnum_memory_unitsr    r)   r*   <lambda>   s    z&FsmnEncoder.__init__.<locals>.<lambda>c                    s   t d S )Nr   r   rS   )r"   rU   rX   r)   r*   rY      s    Nr   )r   rF   r   rW   rV   fsmn_num_layersdnn_num_layersrX   rU   r"   rO   
isinstancelistrangerR   position_encoderr   r   r   	out_units!tf2torch_tensor_name_prefix_torchtf2torch_tensor_name_prefix_tfr   fsmn_layers
dnn_layersr   conv1d)r    rW   rV   rZ   r[   rX   rU   r"   rO   r_   rR   r`   ra   rb   r'   )r"   rU   rV   rW   rX   rR   r    rO   r*   r   S   s<   


zFsmnEncoder.__init__rC   c                 C   s   | j S r8   )rX   )r    r)   r)   r*   output_size   s   zFsmnEncoder.output_sizerB   ilensprev_statesc                 C   s   |}| j d ur|  |}| |}t|d d d d d f  |j}| ||d }| |d }| jd urD| |	dd	dd}||d fS )Nr   r   r   )
r_   r   r   todevicerc   rd   r`   re   r/   )r    rB   rg   rh   r0   masksr)   r)   r*   r7      s   


$

zFsmnEncoder.forward)	rG   rH   r   r   Nr   NrI   rJ   r8   )r9   r:   r;   __doc__r   intrf   r-   rE   r   r   r7   r<   r)   r)   r'   r*   rF   P   s.    OrF   )typingr   r   r   r   r   loggingr-   torch.nnr   r   Fnumpynp*funasr.models.transformer.utils.nets_utilsr   $funasr.models.transformer.layer_normr	   !funasr.models.encoder.abs_encoderr
   math&funasr.models.transformer.utils.repeatr   0funasr.models.transformer.utils.multi_layer_convr   Moduler   r=   rF   r)   r)   r)   r*   <module>   s&    %