
    kh                         d 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
    N)nn   )make_divisiblec                   $     e Zd Z fdZd Z xZS )RadixSoftmaxc                 F    t         t        |           || _        || _        y )N)superr   __init__radixcardinality)selfr   r   	__class__s      R/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/split_attn.pyr
   zRadixSoftmax.__init__   s    lD*,
&    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	::>ud..

B?II!QOA		!#A		%$A  a Ar   )__name__
__module____qualname__r
   r    __classcell__r   s   @r   r   r      s    '
r   r   c                   Z     e Zd ZdZdddddddddddej
                  ddf fd		Zd
 Z xZS )	SplitAttnz Split-Attention (aka Splat)
    N   r   Fr   g      ?   c                    t         t        |           |xs |}|	| _        ||	z  }|t	        ||	z  |
z  d|      }n||	z  }||dz  n|}t        j                  ||||||f||	z  |d|| _        |r ||      nt        j                         | _	        | |       nt        j                         | _
         |d      | _        t        j                  ||d|      | _        |r ||      nt        j                         | _         |d      | _        t        j                  ||d|      | _        t!        |	|      | _        y )	N    )	min_valuedivisorr   )groupsbiasT)inplacer   )r.   )r	   r'   r
   r   r   r   Conv2dconvIdentitybn0dropact0fc1bn1act1fc2r   rsoftmax)r   in_channelsout_channelskernel_sizestridepaddingdilationr.   r/   r   rd_ratiord_channels
rd_divisor	act_layer
norm_layer
drop_layerkwargsmid_chsattn_chsr   s                      r   r
   zSplitAttn.__init__$   s0    	i')#2{
&%kE&9H&DPR\fgH"U*H&-o+"7II+vw8E>8068	 +5:g&"++-$.$:JL	d+	99\8QvF+5:h'2;;=d+	99Xw&A$UF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   )r2   r4   r5   r6   shaper   r   summeanr7   r8   r9   r:   r;   r   
contiguous)	r   r   BRCHWx_gapx_attnouts	            r   r    zSplitAttn.forward=   s^   IIaLHHQKIIaLIIaLgg2q!::>		1djj"

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

64
0		% %v&++Ar1a8::>v~~q$**bDJJ6F1&MNNSSXYSZC ~~ f*C~~r   )	r!   r"   r#   __doc__r   ReLUr
   r    r$   r%   s   @r   r'   r'   !   s8    151QX\AETW[hi77t42 r   r'   )rX   r   torch.nn.functionalr   
functionalr   helpersr   Moduler   r'    r   r   <module>r_      s;        #299 "3 		 3 r   