Ë
    éÓ^j¬  ã                   ó¤   — d Z ddlmZmZmZmZ ddl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ã   Gather-Excite Attention Block

Paper: `Gather-Excite: Exploiting Feature Context in CNNs` - https://arxiv.org/abs/1810.12348

Official code here, but it's only partial impl in Caffe: https://github.com/hujie-frank/GENet

I've tried to support all of the extent both w/ and w/o params. I don't believe I've seen another
impl that covers all of the cases.

NOTE: extent=0 + extra_params=False is equivalent to Squeeze-and-Excitation

Hacked together by / Copyright 2021 Ross Wightman
é    )ÚOptionalÚTupleÚTypeÚUnionN)Únné   )Úcreate_act_layerÚget_act_layer)Úcreate_conv2d)Úmake_divisible)ÚConvMlpc                   ó  ‡ — e Zd ZdZddddddddej
                  ej                  dddfd	ed
ee	eef      de
dede
dedee   dede
deej                     deej                     deeeej                     f   fˆ fd„Zd„ Zˆ xZS )ÚGatherExcitez$ Gather-Excite Attention Module
    NFr   Tg      °?r   ÚsigmoidÚchannelsÚ	feat_sizeÚextra_paramsÚextentÚuse_mlpÚrd_ratioÚrd_channelsÚ
rd_divisorÚadd_maxpoolÚ	act_layerÚ
norm_layerÚ
gate_layerc                 óh  •— ||dœ}t         ‰| �  «        |	| _        t        |
«      }
|| _        |�r]t        j                  «       | _        |dk(  rj|€J d«       ‚| j                  j                  dt        ||g|¢­|dddœŽ«       |�r^| j                  j                  dt        j                  |g|¢­Ž «       �n,|d	z  dk(  sJ ‚t        t        j                  |«      «      }t        |«      D ]ž  }| j                  j                  d
|dz   › �t        ||g|¢­dd	ddœŽ«       |r6| j                  j                  d|dz   › �t        j                  |g|¢­Ž «       ||dz
  k7  sŒv| j                  j                  d|dz   › � |
d¬«      «       Œ  nWd | _        | j                  dk(  rd| _        d| _        n2|d	z  dk(  sJ ‚| j                  d	z  dz
  | _        | j                  | _        |st#        ||z  |d¬«      }|rt%        ||g|¢­d|
iŽnt        j&                  «       | _        t+        |«      | _        y )N)ÚdeviceÚdtyper   zBspatial feature size must be specified for global extent w/ paramsÚconv1r   T)Úkernel_sizeÚstrideÚ	depthwiseÚnorm1é   Úconvé   ÚnormÚact)Úinplaceg        )Úround_limitr   )ÚsuperÚ__init__r   r
   r   r   Ú
SequentialÚgatherÚ
add_moduler   ÚBatchNorm2dÚintÚmathÚlog2ÚrangeÚgkÚgsr   r   ÚIdentityÚmlpr	   Úgate)Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   ÚddÚnum_convÚiÚ	__class__s                     €úd/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/gather_excite.pyr-   zGatherExcite.__init__   s!  ø€ ð" ¨Ñ/ˆÜ‰ÑÔØ&ˆÔÜ! )Ó,ˆ	ØˆŒÚÜŸ-™-›/ˆDŒKØ˜Š{Ø Ð,ÐrÐ.rÓrÐ,Ø—‘×&Ñ&Øœ]¨8°XÐtÐqsÑtÈ9Ð]^ÐjnÒtôvâØ—K‘K×*Ñ*¨U´R·^±^ÀHÐ5RÈrÒ5RÖSà ‘z Q’Ð&�ÜœtŸy™y¨Ó0Ó1�Ü˜x›ò W�AØ—K‘K×*Ñ*Ø˜q 1™u˜g˜Ü% h°ÐgÐdfÑgÀaÐPQÐ]aÒgôiñ "ØŸ™×.Ñ.°°a¸!±e°W¨~¼r¿~¹~ÈhÐ?\ÐY[Ò?\Ô]Ø˜H q™LÓ(ØŸ™×.Ñ.°°Q¸±U°G¨}¹iÐPTÔ>UÕVñWð ˆDŒKØ�{‰{˜aÒØ�”Ø�•à ‘z Q’Ð&�ØŸ+™+¨™/¨AÑ-�”ØŸ+™+�”áÜ(¨°HÑ)<¸jÐVXÔYˆKÙOV”7˜8 [ÐKÈÒK¸IÒKÔ\^×\gÑ\gÓ\iˆŒÜ$ ZÓ0ˆ�	ó    c           	      óÆ  — |j                   dd  }| j                  �| j                  |«      }nÕ| j                  dk(  r<|j                  dd¬«      }| j                  r§d|z  d|j                  dd¬«      z  z   }nŠt        j                  || j                  | j                  | j                  dz  d	¬
«      }| j                  rCd|z  dt        j                  || j                  | j                  | j                  dz  ¬«      z  z   }| j                  |«      }|j                   d   dk7  s|j                   d   dk7  rt        j                  ||¬«      }|| j                  |«      z  S )Néþÿÿÿr   )r%   r'   T)ÚdimÚkeepdimsg      à?)Úkeepdimr%   F)r!   r"   ÚpaddingÚcount_include_pad)r!   r"   rG   éÿÿÿÿr   )Úsize)Úshaper/   r   Úmeanr   ÚamaxÚFÚ
avg_pool2dr6   r7   Ú
max_pool2dr9   Úinterpolater:   )r;   ÚxrJ   Úx_ges       r@   ÚforwardzGatherExcite.forwardU   s,  € Ø�w‰w�r�sˆ|ˆØ�;‰;Ð"Ø—;‘;˜q“>‰Dà�{‰{˜aÒà—v‘v &°4�vÓ8�Ø×#Ò#à ™:¨¨a¯f©f°VÀT¨fÓ.JÑ(JÑJ‘Dä—|‘|Ø 4§7¡7°4·7±7ÀDÇGÁGÈqÁLÐdiôk�à×#Ò#à ™:¨¬a¯l©l¸1È$Ï'É'ÐZ^×ZaÑZaÐko×krÑkrÐvwÑkwÔ.xÑ(xÑx�DØ�x‰x˜‹~ˆØ�:‰:�b‰>˜QÒ $§*¡*¨R¡.°AÒ"5Ü—=‘= ¨DÔ1ˆDØ�4—9‘9˜T“?Ñ"Ð"rA   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚReLUr1   r2   r   r   ÚboolÚfloatr   ÚModuler   Ústrr-   rT   Ú__classcell__)r?   s   @r@   r   r      sí   ø„ ñð
 48Ø!&ØØ Ø#Ø)-ØØ %Ø)+¯©Ø*,¯.©.Ø6?ØØñ61àð61ð    c¨3 h¡Ñ0ð61ð ð	61ð
 ð61ð ð61ð ð61ð " #™ð61ð ð61ð ð61ð ˜BŸI™I‘ð61ð ˜RŸY™Y™ð61ð ˜c 4¨¯	©	¡?Ð2Ñ3õ61öp#rA   r   )rX   Útypingr   r   r   r   r3   Útorchr   Útorch.nn.functionalÚ
functionalrN   Ú
create_actr	   r
   r   Úhelpersr   r9   r   r\   r   © rA   r@   ú<module>rf      s<   ðñ÷ 0Ó /Û å ß Ð ç 7Ý (Ý #Ý ôO#�2—9‘9õ O#rA   