o
    i/                  !   @   s   d dl Z 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 d dl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e
d!d"G d#d$ d$ejZdS )&    N)tables)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*   X/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/transducer/rnn_decoder.pybuild_attention_list   sX   



r,   decoder_classesrnn_decoderc                       s   e Zd Z									d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	           FN
vocab_sizeencoder_output_sizernn_type
num_layershidden_sizesampling_probabilitydropoutcontext_residualreplace_sosr   att_confc                    s  |dvrt d| t   |}|| _|| _|| _|| _|d | _|d | _|| _	|| _
|| _|
| _|	| _tj||| _tjj|d| _tj | _tj | _|  j| jdkrdt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#   super__init__dtyper   dlayersr9   soseosodimr7   r8   r   r:   r   r   	EmbeddingembedDropoutdropout_embr    decoderdropout_decLSTMCellGRUCellr!   Linearoutputr,   r&   )selfr2   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r   _	__class__r*   r+   r?   W   sH   




zRNNDecoder.__init__c                 C   s   | |d| jS )Nr   )	new_zerossizer   )rO   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@   rI   r!   rA   rJ   )rO   eyz_listc_listz_prevc_prevr'   r*   r*   r+   rnn_forward   s   
(0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!   rT   rV   rA   r"   resetrH   rF   rJ   r   stackrandomr7   rN   npargmaxdetachcpur   catr\   r9   masked_fill_r   )rO   rU   rb   	ys_in_pad
ys_in_lensstrm_idxatt_idxolengthrY   rX   rP   z_allatt_w
att_w_list
att_c_listr)   eysr'   att_c
hs_pad_han	hlens_hanz_outrW   r*   ra   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   r[   rZ   a_prev	workspace)r   rV   	unsqueezer!   rA   r"   rg   rh   r&   ri   dict)	rO   xrY   rX   rP   
strm_indexru   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   rZ   r   rd   r[   r   )r   r   rH   rF   r&   rT   rJ   r!   r   rj   rp   r\   r9   rN   Flog_softmaxsqueezer   )rO   yseqstater   ru   rX   rY   vyrW   r|   rx   rz   r)   h_hanlogitslogpr*   r*   r+   score  sT   




(

zRNNDecoder.score)	r0   r   r	   r1   r1   FFr   N)r   )__name__
__module____qualname__r_   strfloatboolr   r?   rV   r\   r   r   r   __classcell__r*   r*   rQ   r+   r/   U   sL    	
B
Tr/   )r   r   r   r   r	   r
   r   r   FNr   r	   r   r   r
   )r   rk   numpyrl   torch.nnr   torch.nn.functional
functionalr   funasr.registerr   *funasr.models.transformer.utils.nets_utilsr   r   +funasr.models.language_model.rnn.attentionsr   r_   r   r   r,   registerModuler/   r*   r*   r*   r+   <module>   sv   	


C