
    Ng                         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
dS )
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                 r    t          t          |                                            || _        || _        d S )N)superr   __init__radixcardinality)selfr   r   	__class__s      R/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/split_attn.pyr
   zRadixSoftmax.__init__   s4    lD!!**,,,
&    c                 4   |                     d          }| j        dk    rc|                    || j        | j        d                              dd          }t          j        |d          }|                    |d          }n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OOA	!###A		%$$AAa  Ar   )__name__
__module____qualname__r
   r    __classcell__r   s   @r   r   r      sG        ' ' ' ' '
      r   r   c                   P     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          |                                            |p|}|	| _        ||	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!          |	|          | _        d S )	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__$   s    	i'')))#2{
&%kE&9H&DPR\fgggHH"U*H&-o+""7I+vw8E>8 8068 8	 +5G::g&&&"+--$.$:JJLLL	Id+++	9\8QvFFF+5H::h'''2;==Id+++	9Xw&AAA$UF33r   c                 J   |                      |          }|                     |          }|                     |          }|                     |          }|j        \  }}}}| j        dk    r>|                    || j        || j        z  ||f          }|                    d          }n|}|                    dd          }| 	                    |          }| 
                    |          }|                     |          }|                     |          }|                     |                              |ddd          }| j        dk    r?||                    || j        || j        z  ddf          z                      d          }n||z  }|                                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=   so   IIaLLHHQKKIIaLLIIaLLg2q!:>>		1dj"
*:AqABBAEEaELLEEE

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