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 )	z-RNN 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ededededdf fddZ	d0dej	de
eej	e
ej	 f  dej	fddZdej	deej	e
ej	 f deej	eej	e
ej	 f f fddZdej	dee deej	e
ej	 f deej	eej	e
ej	 f f fddZd ee deej	eej	e
ej	 f f fd!d"Zd#ejddfd$d%Zd&edeej	e
ej f fd'd(Zdeej	e
ej	 f d)edeej	e
ej	 f fd*d+Zd,eeej	e
ej	 f  deej	e
ej	 f fd-d.Z  ZS )1
RNNDecodera  RNN decoder module.

    Args:
        vocab_size: Vocabulary size.
        embed_size: Embedding size.
        hidden_size: Hidden size..
        rnn_type: Decoder layers type.
        num_layers: Number of decoder layers.
        dropout_rate: Dropout rate for decoder layers.
        embed_dropout_rate: Dropout rate for embedding layer.
        embed_pad: Embedding padding symbol ID.

       lstm           r   
vocab_size
embed_sizehidden_sizernn_type
num_layersdropout_rateembed_dropout_rate	embed_padreturnNc	              	      s   t    t s
J |dvrtd| tjj|||d| _tjj|d| _	|dkr/tjj
ntjj}	tj|	||dddg| _td|D ]}
|  j|	||dddg7  _qFtj fd	d
t|D | _|| _|| _|| _|| _t|  j| _i | _dS )zConstruct a RNNDecoder object.)r
   gruzNot supported: rnn_type=)padding_idxpr
   r   T)batch_firstc                    s   g | ]	}t jj d qS )r   )torchnnDropout).0_r    ^/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr_transducer/decoder/rnn_decoder.py
<listcomp>;   s    z'RNNDecoder.__init__.<locals>.<listcomp>N)super__init__r   
ValueErrorr   r   	Embeddingembedr   dropout_embedLSTMGRU
ModuleListrnnrangedropout_rnndlayersdtypeoutput_sizer   next
parametersdevicescore_cache)selfr   r   r   r   r   r   r   r   	rnn_classr   	__class__r    r"   r%      s*   


zRNNDecoder.__init__labelsstatesc                 C   s<   |du r|  |d}| | |}| ||\}}|S )a%  Encode source label sequences.

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

        Returns:
            dec_out: Decoder output sequences. (B, U, D_dec)

        Nr   )
init_statesizer)   r(   rnn_forward)r7   r;   r<   	dec_embeddec_outr!   r!   r"   forwardG   s
   zRNNDecoder.forwardxstatec                 C   s   |\}}|  |d\}}t| jD ]M}| jdkrB| j| ||||d  |||d  fd\}\|||d < |||d < n| j| ||||d  d\}|||d < | j| |}q|||ffS )at  Encode source label sequences.

        Args:
            x: RNN input sequences. (B, D_emb)
            state: Decoder hidden states. ((N, B, D_dec), (N, B, D_dec) or None)

        Returns:
            x: RNN output sequences. (B, D_dec)
            (h_next, c_next): Decoder hidden states.
                                (N, B, D_dec), (N, B, D_dec) or None)

        r   r
   r   )hx)r=   r>   r.   r0   r1   r-   r/   )r7   rC   rD   h_prevc_prevh_nextc_nextlayerr!   r!   r"   r?   _   s   
 (zRNNDecoder.rnn_forwardlabellabel_sequence	dec_statec                 C   s^   d tt|}|| jv r| j| \}}n| |}| ||\}}||f| j|< |d |fS )a  One-step forward hypothesis.

        Args:
            label: Previous label. (1, 1)
            label_sequence: Current label sequence.
            dec_state: Previous decoder hidden states.
                         ((N, 1, D_dec), (N, 1, D_dec) or None)

        Returns:
            dec_out: Decoder output sequence. (1, D_dec)
            dec_state: Decoder hidden states.
                         ((N, 1, D_dec), (N, 1, D_dec) or None)

        r   r   )joinmapstrr6   r(   r?   )r7   rK   rL   rM   
str_labelsrA   r@   r!   r!   r"   score   s   

zRNNDecoder.scorehypsc                 C   sV   t jdd |D | jd}| |}| d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. ((N, B, D_dec), (N, B, D_dec) or None)

        c                 S   s   g | ]}|j d  gqS ))yseqr   hr!   r!   r"   r#      s    z*RNNDecoder.batch_score.<locals>.<listcomp>r5   c                 S   s   g | ]}|j qS r!   )rM   rV   r!   r!   r"   r#      s    r   )r   
LongTensorr5   r(   create_batch_statesr?   squeeze)r7   rS   r;   r@   r<   rA   r!   r!   r"   batch_score   s
   
zRNNDecoder.batch_scorer5   c                 C   s
   || _ dS )zNSet GPU device to use.

        Args:
            device: Device ID.

        NrX   )r7   r5   r!   r!   r"   
set_device   s   
zRNNDecoder.set_device
batch_sizec                 C   sJ   t j| j|| j| jd}| jdkr!t j| j|| j| jd}||fS |dfS )zInitialize decoder states.

        Args:
            batch_size: Batch size.

        Returns:
            : Initial decoder hidden states. ((N, B, D_dec), (N, B, D_dec) or None)

        rX   r
   N)r   zerosr0   r2   r5   r1   )r7   r^   h_nc_nr!   r!   r"   r=      s   
zRNNDecoder.init_stateidxc                 C   sT   |d dd||d ddf | j dkr'|d dd||d ddf fS dfS )a-  Get specified ID state from decoder hidden states.

        Args:
            states: Decoder hidden states. ((N, B, D_dec), (N, B, D_dec) or None)
            idx: State ID to extract.

        Returns:
            : Decoder hidden state for given ID. ((N, 1, D_dec), (N, 1, D_dec) or None)

        r   Nr   r
   )r1   )r7   r<   rb   r!   r!   r"   select_state   s
    *zRNNDecoder.select_state
new_statesc                 C   s@   t jdd |D dd| jdkrt jdd |D ddfS dfS )zCreate decoder hidden states.

        Args:
            new_states: Decoder hidden states. [N x ((1, D_dec), (1, D_dec) or None)]

        Returns:
            states: Decoder hidden states. ((N, B, D_dec), (N, B, D_dec) or None)

        c                 S      g | ]}|d  qS )r   r!   r   sr!   r!   r"   r#          z2RNNDecoder.create_batch_states.<locals>.<listcomp>r   )dimr
   c                 S   re   )r   r!   rf   r!   r!   r"   r#      rh   N)r   catr1   )r7   rd   r!   r!   r"   rZ      s   
zRNNDecoder.create_batch_states)r	   r	   r
   r   r   r   r   )N)__name__
__module____qualname____doc__intrP   floatr%   r   Tensorr   r   rB   r?   r   rR   r   r\   r5   r]   tensorr=   rc   rZ   __classcell__r!   r!   r9   r"   r      s    	
/

"
 
	

r   )rn   typingr   r   r   r   	typeguardr   -espnet2.asr_transducer.beam_search_transducerr   *espnet2.asr_transducer.decoder.abs_decoderr   r   r!   r!   r!   r"   <module>   s    