
    ^j                         d Z ddlmZmZmZmZ ddlmZ ddlmc m	Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZ  G d
 dej(                        Zy)a   Global Context Attention Block

Paper: `GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond`
    - https://arxiv.org/abs/1904.11492

Official code consulted as reference: https://github.com/xvjiarui/GCNet

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalTupleTypeUnion)nnN   )create_act_layerget_act_layer)make_divisible)ConvMlp)LayerNorm2dc                        e Zd Zdddddddej                  dddfdeded	ed
edededee   dede	ej                     deee	ej                     f   f fdZd Zd Z xZS )GlobalContextTFg      ?Nr   sigmoidchannelsuse_attnfuse_add
fuse_scaleinit_last_zerord_ratiord_channels
rd_divisor	act_layer
gate_layerc                    ||d}t         |           t        |	      }	|rt        j                  |dfddd|nd | _        |t        ||z  |d      }|rt        ||f|	t        d|| _	        nd | _	        |rt        ||f|	t        d|| _
        nd | _
        t        |
      | _        || _        | j                          y )N)devicedtyper   T)kernel_sizebiasg        )round_limit)r   
norm_layer)super__init__r
   r   Conv2d	conv_attnr   r   r   mlp_add	mlp_scaler	   gater   reset_parameters)selfr   r   r   r   r   r   r   r   r   r   r   r   dd	__class__s                 e/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/global_context.pyr#   zGlobalContext.__init__   s     /!),	S[8QOADOBOae(H)<jVXYK"8[lIZeliklDLDL$X{ni\gnkmnDN!DN$Z0	,    c                    | j                   6t        j                  j                  | j                   j                  dd       | j
                  >t        j                  j                  | j
                  j                  j                         y y )Nfan_inrelu)modenonlinearity)r%   r   initkaiming_normal_weightr&   zeros_fc2)r*   s    r-   r)   zGlobalContext.reset_parameters<   s_    >>%GG##DNN$9$9W]#^<<#GGNN4<<++223 $r.   c                    |j                   \  }}}}| j                  | j                  |      j                  |d||z        }t        j                  |d      j                  d      }|j                  ||||z        j                  d      |z  }|j                  ||dd      }n|j                  dd      }| j                  %| j                  |      }|| j                  |      z  }| j                  | j                  |      }||z   }|S )Nr   )dim   )   r<   T)r;   keepdim)shaper%   reshapeFsoftmax	unsqueezeviewmeanr'   r(   r&   )	r*   xBCHWattncontextmlp_xs	            r-   forwardzGlobalContext.forwardB   s    WW
1a>>%>>!$,,Q1q59D99Tr*44Q7Dii1a!e,66q9D@Gll1aA.Gfff6G>>%NN7+EDIIe$$A<<#LL)EE	Ar.   )__name__
__module____qualname__r   ReLUintboolfloatr   r   Moduler   strr#   r)   rN   __classcell__)r,   s   @r-   r   r      s    
 ""##(")-)+6?# #  #  	# 
 #  !#  #  "##  #  BII#  c4		?23# J4r.   r   )__doc__typingr   r   r   r   torchr   torch.nn.functional
functionalrA   
create_actr	   r
   helpersr   mlpr   normr   rV   r    r.   r-   <module>rc      s7    0 /    7 #  ?BII ?r.   