
    ^j                         d Z ddlmZmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ  G d dej"                        Ze
 G d dej"                               Z G d dej"                        Zy)aw   Bilinear-Attention-Transform and Non-Local Attention

Paper: `Non-Local Neural Networks With Grouped Bilinear Attentional Transforms`
    - https://openaccess.thecvf.com/content_CVPR_2020/html/Chi_Non-Local_Neural_Networks_With_Grouped_Bilinear_Attentional_Transforms_CVPR_2020_paper.html
Adapted from original code: https://github.com/BA-Transform/BAT-Image-Classification
    )OptionalTypeN)nn)
functional   )register_notrace_module)ConvNormAct)make_divisible)_assertc                   <     e Zd ZdZ	 	 	 	 	 	 d fd	Zd Zd Z xZS )NonLocalAttnzSpatial NL block for image classification.

    This was adapted from https://github.com/BA-Transform/BAT-Image-Classification
    Their NonLocal impl inspired by https://github.com/facebookresearch/video-nonlocal-net.
    c                    ||d}	t         
|           |t        ||z  |      }|r|dz  nd| _        t	        j
                  ||fdddd|	| _        t	        j
                  ||fdddd|	| _        t	        j
                  ||fdddd|	| _        t	        j
                  ||fdddd|	| _	        t	        j                  |fi |	| _        | j                          y )Ndevicedtypedivisorg      g      ?r   T)kernel_sizestridebias)super__init__r
   scaler   Conv2dtpgzBatchNorm2dnormreset_parameters)selfin_channels	use_scalerd_ratiord_channels
rd_divisorr   r   _dd	__class__s             e/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/non_local_attn.pyr   zNonLocalAttn.__init__   s     /(x)?TK,5[D(3
;^1SW^[]^;^1SW^[]^;^1SW^[]^;^1SW^[]^NN;5"5	    c                    |}| j                  |      }| j                  |      }| j                  |      }|j                         \  }}}}	|j	                  ||d      j                  ddd      }|j	                  ||d      }|j	                  ||d      j                  ddd      }t        j                  ||      | j                  z  }
t        j                  |
d      }
t        j                  |
|      }|j                  ddd      j                  ||||	      }| j                  |      }| j                  |      |z   }|S )Nr      r   dim)r   r   r   sizeviewpermutetorchbmmr   Fsoftmaxreshaper   r    )r"   xshortcutr   r   r   BCHWatts              r+   forwardzNonLocalAttn.forward1   s   FF1IFF1IFF1IVVX
1aFF1a$$Q1-FF1aFF1a$$Q1-ii1o

*ii#IIc1IIaA&&q!Q2FF1IIIaL8#r,   c                 &   | j                         D ]}  \  }}t        |t        j                        r}t        j                  j                  |j                  dd       t        t        |j                                     dkD  sst        j                  j                  |j                  d       t        |t        j                        rVt        j                  j                  |j                  d       t        j                  j                  |j                  d       t        |t        j                        s*t        j                  j                  |j                  d       t        j                  j                  |j                  d        y )Nfan_outrelu)modenonlinearityr   g        r   )named_modules
isinstancer   r   initkaiming_normal_weightlenlist
parameters	constant_r   r   	GroupNorm)r"   namems      r+   r!   zNonLocalAttn.reset_parametersG   s    ))+ 	-GD!!RYY'''HH96 ( CtALLN+,q0GG%%affc2Ar~~.!!!((A.!!!&&!,Ar||,!!!((A.!!!&&!,	-r,   )Tg      ?N   NN)__name__
__module____qualname____doc__r   rA   r!   __classcell__r*   s   @r+   r   r      s+      .,-r,   r   c                        e Zd Zej                  ej
                  ddfdedededeej                     deej                     f
 fdZ	defd	Z
d
 Z xZS )BilinearAttnTransformNr#   
block_sizegroups	act_layer
norm_layerc                 F   ||d}t         	|           t        ||df||d|| _        t	        j
                  |||z  |z  fd|dfi|| _        t	        j
                  |||z  |z  fdd|fi|| _        t        ||df||d|| _        || _	        || _
        || _        y )Nr   r   r^   r_   r   )r   r   r	   conv1r   r   conv_pconv_qconv2r\   r]   r#   )
r"   r#   r\   r]   r^   r_   r   r   r)   r*   s
            r+   r   zBilinearAttnTransform.__init__Y   s     / faj9Ycjgij
ii
Z(?&(HlWacdVeliklii
Z(?&(HlWXZdVelikl k1o	^holno
$&r,   r   c                    |j                   \  }}}}t        ||k(  d       |dk  r|S |j                  ||z  ddd      }|t        j                  |||j
                  |j                        z  }|j                  ||z  ||||      }t        j                  t        j                  |dd      d      }t        j                  t        j                  |dd      d      }|j                  ||||z  ||z        }|S )	N r   r.   )r   r   r0      r/      )	shaper   r3   r5   eyer   r   catsplit)r"   r:   r   r<   r=   r\   block_size1s          r+   
resize_matz BilinearAttnTransform.resize_matm   s    ()%1j+
k)2.6HFF1q5"a#		!Qaggahh??FF1q5*j!Q7IIekk!QA.A6IIekk!QA.A6FF1aaa8r,   c                    t        |j                  d   | j                  z  dk(  d       t        |j                  d   | j                  z  dk(  d       |j                  \  }}}}| j                  |      }t	        j
                  || j                  df      }t	        j
                  |d| j                  f      }| j                  |      j                  || j                  | j                  | j                        j                         }	| j                  |      j                  || j                  | j                  | j                        j                         }
|	|	j                  dd      z  }	|
|
j                  d	d      z  }
|	j                  || j                  d| j                  | j                        j                  |j                  d      | j                  || j                  z  | j                  | j                        j                         }	|	j                  ||| j                  | j                        }	|
j                  || j                  d| j                  | j                        j                  |j                  d      | j                  || j                  z  | j                  | j                        j                         }
|
j                  ||| j                  | j                        }
| j                  |	|| j                  z        }	| j                  |
|| j                  z        }
|	j!                  |      }|j!                  |
      }| j#                  |      }|S )
Nr.   r   rg   r   rh   T)r1   keepdimr/   )r   rj   r\   rb   r7   adaptive_max_pool2drc   r3   r]   sigmoidrd   sumexpandr2   
contiguousro   matmulre   )r"   r:   r<   r=   r>   r?   outrpcpr   qys               r+   rA   zBilinearAttnTransform.forwardz   s   doo-2B7doo-2B7WW
1ajjm""3!(<=""3DOO(<=KKO  DKK$//RZZ\KKO  DKK$//RZZ\!T**!T**FF1dkk1dootGNNqvvPQ$++-tQQ[Q[Q] 	
FF1a$//:FF1dkk1dootGNNqvvPQ$++-tQQ[Q[Q] 	
FF1a$//:OOAqDOO34OOAqDOO34HHQKHHQKJJqMr,   )rT   rU   rV   r   ReLUr   intr   Moduler   ro   rA   rX   rY   s   @r+   r[   r[   V   so     *,*,..'' ' 	'
 BII' RYY'(s r,   r[   c                        e Zd ZdZddddddej
                  ej                  ddf
ded	ed
edede	e   dedede
ej                     de
ej                     f fdZd Z xZS )BatNonLocalAttnzT BAT
    Adapted from: https://github.com/BA-Transform/BAT-Image-Classification
       r/   g      ?NrS   g?r#   r\   r]   r%   r&   r'   	drop_rater^   r_   c                 
   |
|d}t         |           |t        ||z  |      }t        ||df||	d|| _        t        |||f||	d|| _        t        ||df||	d|| _        t        j                  |      | _
        y )Nr   r   r   ra   )r   )r   r   r
   r	   rb   r[   bare   r   	Dropout2ddropout)r"   r#   r\   r]   r%   r&   r'   r   r^   r_   r   r   r(   r)   r*   s                 r+   r   zBatNonLocalAttn.__init__   s     /(x)?TK k1o	^holno
'
  !
 
 !k1o	^holno
||i0r,   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }||z   S )N)rb   r   re   r   )r"   r:   xlr}   s       r+   rA   zBatNonLocalAttn.forward   s?    ZZ]GGBKJJqMLLO1ur,   )rT   rU   rV   rW   r   r~   r   r   floatr   r   r   r   rA   rX   rY   s   @r+   r   r      s      ")-")+*,..11 1 	1
 1 "#1 1 1 BII1 RYY1>r,   r   )rW   typingr   r   r5   r   torch.nnr   r7   _fxr   conv_bn_actr	   helpersr
   trace_utilsr   r   r   r[   r    r,   r+   <module>r      sg    "   $ ( $ #  @-299 @-F :BII : :z)bii )r,   