Ë
    éÓ^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[œŸ™ 8¨QÐO¸AÀDÑOÈBÒOÐaeˆŒàÐÜ(¨°HÑ)<¸jÐVXÔYˆKÙÜ" 8¨[ÐlÀIÔZeÑlÐikÑlˆD�LàˆDŒLÙÜ$ X¨{ÐnÀiÔ\gÑnÐkmÑnˆD�Nà!ˆDŒNä$ 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_   € Ø�>‰>Ð%Ü�G‰G×#Ñ# D§N¡N×$9Ñ$9ÀÐW]Ð#Ô^Ø�<‰<Ð#Ü�G‰G�N‰N˜4Ÿ<™<×+Ñ+×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ö   € Ø—W‘W‰
ˆˆ1ˆa�à�>‰>Ð%Ø—>‘> !Ó$×,Ñ,¨Q°°1°q±5Ó9ˆDÜ—9‘9˜T rÔ*×4Ñ4°QÓ7ˆDØ—i‘i  1 a¨!¡eÓ,×6Ñ6°qÓ9¸DÑ@ˆGØ—l‘l 1 a¨¨AÓ.‰Gà—f‘f °�fÓ6ˆGà�>‰>Ð%Ø—N‘N 7Ó+ˆEØ�D—I‘I˜eÓ$Ñ$ˆAØ�<‰<Ð#Ø—L‘L Ó)ˆ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?ØØñ# àð# ð ð# ð ð	# ð
 ð# ð !ð# ð ð# ð " #™ð# ð ð# ð ˜BŸI™I‘ð# ð ˜c 4¨¯	©	¡?Ð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Ý #Ý Ý ô?�B—I‘Iõ ?r.   