o
    i                     @   sX   d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	 ddl
mZ G dd deZdS )	z3Stateless decoder definition for Transducer models.    )ListOptionalTupleN)check_argument_types)
Hypothesis)
AbsDecoderc                       s   e Zd ZdZ			d"dedededed	d
f
 fddZ	
d#dejde	e
eje	ej f  d	ejfddZdejdee dd
d	e
ejd
f fddZdee d	e
ejd
f fddZdejd	d
fddZded	d
fddZde	ej ded	d
fd d!Z  ZS )$StatelessDecoderzStateless Transducer decoder module.

    Args:
        vocab_size: Output size.
        embed_size: Embedding size.
        embed_dropout_rate: Dropout rate for embedding layer.
        embed_pad: Embed/Blank symbol ID.

               r   
vocab_size
embed_sizeembed_dropout_rate	embed_padreturnNc                    s^   t    t s
J tjj|||d| _tjj|d| _|| _	|| _
t|  j| _i | _dS )z$Construct a StatelessDecoder object.)padding_idx)pN)super__init__r   torchnn	EmbeddingembedDropoutr   output_sizer   next
parametersdevicescore_cache)selfr   r   r   r   	__class__ d/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr_transducer/decoder/stateless_decoder.pyr      s   


zStatelessDecoder.__init__labelsstatesc                 C   s   |  | |}|S )zEncode source label sequences.

        Args:
            labels: Label ID sequences. (B, L)
            states: Decoder hidden states. None

        Returns:
            dec_embed: Decoder output sequences. (B, U, D_emb)

        )r   r   )r   r#   r$   	dec_embedr!   r!   r"   forward,   s   zStatelessDecoder.forwardlabellabel_sequencestatec                 C   sF   d tt|}|| jv r| j| }n
| |}|| j|< |d dfS )aE  One-step forward hypothesis.

        Args:
            label: Previous label. (1, 1)
            label_sequence: Current label sequence.
            state: Previous decoder hidden states. None

        Returns:
            dec_out: Decoder output sequence. (1, D_emb)
            state: Decoder hidden states. None

        _r   N)joinmapstrr   r   )r   r'   r(   r)   
str_labelsr%   r!   r!   r"   score?   s   


zStatelessDecoder.scorehypsc                 C   s2   t jdd |D | jd}| |}|ddfS )zOne-step forward hypotheses.

        Args:
            hyps: Hypotheses.

        Returns:
            dec_out: Decoder output sequences. (B, D_dec)
            states: Decoder hidden states. None

        c                 S   s   g | ]}|j d  gqS ))yseq).0hr!   r!   r"   
<listcomp>j   s    z0StatelessDecoder.batch_score.<locals>.<listcomp>r      N)r   
LongTensorr   r   squeeze)r   r0   r#   r%   r!   r!   r"   batch_score\   s   
zStatelessDecoder.batch_scorer   c                 C   s
   || _ dS )zNSet GPU device to use.

        Args:
            device: Device ID.

        Nr6   )r   r   r!   r!   r"   
set_deviceo   s   
zStatelessDecoder.set_device
batch_sizec                 C      dS )zInitialize decoder states.

        Args:
            batch_size: Batch size.

        Returns:
            : Initial decoder hidden states. None

        Nr!   )r   r<   r!   r!   r"   
init_statex   s   
zStatelessDecoder.init_stateidxc                 C   r=   )zGet specified ID state from decoder hidden states.

        Args:
            states: Decoder hidden states. None
            idx: State ID to extract.

        Returns:
            : Decoder hidden state for given ID. None

        Nr!   )r   r$   r?   r!   r!   r"   select_state   s   zStatelessDecoder.select_state)r	   r
   r   )N)__name__
__module____qualname____doc__intfloatr   r   Tensorr   r   r&   r   r/   r   r:   r   r;   r>   r@   __classcell__r!   r!   r   r"   r      sR    


	$r   )rD   typingr   r   r   r   	typeguardr   -espnet2.asr_transducer.beam_search_transducerr   *espnet2.asr_transducer.decoder.abs_decoderr   r   r!   r!   r!   r"   <module>   s    