o
    i                     @   sr   d Z ddlZddlmZ ddlmZ ddlZ	ddl
mZ ddlmZ ddlmZ ddlmZ G dd dejZdS )	z+Class Declaration of Transformer's Decoder.    N)DecoderLayer)PositionalEncoding)	LayerNorm)make_history_maskc                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )Decodera  Decoder layer.

    Args:
        odim (int): The output dimension.
        n_layers (int): Number of ecoder layers.
        n_units (int): Number of attention units.
        d_units (int): Dimension of input vector of decoder.
        h (int): Number of attention heads.
        dropout (float): Dropout rate.
        initialW (Initializer): Initializer to initialize the weight.
        initial_bias (Initializer): Initializer to initialize the bias.

    Nc           	   	      s0  t t|   |d | _|d | _|du rtjjn|}|du r#tjjn|}|  ? t	|j
| _t|j
|j| _dt|j
 }tj|j
|||d||dd| _tj||j
dtjjddd| _W d   n1 skw   Y  t|jD ]}dt| }t|j
|j|j|j||d	}| || qu|j| _dS )
zInitialize Decoder.   Ng      ?)scale)initialWinitial_bias)ignore_labelr	   	decoders.)d_unitshdropoutr	   r
   )superr   __init__soseoschainerinitializersUniform
init_scoper   adimoutput_normr   dropout_ratepenpsqrtLLinearoutput_layerEmbedIDNormalembedrangedlayersstrr   dunitsaheadsadd_linkn_layers)	selfodimargsr	   r
   stvdinamelayer	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/espnet/nets/chainer_backend/transformer/decoder.pyr      sF   



zDecoder.__init__c                 C   s8   |dddddf dk|dddddf dk }|S )a  Prepare the attention mask.

        Args:
            source_block (ndarray): Source block with dimensions: (B x S).
            target_block (ndarray): Target block with dimensions: (B x T).
        Returns:
            ndarray: Mask with dimensions (B, S, T).

        Nr   r5   )r,   source_blocktarget_blockmaskr5   r5   r6   make_attention_maskD   s   4
zDecoder.make_attention_maskc                    s   | j }t| jgtj  fdd|D }tj|| jdj}||}| 	|||}| 	||}|t
||9 }| | |}|j\}	}
}|d|}|d|}t| jD ]}| dt|  |||||	}qX| | ||	|
dS )a  Forward decoder.

        :param xp.array e: input token ids, int64 (batch, maxlen_out)
        :param xp.array yy_mask: input token mask, uint8  (batch, maxlen_out)
        :param xp.array source: encoded memory, float32  (batch, maxlen_in, feat)
        :param xp.array xy_mask: encoded memory mask, uint8  (batch, maxlen_in)
        :return e: decoded token score before softmax (batch, maxlen_out, token)
        :rtype: chainer.Variable
        c                    s   g | ]}t j |gd dqS )r   axis)r   concatenate).0yr   r5   r6   
<listcomp>^   s    z#Decoder.forward.<locals>.<listcomp>)paddingr   r   )xpr   arrayr   int32Fpad_sequencer   datar:   r   r   r$   shapereshaper%   r+   r'   r!   r   )r,   ys_padsourcex_maskrC   ysexy_maskyy_maskbatchlengthdimsr0   r5   r@   r6   forwardR   s   

zDecoder.forwardc                 C   s   |  |||}tj|ddS )zProcess recognition function.r   r;   )rU   rF   log_softmax)r,   rO   rQ   rL   r5   r5   r6   	recognizen   s   zDecoder.recognize)NN)	__name__
__module____qualname____doc__r   r:   rU   rW   __classcell__r5   r5   r3   r6   r      s    &r   )r[   r   chainer.functions	functionsrF   chainer.linkslinksr   numpyr   5espnet.nets.chainer_backend.transformer.decoder_layerr   1espnet.nets.chainer_backend.transformer.embeddingr   2espnet.nets.chainer_backend.transformer.layer_normr   ,espnet.nets.chainer_backend.transformer.maskr   Chainr   r5   r5   r5   r6   <module>   s   