o
    ¡¿¯i@"  ã                   @   sP   d dl Z d dl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_treec                       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 | _| j d| jd¡| _	| j d| jd¡| _
|d | _|d | _t||| jƒ| _t |¡| _|| _t|ƒ| _|| _d| _d S ©Nz<eos>z<unk>é   Úiz<space>T)Úsuperr   Ú__init__ÚwordlmÚ	subwordlmÚword_eosÚword_unkÚxpÚfullÚxp_word_eosÚxp_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/chainer_backend/extlm.pyr      s   






zMultiLevelLM.__init__c                 C   s   |d u r-|   d | j¡\}}t |¡j}|  d |¡\}}t |¡j| j }| j}	d}
| j}nŠ|\}}}}}}
t	|ƒ}|| jkrj|d urS|d dkrS| j
 d|d d¡}n| j}|   ||¡\}}t |¡j}| j}	d}
n<|d urƒ||d v rƒ|d | }	|
|d|f 7 }
n#| jr‘d }	|
|d|f 7 }
n| j
 d| jf| jd¡}||d |df|fS |  ||¡\}}t |¡j| 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< ||||	||
f|fS )Ng        r	   r   r
   Úf)r   r   ÚFÚlog_softmaxÚdatar   r   r   r   Úintr   r   r   r   r   Úlogzeror   r   r   )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'   Ú__call__.   sJ   

zMultiLevelLM.__call__c           
      C   sj   |\}}}}}}|d ur|d dkr| j  d|d d¡}n| j}|  ||¡\}}	t |	¡jd d …| jf S ©Nr	   r   r
   ©r   r   r   r   r)   r*   r+   r   )
r    r.   r3   r0   r2   r9   r5   r7   r:   r1   r&   r&   r'   Úfinal`   s   zMultiLevelLM.final)r   r   T©	Ú__name__Ú
__module__Ú__qualname__r-   Úzeror   r<   r?   Ú__classcell__r&   r&   r$   r'   r      s    ø2r   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 | _| j d| jd¡| _| j d| jd¡| _	|d | _
|d | _t||| jƒ| _|| _|| _t|ƒ| _d| _d S r   )r   rF   r   r   r   r   r   r   r   r   r   r   r   r   r#   r   r   r   r   )r    r   r!   r"   r#   r   r$   r&   r'   r   o   s   





zLookAheadWordLM.__init__c                 C   sè  |d u r |   d | j¡\}}| jjt |¡jdd}| j}| j}nh|\}}}t	|ƒ}|| jkr^|d urC|d dkrC| j 
d|d d¡}	n| j}	|   ||	¡\}}| jjt |¡jdd}| j}n*|d uro||d v ro|d | }n| jrud }n| j 
d| jf| jd¡}
|d d f|
fS |d urc|\}}}|d urª|d d …|d f |d d …|d f  nd}|| jk rÄ| j 
d| jf| jd¡}
|||f|
fS |d d …| jf |d d …| jd f  }| j 
d| jf|| j d¡}| ¡ D ]$\}}|d d …|d d f |d d …|d d f  | |d d …|f< qê|dkr;|d d …|f |d d …|d f  | }||d d …| jf< ||d d …| jf< n|| jkrU| j|d d …| jf< | j|d d …| jf< | j | j || jd ¡¡}
n
| j d| jfd¡}
|||f|
fS )Nr	   )Úaxisr   r
   r(   r   é   )r   r   r   Úcumsumr)   Úsoftmaxr+   r   r   r,   r   r   r   r   r-   rD   r   r#   Úitemsr   r   ÚclipÚzeros)r    r.   r/   r0   r1   Úcumsum_probsr6   r8   r9   r:   r5   ÚsuccÚwidÚwidsÚsum_probÚunk_probÚyÚcidÚndÚwlm_probr&   r&   r'   r<   €   sd   



(ÿý
&ÿÿ.þ
(ÿzLookAheadWordLM.__call__c                 C   sd   |\}}}|d ur|d dkr| j  d|d d¡}n| j}|  ||¡\}}t |¡jd d …| jf S r=   r>   )r    r.   r0   rO   r9   r:   r1   r&   r&   r'   r?   Á   s   
zLookAheadWordLM.final)rG   Tr@   r&   r&   r$   r'   rF   k   s    ÿArF   )
r   ÚchainerÚchainer.functionsÚ	functionsr)   Úespnet.lm.lm_utilsr   ÚChainr   rF   r&   r&   r&   r'   Ú<module>   s   [