Ë
    éÓ^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 )ÚNonLocalAttnzßSpatial 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Ñ)?ÈÔTˆKÙ,5�[ DÒ(¸3ˆŒ
Ü—‘˜;¨Ð^ÀÈ1ÐSWÑ^Ð[]Ñ^ˆŒÜ—‘˜;¨Ð^ÀÈ1ÐSWÑ^Ð[]Ñ^ˆŒÜ—‘˜;¨Ð^ÀÈ1ÐSWÑ^Ð[]Ñ^ˆŒÜ—‘˜;¨Ð^ÀÈ1ÐSWÑ^Ð[]Ñ^ˆŒÜ—N‘N ;Ñ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 )Néÿÿÿÿr   é   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  € Øˆà�F‰F�1‹IˆØ�F‰F�1‹IˆØ�F‰F�1‹Iˆà—V‘V“X‰
ˆˆ1ˆa�Ø�F‰F�1�a˜Ó×$Ñ$ Q¨¨1Ó-ˆØ�F‰F�1�a˜ÓˆØ�F‰F�1�a˜Ó×$Ñ$ Q¨¨1Ó-ˆä�i‰i˜˜1‹o §
¡
Ñ*ˆÜ�i‰i˜ Ô#ˆÜ�I‰I�c˜1Óˆà�I‰I�a˜˜AÓ×&Ñ& q¨!¨Q°Ó2ˆØ�F‰F�1‹IˆØ�I‰I�a‹L˜8Ñ#ˆàˆ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û   € Ø×)Ñ)Ó+ó 	-‰GˆD�!Ü˜!œRŸY™YÔ'Ü—‘×'Ñ'Ø—H‘H 9¸6ð (ô Cä”t˜AŸL™L›NÓ+Ó,¨qÓ0Ü—G‘G×%Ñ% a§f¡f¨cÕ2Ü˜AœrŸ~™~Ô.Ü—‘×!Ñ! !§(¡(¨AÔ.Ü—‘×!Ñ! !§&¡&¨!Ö,Ü˜AœrŸ|™|Ö,Ü—‘×!Ñ! !§(¡(¨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È   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ  ¨f°aÐjÀ9ÐYcÑjÐgiÑjˆŒ
Ü—i‘i ¨
°ZÑ(?À&Ñ(HÑlÐWaÐcdÐVeÐlÐikÑlˆŒÜ—i‘i ¨
°ZÑ(?À&Ñ(HÑlÐWXÐZdÐVeÐlÐikÑlˆŒÜ  ¨k¸1ÐoÈ	Ð^hÑoÐlnÑ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Ý   € Ø()¯©Ñ%ˆˆ1ˆj˜+Ü�
˜kÑ)¨2Ô.Ø�Š6ØˆHØ�F‰F�1�q‘5˜"˜a Ó#ˆØ”—	‘	˜!˜Q a§g¡g°a·h±hÔ?Ñ?ˆØ�F‰F�1�q‘5˜* j°!°QÓ7ˆÜ�I‰I”e—k‘k ! Q¨AÔ.°AÔ6ˆÜ�I‰I”e—k‘k ! Q¨AÔ.°AÔ6ˆØ�F‰F�1�a˜ 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Ž  € Ü�—‘˜‘˜dŸo™oÑ-°Ñ2°BÔ7Ü�—‘˜‘˜dŸo™oÑ-°Ñ2°BÔ7Ø—W‘W‰
ˆˆ1ˆa�Ø�j‰j˜‹mˆÜ×"Ñ" 3¨¯©¸!Ð(<Ó=ˆÜ×"Ñ" 3¨¨D¯O©OÐ(<Ó=ˆØ�K‰K˜‹O× Ñ   D§K¡K°·±À$Ç/Á/ÓR×ZÑZÓ\ˆØ�K‰K˜‹O× Ñ   D§K¡K°·±À$Ç/Á/ÓR×ZÑZÓ\ˆØ�—‘˜! T�Ó*Ñ*ˆØ�—‘˜! T�Ó*Ñ*ˆØ�F‰F�1�d—k‘k 1 d§o¡o°t·±ÓG×NÑNÈqÏvÉvØóPØ—‘˜Q $§+¡+Ñ-¨t¯©ÀÇÁóQßQ[ÑQ[ÓQ]ð 	
à�F‰F�1�a˜Ÿ™¨$¯/©/Ó:ˆØ�F‰F�1�d—k‘k 1 d§o¡o°t·±ÓG×NÑNÈqÏvÉvØóPØ—‘˜Q $§+¡+Ñ-¨t¯©ÀÇÁóQßQ[ÑQ[ÓQ]ð 	
à�F‰F�1�a˜Ÿ™¨$¯/©/Ó:ˆØ�O‰O˜A˜q D§O¡OÑ3Ó4ˆØ�O‰O˜A˜q D§O¡OÑ3Ó4ˆØ�H‰H�Q‹KˆØ�H‰H�Q‹Kˆà�J‰J�q‹MˆØˆr,   )rT   rU   rV   r   ÚReLUr   Úintr   ÚModuler   ro   rA   rX   rY   s   @r+   r[   r[   V   so   ø„ ð *,¯©Ø*,¯.©.ØØñ'àð'ð ð'ð ð	'ð
 ˜BŸI™I‘ð'ð ˜RŸY™Y™õ'ð(˜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Ñ)?ÈÔTˆKÜ  ¨k¸1ÐoÈ	Ð^hÑoÐlnÑoˆŒ
Ü'ØØØð
ð  Ø!ñ
ð ñ
ˆŒô ! ¨k¸1ÐoÈ	Ð^hÑoÐlnÑ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?   € Ø�Z‰Z˜‹]ˆØ�G‰G�B‹KˆØ�J‰J�q‹MˆØ�L‰L˜‹OˆØ�1‰uˆ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ð ˜BŸI™I‘ð1ð ˜RŸY™Y™õ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   ðñ÷ "ã Ý Ý $å (Ý $Ý #Ý  ô@-�2—9‘9ô @-ðF ô:˜BŸI™Ió :ó ð:ôz)�b—i‘iõ )r,   