Ë
    éÓ^j  ã                   ó¾   — d dl 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
 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y)é    )ÚOptionalÚTypeNé   )Úmaybe_add_mask)Úuse_fused_attn)ÚMlp)Útrunc_normal_tf_c            !       óJ  ‡ — e Zd ZU dZej
                  j                  e   ed<   ddddddddddd	d
de	j                  dddfdededededee   dededededededededeee	j                         deee	j                         def ˆ fd„Zd„ Zd deej&                     fd„Zˆ xZS )!ÚAttentionPoolLatentz‹ Attention pooling w/ latent query

    Setting out_features=0 disables the output projection, norm, and MLP layers (pre_logits mode).
    Ú
fused_attnNé   g      @TFr   Ú Útokeng        Úin_featuresÚout_featuresÚ	embed_dimÚ	num_headsÚ	feat_sizeÚ	mlp_ratioÚqkv_biasÚq_projÚqk_normÚ
latent_lenÚ
latent_dimÚ	pos_embedÚ	pool_typeÚ
norm_layerÚ	act_layerÚdropc                 óà  •— ||dœ}t         ‰| �  «        |xs |}|€|}||z  dk(  sJ ‚|| _        ||z  | _        || _        | j                  dz  | _        || _        t        «       | _        |dk(  r4|€J ‚t        j                  t        j                  ||fi |¤Ž«      | _        nd | _        |xs || _        |s'| j                  |k(  sJ d| j                  › d|› d�«       ‚|
| _        t        j                  t        j                  d| j                  | j                  fi |¤Ž«      | _        |r#t        j"                  | j                  |fd	|i|¤Žnt        j$                  «       | _        t        j"                  ||d
z  fd	|i|¤Ž| _        |	rE|xs t        j*                  } || j                  fi |¤Ž| _         || j                  fi |¤Ž| _        n2t        j$                  «       | _        t        j$                  «       | _        |dkD  r|t        j"                  ||fi |¤Ž| _        t        j2                  |«      | _        |�	 ||fi |¤Žnt        j$                  «       | _        t9        |t;        ||z  «      f||dœ|¤Ž| _        nUt        j$                  «       | _        t        j2                  |«      | _        t        j$                  «       | _        d | _        |}|| _        | jA                  «        y )N©ÚdeviceÚdtyper   ç      à¿Úabszdq_proj=False uses the latent directly as the query; latent_dim must equal embed_dim (got latent_dim=z, embed_dim=z).r   Úbiasé   )r   r   )!ÚsuperÚ__init__r   Úhead_dimr   ÚscaleÚpoolr   r   ÚnnÚ	ParameterÚtorchÚzerosr   r   r   ÚlatentÚLinearÚIdentityÚqÚkvÚ	LayerNormÚq_normÚk_normÚprojÚDropoutÚ	proj_dropÚnormr   ÚintÚmlpr   Úinit_weights)Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r#   ÚddÚqk_norm_layerÚ	__class__s                        €úe/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/attention_pool.pyr)   zAttentionPoolLatent.__init__   s�  ø€ ð* ¨Ñ/ˆÜ‰ÑÔØÒ, ˆ	ØÐØ&ˆLØ˜9Ñ$¨Ò)Ð)Ð)Ø"ˆŒØ! YÑ.ˆŒØ"ˆŒØ—]‘] dÑ*ˆŒ
ØˆŒ	Ü(Ó*ˆŒà˜ÒØÐ(Ð(Ð(ÜŸ\™\¬%¯+©+°iÀÑ*SÐPRÑ*SÓTˆD�Nà!ˆDŒNà$Ò1¨	ˆŒÙà—?‘? iÒ/ð Nð#Ø#'§?¡?Ð"3°<À	¸{È"ðNóNÐ/ð %ˆŒÜ—l‘l¤5§;¡;¨q°$·/±/À4Ç?Á?Ñ#YÐVXÑ#YÓZˆŒñ PV”—‘˜4Ÿ?™?¨IÑK¸HÐKÈÒKÔ[]×[fÑ[fÓ[hˆŒÜ—)‘)˜I y°1¡}ÑJ¸8ÐJÀrÑJˆŒÙØ&Ò6¬"¯,©,ˆMÙ'¨¯©Ñ<¸Ñ<ˆDŒKÙ'¨¯©Ñ<¸Ñ<ˆD�KäŸ+™+›-ˆDŒKÜŸ+™+›-ˆDŒKà˜!ÒÜŸ	™	 )¨\Ñ@¸RÑ@ˆDŒIÜŸZ™Z¨Ó-ˆDŒNØ:DÐ:P™
 <Ñ6°2Ò6ÔVX×VaÑVaÓVcˆDŒIÜ˜<¬¨\¸IÑ-EÓ)FÐ}ÐUaÐmvÑ}Ðz|Ñ}ˆD�HäŸ™›ˆDŒIÜŸZ™Z¨Ó-ˆDŒNÜŸ™›ˆDŒIØˆDŒHØ$ˆLà(ˆÔà×ÑÕó    c                 óÆ   — | j                   �1t        | j                   | j                   j                  d   dz  ¬«       t        | j                  | j                  dz  ¬«       y )Nr   r$   )Ústd)r   r	   Úshaper1   r   )r@   s    rD   r?   z AttentionPoolLatent.init_weightsa   sE   € Ø�>‰>Ð%Ü˜TŸ^™^°·±×1EÑ1EÀaÑ1HÈDÑ1PÕQÜ˜Ÿ™¨$¯/©/¸TÑ*AÖBrE   Ú	attn_maskc                 óÔ  — |j                   \  }}}| j                  �7|| j                  j                  d«      j                  |j                  «      z   }| j
                  j                  |dd«      }| j                  |«      j                  || j                  | j                  | j                  «      j                  dd«      }| j                  |«      j                  ||d| j                  | j                  «      j                  ddddd«      }|j                  d«      \  }	}
| j!                  |«      | j#                  |	«      }	}| j$                  rt'        j(                  ||	|
|¬«      }nG|| j*                  z  }||	j                  dd«      z  }t-        ||«      }|j/                  d¬	«      }||
z  }|j                  dd«      j                  || j                  |«      }| j1                  |«      }| j3                  |«      }| j4                  �#|| j5                  | j7                  |«      «      z   }| j8                  d
k(  r|d d …df   }|S | j8                  dk(  r|j;                  d«      }|S )Nr   éÿÿÿÿr   r'   é   é   )rI   éþÿÿÿ©Údimr   Úavg)rH   r   Ú	unsqueezeÚtor#   r1   Úexpandr4   Úreshaper   r   r*   Ú	transposer5   ÚpermuteÚunbindr7   r8   r   ÚFÚscaled_dot_product_attentionr+   r   Úsoftmaxr9   r;   r>   r<   r,   Úmean)r@   ÚxrI   ÚBÚNÚCÚq_latentr4   r5   ÚkÚvÚattns               rD   ÚforwardzAttentionPoolLatent.forwardf   s  € Ø—'‘'‰ˆˆ1ˆaà�>‰>Ð%à�D—N‘N×,Ñ,¨QÓ/×2Ñ2°1·7±7Ó;Ñ;ˆAà—;‘;×%Ñ% a¨¨RÓ0ˆØ�F‰F�8Ó×$Ñ$ Q¨¯©¸¿¹ÈÏÉÓW×aÑaÐbcÐefÓgˆà�W‰W�Q‹Z×Ñ  1 a¨¯©¸¿¹ÓG×OÑOÐPQÐSTÐVWÐYZÐ\]Ó^ˆØ�y‰y˜‹|‰ˆˆ1à�{‰{˜1‹~˜tŸ{™{¨1›~ˆ1ˆà�?Š?Ü×.Ñ.¨q°!°QÀ)ÔL‰Aà�D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDÜ! $¨	Ó2ˆDØ—<‘< B�<Ó'ˆDØ�q‘ˆAØ�K‰K˜˜1Ó×%Ñ% a¨¯©¸!Ó<ˆØ�I‰I�a‹LˆØ�N‰N˜1Óˆà�8‰8ÐØ�D—H‘H˜TŸY™Y q›\Ó*Ñ*ˆAð �9‰9˜ÒØ’!�Q�$‘ˆAð ˆð �Y‰Y˜%ÒØ—‘�q“	ˆAØˆrE   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   ÚjitÚFinalÚboolÚ__annotations__r-   ÚGELUr=   r   ÚfloatÚstrr   ÚModuler)   r?   ÚTensorre   Ú__classcell__©rC   s   @rD   r   r      sD  ø… ñð —	‘	—‘ Ñ%Ó%ð
 !%Ø!ØØ'+Ø"Ø!ØØ!ØØ"ØØ$Ø48Ø35·7±7ØØØñ'KàðKð ðKð ð	Kð
 ðKð   ‘}ðKð ðKð ðKð ðKð ðKð ðKð ðKð ðKð ðKð !  b§i¡i¡Ñ1ðKð     R§Y¡Y¡Ñ0ð!Kð" õ#KòZCñ
# H¨U¯\©\Ñ$:÷ #rE   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deeej                        fˆ fd	„Zd
ej                   dej                   fd„Zˆ xZS )ÚAttentionPoolPrruF   Patch Representation Refinement (PRR) attention pool.

    From "Locality-Attending Vision Transformer" (ICLR 2026).

    Parameter-free multi-head self-attention that refines all patch representations
    before pooling. No Q/K/V projections â€” input is reshaped directly into multi-head
    format for self-attention.
    r   rP   r   r   Úpre_normÚ	post_normr   c	                 óÂ  •— ||dœ}	t         ‰
| �  «        |dv sJ d|› d�«       ‚||z  dk(  sJ d|› d|› d�«       ‚|€|s|rt        j                  }|| _        ||z  | _        | j
                  d	z  | _        || _        t        «       | _	        || _
        |r	 ||fi |	¤Žnt        j                  «       | _        |r ||fi |	¤Ž| _        y t        j                  «       | _        y )
Nr!   )r   rQ   z)pool_type must be 'token' or 'avg', got 'ú'r   zdim (z") must be divisible by num_heads (ú)r$   )r(   r)   r-   r6   r   r*   r+   r,   r   r   r   r3   rw   rx   )r@   rP   r   r   rw   rx   r   r"   r#   rA   rC   s             €rD   r)   zAttentionPoolPrr.__init__—   sî   ø€ ð ¨Ñ/ˆÜ‰ÑÔØÐ,Ñ,ÐfÐ0YÐZcÐYdÐdeÐ.fÓfÐ,Ø�Y‰ !Ò#Ð` u¨S¨EÐ1SÐT]ÐS^Ð^_Ð%`Ó`Ð#àÐ¡8©yÜŸ™ˆJà"ˆŒØ˜yÑ(ˆŒØ—]‘] dÑ*ˆŒ
ØˆŒ	Ü(Ó*ˆŒØˆÔá19™
 3Ñ-¨"Ò-¼r¿{¹{»}ˆŒÙ2;™ CÑ.¨2Ñ.ˆ�ÄÇÁÃˆ�rE   r]   Úreturnc                 óN  — |j                   \  }}}| j                  |«      }|j                  ||| j                  | j                  «      j                  dd«      }| j                  rt        j                  |||«      }n9|| j                  z  |j                  dd«      z  }|j                  d¬«      }||z  }|j                  dd«      j                  |||«      }| j                  |«      }| j                  dk(  r|d d …df   }|S | j                  dk(  r|j                  d«      }|S )	Nr   r'   rN   rK   rO   r   r   rQ   )rH   rw   rU   r   r*   rV   r   rY   rZ   r+   r[   rx   r,   r\   )r@   r]   r^   r_   r`   Úqkvrd   s          rD   re   zAttentionPoolPrr.forward´   s  € Ø—'‘'‰ˆˆ1ˆaà�M‰M˜!Óˆð �i‰i˜˜1˜dŸn™n¨d¯m©mÓ<×FÑFÀqÈ!ÓLˆØ�?Š?Ü×.Ñ.¨s°C¸Ó=‰Aà˜$Ÿ*™*Ñ$¨¯©°b¸"Ó(=Ñ=ˆDØ—<‘< B�<Ó'ˆDØ�s‘
ˆAØ�K‰K˜˜1Ó×%Ñ% a¨¨AÓ.ˆà�N‰N˜1Óˆð �9‰9˜ÒØ’!�Q�$‘ˆAð ˆð �Y‰Y˜%ÒØ—‘�q“	ˆAàˆrE   )r   r   FFNNN)rf   rg   rh   ri   r/   rj   rk   rl   rm   r=   rp   r   r   r-   rq   r)   rr   re   rs   rt   s   @rD   rv   rv   Œ   s¢   ø… ñð —	‘	—‘ Ñ%Ó%ð
 Ø$Ø"Ø#Ø48ØØñOàðOð ðOð ð	Oð
 ðOð ðOð !  b§i¡i¡Ñ1õOð:˜Ÿ™ð ¨%¯,©,÷ rE   rv   )Útypingr   r   r/   Útorch.nnr-   Útorch.nn.functionalÚ
functionalrY   Ú	attentionr   Úconfigr   r>   r   Úweight_initr	   rq   r   rv   © rE   rD   ú<module>r‡      sC   ðß !ã Ý ß Ð å %Ý "Ý Ý )ô|˜"Ÿ)™)ô |ô~?�r—y‘yõ ?rE   