o
    پi                     @   s^   d Z ddlZddlm  mZ ddlmZ ddlmZ G dd dejZ	G d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                       s$   e Zd Z fddZdd Z  ZS )RadixSoftmaxc                    s   t t|   || _|| _d S )N)superr   __init__radixcardinality)selfr   r	   	__class__ J/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/split_attn.pyr      s   
zRadixSoftmax.__init__c                 C   s\   | d}| jdkr'||| j| jddd}tj|dd}||d}|S t	|}|S )Nr   r      dim)
sizer   viewr	   	transposeFsoftmaxreshapetorchsigmoid)r
   xbatchr   r   r   forward   s   


zRadixSoftmax.forward)__name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s    r   c                       sH   e Zd ZdZdddddddddddejddf fd	d
	Zdd Z  ZS )	SplitAttnz Split-Attention (aka Splat)
    N   r   Fr   g      ?   c                    s  t t|   |p
|}|	| _||	 }|d u r"t||	 |
 d|d}n||	 }|d u r.|d n|}tj||||||f||	 |d|| _|rJ||nt | _	|d urV| nt | _
|dd| _tj||d|d| _|rq||nt | _|dd| _tj||d|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   r   r   r   $   s.   zSplitAttn.__init__c           	      C   s  |  |}| |}| |}| |}|j\}}}}| jdkr5||| j|| j ||f}|jdd}n|}|jddd}| 	|}| 
|}| |}| |}| ||ddd}| jdkrz|||| j|| j ddf jdd}| S || }| S )Nr   r   )r   r#   T)keepdimr   )r,   r.   r/   r0   shaper   r   summeanr1   r2   r3   r4   r5   r   
contiguous)	r
   r   BRCHWx_gapx_attnoutr   r   r   r   =   s(   









(zSplitAttn.forward)	r   r   r    __doc__r   ReLUr   r   r!   r   r   r   r   r"   !   s    r"   )rQ   r   torch.nn.functionalr   
functionalr   helpersr   Moduler   r"   r   r   r   r   <module>   s    