o
    iY/                  !   @   s   d dl Z d dlZd dlZd dlm  mZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ 						
								
			d$dedededededededededededededededef d d!ZG d"d# d#eZdS )%    N)check_argument_types)
AbsDecoder)get_default_kwargs)make_pad_mask	to_device)initial_attlocation      @     
   d   Feprojsdunitsatypenum_attnum_encsaheadsadimawinaconv_chansaconv_filtshan_mode	han_headshan_dimhan_conv_chanshan_conv_filtshan_winc                 C   s   t j }|dkr"t|D ]}t|| ||||||	}|| q|S |dkra|
r7t|| ||||||dd	}|S t j }t|D ]}t|| | ||| || || || |	| }|| q@|S td|)Nr	   T)r   z0Number of encoders needs to be more than one. {})torchnn
ModuleListranger   append
ValueErrorformat)r   r   r   r   r   r   r   r   r   r   r   han_typer   r   r   r   r   att_listiattidx r,   S/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/decoder/rnn_decoder.pybuild_attention_list   s\   

!

r.   c                       s   e Zd Zddddddddeef	dedede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d ZdddZdd Zdd Z  ZS )
RNNDecoderlstmr	   r   g        F
vocab_sizeencoder_output_sizernn_type
num_layershidden_sizesampling_probabilitydropoutcontext_residualreplace_sosr   att_confc                    s  t  sJ |dvrtd| t   |}|| _|| _|| _|| _|d | _|d | _	|| _
|| _|| _|
| _|	| _tj||| _tjj|d| _tj | _tj | _|  j| jdkritj|| |ntj|| |g7  _|  jtjj|dg7  _td| jD ](}|  j| jdkrtj||ntj||g7  _|  jtjj|dg7  _q|rtj|| || _ntj||| _td||d|| _d S )N>   grur0   zNot supported: rnn_type=r	   )pr0   )r   r   r,   )r   r%   super__init__dtyper   dlayersr8   soseosodimr6   r7   r   r9   r    r!   	EmbeddingembedDropoutdropout_embr"   decoderdropout_decLSTMCellGRUCellr#   Linearoutputr.   r(   )selfr1   r2   r3   r4   r5   r6   r7   r8   r9   r   r:   r   _	__class__r,   r-   r>   T   sR   





zRNNDecoder.__init__c                 C   s   | |d| jS )Nr   )	new_zerossizer   )rN   hs_padr,   r,   r-   
zero_state   s   zRNNDecoder.zero_statec                 C   s   | j dkrE| jd ||d |d f\|d< |d< td| jD ]!}| j| | j|d  ||d  || || f\||< ||< q||fS | jd ||d |d< td| jD ]}| j| | j|d  ||d  || ||< qW||fS )Nr0   r   r	   )r?   rH   r#   r@   rI   )rN   eyz_listc_listz_prevc_prevr)   r,   r,   r-   rnn_forward   s   
(

zRNNDecoder.rnn_forwardr   c                    s  | j dkr|g} g t|t| jd } fddt| j D  |d}| |d g}| |d g}	td| jD ]}
|| |d  |	| |d  q<g }| j dkrdd }| j| 	  nd g| j d  }d g| j  }t| j d D ]	}| j| 	  qy| 
| |}t|D ]}| j dkr| j| |d  d | jd |	d |\}}nNt| j D ]}| j| ||  | | jd |	d || \||< ||< qtj|dd}| j gt| }| j| j  ||| jd |	d || j  \}|| j < |dkr0t | jk r0| |d }tj|  dd}| 
| t| |}tj||fdd}ntj|d d |d d f |fdd}| ||	||	|\}	}| jre|tj| jd |	d |fdd q|| jd |	d  qtj|dd}| |}|t||dd ||fS )Nr	   c                    s   g | ]}t tt | qS r,   )listmapint).0r+   hlensr,   r-   
<listcomp>   s    z&RNNDecoder.forward.<locals>.<listcomp>r   dimr   )axis)r   minlenr(   r#   rS   rU   r@   r$   resetrG   rE   rI   r    stackrandomr6   rM   npargmaxdetachcpur   catr[   r8   masked_fill_r   )rN   rT   ra   	ys_in_pad
ys_in_lensstrm_idxatt_idxolengthrX   rW   rO   z_allatt_w
att_w_list
att_c_listr+   eysr)   att_c
hs_pad_han	hlens_hanz_outrV   r,   r`   r-   forward   sv   





$

zRNNDecoder.forwardc           	      C   s  | j dkr|g}| |d dg}| |d dg}td| jD ]}|| |d d || |d d q$d}t|t| jd }| j dkr\d }| j| 	  nd g| j d  }t| j d D ]	}| j| 	  qkt
|d d  |d d  ||||fdS )Nr	   r   rZ   rY   a_prev	workspace)r   rU   	unsqueezer#   r@   r$   rf   rg   r(   rh   dict)	rN   xrX   rW   rO   
strm_indexrt   ar+   r,   r,   r-   
init_state   s*   



zRNNDecoder.init_statec                 C   s
  | j dkr|g}|d \}}}|d d}| | |}| j dkrF| j| |d d|d dg| jd |d d |d \}	}
ned g| j d  }
d g| j  }t| j D ]*}| j| || d|| dg| jd |d d |d | \||< |
|< qYtj	|dd}| j| j  || j g| jd |d d |d | j  \}	|
| j < tj
||	fdd}| ||||d |d \}}| jr| tj
| jd |d |	fdd}n| | jd |d }tj|ddd}|t|d d  |d d  |
|||fd	fS )
Nr	   r   r   r   rY   r   rc   rZ   r   )r   r   rG   rE   r(   rS   rI   r#   r    ri   ro   r[   r8   rM   Flog_softmaxsqueezer   )rN   yseqstater   rt   rW   rX   vyrV   r{   rw   ry   r+   h_hanlogitslogpr,   r,   r-   score  s\   






zRNNDecoder.score)r   )__name__
__module____qualname__r   r.   r^   strfloatboolr   r>   rU   r[   r   r   r   __classcell__r,   r,   rP   r-   r/   S   sL    	
A
Tr/   )r   r	   r	   r
   r   r   r   r   FNr
   r   r   r   r   )rj   numpyrk   r    torch.nn.functionalr!   
functionalr   	typeguardr   espnet2.asr.decoder.abs_decoderr    espnet2.utils.get_default_kwargsr   &espnet.nets.pytorch_backend.nets_utilsr   r   *espnet.nets.pytorch_backend.rnn.attentionsr   r^   r   r   r.   r/   r,   r,   r,   r-   <module>   st    	

E