
    RЦih                         S r SSKJrJrJr  SSKrSSKJs  Jr	  SSKJr  SSK
Jr   " S S\R                  5      r " S	 S
\R                  5      rg)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                   :   ^  \ rS rSrS\S\4U 4S jjrS rSrU =r$ )RadixSoftmax   radixcardinalityc                 :   > [         TU ]  5         Xl        X l        g )N)super__init__r   r   )selfr   r   	__class__s      U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/split_attn.pyr   RadixSoftmax.__init__   s    
&    c                 4   UR                  S5      nU R                  S:  a`  UR                  X R                  U R                  S5      R	                  SS5      n[
        R                  " USS9nUR                  US5      nU$ [        R                  " U5      nU$ )Nr   r      dim)
sizer   viewr   	transposeFsoftmaxreshapetorchsigmoid)r   xbatchs      r   forwardRadixSoftmax.forward   s    q	::>u..

B?II!QOA		!#A		%$A  a Ar   )r   r   )	__name__
__module____qualname____firstlineno__intr   r%   __static_attributes____classcell__r   s   @r   r
   r
      s     'c ' '
 r   r
   c            !         ^  \ rS rSrSrSSSSSSSSSSS	\R                  SS4S
\S\\   S\S\S\\   S\S\S\	S\S\
S\\   S\S\\R                     S\\\R                        S\\\R                        4U 4S jjjrS rSrU =r$ )	SplitAttn#   z 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                   > UR                  SS 5      UR                  SS 5      S.n[        TU ]	  5         U=(       d    UnXl        X)-  nUc  [	        X-  U
-  SUS9nOX-  nUc  US-  OUn[
        R                  " UUUUUU4Xy-  US.UDUD6U l        U(       a	  U" U40 UD6O[
        R                  " 5       U l	        Ub  U" 5       O[
        R                  " 5       U l
        U" SS	9U l        [
        R                  " UUS
4SU0UD6U l        U(       a	  U" U40 UD6O[
        R                  " 5       U l        U" SS	9U l        [
        R                  " UUS
4SU0UD6U l        [!        X5      U l        g )Ndevicedtype)rC   rD       )	min_valuedivisorr   )r:   r;   T)inplacer   r:   )popr   r   r   r   r   Conv2dconvIdentitybn0dropact0fc1bn1act1fc2r
   rsoftmax)r   r4   r5   r6   r7   r8   r9   r:   r;   r   r<   r=   r>   r?   r@   rA   kwargsddmid_chsattn_chsr   s                       r   r   SplitAttn.__init__&   sq   & 

8T2VZZQU=VW#2{
&%k&9H&DPR\fgH"*H&-o+"7II
 >
 
 
	 1;:g,,$.$:JL	d+	99\8QLvLL1;:h-"-d+	99XwG&GBG$U3r   c                 
   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nUR                  u  p#pEU R
                  S:  a:  UR                  X R
                  X0R
                  -  XE45      nUR                  SS9nOUnUR                  SSS9nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      R                  USSS5      nU R
                  S:  aJ  XR                  X R
                  X0R
                  -  SS45      -  R                  SS9nUR                  5       $ X-  nUR                  5       $ )Nr   r   )r   r2   T)keepdimr   )rK   rM   rN   rO   shaper   r    summeanrP   rQ   rR   rS   rT   r   
contiguous)	r   r#   BRCHWx_gapx_attnouts	            r   r%   SplitAttn.forwardY   sL   IIaLHHQKIIaLIIaLggq::>		1jj"

*:AABAEEaELEE

64
0		% %v&++Ar1a8::>~~q**bJJ6F1&MNNSSXYSZC ~~ *C~~r   )
rO   rR   rM   rQ   rK   rN   rP   rS   r   rT   )r'   r(   r)   r*   __doc__r   ReLUr+   r   boolfloatr   Moduler   r%   r,   r-   r.   s   @r   r0   r0   #   s   
 +/ %)")-)+4848!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 BII14 !bii114  !bii1!14 14f   r   r0   )rh   typingr   r   r   r!   torch.nn.functionalr   
functionalr   helpersr   rl   r
   r0    r   r   <module>rr      sC    ) (     #299 "M 		 M r   