
    NgJ                         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dS )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.
    T      ?N   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        |          | _        |                                  d S )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/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/non_local_attn.pyr   zNonLocalAttn.__init__   s    lD!!**,,,(x)?TTTK,5>[D((3
;1SWXXX;1SWXXX;1SWXXX;1SWXXXN;//	    c                    |}|                      |          }|                     |          }|                     |          }|                                \  }}}}	|                    ||d                              ddd          }|                    ||d          }|                    ||d                              ddd          }t          j        ||          | j        z  }
t          j
        |
d          }
t          j        |
|          }|                    ddd                              ||||	          }|                     |          }|                     |          |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#   s8   FF1IIFF1IIFF1IIVVXX
1aFF1a$$Q1--FF1aFF1a$$Q1--i1oo
*i###Ic1IIaA&&q!Q22FF1IIIIaLL8#r'   c                    |                                  D ]i\  }}t          |t          j                  rt          j                            |j        dd           t          t          |	                                                    dk    r%t          j        
                    |j        d           t          |t          j                  rLt          j        
                    |j        d           t          j        
                    |j        d           t          |t          j                  rJt          j        
                    |j        d           t          j        
                    |j        d           kd S )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!!RY'' 
-''H96 ( C C CtALLNN++,,q00G%%afc222Ar~.. -!!!(A...!!!&!,,,,Ar|,, -!!!(A...!!!&!,,,	- 	-r'   )Tr   Nr   )__name__
__module____qualname____doc__r   r<   r   __classcell__r%   s   @r&   r
   r
      se         
  
  
  
  
  
   ,- - - - - - -r'   r
   c                   J     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          |                                            t          ||d||          | _        t          j        |||z  |z  |df          | _        t          j        |||z  |z  d|f          | _        t          ||d||          | _	        || _
        || _        || _        d S )Nr   	act_layer
norm_layer)r   )r   rU   r   r   conv1r   r   conv_pconv_qconv2
block_sizegroupsr   )r   r   r^   r_   rX   rY   r%   s         r&   r   zBilinearAttnTransform.__init__J   s    #T**33555 fa9Ycddd
i
Z(?&(HWacdVefffi
Z(?&(HWXZdVefff k1	^hiii
$&r'   r   c                    |j         \  }}}}t          ||k    d           |dk    r|S |                    ||z  ddd          }|t          j        |||j        |j                  z  }|                    ||z  ||||          }t          j        t          j        |dd          d          }t          j        t          j        |dd          d          }|                    ||||z  ||z            }|S )	N r   r)   )dtypedevicer+      r*      )	shaper   r.   r0   eyerb   rc   catsplit)r   r5   r   r7   r8   r^   block_size1s          r&   
resize_matz BilinearAttnTransform.resize_matU   s    ()%1j+
k)2...66HFF1q5"a##	!Qagah????FF1q5*j!Q77Iek!QA...A666Iek!QA...A666FF1aaa88r'   c                 V   t          |j        d         | j        z  dk    d           t          |j        d         | j        z  dk    d           |j        \  }}}}|                     |          }t	          j        || j        df          }t	          j        |d| j        f          }|                     |                              || j        | j        | j                  	                                }	| 
                    |                              || j        | j        | j                  	                                }
|	|	                    dd          z  }	|
|
                    d	d          z  }
|	                    || j        d| j        | j                                      |                    d          | j        || j        z  | j        | j                                                  }	|	                    ||| j        | j                  }	|
                    || j        d| j        | j                                      |                    d          | j        || j        z  | j        | j                                                  }
|
                    ||| j        | j                  }
|                     |	|| j        z            }	|                     |
|| j        z            }
|	                    |          }|                    |
          }|                     |          }|S )
Nr)   r   ra   r   rd   T)r,   keepdimr*   )r   rf   r^   rZ   r2   adaptive_max_pool2dr[   r.   r_   sigmoidr\   sumexpandr-   
contiguousrk   matmulr]   )r   r5   r7   r8   r9   r:   outrpcpr   qys               r&   r<   zBilinearAttnTransform.forwardb   s   do-2B777do-2B777W
1ajjmm"3!(<=="3DO(<==KKOO  DK$/RRZZ\\KKOO  DK$/RRZZ\\!T***!T***FF1dk1dotGGNNqvvP PQ$+-tQ QQ[Q[Q]Q] 	
FF1a$/::FF1dk1dotGGNNqvvP PQ$+-tQ QQ[Q[Q]Q] 	
FF1a$/::OOAqDO344OOAqDO344HHQKKHHQKKJJqMMr'   )rN   rO   rP   r   ReLUr   r   intrk   r<   rR   rS   s   @r&   rU   rU   H   sr        BD'VXVd 	' 	' 	' 	' 	' 	's          r'   rU   c                   N     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      ?Nr   g?c
                 >   t                                                       |t          ||z  |          }t          ||d||	          | _        t          |||||	          | _        t          ||d||	          | _        t          j	        |          | _
        d S )Nr   r   rW   )r   )r   r   r   r   rZ   rU   bar]   r   	Dropout2ddropout)r   r   r^   r_   r!   r"   r#   	drop_raterX   rY   _r%   s              r&   r   zBatNonLocalAttn.__init__   s     	(x)?TTTK k1	^hiii
'ZS\isttt k1	^hiii
|i000r'   c                     |                      |          }|                     |          }|                     |          }|                     |          }||z   S )N)rZ   r   r]   r   )r   r5   xlry   s       r&   r<   zBatNonLocalAttn.forward   sG    ZZ]]GGBKKJJqMMLLOO1ur'   )
rN   rO   rP   rQ   r   rz   r   r   r<   rR   rS   s   @r&   r}   r}   |   sp         
 +,ARVcdRW	1 	1 	1 	1 	1 	1      r'   r}   )rQ   r0   r   torch.nnr   r2   conv_bn_actr   helpersr   trace_utilsr   Moduler
   rU   r}    r'   r&   <module>r      s           $ $ $ $ $ $ $ $ $ $ $ $ # # # # # #            5- 5- 5- 5- 5-29 5- 5- 5-p1 1 1 1 1BI 1 1 1h    bi     r'   