o
    i                     @   sd   d dl Z d dlmZ d dlm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dS )
    N)Optional)Tuple)
functional)make_pad_maskc                
       sh   e Zd Z			ddededef fddZd	d
 Z	ddejdejde	eje
ej f fddZ  ZS )LabelAggregate      T
win_length
hop_lengthcenterc                    s    t    || _|| _|| _d S N)super__init__r	   r
   r   )selfr	   r
   r   	__class__ X/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/sond/label_aggregation.pyr   	   s   

zLabelAggregate.__init__c                 C   s   d| j  d| j d| j dS )Nzwin_length=z, hop_length=z	, center=, )r	   r
   r   r   r   r   r   
extra_repr   s   
zLabelAggregate.extra_reprNinputilensreturnc           
      C   s  | d}| d}| d}| jro| jd }|d|  }tjj|dd||fdd}|dd|d| ddf |ddd|ddf< |dd|d|  || ddf |dd|| |ddf< || j | j d }|||| j|f|| | j| |df}t	|j
ddd| jd }| }|dur| jr| jd }|d|  }|| j | j d }	|t|	|dd nd}	||j|	fS )	LabelAggregate forward function.

        Args:
            input: (Batch, Nsamples, Label_dim)
            ilens: (Batch)
        Returns:
            output: (Batch, Frames, Label_dim)

        r         constantNF)dimkeepdimg        )sizer   r	   torchnnr   padr
   
as_stridedgtsumfloatmasked_fill_r   todtype)
r   r   r   bs
max_length	label_dimr#   nframeoutputolensr   r   r   forward   s4   



4 
zLabelAggregate.forward)r   r   Tr   )__name__
__module____qualname__intboolr   r   r!   Tensorr   r   r1   __classcell__r   r   r   r   r      s(    r   c                
       s\   e Zd Z	ddef fddZdd Z	ddejd	ejd
eeje	ej f fddZ
  ZS )LabelAggregateMaxPooling   r
   c                    s   t    || _d S r   )r   r   r
   )r   r
   r   r   r   r   T   s   

z!LabelAggregateMaxPooling.__init__c                 C   s   d| j  dS )Nzhop_length=r   )r
   r   r   r   r   r   \   s   z#LabelAggregateMaxPooling.extra_reprNr   r   r   c                 C   s<   t |dd| j| jdd}|| j }||j|fS )r   r   r   )F
max_pool1d	transposer
   r)   r*   )r   r   r   r/   r0   r   r   r   r1   _   s
   
z LabelAggregateMaxPooling.forward)r:   r   )r2   r3   r4   r5   r   r   r!   r7   r   r   r1   r8   r   r   r   r   r9   S   s    r9   )r!   typingr   r   torch.nnr   r;   *funasr.models.transformer.utils.nets_utilsr   r"   Moduler   r9   r   r   r   r   <module>   s    K