o
    (i                     @  sf   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ h dZG dd	 d	ejZdS )
    )annotations)UnionN)get_act_layer)
split_args)look_up_option>   swinvista3dvitc                      s.   e Zd ZdZ	dd fddZdd Z  ZS )MLPBlockz
    A multi-layer perceptron block, based on: "Dosovitskiy et al.,
    An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale <https://arxiv.org/abs/2010.11929>"
            GELUr	   hidden_sizeintmlp_dimdropout_ratefloatacttuple | strreturnNonec           	        s  t    d|  krdkstd td|p|}t|\}}|dkr+t||nt||d | _t||| _t|| _	|  |  t
|t}|dkr[t|| _t|| _d
S |dkrkt|| _| j| _d
S |dkr{t | _t | _d
S td	t )a  
        Args:
            hidden_size: dimension of hidden layer.
            mlp_dim: dimension of feedforward layer. If 0, `hidden_size` will be used.
            dropout_rate: fraction of the input units to drop.
            act: activation type and arguments. Defaults to GELU. Also supports "GEGLU" and others.
            dropout_mode: dropout mode, can be "vit" or "swin".
                "vit" mode uses two dropout instances as implemented in
                https://github.com/google-research/vision_transformer/blob/main/vit_jax/models.py#L87
                "swin" corresponds to one instance as implemented in
                https://github.com/microsoft/Swin-Transformer/blob/main/models/swin_mlp.py#L23
                "vista3d" mode does not use dropout.

        r      z'dropout_rate should be between 0 and 1.GEGLU   r	   r   r   zdropout_mode should be one of N)super__init__
ValueErrorr   nnLinearlinear1linear2r   fnr   SUPPORTED_DROPOUT_MODEDropoutdrop1drop2Identity)	selfr   r   r   r   Zdropout_modeact_name_Zdropout_opt	__class__ [/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/networks/blocks/mlp.pyr      s.   
&


zMLPBlock.__init__c                 C  s2   |  | |}| |}| |}| |}|S )N)r    r   r#   r   r$   )r&   xr+   r+   r,   forwardK   s
   


zMLPBlock.forward)r   r   r	   )
r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r.   __classcell__r+   r+   r)   r,   r
      s
    ,r
   )
__future__r   typingr   torch.nnr   monai.networks.layersr   monai.networks.layers.factoriesr   monai.utilsr   r!   Moduler
   r+   r+   r+   r,   <module>   s   