o
    iY                     @   sD   d Z ddlZddlZddlmZmZ ddlmZ G dd deZ	dS )z'ScorerInterface implementation for CTC.    N)CTCPrefixScoreCTCPrefixScoreTH)BatchPartialScorerInterfacec                   @   sx   e Zd ZdZdejjdefddZdej	fddZ
dd
dZdd Zdej	fddZdd Zdej	fddZdd Zd	S )CTCPrefixScorerz-Decoder interface wrapper for CTCPrefixScore.ctceosc                 C   s   || _ || _d| _dS )zInitialize class.

        Args:
            ctc (torch.nn.Module): The CTC implementation.
                For example, :class:`espnet.nets.pytorch_backend.ctc.CTC`
            eos (int): The end-of-sequence id.

        N)r   r   impl)selfr   r    r
   K/home/ubuntu/.local/lib/python3.10/site-packages/espnet/nets/scorers/ctc.py__init__   s   	
zCTCPrefixScorer.__init__xc                 C   sD   | j |d d  }t|d| jt	| _
d| j
 fS )Get an initial state for decoding.

        Args:
            x (torch.Tensor): The encoded feature tensor

        Returns: initial state

        r   )r   log_softmax	unsqueezedetachsqueezecpunumpyr   r   npr   initial_stater	   r   logpr
   r
   r   
init_state   s   $	zCTCPrefixScorer.init_stateNc                 C   s   t |tkrSt|dkr|\}}|| || fS |\}}}}	}
|||f |d}|
durC|dddd||
||f f |||	fS |dddd||f |||	fS |du rYdS || S )a@  Select state with relative ids in the main beam search.

        Args:
            state: Decoder state for prefix tokens
            i (int): Index to select a state in the main beam search
            new_id (int): New label id to select a state if necessary

        Returns:
            state: pruned state

              N)typetuplelenexpandsize)r	   stateinew_idscstrlog_psif_minf_maxscoring_idmapsr
   r
   r   select_state(   s   ( zCTCPrefixScorer.select_statec           	      C   sF   |\}}|  | | |\}}tj|| |j|jd}|||ffS )a  Score new token.

        Args:
            y (torch.Tensor): 1D prefix token
            next_tokens (torch.Tensor): torch.int64 next token to score
            state: decoder state for prefix tokens
            x (torch.Tensor): 2D encoder feature that generates ys

        Returns:
            tuple[torch.Tensor, Any]:
                Tuple of a score tensor for y that has a shape `(len(next_tokens),)`
                and next state for ys

        )devicedtype)r   r   torch	as_tensorr-   r.   )	r	   yidsr!   r   
prev_scorepresub_scorenew_sttscorer
   r
   r   score_partialA   s   zCTCPrefixScorer.score_partialc                 C   s:   | j |d}t|dg}t||d| j| _dS )r   r   r   N)	r   r   r   r/   tensorr    r   r   r   )r	   r   r   xlenr
   r
   r   batch_init_stateW   s   	z CTCPrefixScorer.batch_init_statec                 C   s^   |d dur&t jdd |D ddt dd |D |d d |d d fnd}| |||S )	a  Score new token.

        Args:
            y (torch.Tensor): 1D prefix token
            ids (torch.Tensor): torch.int64 next token to score
            state: decoder state for prefix tokens
            x (torch.Tensor): 2D encoder feature that generates ys

        Returns:
            tuple[torch.Tensor, Any]:
                Tuple of a score tensor for y that has a shape `(len(next_tokens),)`
                and next state for ys

        r   Nc                 S      g | ]}|d  qS )r   r
   .0r+   r
   r
   r   
<listcomp>v       z7CTCPrefixScorer.batch_score_partial.<locals>.<listcomp>r   )dimc                 S   r;   )r   r
   r<   r
   r
   r   r>   w   r?      )r/   stackr   )r	   r1   r2   r!   r   batch_stater
   r
   r   batch_score_partiale   s   


z#CTCPrefixScorer.batch_score_partialc                 C   s"   | j |d}| j| dS )zExtend probs for decoding.

        This extension is for streaming decoding
        as in Eq (14) in https://arxiv.org/abs/2006.14941

        Args:
            x (torch.Tensor): The encoded feature tensor

        r   N)r   r   r   r   extend_probr   r
   r
   r   rE      s   
zCTCPrefixScorer.extend_probc                 C   s$   g }|D ]}| | j| q|S )zExtend state for decoding.

        This extension is for streaming decoding
        as in Eq (14) in https://arxiv.org/abs/2006.14941

        Args:
            state: The states of hyps

        Returns: exteded state

        )appendr   extend_state)r	   r!   	new_stater+   r
   r
   r   rG      s   zCTCPrefixScorer.extend_state)N)__name__
__module____qualname____doc__r/   nnModuleintr   Tensorr   r,   r7   r:   rD   rE   rG   r
   r
   r
   r   r   
   s    
r   )
rL   r   r   r/   espnet.nets.ctc_prefix_scorer   r   espnet.nets.scorer_interfacer   r   r
   r
   r
   r   <module>   s    