o
    ´©iº
  ã                   @   s4   d Z ddlmZmZ ddlZG dd„ dejjƒZdS )z+VGG2L module definition for custom encoder.é    )ÚTupleÚUnionNc                       sŽ   e Zd ZdZddededejjf‡ fdd„Zdej	d	ej	d
e
eej	ej	f eeej	ej	f ej	f f fdd„Zd	ej	d
ej	fdd„Z‡  ZS )ÚVGG2LzœVGG2L module for custom encoder.

    Args:
        idim: Input dimension.
        odim: Output dimension.
        pos_enc: Positional encoding class.

    NÚidimÚodimÚpos_encc                    sì   t ƒ  ¡  tj tjjddddddtj ¡ tjjddddddtj ¡ tj d¡tjjddddddtj ¡ tjjddddddtj ¡ tj d¡¡
| _|durftj tj 	d|d	 d	  |¡|¡| _
dS tj 	d|d	 d	  |¡| _
dS )
zConstruct a VGG2L object.é   é@   é   )ÚstrideÚpadding)r
   é   é€   )r   r   Nr   )ÚsuperÚ__init__ÚtorchÚnnÚ
SequentialÚConv2dÚReLUÚ	MaxPool2dÚvgg2lÚLinearÚoutput)Úselfr   r   r   ©Ú	__class__© úY/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transformer/utils/vgg2l.pyr      s$   


ö
ÿ zVGG2L.__init__ÚfeatsÚ
feats_maskÚreturnc           	      C   sn   |  d¡}|  |¡}| ¡ \}}}}|  | dd¡ ¡  |||| ¡¡}|dur1|  |¡}||fS |}||fS )az  Forward VGG2L bottleneck.

        Args:
            feats: Feature sequences. (B, F, D_feats)
            feats_mask: Mask of feature sequences. (B, 1, F)

        Returns:
            vgg_output: VGG output sequences.
                   (B, sub(F), D_out) or ((B, sub(F), D_out), (B, sub(F), D_att))
            vgg_mask: Mask of VGG output sequences. (B, 1, sub(F))

        r   r   N)Ú	unsqueezer   Úsizer   Ú	transposeÚ
contiguousÚviewÚcreate_new_mask)	r   r   r    Ú
vgg_outputÚbÚcÚtÚfÚvgg_maskr   r   r   Úforward*   s   

$
þzVGG2L.forwardc                 C   s˜   |  d¡|  d¡d  }|dd…dd…d|…f dd…dd…ddd…f }|  d¡|  d¡d  }|dd…dd…d|…f dd…dd…ddd…f }|S )zÛCreate a subsampled mask of feature sequences.

        Args:
            feats_mask: Mask of feature sequences. (B, 1, F)

        Returns:
            vgg_mask: Mask of VGG2L output sequences. (B, 1, sub(F))

        r   r
   N)r#   )r   r    Ú
vgg1_t_lenr-   Ú
vgg2_t_lenr   r   r   r'   H   s
   
22zVGG2L.create_new_mask)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r   ÚModuler   ÚTensorr   r   r.   r'   Ú__classcell__r   r   r   r   r      s     	ÿÿr   )r4   Útypingr   r   r   r   r6   r   r   r   r   r   Ú<module>   s    