U
    ›PÓh	  ã                   @  sF   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 )é    )ÚannotationsN)ÚMLPBlock)ÚSABlockc                	      s<   e Zd ZdZdddddddddœ‡ fd	d
„Zdd„ Z‡  ZS )ÚTransformerBlockz°
    A transformer block, based on: "Dosovitskiy et al.,
    An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale <https://arxiv.org/abs/2010.11929>"
    ç        FÚintÚfloatÚboolÚNone)Úhidden_sizeÚmlp_dimÚ	num_headsÚdropout_rateÚqkv_biasÚ	save_attnÚreturnc                   sx   t ƒ  ¡  d|  krdks(n tdƒ‚|| dkr<tdƒ‚t|||ƒ| _t |¡| _t|||||ƒ| _	t |¡| _
dS )aï  
        Args:
            hidden_size (int): dimension of hidden layer.
            mlp_dim (int): dimension of feedforward layer.
            num_heads (int): number of attention heads.
            dropout_rate (float, optional): fraction of the input units to drop. Defaults to 0.0.
            qkv_bias (bool, optional): apply bias term for the qkv linear layer. Defaults to False.
            save_attn (bool, optional): to make accessible the attention matrix. Defaults to False.

        r   é   z'dropout_rate should be between 0 and 1.z-hidden_size should be divisible by num_heads.N)ÚsuperÚ__init__Ú
ValueErrorr   ÚmlpÚnnÚ	LayerNormÚnorm1r   ÚattnÚnorm2)Úselfr   r   r   r   r   r   ©Ú	__class__© ú[/home/dell461/cl/sdc2/HISourceFinder-master-l/src/monai/networks/blocks/transformerblock.pyr      s    
zTransformerBlock.__init__c                 C  s,   ||   |  |¡¡ }||  |  |¡¡ }|S )N)r   r   r   r   )r   Úxr   r   r    Úforward;   s    zTransformerBlock.forward)r   FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   Ú__classcell__r   r   r   r    r      s   
   ù !r   )
Ú
__future__r   Útorch.nnr   Zmonai.networks.blocks.mlpr   Z#monai.networks.blocks.selfattentionr   ÚModuler   r   r   r   r    Ú<module>   s   