Ë
    éÓ^j/)  ã                   óö   — d Z ddlmZmZmZ ddlZddlmZ ddlmc 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 G d„ dej                  «      Zy)aH   Non-Local Attention Pooling Layers

A collection of global pooling layers that go beyond simple avg/max pooling.

LSEPool - LogSumExp pooling, a smooth approximation between avg and max pooling
SimPool - Attention-based pooling from 'Keep It SimPool' (ICCV 2023)

Based on implementations from:
* LSE Pooling: custom implementation by Bill Psomas
* SimPool: https://arxiv.org/abs/2309.06891 - 'Keep It SimPool: Who Said Supervised Transformers
    Suffer from Attention Deficit?' by Bill Psomas et al.

Hacked together by / Copyright 2024 Ross Wightman, original code by Bill Psomas
é    )ÚOptionalÚTypeÚUnionNé   )Úuse_fused_attnc                   ót   ‡ — e Zd ZdZ	 	 	 	 	 d	dededefˆ fd„Zdej                  dej                  fd„Z	ˆ xZ
S )
Ú	LsePlus2da…  LogSumExp (LSE) Pooling for 2D inputs.

    A smooth approximation to max pooling that provides a learnable interpolation between
    average and max pooling. When r is large, LSE approaches max pooling; when r is small,
    it approaches average pooling.

    Implements: (1/r) * log((1/n) * sum(exp(r * (x - x_max)))) + x_max

    The x_max subtraction provides numerical stability.
    ÚrÚr_learnableÚflattenc                 óô   •— t         ‰| �  «        |r8t        j                  t	        j
                  |||¬«      «      | _        || _        y| j                  dt	        j
                  |||¬«      «       || _        y)zê
        Args:
            r: Initial value of the pooling parameter. Higher = closer to max pooling.
            r_learnable: If True, r is a learnable parameter.
            flatten: If True, flatten spatial dims in output.
        ©ÚdeviceÚdtyper
   N)	ÚsuperÚ__init__ÚnnÚ	ParameterÚtorchÚtensorr
   Úregister_bufferr   )Úselfr
   r   r   r   r   Ú	__class__s         €úa/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/other_pool.pyr   zLsePlus2d.__init__$   s_   ø€ ô 	‰ÑÔÙÜ—\‘\¤%§,¡,¨q¸ÀuÔ"MÓNˆDŒFð ˆ�ð × Ñ  ¤e§l¡l°1¸VÈ5Ô&QÔRØˆ�ó    ÚxÚreturnc                 ó,  — t        j                  |d«      }t        j                  | j                  ||z
  z  «      }|j                  dd¬«      }|d| j                  z  t        j                  |«      z  z   }| j                  r|j                  d«      }|S )Nr   )é   é   T©ÚdimÚkeepdimç      ð?)ÚFÚadaptive_max_pool2dr   Úexpr
   ÚmeanÚlogr   ©r   r   Úx_maxÚexp_xÚsum_expÚouts         r   ÚforwardzLsePlus2d.forward9   sz   € Ü×%Ñ% a¨Ó+ˆÜ—	‘	˜$Ÿ&™& A¨¡IÑ.Ó/ˆØ—*‘* °�*Ó6ˆØ�s˜TŸV™V‘|¤u§y¡y°Ó'9Ñ9Ñ9ˆØ�<Š<Ø—+‘+˜a“.ˆCØˆ
r   )ç      $@TTNN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚfloatÚboolr   r   ÚTensorr/   Ú__classcell__©r   s   @r   r	   r	      sU   ø„ ñ	ð Ø $Ø ØØñàðð ðð õ	ð*˜Ÿ™ð ¨%¯,©,÷ r   r	   c                   ón   ‡ — e Zd ZdZ	 	 	 	 ddedefˆ fd„Zdej                  dej                  fd„Z	ˆ xZ
S )	Ú	LsePlus1da  LogSumExp (LSE) Pooling for sequence (NLC) inputs.

    A smooth approximation to max pooling that provides a learnable interpolation between
    average and max pooling. When r is large, LSE approaches max pooling; when r is small,
    it approaches average pooling.
    r
   r   c                 óØ   •— t         ‰| �  «        |r1t        j                  t	        j
                  |||¬«      «      | _        y| j                  dt	        j
                  |||¬«      «       y)z¬
        Args:
            r: Initial value of the pooling parameter. Higher = closer to max pooling.
            r_learnable: If True, r is a learnable parameter.
        r   r
   N)r   r   r   r   r   r   r
   r   )r   r
   r   r   r   r   s        €r   r   zLsePlus1d.__init__K   sM   ø€ ô 	‰ÑÔÙÜ—\‘\¤%§,¡,¨q¸ÀuÔ"MÓNˆD�Fà× Ñ  ¤e§l¡l°1¸VÈ5Ô&QÕRr   r   r   c                 ó  — |j                  dd¬«      j                  }t        j                  | j                  ||z
  z  «      }|j                  dd¬«      }|d| j                  z  t        j                  |«      z  z   }|j                  d«      S )Nr   Tr!   r$   )ÚmaxÚvaluesr   r'   r
   r(   r)   Úsqueezer*   s         r   r/   zLsePlus1d.forward]   su   € à—‘˜! T�Ó*×1Ñ1ˆÜ—	‘	˜$Ÿ&™& A¨¡IÑ.Ó/ˆØ—*‘* ¨D�*Ó1ˆØ�s˜TŸV™V‘|¤u§y¡y°Ó'9Ñ9Ñ9ˆØ�{‰{˜1‹~Ðr   )r0   TNNr1   r:   s   @r   r<   r<   C   sK   ø„ ñð Ø $ØØñSàðSð õSð$˜Ÿ™ð ¨%¯,©,÷ r   r<   c                   óä   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 	 dde	de	dedede
e   de
eej                        fˆ fd	„Zd
ej                   dej                   fd„Zˆ xZS )Ú	SimPool2dab  SimPool: Simple Attention-Based Pooling for 2D (NCHW) inputs.

    From 'Keep It SimPool: Who Said Supervised Transformers Suffer from Attention Deficit?'
    https://arxiv.org/abs/2309.06891

    Uses GAP as query initialization and applies cross-attention between the GAP query
    and spatial features to produce a weighted pooled representation.
    Ú
fused_attnr"   Ú	num_headsÚqkv_biasÚqk_normÚgammaÚ
norm_layerc	                 óF  •— t         ‰
| �  «        ||dœ}	||z  dk(  sJ d«       ‚|| _        ||z  | _        | j                  dz  | _        || _        t        «       | _        |xs t        j                  } ||fi |	¤Ž| _
        t        j                  ||fd|i|	¤Ž| _        t        j                  ||fd|i|	¤Ž| _        |r1 || j                  fi |	¤Ž| _         || j                  fi |	¤Ž| _        yt        j                   «       | _        t        j                   «       | _        y)aõ  
        Args:
            dim: Input feature dimension (number of channels).
            num_heads: Number of attention heads.
            qkv_bias: If True, add bias to query and key projections.
            qk_norm: If True, apply normalization to queries and keys.
            gamma: If provided, apply power normalization to values with this exponent.
            norm_layer: Normalization layer for patches and optionally qk_norm.
            flatten: If True, flatten output to (B, C).
        r   r   ú"dim must be divisible by num_headsç      à¿ÚbiasN©r   r   rE   Úhead_dimÚscalerH   r   rD   r   Ú	LayerNormÚnormÚLinearÚqÚkÚq_normÚk_normÚIdentity©r   r"   rE   rF   rG   rH   rI   r   r   Úddr   s             €r   r   zSimPool2d.__init__q   s  ø€ ô* 	‰ÑÔØ¨Ñ/ˆØ�Y‰ !Ò#ÐIÐ%IÓIÐ#Ø"ˆŒØ˜yÑ(ˆŒØ—]‘] dÑ*ˆŒ
ØˆŒ
Ü(Ó*ˆŒàÒ/¤2§<¡<ˆ
Ù˜sÑ) bÑ)ˆŒ	Ü—‘˜3 Ñ9¨(Ð9°bÑ9ˆŒÜ—‘˜3 Ñ9¨(Ð9°bÑ9ˆŒÙÙ$ T§]¡]Ñ9°bÑ9ˆDŒKÙ$ T§]¡]Ñ9°bÑ9ˆD�KäŸ+™+›-ˆDŒKÜŸ+™+›-ˆD�Kr   r   r   c                 ó4  — |j                   \  }}}}||z  }|j                  d«      j                  dd«      }|j                  dd¬«      }| j	                  |«      }| j                  |«      j                  |d| j                  | j                  «      j                  dd«      }| j                  |«      j                  ||| j                  | j                  «      j                  dd«      }	|j                  ||| j                  | j                  «      j                  dd«      }
| j                  |«      | j                  |	«      }	}| j                  �É|
j                  dd¬«      }|
|z
  dz   }| j                  r1t        j                   ||	|j#                  | j                  «      «      }nR|| j$                  z  |	j                  dd«      z  }|j'                  d¬«      }||j#                  | j                  «      z  }|j#                  d	| j                  z  «      }n]| j                  rt        j                   ||	|
«      }n9|| j$                  z  |	j                  dd«      z  }|j'                  d¬«      }||
z  }|j                  dd«      j                  ||«      }|S )
Nr   r   Tr!   éþÿÿÿç�íµ ÷Æ°>éÿÿÿÿ©r"   r$   )Úshaper   Ú	transposer(   rR   rT   ÚreshaperE   rO   rU   rV   rW   rH   ÚaminrD   r%   Úscaled_dot_product_attentionÚpowrP   Úsoftmax)r   r   ÚBÚCÚHÚWÚNrT   Úx_normrU   ÚvÚv_minÚ	v_shiftedÚattn_outÚattnr.   s                   r   r/   zSimPool2d.forwardš   s*  € Ø—W‘W‰
ˆˆ1ˆa�Ø�‰Eˆð �I‰I�a‹L×"Ñ" 1 aÓ(ˆð �F‰F�q $ˆFÓ'ˆð —‘˜1“ˆð �F‰F�1‹I×Ñ˜a  D§N¡N°D·M±MÓB×LÑLÈQÐPQÓRˆØ�F‰F�6‹N×"Ñ" 1 a¨¯©¸¿¹ÓG×QÑQÐRSÐUVÓWˆØ�N‰N˜1˜a §¡°·±Ó?×IÑIÈ!ÈQÓOˆà�{‰{˜1‹~˜tŸ{™{¨1›~ˆ1ˆà�:‰:Ð!à—F‘F˜r¨4�FÓ0ˆEØ˜E™	 DÑ(ˆIØ�ŠÜ×9Ñ9¸!¸QÀ	ÇÁÈdÏjÉjÓ@YÓZ‘à˜DŸJ™J™¨!¯+©+°b¸"Ó*=Ñ=�Ø—|‘|¨�|Ó+�Ø )§-¡-°·
±
Ó";Ñ;�Ø—,‘,˜s T§Z¡ZÑ/Ó0‰Cà�ŠÜ×4Ñ4°Q¸¸1Ó=‘à˜DŸJ™J™¨!¯+©+°b¸"Ó*=Ñ=�Ø—|‘|¨�|Ó+�Ø˜Q‘h�ð �m‰m˜A˜qÓ!×)Ñ)¨!¨QÓ/ˆØˆ
r   ©r   FFNNNN©r2   r3   r4   r5   r   ÚjitÚFinalr7   Ú__annotations__Úintr   r6   r   r   ÚModuler   r8   r/   r9   r:   s   @r   rC   rC   f   s    ø… ñð —	‘	—‘ Ñ%Ó%ð
 Ø"Ø!Ø%)Ø48ØØñ'(àð'(ð ð'(ð ð	'(ð
 ð'(ð ˜E‘?ð'(ð !  b§i¡i¡Ñ1õ'(ðR)˜Ÿ™ð )¨%¯,©,÷ )r   rC   c                   óä   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 	 dde	de	dedede
e   de
eej                        fˆ fd	„Zd
ej                   dej                   fd„Zˆ xZS )Ú	SimPool1daf  SimPool: Simple Attention-Based Pooling for sequence (NLC) inputs.

    From 'Keep It SimPool: Who Said Supervised Transformers Suffer from Attention Deficit?'
    https://arxiv.org/abs/2309.06891

    Uses GAP as query initialization and applies cross-attention between the GAP query
    and sequence tokens to produce a weighted pooled representation.
    rD   r"   rE   rF   rG   rH   rI   c	                 óF  •— t         ‰
| �  «        ||dœ}	||z  dk(  sJ d«       ‚|| _        ||z  | _        | j                  dz  | _        || _        t        «       | _        |xs t        j                  } ||fi |	¤Ž| _
        t        j                  ||fd|i|	¤Ž| _        t        j                  ||fd|i|	¤Ž| _        |r1 || j                  fi |	¤Ž| _         || j                  fi |	¤Ž| _        yt        j                   «       | _        t        j                   «       | _        y)a§  
        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            qkv_bias: If True, add bias to query and key projections.
            qk_norm: If True, apply normalization to queries and keys.
            gamma: If provided, apply power normalization to values with this exponent.
            norm_layer: Normalization layer for tokens and optionally qk_norm.
        r   r   rK   rL   rM   NrN   rY   s             €r   r   zSimPool1d.__init__Ñ   s  ø€ ô( 	‰ÑÔØ¨Ñ/ˆØ�Y‰ !Ò#ÐIÐ%IÓIÐ#Ø"ˆŒØ˜yÑ(ˆŒØ—]‘] dÑ*ˆŒ
ØˆŒ
Ü(Ó*ˆŒàÒ/¤2§<¡<ˆ
Ù˜sÑ) bÑ)ˆŒ	Ü—‘˜3 Ñ9¨(Ð9°bÑ9ˆŒÜ—‘˜3 Ñ9¨(Ð9°bÑ9ˆŒÙÙ$ T§]¡]Ñ9°bÑ9ˆDŒKÙ$ T§]¡]Ñ9°bÑ9ˆD�KäŸ+™+›-ˆDŒKÜŸ+™+›-ˆD�Kr   r   r   c                 óæ  — |j                   \  }}}|j                  dd¬«      }| j                  |«      }| j                  |«      j	                  |d| j
                  | j                  «      j                  dd«      }| j                  |«      j	                  ||| j
                  | j                  «      j                  dd«      }|j	                  ||| j
                  | j                  «      j                  dd«      }| j                  |«      | j                  |«      }}| j                  �É|j                  dd¬«      }	||	z
  dz   }
| j                  r1t        j                  |||
j!                  | j                  «      «      }nR|| j"                  z  |j                  dd«      z  }|j%                  d¬«      }||
j!                  | j                  «      z  }|j!                  d	| j                  z  «      }n]| j                  rt        j                  |||«      }n9|| j"                  z  |j                  dd«      z  }|j%                  d¬«      }||z  }|j                  dd«      j	                  ||«      }|S )
Nr   Tr!   r   r\   r]   r^   r_   r$   )r`   r(   rR   rT   rb   rE   rO   ra   rU   rV   rW   rH   rc   rD   r%   rd   re   rP   rf   )r   r   rg   rk   rh   rT   rl   rU   rm   rn   ro   rp   rq   r.   s                 r   r/   zSimPool1d.forwardù   s  € Ø—'‘'‰ˆˆ1ˆað �F‰F�q $ˆFÓ'ˆð —‘˜1“ˆð �F‰F�1‹I×Ñ˜a  D§N¡N°D·M±MÓB×LÑLÈQÐPQÓRˆØ�F‰F�6‹N×"Ñ" 1 a¨¯©¸¿¹ÓG×QÑQÐRSÐUVÓWˆØ�N‰N˜1˜a §¡°·±Ó?×IÑIÈ!ÈQÓOˆà�{‰{˜1‹~˜tŸ{™{¨1›~ˆ1ˆà�:‰:Ð!à—F‘F˜r¨4�FÓ0ˆEØ˜E™	 DÑ(ˆIØ�ŠÜ×9Ñ9¸!¸QÀ	ÇÁÈdÏjÉjÓ@YÓZ‘à˜DŸJ™J™¨!¯+©+°b¸"Ó*=Ñ=�Ø—|‘|¨�|Ó+�Ø )§-¡-°·
±
Ó";Ñ;�Ø—,‘,˜s T§Z¡ZÑ/Ó0‰Cà�ŠÜ×4Ñ4°Q¸¸1Ó=‘à˜DŸJ™J™¨!¯+©+°b¸"Ó*=Ñ=�Ø—|‘|¨�|Ó+�Ø˜Q‘h�ð �m‰m˜A˜qÓ!×)Ñ)¨!¨QÓ/ˆØˆ
r   rr   rs   r:   s   @r   rz   rz   Æ   s    ø… ñð —	‘	—‘ Ñ%Ó%ð
 Ø"Ø!Ø%)Ø48ØØñ&(àð&(ð ð&(ð ð	&(ð
 ð&(ð ˜E‘?ð&(ð !  b§i¡i¡Ñ1õ&(ðP%˜Ÿ™ð %¨%¯,©,÷ %r   rz   )r5   Útypingr   r   r   r   Útorch.nnr   Útorch.nn.functionalÚ
functionalr%   Úconfigr   rx   r	   r<   rC   rz   © r   r   ú<module>rƒ      sh   ðñ÷ )Ñ (ã Ý ß Ð å "ô(�—	‘	ô (ôV �—	‘	ô  ôF]�—	‘	ô ]ô@X�—	‘	õ Xr   