
    khJ                         d 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  G d	 d
ej                        Z 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
    N)nn)
functional   )ConvNormAct)make_divisible)_assertc                   0     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                    t         t        |           |t        ||z  |      }|r|dz  nd| _        t        j                  ||ddd      | _        t        j                  ||ddd      | _        t        j                  ||ddd      | _	        t        j                  ||ddd      | _
        t        j                  |      | _        | j                          y )Ndivisorg      g      ?r   T)kernel_sizestridebias)superr
   __init__r   scaler   Conv2dtpgzBatchNorm2dnormreset_parameters)selfin_channels	use_scalerd_ratiord_channels
rd_divisorkwargs	__class__s          V/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/non_local_attn.pyr   zNonLocalAttn.__init__   s    lD*,(x)?TK,5[D(3
;1SWX;1SWX;1SWX;1SWXNN;/	    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.forward#   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_parameters9   s    ))+ 	-GD!!RYY'''HH96 ( CtALLN+,q0GG%%affc2Ar~~.!!!((A.!!!&&!,Ar||,!!!((A.!!!&&!,	-r%   )Tg      ?N   )__name__
__module____qualname____doc__r   r:   r   __classcell__r#   s   @r$   r
   r
      s    
 ,-r%   r
   c                   ^     e Zd Zej                  ej
                  f fd	ZdefdZd Z	 xZ
S )BilinearAttnTransformc                 <   t         t        |           t        ||d||      | _        t        j                  |||z  |z  |df      | _        t        j                  |||z  |z  d|f      | _        t        ||d||      | _	        || _
        || _        || _        y )Nr   	act_layer
norm_layer)r   )r   rT   r   r   conv1r   r   conv_pconv_qconv2
block_sizegroupsr   )r   r   r]   r^   rW   rX   r#   s         r$   r   zBilinearAttnTransform.__init__J   s    #T35 fa9Ycd
ii
Z(?&(HWacdVefii
Z(?&(HWXZdVef k1	^hi
$&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'   )dtypedevicer)      r(      )	shaper   r,   r.   eyera   rb   catsplit)r   r3   r   r5   r6   r]   block_size1s          r$   
resize_matz BilinearAttnTransform.resize_matU   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   r`   r   rc   T)r*   keepdimr(   )r   re   r]   rY   r0   adaptive_max_pool2drZ   r,   r^   sigmoidr[   sumexpandr+   
contiguousrj   matmulr\   )r   r3   r5   r6   r7   r8   outrpcpr   qys               r$   r:   zBilinearAttnTransform.forwardb   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%   )rM   rN   rO   r   ReLUr   r   intrj   r:   rQ   rR   s   @r$   rT   rT   H   s)    BD''VXVdVd 	's r%   rT   c                   b     e Zd ZdZddddddej
                  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      ?NrL   g?c
                     t         |           |t        ||z  |      }t        ||d||	      | _        t        |||||	      | _        t        ||d||	      | _        t        j                  |      | _
        y )Nr   r   rV   )r   )r   r   r   r   rY   rT   bar\   r   	Dropout2ddropout)r   r   r]   r^   r   r    r!   	drop_raterW   rX   _r#   s              r$   r   zBatNonLocalAttn.__init__   sw     	(x)?TK k1	^hi
'ZS\ist k1	^hi
||i0r%   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }||z   S )N)rY   r   r\   r   )r   r3   xlrx   s       r$   r:   zBatNonLocalAttn.forward   s?    ZZ]GGBKJJqMLLO1ur%   )
rM   rN   rO   rP   r   ry   r   r   r:   rQ   rR   s   @r$   r|   r|   |   s0    
 +,ARVcdRWW	1r%   r|   )rP   r.   r   torch.nnr   r0   conv_bn_actr   helpersr   trace_utilsr   Moduler
   rT   r|    r%   r$   <module>r      sP      $ $ #  5-299 5-p1BII 1hbii r%   