o
    i                     @   sT   d Z ddl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 )zESequential implementation of Recurrent Neural Network Language Model.    )TupleUnionN)check_argument_types)AbsLMc                       s   e Zd ZdZ							d$d	ed
ededededededef fddZdd Z	de
jde
jdee
je
jf fddZde
jdee
jee
je
jf f de
jdee
jee
jee
je
jf f f fddZde
jd e
jd!e
jdee
je
jf fd"d#Z  ZS )%SequentialRNNLMzSequential RNNLM.

    See also:
        https://github.com/pytorch/examples/blob/4581968193699de14b56527296262dd76ab43557/word_language_model/model.py

      N           Flstmr   
vocab_sizeunitnhidnlayersdropout_ratetie_weightsrnn_type	ignore_idc	                    s   t  sJ t   |}	|d u r|}| }t|| _tj||	|d| _|dv r9t	t|}
|
|	|||dd| _
n!z	ddd| }W n tyM   tdw tj|	||||dd	| _
t||| _|rq||	krktd
| jj| j_|| _|| _|| _d S )N)padding_idx)LSTMGRUT)dropoutbatch_firsttanhrelu)RNN_TANHRNN_RELUzwAn invalid option for `--model` was supplied,
                    options are ['LSTM', 'GRU', 'RNN_TANH' or 'RNN_RELU'])nonlinearityr   r   z6When using the tied flag, nhid must be equal to emsize)r   super__init__uppernnDropoutdrop	EmbeddingencodergetattrrnnKeyError
ValueErrorRNNLineardecoderweightr   r   r   )selfr   r   r   r   r   r   r   r   ninp	rnn_classr   	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/lm/seq_rnn_lm.pyr      sL   




	
zSequentialRNNLM.__init__c                 C   sh   t | jtjjr&tj| j| jftjd}tj| j| jftjd}||f}|S tj| j| jftjd}|S )z,Initialize LM state filled with zero values.)dtype)	
isinstancer&   torchr    r   zerosr   r   float)r-   hcstater2   r2   r3   
zero_stateQ   s   zSequentialRNNLM.zero_stateinputhiddenreturnc                 C   sz   |  | |}| ||\}}|  |}| | |d|d |d}||d|d|d|fS )Nr      r   )r"   r$   r&   r+   
contiguousviewsize)r-   r=   r>   emboutputdecodedr2   r2   r3   forward\   s   
$zSequentialRNNLM.forwardyr;   xc                 C   s4   | |d  dd|\}}|jdd d}||fS )aH  Score new token.

        Args:
            y: 1D torch.int64 prefix tokens.
            state: Scorer state for prefix tokens
            x: 2D encoder feature that generates ys.

        Returns:
            Tuple of
                torch.float32 scores for next token (n_vocab)
                and next state for ys

        r@   dim)rB   log_softmax)r-   rH   r;   rI   	new_statelogpr2   r2   r3   scorej   s   zSequentialRNNLM.scoreysstatesxsc                    s  d du r	dn,t | jtjjr.tjdd D ddtjdd D dd  fntjdd| |ddddf \}|ddksPJ |j|d}|j	dd}t | jtjjrz\  fd	dt
dD |fS fd
dt
dD |fS )a  Score new token batch.

        Args:
            ys (torch.Tensor): torch.int64 prefix tokens (n_batch, ylen).
            states (List[Any]): Scorer states for prefix tokens.
            xs (torch.Tensor):
                The encoder feature that generates ys (n_batch, xlen, n_feat).

        Returns:
            tuple[torch.Tensor, List[Any]]: Tuple of
                batchfied scores for next token with shape of `(n_batch, n_vocab)`
                and next state list for ys.

        r   Nc                 S   s   g | ]\}}|qS r2   r2   .0r9   r:   r2   r2   r3   
<listcomp>       z/SequentialRNNLM.batch_score.<locals>.<listcomp>r@   rK   c                 S   s   g | ]\}}|qS r2   r2   rT   r2   r2   r3   rV      rW   rJ   c                    s,   g | ]}d d |f  d d |f fqS Nr2   rU   i)r:   r9   r2   r3   rV      s   , c                    s   g | ]
} d d |f qS rX   r2   rY   )rR   r2   r3   rV      s    )r5   r&   r6   r    r   stackrC   shapesqueezerM   range)r-   rQ   rR   rS   rO   r2   )r:   r9   rR   r3   batch_score   s"   

zSequentialRNNLM.batch_score)r   Nr   r	   Fr
   r   )__name__
__module____qualname____doc__intr8   boolstrr   r<   r6   Tensorr   rG   r   rP   r_   __classcell__r2   r2   r0   r3   r      sh    
	>
"
r   )rc   typingr   r   r6   torch.nnr    	typeguardr   espnet2.lm.abs_modelr   r   r2   r2   r2   r3   <module>   s    