U
    Ph                     @  sR   d dl mZ d dlZd dlmZ d dlmZ eddd\ZZG dd dej	Z
dS )	    )annotationsN)optional_importzeinops.layers.torch	Rearrange)namec                	      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 )SABlockz
    A self-attention block, based on: "Dosovitskiy et al.,
    An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale <https://arxiv.org/abs/2010.11929>"
            FNintfloatboolz
int | NoneNone)hidden_size	num_headsdropout_rateqkv_bias	save_attndim_headreturnc                   s   t    d|  krdks(n td|| dkr<td|| _|dkrR|| n|| _| j| | _t| j|| _tj|| jd |d| _	t
dd|d	| _t
d
| _t|| _t|| _| jd | _|| _t | _dS )a  
        Args:
            hidden_size (int): dimension of hidden 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): bias term for the qkv linear layer. Defaults to False.
            save_attn (bool, optional): to make accessible the attention matrix. Defaults to False.
            dim_head (int, optional): dimension of each head. Defaults to hidden_size // num_heads.

        r      z'dropout_rate should be between 0 and 1.z-hidden size should be divisible by num_heads.N   )biaszb h (qkv l d) -> qkv b l h d)qkvlzb h l d -> b l (h d)g      )super__init__
ValueErrorr   r   Z	inner_dimnnLinearout_projr   r   input_rearrangeout_rearrangeDropoutdrop_outputdrop_weightsscaler   torchTensoratt_mat)selfr   r   r   r   r   r   	__class__ X/home/dell461/cl/sdc2/HISourceFinder-master-l/src/monai/networks/blocks/selfattention.pyr      s"    

zSABlock.__init__c                 C  s   |  | |}|d |d |d   }}}td||| j jdd}| jrX| | _| 	|}td||}| 
|}| |}| |}|S )Nr   r      zblxd,blyd->blxy)dimzbhxy,bhyd->bhxd)r   r   r$   einsumr#   softmaxr   detachr&   r"   r   r   r!   )r'   xoutputqkvr&   r*   r*   r+   forwardF   s    




zSABlock.forward)r   FFN)__name__
__module____qualname____doc__r   r7   __classcell__r*   r*   r(   r+   r      s   	     *r   )
__future__r   r$   torch.nnr   monai.utilsr   r   _Moduler   r*   r*   r*   r+   <module>   s
   