o
    i~                     @   sP   d Z ddlmZ ddlmZ ddl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)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    |}	|d u r|}| }t|| _tj||	|d| _|dv r4tt|}
|
|	|||dd| _	n!z	ddd| }W n t
yH   tdw tj|	||||dd	| _	t||| _|rl||	krft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)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__ [/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/language_model/seq_rnn_lm.pyr      sB   

	
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stater1   r1   r2   
zero_stateL   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decodedr1   r1   r2   forwardW   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)rA   log_softmax)r,   rG   r:   rH   	new_statelogpr1   r1   r2   scoree   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 r1   r1   .0r8   r9   r1   r1   r2   
<listcomp>       z/SequentialRNNLM.batch_score.<locals>.<listcomp>r?   rJ   c                 S   s   g | ]\}}|qS r1   r1   rS   r1   r1   r2   rU      rV   rI   c                    s,   g | ]}d d |f  d d |f fqS Nr1   rT   i)r9   r8   r1   r2   rU      s   , c                    s   g | ]
} d d |f qS rW   r1   rX   )rQ   r1   r2   rU      s    )r4   r%   r5   r   r   stackrB   shapesqueezerL   range)r,   rP   rQ   rR   rN   r1   )r9   r8   rQ   r2   batch_score|   s"   

zSequentialRNNLM.batch_score)r   Nr   r   Fr	   r   )__name__
__module____qualname____doc__intr7   boolstrr   r;   r5   Tensorr   rF   r   rO   r^   __classcell__r1   r1   r/   r2   r      sh    
	9
"
r   )
rb   typingr   r   r5   torch.nnr   funasr.train.abs_modelr   r   r1   r1   r1   r2   <module>   s    