
    RЦi                         S r SSKJrJrJrJr  SSKJr  SSKJs  J	r
  SSKJrJr  SSKJr  SSKJr  SS	KJr   " S
 S\R(                  5      rg)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                      ^  \ rS rSrSSSSSSS\R
                  SSS4S\S	\S
\S\S\S\S\	\   S\S\
\R                     S\\\
\R                     4   4U 4S jjjrS rS rSrU =r$ )GlobalContext   TFg      ?Nr   sigmoidchannelsuse_attnfuse_add
fuse_scaleinit_last_zerord_ratiord_channels
rd_divisor	act_layer
gate_layerc                   > XS.n[         TU ]  5         [        U	5      n	U(       a  [        R                  " US4SSS.UD6OS U l        Uc  [        X-  USS9nU(       a  [        X4U	[        S.UD6U l	        OS U l	        U(       a  [        X4U	[        S.UD6U l
        OS U l
        [        U
5      U l        XPl        U R                  5         g )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                 Y/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/global_context.pyr$   GlobalContext.__init__   s     /!),	S[8QOADOBOae()<jVXYK"8lIZeliklDLDL$Xni\gnkmnDN!DN$Z0	,    c                    U R                   b3  [        R                  R                  U R                   R                  SSS9  U R
                  b>  [        R                  R                  U R
                  R                  R                  5        g g )Nfan_inrelu)modenonlinearity)r&   r   initkaiming_normal_weightr'   zeros_fc2)r+   s    r.   r*   GlobalContext.reset_parameters<   s_    >>%GG##DNN$9$9W]#^<<#GGNN4<<++223 $r0   c                    UR                   u  p#pEU R                  b  U R                  U5      R                  USXE-  5      n[        R                  " USS9R                  S5      nUR                  X#XE-  5      R                  S5      U-  nUR                  X#SS5      nOUR                  SSS9nU R                  b$  U R                  U5      nXR                  U5      -  nU R                  b  U R                  U5      nX-   nU$ )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.   forwardGlobalContext.forwardB   s    WW
a>>%>>!$,,Q159D99Tr*44Q7Diiae,66q9D@Gll1A.Gfff6G>>%NN7+EIIe$$A<<#LL)E	Ar0   )r&   r)   r   r'   r(   )__name__
__module____qualname____firstlineno__r   ReLUintboolfloatr   r   Moduler   strr$   r*   rQ   __static_attributes____classcell__)r-   s   @r.   r   r      s    
 ""##(")-)+6?# #  #  	# 
 #  !#  #  "##  #  BII#  c4		?23#  # J4 r0   r   )__doc__typingr   r   r   r   torchr   torch.nn.functional
functionalrD   
create_actr	   r
   helpersr   mlpr   normr   r[   r    r0   r.   <module>ri      s7    0 /    7 #  ?BII ?r0   