o
    iJ%                     @   sn   d dl Z d dlZd dlmZ d dlm  mZ d dlmZ d dl	m
Z
 G dd dejZG dd dejZdS )    N)make_lexical_tree)	to_devicec                       s<   e Zd ZdZdZ			d fdd	Zdd	 Zd
d Z  ZS )MultiLevelLM    _绽|=皙?      ?Tc                    s   t t|   || _|| _|d | _|d | _t| jg| _	t| jg| _
|d | _|d | _t||| j| _t|| _|| _t|| _|| _d| _d S Nz<eos>z<unk>z<space>T)superr   __init__wordlm	subwordlmword_eosword_unktorch
LongTensorvar_word_eosvar_word_unkspaceeosr   lexrootmathloglog_oov_penalty
open_vocablensubword_dict_sizesubwordlm_weight
normalized)selfr   r   	word_dictsubword_dictr   oov_penaltyr   	__class__ S/home/ubuntu/.local/lib/python3.10/site-packages/espnet/lm/pytorch_backend/extlm.pyr      s   






zMultiLevelLM.__init__c                 C   sP  |d u r=t || j| _t || j| _| d | j\}}tj|dd}| d |\}}tj|dd| j }| j}	d}
| j	}n|\}}}}}}
t
|}|| j	kr||d urd|d dkrdt |t|d g}n| j}| ||\}}tj|dd}| j}	d}
n>|d ur||d v r|d | }	|
|d|f 7 }
n%| jrd }	|
|d|f 7 }
nt |td| jf| j}|||d |df|fS | ||\}}tj|dd| j }|| j	kr|	d ur|	d dkr|d d |	d f |
 }n|d d | jf | j }||d d | j	f< ||d d | jf< n| j|d d | j	f< | j|d d | jf< ||||	|t|
f|fS )N   dimg        r   )r   r   r   r   Flog_softmaxr   r   r   r   intr   r   r   fullr   logzeror   r   r   float)r   statex	wlm_statez_wlmwlm_logprobs	clm_statez_clmlog_ynew_nodeclm_logprobxinodewwlm_logprobr%   r%   r&   forward0   sV   
zMultiLevelLM.forwardc           
      C   sr   |\}}}}}}|d ur|d dkrt |t|d g}n| j}| ||\}}	ttj|	ddd d | jf S Nr'   r   r(   	r   r   r   r   r   r/   r*   r+   r   )
r   r0   r5   r2   r4   r;   r7   r9   r<   r3   r%   r%   r&   finali   s    zMultiLevelLM.final)r   r   T	__name__
__module____qualname__r.   zeror   r>   rA   __classcell__r%   r%   r#   r&   r      s    9r   c                       s8   e Zd ZdZdZ	d fdd	Zdd Zd	d
 Z  ZS )LookAheadWordLMr   r   -C6?Tc                    s   t t|   || _|d | _|d | _t| jg| _t| jg| _	|d | _
|d | _t||| j| _|| _|| _t|| _t| jg| _d| _d S r	   )r
   rH   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   FloatTensorrF   zero_tensorr   )r   r   r    r!   r"   r   r#   r%   r&   r   x   s   





zLookAheadWordLM.__init__c                 C   s  |d u r5t || j| _t || j| _t || j| _| d | j\}}tjtj|dddd}| j	}| j
}nj|\}}}t|}|| j
krt|d urY|d dkrYt |t|d g}	n| j}	| ||	\}}tjtj|dddd}| j	}n+|d ur||d v r|d | }n| jrd }nt |td| jf| j}
|d d f|
fS |d ur||\}}}|d ur|d d |d f |d d |d f  nd}|| jk rt |td| jf| j}
|||f|
fS |d d | jf |d d | jd f  }t |td| jft|| j }| D ]%\}}|d d |d d f |d d |d d f  | |d d |f< q|dkrW|d d |f |d d |d f  | }||d d | j
f< ||d d | jf< n|| j
krq| j|d d | j
f< | j|d d | jf< tt|| j}
n
t |td| j}
|||f|
fS )Nr'   r(   r   r      )r   r   r   rK   r   r   cumsumr*   softmaxr   r   r,   r   r   r-   r   r.   rF   r   r/   r"   itemsr   r   maxzeros)r   r0   r1   r2   r3   cumsum_probsr8   r:   r;   r<   r7   succwidwidssum_probunk_probycidndwlm_probr%   r%   r&   r>      st   



(
&.
(zLookAheadWordLM.forwardc                 C   sl   |\}}}|d ur|d dkrt |t|d g}n| j}| ||\}}ttj|ddd d | jf S r?   r@   )r   r0   r2   rR   r;   r<   r3   r%   r%   r&   rA      s   
 zLookAheadWordLM.final)rI   TrB   r%   r%   r#   r&   rH   t   s    IrH   )r   r   torch.nnnntorch.nn.functional
functionalr*   espnet.lm.lm_utilsr   &espnet.nets.pytorch_backend.nets_utilsr   Moduler   rH   r%   r%   r%   r&   <module>   s   b