Ë
    éÓ^jò]  ã            	       ó®  — d Z ddlZddlmZmZmZmZmZ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mZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
l m!Z!m"Z" dgZ# G d„ dejH                  «      Z% G d„ dejH                  «      Z& G d„ dejH                  «      Z' G d„ dejH                  «      Z( G d„ dejH                  «      Z) G d„ dejH                  «      Z* G d„ dejH                  «      Z+ G d„ dejH                  «      Z, G d„ dejH                  «      Z-dee.ej^                  f   dejH                  dee.ej^                  f   fd „Z0d.d!e.d"edee.ef   fd#„Z1 e! e1d$¬%«       e1d$¬%«       e1d$¬%«       e1d$¬%«      d&œ«      Z2d/d'e.d(e3d"ede-fd)„Z4e"d/d(e3d"ede-fd*„«       Z5e"d/d(e3d"ede-fd+„«       Z6e"d/d(e3d"ede-fd,„«       Z7e"d/d(e3d"ede-fd-„«       Z8y)0aj  SwiftFormer
SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications
Code: https://github.com/Amshaker/SwiftFormer
Paper: https://arxiv.org/pdf/2303.15446

@InProceedings{Shaker_2023_ICCV,
    author    = {Shaker, Abdelrahman and Maaz, Muhammad and Rasheed, Hanoona and Khan, Salman and Yang, Ming-Hsuan and Khan, Fahad Shahbaz},
    title     = {SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications},
    booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
    year      = {2023},
}
é    N)ÚAnyÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnion©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚDropPathÚLinearÚ	LayerTypeÚ	to_2tupleÚtrunc_normal_é   )Úbuild_model_with_cfg)Úfeature_take_indices)Úcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚSwiftFormerc                   óf   ‡ — e 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 )	ÚLayerScale2dÚdimÚinit_valuesÚinplacec                 ó¤   •— ||dœ}t         ‰| �  «        || _        t        j                  |t        j                  |ddfi |¤Žz  d¬«      | _        y )N©ÚdeviceÚdtyper   T)Úrequires_grad)ÚsuperÚ__init__r   ÚnnÚ	ParameterÚtorchÚonesÚgamma)Úselfr   r   r   r!   r"   ÚddÚ	__class__s          €úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/swiftformer.pyr%   zLayerScale2d.__init__   sL   ø€ Ø¨Ñ/ˆÜ‰ÑÔØˆŒÜ—\‘\Øœ%Ÿ*™* S¨!¨QÑ5°"Ñ5Ñ5ÀTôKˆ�
ó    ÚxÚreturnc                 ón   — | j                   r|j                  | j                  «      S || j                  z  S ©N)r   Úmul_r*   ©r+   r0   s     r.   ÚforwardzLayerScale2d.forward&   s(   € Ø%)§\¢\ˆq�v‰v�d—j‘jÓ!ÐE°q¸4¿:¹:±~ÐEr/   )çñhãˆµøä>FNN)Ú__name__Ú
__module__Ú__qualname__ÚintÚfloatÚboolr%   r(   ÚTensorr6   Ú__classcell__©r-   s   @r.   r   r      s?   ø„ ñK˜Cð K¨eð KÀTõ KðF˜Ÿ™ð F¨%¯,©,÷ Fr/   r   c                   ó´   ‡ — e Zd ZdZdddddej
                  ddfdeded	ed
ededeej                     fˆ fd„Z	de
j                  de
j                  fd„Zˆ xZS )Ú	Embeddingz 
    Patch Embedding that is implemented by a layer of conv.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H/stride, W/stride]
    é   i   é   r   NÚin_chansÚ	embed_dimÚ
patch_sizeÚstrideÚpaddingÚ
norm_layerc	                 ó   •— ||dœ}	t         ‰
| �  «        t        |«      }t        |«      }t        |«      }t        j                  |||||fi |	¤Ž| _        |r ||fi |	¤Ž| _        y t        j                  «       | _        y )Nr    )r$   r%   r   r&   ÚConv2dÚprojÚIdentityÚnorm)r+   rE   rF   rG   rH   rI   rJ   r!   r"   r,   r-   s             €r.   r%   zEmbedding.__init__0   su   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ˜zÓ*ˆ
Ü˜6Ó"ˆÜ˜GÓ$ˆÜ—I‘I˜h¨	°:¸vÀwÑUÐRTÑUˆŒ	Ù3=‘J˜yÑ/¨BÑ/ˆ�	Ä2Ç;Á;Ã=ˆ�	r/   r0   r1   c                 óJ   — | j                  |«      }| j                  |«      }|S r3   )rM   rO   r5   s     r.   r6   zEmbedding.forwardC   s!   € Ø�I‰I�a‹LˆØ�I‰I�a‹LˆØˆr/   )r8   r9   r:   Ú__doc__r&   ÚBatchNorm2dr;   r	   ÚModuler%   r(   r>   r6   r?   r@   s   @r.   rB   rB   *   s�   ø„ ñð Ø Ø ØØØ*,¯.©.ØØñQàðQð ðQð ð	Qð
 ðQð ðQð ˜RŸY™Y™õQð&˜Ÿ™ð ¨%¯,©,÷ r/   rB   c                   óæ   ‡ — e Zd ZdZdddej
                  ej                  dddfdeded	ed
ede	ej                     de	ej                     defˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚConvEncoderz›
    Implementation of ConvEncoder with 3*3 and 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    Output: tensor with shape [B, C, H, W]
    é@   rC   ç        TNr   Ú
hidden_dimÚkernel_sizeÚ	drop_pathÚ	act_layerrJ   Úuse_layer_scalec
                 óÈ  •— ||	dœ}
t         ‰| �  «        t        j                  |||f|dz  |dœ|
¤Ž| _         ||fi |
¤Ž| _        t        j                  ||dfi |
¤Ž| _         |«       | _        t        j                  ||dfi |
¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |rt        |dfi |
¤Ž| _        y t        j                  «       | _        y )Nr    é   ©rI   Úgroupsr   rW   ©r$   r%   r&   rL   ÚdwconvrO   Úpwconv1ÚactÚpwconv2r   rN   rZ   r   Úlayer_scale)r+   r   rX   rY   rZ   r[   rJ   r\   r!   r"   r,   r-   s              €r.   r%   zConvEncoder.__init__O   sÊ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—i‘i  S¨+Ðb¸{ÈaÑ?OÐX[ÑbÐ_aÑbˆŒÙ˜sÑ) bÑ)ˆŒ	Ü—y‘y  j°!Ñ:°rÑ:ˆŒÙ“;ˆŒÜ—y‘y ¨S°!Ñ:°rÑ:ˆŒØ09¸B²œ )Ô,ÄBÇKÁKÃMˆŒÙ9Hœ<¨¨QÑ5°"Ñ5ˆÕÌbÏkÉkËmˆÕr/   r0   r1   c                 óþ   — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|| j                  |«      z   }|S r3   ©rb   rO   rc   rd   re   rf   rZ   )r+   r0   Úinputs      r.   r6   zConvEncoder.forwarde   sp   € ØˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�H‰H�Q‹KˆØ�L‰L˜‹OˆØ×Ñ˜QÓˆØ�D—N‘N 1Ó%Ñ%ˆØˆr/   ©r8   r9   r:   rQ   r&   ÚGELUrR   r;   r<   r	   rS   r=   r%   r(   r>   r6   r?   r@   s   @r.   rU   rU   I   s¦   ø„ ñð !Ø Ø!Ø)+¯©Ø*,¯.©.Ø$(ØØñ\àð\ð ð\ð ð	\ð
 ð\ð ˜BŸI™I‘ð\ð ˜RŸY™Y™ð\ð "õ\ð,	˜Ÿ™ð 	¨%¯,©,÷ 	r/   rU   c                   óì   ‡ — e Zd ZdZddej
                  ej                  dddfdedee   dee   de	ej                     de	ej                     d	efˆ fd
„Zdej                  dej                  fd„Zˆ xZS )ÚMlpz‘
    Implementation of MLP layer with 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    Output: tensor with shape [B, C, H, W]
    NrW   Úin_featuresÚhidden_featuresÚout_featuresr[   rJ   Údropc	                 ó   •— ||dœ}	t         ‰
| �  «        |xs |}|xs |} ||fi |	¤Ž| _        t        j                  ||dfi |	¤Ž| _         |«       | _        t        j                  ||dfi |	¤Ž| _        t        j                  |«      | _	        y )Nr    r   )
r$   r%   Únorm1r&   rL   Úfc1rd   Úfc2ÚDropoutrq   )r+   rn   ro   rp   r[   rJ   rq   r!   r"   r,   r-   s             €r.   r%   zMlp.__init__w   sŠ   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ#Ò2 {ˆØ)Ò8¨[ˆÙ Ñ2¨rÑ2ˆŒ
Ü—9‘9˜[¨/¸1ÑCÀÑCˆŒÙ“;ˆŒÜ—9‘9˜_¨l¸AÑDÀÑDˆŒÜ—J‘J˜tÓ$ˆ�	r/   r0   r1   c                 óÒ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|S r3   )rs   rt   rd   rq   ru   r5   s     r.   r6   zMlp.forwardŒ   sU   € Ø�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØˆr/   )r8   r9   r:   rQ   r&   rk   rR   r;   r   r	   rS   r<   r%   r(   r>   r6   r?   r@   s   @r.   rm   rm   q   s™   ø„ ñð .2Ø*.Ø)+¯©Ø*,¯.©.ØØØñ%àð%ð & c™]ð%ð # 3™-ð	%ð
 ˜BŸI™I‘ð%ð ˜RŸY™Y™ð%ð õ%ð*˜Ÿ™ð ¨%¯,©,÷ r/   rm   c                   ó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 )
ÚEfficientAdditiveAttentionz�
    Efficient Additive Attention module for SwiftFormer.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    Úin_dimsÚ	token_dimÚ	num_headsc                 ó¢  •— ||dœ}t         ‰| �  «        |dz  | _        t        j                  |||z  fi |¤Ž| _        t        j                  |||z  fi |¤Ž| _        t        j                  t        j                  ||z  dfi |¤Ž«      | _
        t        j                  ||z  ||z  fi |¤Ž| _        t        j                  ||z  |fi |¤Ž| _        y )Nr    g      à¿r   )r$   r%   Úscale_factorr&   r   Úto_queryÚto_keyr'   r(   ÚrandnÚw_grM   Úfinal)r+   rz   r{   r|   r!   r"   r,   r-   s          €r.   r%   z#EfficientAdditiveAttention.__init__œ   sÁ   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ%¨Ñ-ˆÔÜŸ	™	 '¨9°yÑ+@ÑGÀBÑGˆŒÜ—i‘i ¨°YÑ)>ÑEÀ"ÑEˆŒä—<‘<¤§¡¨I¸	Ñ,AÀ1Ñ KÈÑ KÓLˆŒä—I‘I˜i¨)Ñ3°YÀÑ5JÑQÈbÑQˆŒ	Ü—Y‘Y˜y¨9Ñ4°iÑFÀ2ÑFˆ�
r/   r0   r1   c                 ó2  — |j                   \  }}}}|j                  d«      j                  ddd«      }t        j                  | j                  |«      d¬«      }t        j                  | j                  |«      d¬«      }t        j                  || j                  z  | j                  z  d¬«      }t        j                  ||z  dd¬«      }| j                  ||z  «      |z   }	| j                  |	«      j                  ddd«      j                  |d||«      }	|	S )Nr^   r   r   éÿÿÿÿ©r   T)r   Úkeepdim)ÚshapeÚflattenÚpermuteÚFÚ	normalizer   r€   r‚   r~   r(   ÚsumrM   rƒ   Úreshape)
r+   r0   ÚBÚ_ÚHÚWÚqueryÚkeyÚattnÚouts
             r.   r6   z"EfficientAdditiveAttention.forward¯   sã   € Ø—W‘W‰
ˆˆ1ˆa�Ø�I‰I�a‹L× Ñ   A qÓ)ˆä—‘˜DŸM™M¨!Ó,°"Ô5ˆÜ�k‰k˜$Ÿ+™+ a›.¨bÔ1ˆä�{‰{˜5 4§8¡8Ñ+¨d×.?Ñ.?Ñ?ÀQÔGˆÜ�y‰y˜ ™¨1°dÔ;ˆà�i‰i˜˜s™
Ó# eÑ+ˆØ�j‰j˜‹o×%Ñ% a¨¨AÓ.×6Ñ6°q¸"¸aÀÓCˆØˆ
r/   )é   é   r   NN)
r8   r9   r:   rQ   r;   r%   r(   r>   r6   r?   r@   s   @r.   ry   ry   –   sY   ø„ ñð Ø ØØØñGàðGð ðGð õ	Gð&˜Ÿ™ð ¨%¯,©,÷ r/   ry   c                   óà   ‡ — e Zd ZdZdddej
                  ej                  ddfdededed	e	d
e
ej                     de
ej                     fˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚLocalRepresentationzÉ
    Local Representation module for SwiftFormer that is implemented by 3*3 depth-wise and point-wise convolutions.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    rC   rW   TNr   rY   rZ   r\   r[   rJ   c	                 óÌ  •— ||dœ}	t         ‰
| �  «        t        j                  |||f|dz  |dœ|	¤Ž| _         ||fi |	¤Ž| _        t        j                  ||fddi|	¤Ž| _         |«       | _        t        j                  ||fddi|	¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |rt        |dfi |	¤Ž| _        y t        j                  «       | _        y )Nr    r^   r_   rY   r   rW   ra   )r+   r   rY   rZ   r\   r[   rJ   r!   r"   r,   r-   s             €r.   r%   zLocalRepresentation.__init__Ä   sÐ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—i‘i  S¨+Ðb¸{ÈaÑ?OÐX[ÑbÐ_aÑbˆŒÙ˜sÑ) bÑ)ˆŒ	Ü—y‘y  cÑ?°qÐ?¸BÑ?ˆŒÙ“;ˆŒÜ—y‘y  cÑ?°qÐ?¸BÑ?ˆŒØ09¸B²œ )Ô,ÄBÇKÁKÃMˆŒÙ9Hœ<¨¨QÑ5°"Ñ5ˆÕÌbÏkÉkËmˆÕr/   r0   r1   c                 óþ   — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|| j                  |«      z   }|S r3   rh   )r+   r0   Úskips      r.   r6   zLocalRepresentation.forwardÙ   sp   € ØˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�H‰H�Q‹KˆØ�L‰L˜‹OˆØ×Ñ˜QÓˆØ�4—>‘> !Ó$Ñ$ˆØˆr/   )r8   r9   r:   rQ   r&   rk   rR   r;   r<   r=   r	   rS   r%   r(   r>   r6   r?   r@   s   @r.   rš   rš   ¾   s˜   ø„ ñð  !Ø!Ø$(Ø)+¯©Ø*,¯.©.ØØñ\àð\ð ð\ð ð	\ð
 "ð\ð ˜BŸI™I‘ð\ð ˜RŸY™Y™õ\ð*	˜Ÿ™ð 	¨%¯,©,÷ 	r/   rš   c                   óì   ‡ — e Zd ZdZdddej
                  ej                  ddddf	deded	ed
ede	ej                     de	ej                     dedefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚBlockzî
    SwiftFormer Encoder Block for SwiftFormer. It consists of :
    (1) Local representation module, (2) EfficientAdditiveAttention, and (3) MLP block.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    ç      @rW   Tr7   Nr   Ú	mlp_ratioÚ	drop_raterZ   r[   rJ   r\   Úlayer_scale_init_valuec           	      ó¾  •— |	|
dœ}t         ‰| �  «        t        d||||dœ|¤Ž| _        t	        d||dœ|¤Ž| _        t        d|t        ||z  «      |||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |rt        ||fi |¤Žnt        j                  «       | _        |rt        ||fi |¤Ž| _        y t        j                  «       | _        y )Nr    )r   r\   r[   rJ   )rz   r{   )rn   ro   r[   rJ   rq   rW   © )r$   r%   rš   Úlocal_representationry   r•   rm   r;   Úlinearr   r&   rN   rZ   r   Úlayer_scale_1Úlayer_scale_2)r+   r   r¡   r¢   rZ   r[   rJ   r\   r£   r!   r"   r,   r-   s               €r.   r%   zBlock.__init__ì   sü   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ$7ð %
ØØ+ØØ!ñ	%
ð
 ñ%
ˆÔ!ô /ÐP°sÀcÑPÈRÑPˆŒ	Üð 
ØÜ  i¡Ó0ØØ!Øñ
ð ñ
ˆŒð 1:¸B²œ )Ô,ÄBÇKÁKÃMˆŒáô *¨#Ð/EÑLÈÒLÜ$&§K¡K£Mð 	Ôñ ô *¨#Ð/EÑLÈÑLˆÕÜ$&§K¡K£Mð 	Õr/   r0   r1   c                 óð   — | j                  |«      }|| j                  | j                  | j                  |«      «      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }|S r3   )r¦   rZ   r¨   r•   r©   r§   r5   s     r.   r6   zBlock.forward  sc   € Ø×%Ñ% aÓ(ˆØ�—‘˜t×1Ñ1°$·)±)¸A³,Ó?Ó@Ñ@ˆØ�—‘˜t×1Ñ1°$·+±+¸a³.ÓAÓBÑBˆØˆr/   rj   r@   s   @r.   rŸ   rŸ   å   s¬   ø„ ñð  "Ø!Ø!Ø)+¯©Ø*,¯.©.Ø$(Ø,0ØØñ#2àð#2ð ð#2ð ð	#2ð
 ð#2ð ˜BŸI™I‘ð#2ð ˜RŸY™Y™ð#2ð "ð#2ð %*õ#2ðJ˜Ÿ™ð ¨%¯,©,÷ r/   rŸ   c                   ó   ‡ — e Zd ZdZdej
                  ej                  dddddddf
deded	ee   d
e	de
ej                     de
ej                     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 )ÚStagezö
    Implementation of each SwiftFormer stages. Here, SwiftFormerEncoder used as the last block in all stages, while ConvEncoder used in the rest of the blocks.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    r    rW   Tr7   Nr   ÚindexÚlayersr¡   r[   rJ   r¢   Údrop_path_rater\   r£   Ú
downsamplec                 óÌ  •— ||dœ}t         ‰| �  «        d| _        |�|nt        j                  «       | _        g }t        ||   «      D ]‚  }||t        |d | «      z   z  t        |«      dz
  z  }||   |z
  dk  r$|j                  t        |f||||||	|
dœ|¤Ž«       ŒU|j                  t        d|t        ||z  «      d||||	dœ|¤Ž«       Œ„ t        j                  |Ž | _        y )Nr    Fr   )r¡   r¢   rZ   r[   rJ   r\   r£   rC   )r   rX   rY   rZ   r[   rJ   r\   r¥   )r$   r%   Úgrad_checkpointingr&   rN   r°   Úranger�   ÚappendrŸ   rU   r;   Ú
SequentialÚblocks)r+   r   r­   r®   r¡   r[   rJ   r¢   r¯   r\   r£   r°   r!   r"   r,   r¶   Ú	block_idxÚ	block_dprr-   s                     €r.   r%   zStage.__init__  s  ø€ ð  ¨Ñ/ˆÜ‰ÑÔØ"'ˆÔØ(2Ð(>™*ÄBÇKÁKÃMˆŒàˆÜ˜v e™}Ó-ò 	ˆIØ&¨)´c¸&ÀÀ%¸.Ó6IÑ*IÑJÌcÐRXËkÐ\]ÉoÑ^ˆIØ�e‰}˜yÑ(¨AÒ-Ø—‘œeØð
à'Ø'Ø'Ø'Ø)Ø$3Ø+Añ
ð ñ
õ 
ð —‘œkð 	ØÜ" 9¨s¡?Ó3Ø !Ø'Ø'Ø)Ø$3ñ	ð ñ	õ 	ð	ô2 —m‘m VÐ,ˆ�r/   r0   r1   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S r3   )r°   r²   r(   ÚjitÚis_scriptingr   r¶   r5   s     r.   r6   zStage.forwardO  sS   € Ø�O‰O˜AÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr/   )r8   r9   r:   rQ   r&   rk   rR   r;   r   r<   r	   rS   r=   r   r%   r(   r>   r6   r?   r@   s   @r.   r¬   r¬     sÞ   ø„ ñð  "Ø)+¯©Ø*,¯.©.Ø!Ø$&Ø$(Ø,0Ø48ØØñ/-àð/-ð ð/-ð ˜‘Ið	/-ð
 ð/-ð ˜BŸI™I‘ð/-ð ˜RŸY™Y™ð/-ð ð/-ð "ð/-ð "ð/-ð %*ð/-ð !  b§i¡i¡Ñ1õ/-ðb˜Ÿ™ð ¨%¯,©,÷ r/   r¬   c            !       óÌ  ‡ — e Zd Zg d¢g d¢dg d¢ej                  ddddd	d	d
ddddddfdee   dee   dedee   deej                     dedededede
de
dede
dededef ˆ fd„Zd „ Zej                  j                   d!efd"„«       Zej                  j                   d8d#ed!eeef   fd$„«       Zej                  j                   d9d%efd&„«       Zej                  j                   d!eej                  ej                  f   fd'„«       Zd:dedee   fd(„Zej                  j                   d9d%efd)„«       Z	 	 	 	 	 d;d*ej8                  d+eeeee   f      d,ed-ed.ed/ed!eeej8                     eej8                  eej8                     f   f   fd0„Z	 	 	 d<d+eeee   f   d1ed2efd3„Zd*ej8                  d!ej8                  fd4„Z d8d*ej8                  d5efd6„Z!d*ej8                  fd7„Z"ˆ xZ#S )=r   ©rC   rC   é   é   ©é0   é8   ép   éÜ   r¿   )FTTTrC   r^   r   éè  rW   Tr7   Úavgé    Nr®   Ú
embed_dimsÚ
mlp_ratiosÚdownsamplesr[   Údown_patch_sizeÚdown_strideÚdown_padÚnum_classesr¢   r¯   r\   r£   Úglobal_poolÚoutput_striderE   c                 óÄ  •— t         ‰| �  «        ||dœ}|dk(  sJ ‚|	| _        || _        || _        g | _        t        j                  t        j                  ||d   dz  dddfi |¤Žt        j                  |d   dz  fi |¤Žt        j                  «       t        j                  |d   dz  |d   dddfi |¤Žt        j                  |d   fi |¤Žt        j                  «       «      | _        |d   }g }t        t        |«      «      D ]Œ  }||   rt        d|||   |||dœ|¤Žnt        j                  «       }t!        d||   |||||
||||dœ
|¤Ž}||   }|j#                  |«       | xj
                  t%        ||   d|dz   z  d	|› �¬
«      gz  c_        ŒŽ t        j                  |Ž | _        |d   x| _        x| _        }t        j                  |fi |¤Ž| _        t        j.                  |
«      | _        |	dkD  rt3        ||	fi |¤Žnt        j                  «       | _        |	dkD  rt3        ||	fi |¤Žnt        j                  «       | _        d| _        | j;                  «        y )Nr    rÇ   r   r^   rC   r   )rE   rF   rG   rH   rI   )
r   r­   r®   r¡   r[   r¢   r¯   r\   r£   r°   ústages.)Únum_chsÚ	reductionÚmoduler…   Fr¥   )r$   r%   rÎ   rE   rÏ   Úfeature_infor&   rµ   rL   rR   ÚReLUÚstemr³   ÚlenrB   rN   r¬   r´   ÚdictÚstagesÚnum_featuresÚhead_hidden_sizerO   rv   Ú	head_dropr   ÚheadÚ	head_distÚdistilled_trainingÚ_initialize_weights)r+   r®   rÈ   rÉ   rÊ   r[   rË   rÌ   rÍ   rÎ   r¢   r¯   r\   r£   rÏ   rÐ   rE   r!   r"   Úkwargsr,   Úprev_dimrÛ   Úir°   ÚstageÚout_chsr-   s                              €r.   r%   zSwiftFormer.__init__Y  s„  ø€ ô, 	‰ÑÔØ¨Ñ/ˆØ Ò"Ð"Ð"Ø&ˆÔØ ˆŒØ&ˆÔØˆÔä—M‘MÜ�I‰I�h 
¨1¡°Ñ 2°A°q¸!ÑB¸rÑBÜ�N‰N˜: a™=¨AÑ-Ñ4°Ñ4Ü�G‰G‹IÜ�I‰I�j ‘m qÑ(¨*°Q©-¸¸A¸qÑGÀBÑGÜ�N‰N˜: a™=Ñ/¨BÑ/Ü�G‰G‹Ió
ˆŒ	ð ˜a‘=ˆàˆÜ”s˜6“{Ó#ò 	iˆAð ˜Q’ô #ð Ø!Ø$ Q™-Ø*Ø"Ø ñð òô &(§[¡[£]ð ô ð Ø˜q‘MØØØ$Ø#Ø#Ø-Ø /Ø'=Ø%ñð ñˆEð " !‘}ˆHØ�M‰M˜%Ô Ø×Ò¤$¨z¸!©}ÈÈAÈaÉCÉÐ[bÐcdÐbeÐYfÔ"gÐ!hÑhÖð1	iô2 —m‘m VÐ,ˆŒð @JÈ"¹~ÐMˆÔÐM˜TÔ2°WÜ—N‘N 7Ñ1¨bÑ1ˆŒ	ÜŸ™ IÓ.ˆŒØ:EÈº/”F˜7 KÑ6°2Ò6ÌrÏ{É{Ë}ˆŒ	à?JÈQºœ ¨Ñ;¸Ò;ÔTV×T_ÑT_ÓTaˆŒØ"'ˆÔØ× Ñ Õ"r/   c                 óØ  — | j                  «       D ]×  \  }}t        |t        j                  «      rOt	        |j
                  d¬«       |j                  €ŒDt        j                  j                  |j                  d«       Œot        |t        j                  «      sŒŠt	        |j
                  d¬«       |j                  €Œ®t        j                  j                  |j                  d«       ŒÙ y )Ng{®Gáz”?)Ústdr   )
Únamed_modulesÚ
isinstancer&   r   r   ÚweightÚbiasÚinitÚ	constant_rL   )r+   ÚnameÚms      r.   râ   zSwiftFormer._initialize_weights§  sš   € Ø×)Ñ)Ó+ò 	1‰GˆD�!Ü˜!œRŸY™YÔ'Ü˜aŸh™h¨CÕ0Ø—6‘6Ñ%Ü—G‘G×%Ñ% a§f¡f¨aÕ0Ü˜AœrŸy™yÕ)Ü˜aŸh™h¨CÕ0Ø—6‘6Ñ%Ü—G‘G×%Ñ% a§f¡f¨aÕ0ñ	1r/   r1   c                 ó   — t        «       S r3   )Úset©r+   s    r.   Úno_weight_decayzSwiftFormer.no_weight_decay²  s	   € ä‹uˆr/   Úcoarsec                 ó,   — t        d|rdng d¢¬«      }|S )Nz^stemz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)iŸ† )rØ   r¶   )rÚ   )r+   rö   Úmatchers      r.   Úgroup_matcherzSwiftFormer.group_matcher¶  s!   € äØÙ(.Ñ$ò 5ô
ˆð ˆr/   Úenablec                 ó4   — | j                   D ]	  }||_        Œ y r3   )rÛ   r²   )r+   rú   Úss      r.   Úset_grad_checkpointingz"SwiftFormer.set_grad_checkpointingÂ  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r/   c                 ó2   — | j                   | j                  fS r3   ©rß   rà   rô   s    r.   Úget_classifierzSwiftFormer.get_classifierÇ  s   € à�y‰y˜$Ÿ.™.Ð(Ð(r/   c                 ó¼  — || _         |�|| _        | j                  j                  j                  t        | j                  d«      r | j                  j                  j                  nd}}|dkD  rt        | j                  |||¬«      nt        j                  «       | _        |dkD  rt        | j                  |||¬«      | _        y t        j                  «       | _        y )Nrì   )NNr   r    )rÎ   rÏ   rß   rì   r!   Úhasattrr"   r   rÜ   r&   rN   rà   )r+   rÎ   rÏ   r!   r"   s        r.   Úreset_classifierzSwiftFormer.reset_classifierË  s·   € Ø&ˆÔØÐ"Ø*ˆDÔØŸ	™	×(Ñ(×/Ñ/Ì7ÐSW×S\ÑS\Ð^fÔKg°·±×1AÑ1A×1GÒ1GÐmy�ˆØZeÐhiÒZi”F˜4×,Ñ,¨kÀ&ÐPUÕVÔoq×ozÑozÓo|ˆŒ	Ø_jÐmnÒ_nœ × 1Ñ 1°;ÀvÐUZÔ[ˆ�Ôtv×tÑtó  uBˆ�r/   c                 ó   — || _         y r3   )rá   )r+   rú   s     r.   Úset_distilled_trainingz"SwiftFormer.set_distilled_trainingÓ  s
   € à"(ˆÕr/   r0   ÚindicesrO   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc                 ó  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	t        | j                  «      dz
  }
| j                  |«      }t        j
                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]>  \  }} ||«      }||v sŒ|r||
k(  r| j                  |«      }n|}|j                  |«       Œ@ |r|S |
k(  r| j                  |«      }||fS )aï   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )ÚNCHWzOutput shape must be NCHW.r   N)
r   rÙ   rÛ   rØ   r(   rº   r»   Ú	enumeraterO   r´   )r+   r0   r  rO   r  r  r	  ÚintermediatesÚtake_indicesÚ	max_indexÚlast_idxrÛ   Úfeat_idxræ   Úx_inters                  r.   Úforward_intermediatesz!SwiftFormer.forward_intermediates×  s  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iÜ�t—{‘{Ó# aÑ'ˆð �I‰I�a‹LˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	.‰OˆH�eÙ�a“ˆAØ˜<Ò'Ù˜H¨Ò0Ø"Ÿi™i¨›l‘Gà�GØ×$Ñ$ WÕ-ð	.ñ Ø Ð à�xÒØ—	‘	˜!“ˆAà�-ÐÐr/   Ú
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   Ú )r   rÙ   rÛ   r&   rN   rO   r  )r+   r  r  r  r  r  s         r.   Úprune_intermediate_layersz%SwiftFormer.prune_intermediate_layers	  s]   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐr/   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r3   )rØ   rÛ   rO   r5   s     r.   Úforward_featureszSwiftFormer.forward_features  s.   € Ø�I‰I�a‹LˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØˆr/   Ú
pre_logitsc                 ó6  — | j                   dk(  r|j                  d¬«      }| j                  |«      }|r|S | j                  |«      | j	                  |«      }}| j
                  r.| j                  r"t        j                  j                  «       s||fS ||z   dz  S )NrÆ   )r^   rC   r†   r^   )
rÏ   ÚmeanrÞ   rß   rà   rá   Útrainingr(   rº   r»   )r+   r0   r  Úx_dists       r.   Úforward_headzSwiftFormer.forward_head  s‰   € Ø×Ñ˜uÒ$Ø—‘˜6�Ó"ˆAØ�N‰N˜1ÓˆÙØˆHØ—I‘I˜a“L $§.¡.°Ó"3ˆ6ˆØ×"Ò" t§}¢}¼U¿Y¹Y×=SÑ=SÔ=Uà�f�9Ðð ˜‘J !Ñ#Ð#r/   c                 óJ   — | j                  |«      }| j                  |«      }|S r3   )r  r   r5   s     r.   r6   zSwiftFormer.forward-  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr/   ©F)Tr3   )NFFr  F)r   FT)$r8   r9   r:   r&   rk   r   r;   r=   r	   rS   r<   Ústrr%   râ   r(   rº   Úignorer   rõ   r   r   rù   rý   r   r   r   r  r  r>   r
   r  r  r  r   r6   r?   r@   s   @r.   r   r   X  s  ø„ ò !-Ú$6ØÚ&?Ø)+¯©Ø#$Ø ØØ#Ø!Ø$&Ø$(Ø,0Ø$Ø!#ØØØñ'L#à˜‘IðL#ð ˜S™	ðL#ð ð	L#ð
 ˜d™ðL#ð ˜BŸI™I‘ðL#ð !ðL#ð ðL#ð ðL#ð ðL#ð ðL#ð "ðL#ð "ðL#ð %*ðL#ð ðL#ð  ð!L#ð" õ#L#ò\	1ð ‡Y�Y×Ñð ò ó ðð ‡Y�Y×Ññ	 Dð 	°T¸#¸s¸(±^ò 	ó ð	ð ‡Y�Y×Ññ*¨Tò *ó ð*ð ‡Y�Y×Ñð)  b§i¡i°·±Ð&:Ñ ;ò )ó ð)ñB¨Cð B¸hÀs¹mó Bð ‡Y�Y×Ññ)¨Tò )ó ð)ð 8<ØØ$Ø$Ø',ñ0 à�|‰|ð0 ð ˜e C¨¨c© NÑ3Ñ4ð0 ð ð	0 ð
 ð0 ð ð0 ð !%ð0 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó0 ðh ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ð  %§,¡,ð °5·<±<ó ñ$˜eŸl™lð $¸ó $ð˜Ÿ™÷ r/   Ú
state_dictÚmodelr1   c                 ó  — | j                  d| «      } d| v r| S i }| j                  «       D ]ß  \  }}|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  d	d
«      }|j                  dd«      }t        j                  dd|«      }t        j
                  d|«      }|rLt        |j                  d«      «      |j                  d«      }}|dz  }|dz  dk(  r	d|› d|› �}nd|dz   › d|› �}|||<   Œá |S )Nr&  zstem.0.weightzpatch_embed.zstem.z
dist_head.z
head_dist.z
attn.Proj.z
attn.proj.z.layer_scale_1z.layer_scale_1.gammaz.layer_scale_2z.layer_scale_2.gammaz\.layer_scale(?=$|\.)z.layer_scale.gammaz^network\.(\d+)\.(.*)r   r^   r   rÒ   z.blocks.z.downsample.)ÚgetÚitemsÚreplaceÚreÚsubÚmatchr;   Úgroup)	r%  r&  Úout_dictÚkÚvrñ   Ún_idxÚrestÚ	stage_idxs	            r.   Úcheckpoint_filter_fnr5  3  s&  € Ø—‘ ¨Ó4€JØ˜*Ñ$ØÐà€HØ× Ñ Ó"ò ‰ˆˆ1Ø�I‰I�n gÓ.ˆØ�I‰I�l LÓ1ˆØ�I‰I�l LÓ1ˆØ�I‰IÐ&Ð(>Ó?ˆØ�I‰IÐ&Ð(>Ó?ˆÜ�F‰FÐ+Ð-AÀ1ÓEˆÜ�H‰HÐ-¨qÓ1ˆÙÜ˜aŸg™g a›j›/¨1¯7©7°1«:�4ˆEØ ™
ˆIØ�q‰y˜AŠ~Ø˜i˜[¨°°Ð7‘à˜i¨™k˜]¨,°t°fÐ=�àˆ�Šð!ð" €Or/   Úurlrã   c                 ó:   — | ddd dddt         t        dddd	d
ddœ|¥S )NrÅ   )rC   éà   r8  Tgffffffî?Úbicubiczstem.0rÿ   z
apache-2.0zarXiv:2303.15446zdSwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applicationsz'https://github.com/Amshaker/SwiftFormer)r6  rÎ   Ú
input_sizeÚ	pool_sizeÚfixed_input_sizeÚcrop_pctÚinterpolationr  ré   Ú
first_convÚ
classifierÚlicenseÚ	paper_idsÚ
paper_nameÚ
origin_urlr   )r6  rã   s     r.   Ú_cfgrE  M  s@   € àØ¨=ÀtÐaeØ¨)Ü%Ô.BØÐ.CØØ'Ø|Ø?ñð ðð r/   ztimm/)Ú	hf_hub_id)zswiftformer_xs.dist_in1kzswiftformer_s.dist_in1kzswiftformer_l1.dist_in1kzswiftformer_l3.dist_in1kÚvariantÚ
pretrainedc                 óN   — t        t        | |ft        t        dd¬«      dœ|¤Ž}|S )N)r   r   r^   rC   T)Úout_indicesÚflatten_sequential)Úpretrained_filter_fnÚfeature_cfg)r   r   r5  rÚ   )rG  rH  rã   r&  s       r.   Ú_create_swiftformerrN  l  s6   € Ü Ü�W˜jðä1Ü \ÀdÔKñð ñ	€Eð €Lr/   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )Nr½   rÀ   ©r®   rÈ   rH  )Úswiftformer_xs©rÚ   rN  ©rH  rã   Ú
model_argss      r.   rQ  rQ  v  s-   € äš\Ò6HÔI€JÜÑe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer/   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )N)rC   rC   é	   r¾   )rÁ   rV   é¨   r8  rP  rH  )Úswiftformer_srR  rS  s      r.   rX  rX  |  s-   € äš\Ò6HÔI€JÜÑd¸:ÐdÌÈjÑIcÐ\bÑIcÑdÐdr/   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )N)r¿   rC   é
   é   )rÁ   é`   éÀ   i€  rP  rH  )Úswiftformer_l1rR  rS  s      r.   r^  r^  �  s-   € äš]Ò7IÔJ€JÜÑe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer/   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )N)r¿   r¿   é   r¾   )rV   é€   i@  r—   rP  rH  )Úswiftformer_l3rR  rS  s      r.   rb  rb  ‡  s-   € äš]Ò7JÔK€JÜÑe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer/   )r  r"  )9rQ   r+  Útypingr   r   r   r   r   r   r	   r
   r(   Útorch.nnr&   Útorch.nn.functionalÚ
functionalr‹   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r   Ú__all__rS   r   rB   rU   rm   ry   rš   rŸ   r¬   r   r#  r>   r5  rE  Údefault_cfgsr=   rN  rQ  rX  r^  rb  r¥   r/   r.   ú<module>ro     sY  ðñó 
ß E× EÓ Eã Ý ß Ð ç Aß MÕ MÝ *Ý +Ý 'ß <àˆ/€ô	F�2—9‘9ô 	Fô�—	‘	ô ô>%�"—)‘)ô %ôP"ˆ"�)‰)ô "ôJ% §¡ô %ôP$˜"Ÿ)™)ô $ôN0ˆB�I‰Iô 0ôf=ˆB�I‰Iô =ô@X�"—)‘)ô Xðv T¨#¨u¯|©|Ð*;Ñ%<ð ÀRÇYÁYð ÐSWÐX[Ð]b×]iÑ]iÐXiÑSjó ñ4ˆcð  #ð ¨$¨s°C¨x©.ó ñ %Ù $Øô!ñ  $Øô ñ !%Øô!ñ !%Øô!ñ&ó €ñ  ð °$ð È#ð ÐR]ó ð ñf˜tð f°sð f¸{ò fó ðfð
 ñe˜dð e°cð e¸kò eó ðeð ñf˜tð f°sð f¸{ò fó ðfð
 ñf˜tð f°sð f¸{ò fó ñfr/   