Ë
    éÓ^jh  ã                   ó¢   — d Z ddlmZmZmZ ddlZddlmc mZ	 ddlmZ ddl
mZ  G d„ dej                  «      Z G d	„ d
ej                  «      Zy)a'   Split Attention Conv2d (for ResNeSt Models)

Paper: `ResNeSt: Split-Attention Networks` - /https://arxiv.org/abs/2004.08955

Adapted from original PyTorch impl at https://github.com/zhanghang1989/ResNeSt

Modified for torchscript compat, performance, and consistency with timm by Ross Wightman
é    )ÚOptionalÚTypeÚUnionN)Únné   )Úmake_divisiblec                   ó.   ‡ — e Zd Zdedefˆ fd„Zd„ Zˆ xZS )ÚRadixSoftmaxÚradixÚcardinalityc                 ó>   •— t         ‰| �  «        || _        || _        y )N)ÚsuperÚ__init__r   r   )Úselfr   r   Ú	__class__s      €úa/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/split_attn.pyr   zRadixSoftmax.__init__   s   ø€ Ü‰ÑÔØˆŒ
Ø&ˆÕó    c                 ó6  — |j                  d«      }| j                  dkD  rc|j                  || j                  | j                  d«      j	                  dd«      }t        j                  |d¬«      }|j                  |d«      }|S t        j                  |«      }|S )Nr   r   éÿÿÿÿé   ©Údim)
Úsizer   Úviewr   Ú	transposeÚFÚsoftmaxÚreshapeÚtorchÚsigmoid)r   ÚxÚbatchs      r   ÚforwardzRadixSoftmax.forward   s�   € Ø—‘�q“	ˆØ�:‰:˜Š>Ø—‘�u˜d×.Ñ.°·
±
¸BÓ?×IÑIÈ!ÈQÓOˆAÜ—	‘	˜! Ô#ˆAØ—	‘	˜% Ó$ˆAð ˆô —‘˜aÓ ˆAØˆr   )Ú__name__Ú
__module__Ú__qualname__Úintr   r#   Ú__classcell__©r   s   @r   r
   r
      s   ø„ ð'˜cð '°õ 'ö
r   r
   c            !       ó  ‡ — e Zd ZdZdddddddddddej
                  ddfd	ed
ee   dededee   dedededede	dee   dede
ej                     dee
ej                        dee
ej                        fˆ fd„Zd„ Zˆ xZS )Ú	SplitAttnz Split-Attention (aka Splat)
    Né   r   Fr   g      Ð?é   Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingÚdilationÚgroupsÚbiasr   Úrd_ratioÚrd_channelsÚ
rd_divisorÚ	act_layerÚ
norm_layerÚ
drop_layerc                 óÔ  •— |j                  dd «      |j                  dd «      dœ}t        ‰| �	  «        |xs |}|	| _        ||	z  }|€t	        ||	z  |
z  d|¬«      }n||	z  }|€|dz  n|}t        j                  ||||||f||	z  |dœ|¤|¤Ž| _        |r	 ||fi |¤Žnt        j                  «       | _	        |� |«       nt        j                  «       | _
         |d¬	«      | _        t        j                  ||d
fd|i|¤Ž| _        |r	 ||fi |¤Žnt        j                  «       | _         |d¬	«      | _        t        j                  ||d
fd|i|¤Ž| _        t!        |	|«      | _        y )NÚdeviceÚdtype)r=   r>   é    )Ú	min_valueÚdivisorr   )r4   r5   T)Úinplacer   r4   )Úpopr   r   r   r   r   ÚConv2dÚconvÚIdentityÚbn0ÚdropÚact0Úfc1Úbn1Úact1Úfc2r
   Úrsoftmax)r   r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   r9   r:   r;   ÚkwargsÚddÚmid_chsÚattn_chsr   s                       €r   r   zSplitAttn.__init__&   s}  ø€ ð& Ÿ
™
 8¨TÓ2¸V¿Z¹ZÈÐQUÓ=VÑWˆÜ‰ÑÔØ#Ò2 {ˆØˆŒ
Ø Ñ&ˆØÐÜ% k°EÑ&9¸HÑ&DÐPRÐ\fÔg‰Hà" UÑ*ˆHà&- o�+ Ò"¸7ˆÜ—I‘IØØØØØØð
ð ˜E‘>Øñ
ð ð
ð ñ
ˆŒ	ñ 1;‘:˜gÑ,¨Ò,ÄÇÁÃˆŒØ$.Ð$:‘J”LÄÇÁÃˆŒ	Ù dÔ+ˆŒ	Ü—9‘9˜\¨8°QÑL¸vÐLÈÑLˆŒÙ1;‘:˜hÑ-¨"Ò-ÄÇÁÃˆŒÙ dÔ+ˆŒ	Ü—9‘9˜X w°ÑG¸&ÐGÀBÑGˆŒÜ$ U¨FÓ3ˆ�r   c                 ó*  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|j                  \  }}}}| j
                  dkD  r@|j                  || j
                  || j
                  z  ||f«      }|j                  d¬«      }n|}|j                  dd¬«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      j                  |ddd«      }| j
                  dkD  rP||j                  || j
                  || j
                  z  ddf«      z  j                  d¬«      }|j                  «       S ||z  }|j                  «       S )Nr   r   )r   r,   T)Úkeepdimr   )rE   rG   rH   rI   Úshaper   r   ÚsumÚmeanrJ   rK   rL   rM   rN   r   Ú
contiguous)	r   r!   ÚBÚRCÚHÚWÚx_gapÚx_attnÚouts	            r   r#   zSplitAttn.forwardY   s^  € Ø�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�I‰I�a‹Lˆà—g‘g‰ˆˆ2ˆq�!Ø�:‰:˜Š>Ø—	‘	˜1˜dŸj™j¨"°·
±
Ñ*:¸A¸qÐAÓBˆAØ—E‘E˜a�E“L‰EàˆEØ—
‘
˜6¨4�
Ó0ˆØ—‘˜“ˆØ—‘˜“ˆØ—	‘	˜%Ó ˆØ—‘˜%“ˆà—‘˜vÓ&×+Ñ+¨A¨r°1°aÓ8ˆØ�:‰:˜Š>Ø�v—~‘~ q¨$¯*©*°b¸D¿J¹JÑ6FÈÈ1Ð&MÓNÑN×SÑSÐXYÐSÓZˆCð �~‰~ÓÐð �f‘*ˆCØ�~‰~ÓÐr   )r$   r%   r&   Ú__doc__r   ÚReLUr'   r   ÚboolÚfloatr   ÚModuler   r#   r(   r)   s   @r   r+   r+   #   s  ø„ ñð
 +/Ø ØØ%)ØØØØØ"Ø)-ØØ)+¯©Ø48Ø48ñ!14àð14ð # 3™-ð14ð ð	14ð
 ð14ð ˜c‘]ð14ð ð14ð ð14ð ð14ð ð14ð ð14ð " #™ð14ð ð14ð ˜BŸI™I‘ð14ð !  b§i¡i¡Ñ1ð14ð  !  b§i¡i¡Ñ1õ!14öf r   r+   )r`   Útypingr   r   r   r   Útorch.nn.functionalr   Ú
functionalr   Úhelpersr   rd   r
   r+   © r   r   ú<module>rj      sC   ðñ÷ )Ñ (ã ß Ð Ý å #ô�2—9‘9ô ô"M �—	‘	õ M r   