
    RЦi7\                        S r SSKJrJrJrJrJrJr  SSKrSSK	J
r
  SSKJrJr  SSKJrJrJrJrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  S/r SSSS.r!SSSS.r" " S S\R                  RF                  5      r$ " S S\
RJ                  5      r& " S S\
RF                  5      r' " S S\
RF                  5      r( " S S\
RF                  5      r) " S S\
RF                  5      r* " S S \
RF                  5      r+ " S! S"\
RF                  5      r, " S# S$\
RF                  5      r- " S% S\
RF                  5      r.S& r/S0S' jr0\" \0" S(S)9\0" S(S)9\0" S(S)9S*.5      r1S1S+ jr2\S1S,\.4S- jj5       r3\S1S,\.4S. jj5       r4\S1S,\.4S/ jj5       r5g)2a  EfficientFormer

@article{li2022efficientformer,
  title={EfficientFormer: Vision Transformers at MobileNet Speed},
  author={Li, Yanyu and Yuan, Geng and Wen, Yang and Hu, Eric and Evangelidis, Georgios and Tulyakov,
   Sergey and Wang, Yanzhi and Ren, Jian},
  journal={arXiv preprint arXiv:2206.01191},
  year={2022}
}

Based on Apache 2.0 licensed code at https://github.com/snap-research/EfficientFormer, Copyright (c) 2022 Snap Inc.

Modifications and timm support by / Copyright 2022, Ross Wightman
    )DictListOptionalTupleTypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPath
LayerScaleLayerScale2dMlpcalculate_drop_path_ratestrunc_normal_	to_2tuplendgrid   )build_model_with_cfg)feature_take_indices)checkpoint_seq)generate_default_cfgsregister_modelEfficientFormer0   `      i  )@      i@  i   )r        i   )l1l3l7            )r*   r*      r)   )r)   r)         c                      ^  \ rS rSr% \\\R                  4   \S'          SS\	S\	S\	S\
S\	4
U 4S jjjr\R                  " 5       SU 4S	 jj5       rS
\R                  S\R                  4S jrS rSrU =r$ )	Attention4   attention_bias_cachedimkey_dim	num_heads
attn_ratio
resolutionc                   > XgS.n[         TU ]  5         X0l        US-  U l        X l        X#-  U l        [        XB-  5      U l        U R                  U-  U l        X@l	        [        R                  " XR
                  S-  U R                  -   40 UD6U l        [        R                  " U R                  U40 UD6U l        [        U5      n[        R                   " [#        [        R$                  " US   U[        R&                  S9[        R$                  " US   U[        R&                  S95      5      R)                  S5      n	U	SS S 2S 4   U	SS S S 24   -
  R+                  5       n
U
S   US   -  U
S   -   n
[        R                  R-                  [        R.                  " X5S   US   -  40 UD65      U l        U R3                  SU
5        0 U l        g )Ndevicedtypeg      r(   r   r   .attention_bias_idxs)super__init__r4   scaler3   key_attn_dimintval_dimval_attn_dimr5   nnLinearqkvprojr   torchstackr   arangelongflattenabs	Parameterzerosattention_biasesregister_bufferr1   )selfr2   r3   r4   r5   r6   r9   r:   ddposrel_pos	__class__s              Z/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/efficientformer.pyr=   Attention.__init__7   s    /"_
#/:/0 LL94$99S"3"3a"7$:K:K"KRrRIId//;;	z*
kk&LLAvUZZHLLAvUZZH
  71: 	 sAt|$s3a<'88==?1:
1-; % 2 25;;yUV-ZdefZgJg3nkm3n o2G<$&!    c                 f   > [         TU ]  U5        U(       a  U R                  (       a  0 U l        g g g N)r<   trainr1   )rQ   moderU   s     rV   r[   Attention.trainY   s)    dD--(*D% .4rX   r9   returnc                 J   [         R                  R                  5       (       d  U R                  (       a  U R                  S S 2U R
                  4   $ [        U5      nX R                  ;  a*  U R                  S S 2U R
                  4   U R                  U'   U R                  U   $ rZ   )rG   jit
is_tracingtrainingrO   r;   strr1   )rQ   r9   
device_keys      rV   get_attention_biasesAttention.get_attention_biases_   s    99!!T]]((D,D,D)DEEVJ!:!::8<8M8MaQUQiQiNi8j))*5,,Z88rX   c                 $   UR                   u  p#nU R                  U5      nUR                  X#U R                  S5      R	                  SSSS5      nUR                  U R                  U R                  U R                  /SS9u  pgnXgR                  SS5      -  U R                  -  n	XR                  UR                  5      -   n	U	R                  SS9n	X-  R                  SS5      R                  X#U R                  5      nU R                  U5      nU$ )Nr   r(   r   r'   r2   )shaperE   reshaper4   permutesplitr3   rA   	transposer>   re   r9   softmaxrB   rF   )
rQ   xBNCrE   qkvattns
             rV   forwardAttention.forwardh   s    ''ahhqkkk!3;;Aq!QG))T\\4<<FA)NaKKB''4::5//99|||#X  A&..qT5F5FGIIaLrX   )r1   rO   r5   r?   r3   r4   rF   rE   r>   rB   rA   )r"       r-   r*      NNT)__name__
__module____qualname____firstlineno__r   rc   rG   Tensor__annotations__r@   floatr=   no_gradr[   r9   re   ry   __static_attributes____classcell__rU   s   @rV   r/   r/   4   s    sELL011  ! ' '  ' 	 '
  '  '  'D ]]_+ +
95<< 9ELL 9 rX   r/   c            
          ^  \ rS rSr\R
                  \R                  SS4S\S\S\\R                     S\\R                     4U 4S jjjr
SrU =r$ )	Stem4w   Nin_chsout_chs	act_layer
norm_layerc           
        > XVS.n[         TU ]  5         SU l        U R                  S[        R
                  " XS-  4SSSS.UD65        U R                  SU" US-  40 UD65        U R                  S	U" 5       5        U R                  S
[        R
                  " US-  U4SSSS.UD65        U R                  SU" U40 UD65        U R                  SU" 5       5        g )Nr8   r*   conv1r(   r'   r   kernel_sizestridepaddingnorm1act1conv2norm2act2)r<   r=   r   
add_modulerC   Conv2d)	rQ   r   r   r   r   r9   r:   rR   rU   s	           rV   r=   Stem4.__init__x   s     /6a<!jQWXbc!jgi!jkGqL!?B!?@	,7a<!kaXYcd!khj!klG!:r!:;	,rX   )r   )r~   r   r   r   rC   ReLUBatchNorm2dr@   r   Moduler=   r   r   r   s   @rV   r   r   w   sY    
 *,*,..-- - BII	-
 RYY- -rX   r   c                      ^  \ rS rSrSrSSS\R                  SS4S\S\S\S	\S
\\   S\	\R                     4U 4S jjjrS rSrU =r$ )
Downsample   z~
Downsampling via strided conv w/ norm
Input: tensor in shape [B, C, H, W]
Output: tensor in shape [B, C, H/stride, W/stride]
r'   r(   Nr   r   r   r   r   r   c	                    > XxS.n	[         T
U ]  5         Uc  US-  n[        R                  " X4X4US.U	D6U l        U" U40 U	D6U l        g )Nr8   r(   r   )r<   r=   rC   r   convnorm)rQ   r   r   r   r   r   r   r9   r:   rR   rU   s             rV   r=   Downsample.__init__   sV     /?!Q&GIIfm;_fmjlm	w-"-	rX   c                 J    U R                  U5      nU R                  U5      nU$ rZ   r   r   rQ   rq   s     rV   ry   Downsample.forward   s!    IIaLIIaLrX   r   )r~   r   r   r   __doc__rC   r   r@   r   r   r   r=   ry   r   r   r   s   @rV   r   r      sz      !%)*,.... . 	.
 . c]. RYY. .$ rX   r   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )Flat   c                 "   > [         TU ]  5         g rZ   )r<   r=   )rQ   rU   s    rV   r=   Flat.__init__   s    rX   c                 H    UR                  S5      R                  SS5      nU$ )Nr(   r   )rK   ro   r   s     rV   ry   Flat.forward   s!    IIaL""1a(rX    )r~   r   r   r   r=   ry   r   r   r   s   @rV   r   r      s     rX   r   c                   >   ^  \ rS rSrSrSS\4U 4S jjjrS rSrU =r	$ )Pooling   zD
Implementation of pooling for PoolFormer
--pool_size: pooling size
	pool_sizec                 `   > [         TU ]  5         [        R                  " USUS-  SS9U l        g )Nr   r(   F)r   r   count_include_pad)r<   r=   rC   	AvgPool2dpool)rQ   r   rU   s     rV   r=   Pooling.__init__   s)    LL1i1n`ef	rX   c                 *    U R                  U5      U-
  $ rZ   r   r   s     rV   ry   Pooling.forward   s    yy|arX   r   )r'   )
r~   r   r   r   r   r@   r=   ry   r   r   r   s   @rV   r   r      s&    
g# g g   rX   r   c                      ^  \ rS rSrSrSS\R                  \R                  SSS4S\S\	\   S\	\   S\
\R                     S	\
\R                     S
\4U 4S jjjrS rSrU =r$ )ConvMlpWithNorm   zT
Implementation of MLP with 1*1 convolutions.
Input: tensor with shape [B, C, H, W]
N        in_featureshidden_featuresout_featuresr   r   dropc	                   > XxS.n	[         T
U ]  5         U=(       d    UnU=(       d    Un[        R                  " XS40 U	D6U l        Ub	  U" U40 U	D6O[        R
                  " 5       U l        U" 5       U l        [        R                  " X#S40 U	D6U l        Ub	  U" U40 U	D6O[        R
                  " 5       U l	        [        R                  " U5      U l        g )Nr8   r   )r<   r=   rC   r   fc1Identityr   actfc2r   Dropoutr   )rQ   r   r   r   r   r   r   r9   r:   rR   rU   s             rV   r=   ConvMlpWithNorm.__init__   s     /#2{)8[99[1CC:D:PZ626VXVaVaVc
;99_ADD7A7MZ33SUS^S^S`
JJt$	rX   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU$ rZ   )r   r   r   r   r   r   r   s     rV   ry   ConvMlpWithNorm.forward   sb    HHQKJJqMHHQKIIaLHHQKJJqMIIaLrX   )r   r   r   r   r   r   )r~   r   r   r   r   rC   GELUr   r@   r   r   r   r   r=   ry   r   r   r   s   @rV   r   r      s     .2*.)+*,..%% &c]% #3-	%
 BII% RYY% % %, rX   r   c                      ^  \ rS rSrS\R
                  \R                  SSSSS4S\S\S\	\R                     S	\	\R                     S
\S\S\4U 4S jjjrS rSrU =r$ )MetaBlock1d         @r   h㈵>Nr2   	mlp_ratior   r   	proj_drop	drop_pathlayer_scale_init_valuec
                   > XS.n
[         TU ]  5         U" U40 U
D6U l        [        U40 U
D6U l        [        X40 U
D6U l        US:  a  [        U5      O[        R                  " 5       U l
        U" U40 U
D6U l        [        SU[        X-  5      UUS.U
D6U l        [        X40 U
D6U l        US:  a  [        U5      U l        g [        R                  " 5       U l        g )Nr8   r   )r   r   r   r   r   )r<   r=   r   r/   token_mixerr   ls1r   rC   r   
drop_path1r   r   r@   mlpls2
drop_path2)rQ   r2   r   r   r   r   r   r   r9   r:   rR   rU   s              rV   r=   MetaBlock1d.__init__   s     /*r*
$S/B/c@R@1:R(9-R[[]*r*
 
0	

 
 c@R@1:R(9-R[[]rX   c           
         XR                  U R                  U R                  U R                  U5      5      5      5      -   nXR	                  U R                  U R                  U R                  U5      5      5      5      -   nU$ rZ   )r   r   r   r   r   r   r   r   r   s     rV   ry   MetaBlock1d.forward  s_    )9)9$**Q-)H IJJ$**Q-)@ ABBrX   )r   r   r   r   r   r   r   r   )r~   r   r   r   rC   r   	LayerNormr@   r   r   r   r=   ry   r   r   r   s   @rV   r   r      s    
  ")+*,,,!!,0SS S BII	S
 RYYS S S %*S S< rX   r   c                      ^  \ rS rSrSS\R
                  \R                  SSSSS4	S\S\S	\S
\	\R                     S\	\R                     S\S\S\4U 4S jjjrS rSrU =r$ )MetaBlock2di  r'   r   r   r   Nr2   r   r   r   r   r   r   r   c                   > XS.n[         TU ]  5         [        US9U l        [	        X40 UD6U l        US:  a  [        U5      O[        R                  " 5       U l	        [        U4[        X-  5      UUUS.UD6U l        [	        X40 UD6U l        US:  a  [        U5      U l        g [        R                  " 5       U l        g )Nr8   )r   r   )r   r   r   r   )r<   r=   r   r   r   r   r   rC   r   r   r   r@   r   r   r   )rQ   r2   r   r   r   r   r   r   r   r9   r:   rR   rU   s               rV   r=   MetaBlock2d.__init__  s     /"Y7BrB1:R(9-R[[]"
0!
 
  BrB1:R(9-R[[]rX   c                     XR                  U R                  U R                  U5      5      5      -   nXR                  U R	                  U R                  U5      5      5      -   nU$ rZ   )r   r   r   r   r   r   r   s     rV   ry   MetaBlock2d.forward1  sN    )9)9!)< =>>! 566rX   )r   r   r   r   r   r   )r~   r   r   r   rC   r   r   r@   r   r   r   r=   ry   r   r   r   s   @rV   r   r     s    
 !)+*,..!!,0SS S 	S
 BIIS RYYS S S %*S S< rX   r   c                     ^  \ rS rSrSSSS\R
                  \R                  \R                  SSSSS4S	\S
\S\S\	S\S\S\
S\\R                     S\\R                     S\\R                     S\
S\
S\
4U 4S jjjrS rSrU =r$ )EfficientFormerStagei7  Tr   r'   r   r   r   Nr2   dim_outdepth
downsamplenum_vitr   r   r   r   norm_layer_clr   r   r   c                 n  > XS.n[         TU ]  5         SU l        U(       a  [        SXU	S.UD6U l        UnO!X:X  d   e[
        R                  " 5       U l        / nU(       a  XS:  a  UR                  [        5       5        [        U5       H  nUU-
  S-
  nU(       a-  UU:  a'  UR                  [        U4UUU
UUU   US.UD65        M?  UR                  [        U4UUUU	UUU   US.UD65        U(       d  Mn  UU:X  d  Mv  UR                  [        5       5        M     [
        R                  " U6 U l        g )Nr8   F)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r<   r=   grad_checkpointingr   r   rC   r   appendr   ranger   r   
Sequentialblocks)rQ   r2   r   r   r   r   r   r   r   r   r   r   r   r   r9   r:   rR   r   	block_idx
remain_idxrU   s                       rV   r=   EfficientFormerStage.__init__9  sF   $ /"'(bQ[b_abDOC>!> kkmDOw'MM$&!uI*Q.J7Z/	"+"+#0"+"+I"6/E	 	
 
"+"+"+#-"+"+I"6/E
 
 7w*4MM$&)9 &< mmV,rX   c                     U R                  U5      nU R                  (       a;  [        R                  R	                  5       (       d  [        U R                  U5      nU$ U R                  U5      nU$ rZ   )r   r   rG   r`   is_scriptingr   r   r   s     rV   ry   EfficientFormerStage.forwardz  sV    OOA""599+A+A+C+Ct{{A.A  AArX   )r   r   r   )r~   r   r   r   rC   r   r   r   r@   boolr   r   r   r=   ry   r   r   r   s   @rV   r   r   7  s      $!)+*,..-/\\!!,0!?-?- ?- 	?-
 ?- ?- ?- ?- BII?- RYY?-  		??- ?- ?- %*?- ?-B rX   r   c            !         ^  \ rS rSrSSSSSSSS	SS
\R
                  \R                  \R                  SSSSS4S\\	S4   S\\	S4   S\	S\	S\
S\\\S4      S\	S\S\	S\S\\R                     S\\R                     S\\R                     S\S\S\4 U 4S jjjrS r\R&                  R(                  S 5       r\R&                  R(                  S5S  j5       r\R&                  R(                  S6S! j5       r\R&                  R(                  S"\R                  4S# j5       rS7S\	S\\
   4S$ jjr\R&                  R(                  S6S% j5       r     S8S&\R6                  S'\\\	\\	   4      S(\S)\S*\
S+\S"\\\R6                     \\R6                  \\R6                     4   4   4S, jjr   S9S'\\	\\	   4   S-\S.\4S/ jjrS0 r S5S1\4S2 jjr!S3 r"S4r#U =r$$ ):r   i  r&   r   r'     avgNr   r*   r   r   depths.
embed_dimsin_chansnum_classesglobal_pooldownsamplesr   
mlp_ratiosr   r   r   r   r   	drop_rateproj_drop_ratedrop_path_ratec                 2  > [         TU ]  5         UUS.nX@l        X0l        XPl        [        X2S   4SU0UD6U l        US   n[        U5      U l        U R                  S-
  n[        UUSS9nU=(       d    SSU R                  S-
  -  -   n/ n/ U l
        [        U R                  5       Hq  n[        UUU   UU   4UU   UU:X  a  UOSU	UUUUUUU   U
S	.
UD6nUU   nUR                  U5        U =R                  [        UU   S
US
-   -  SU 3S9/-  sl
        Ms     [        R                   " U6 U l        US   =U l        U l        U" U R$                  40 UD6U l        [        R*                  " U5      U l        US:  a"  [        R.                  " U R$                  U40 UD6O[        R0                  " 5       U l        US:  a  [        R.                  " US   U40 UD6O[        R0                  " 5       U l        SU l        U R9                  U R:                  5        g )Nr8   r   r   r   T)	stagewiseFr}   )
r   r   r   r   r   r   r   r   r   r   r(   stages.)num_chs	reductionmodulerh   F)r<   r=   r  r  r  r   stemlen
num_stagesr   feature_infor   r   r   dictrC   r   stagesnum_featureshead_hidden_sizer   r   	head_droprD   r   head	head_distdistilled_trainingapply_init_weights)rQ   r  r  r  r  r  r	  r   r
  r   r   r   r   r   r  r  r  r9   r:   kwargsrR   prev_dim
last_stagedprr  istagerU   s                              rV   r=   EfficientFormer.__init__  s   , 	/& &(qMOjOBO	a= f+__q(
'$O!OX4??Q;N0O%Ot'A(1q	 'q>#$
?#$#+%(a&'= E  "!}HMM% $z!}AaC[bcdbeYf"g!hh' (( mmV, 5?rNBD1!$"3"3:r:	I.GRUVBIId//CC\^\g\g\i	ITWX:b>;E"E^`^i^i^k"'

4%%&rX   c                    [        U[        R                  5      (       am  [        UR                  SS9  [        U[        R                  5      (       a9  UR
                  b+  [        R                  R                  UR
                  S5        g g g g )Ng{Gz?)stdr   )
isinstancerC   rD   r   weightbiasinit	constant_)rQ   ms     rV   r"  EfficientFormer._init_weights  s`    a##!((,!RYY''AFF,>!!!&&!, -?' $rX   c                 h    U R                  5        VVs1 s H  u  pSU;   d  M  UiM     snn$ s  snnf )NrO   )named_parameters)rQ   rv   _s      rV   no_weight_decayEfficientFormer.no_weight_decay  s/    "335Q5da9Kq9P5QQQs   ..c                     [        SSS/S9nU$ )Nz^stem)z^stages\.(\d+)N)z^norm)i )r  r   )r  )rQ   coarsematchers      rV   group_matcherEfficientFormer.group_matcher  s    -/CD
 rX   c                 6    U R                    H	  nXl        M     g rZ   )r  r   )rQ   enabless      rV   set_grad_checkpointing&EfficientFormer.set_grad_checkpointing  s    A#)  rX   r^   c                 2    U R                   U R                  4$ rZ   r  r  )rQ   s    rV   get_classifierEfficientFormer.get_classifier  s    yy$..((rX   c                 2   Xl         Ub  X l        US:  a!  [        R                  " U R                  U5      O[        R
                  " 5       U l        US:  a'  [        R                  " U R                  U5      U l        g [        R
                  " 5       U l        g )Nr   )r  r  rC   rD   r  r   r  r  )rQ   r  r  s      rV   reset_classifier EfficientFormer.reset_classifier  sm    &"*ALqBIId//=VXVaVaVc	FQTUo4#4#4kB[][f[f[hrX   c                     Xl         g rZ   )r   )rQ   r>  s     rV   set_distilled_training&EfficientFormer.set_distilled_training  s    "(rX   rq   indicesr   
stop_early
output_fmtintermediates_onlyc           	         US;   d   S5       e/ n[        [        U R                  5      U5      u  pU R                  U5      nUR                  u  ppU R
                  S-
  n[        R                  R                  5       (       d  U(       d  U R                  nOU R                  SU	S-    nSn[        U5       H  u  nnU" U5      nUU:  a  UR                  u  ppUU;   d  M+  UU:X  aV  U(       a  U R                  U5      OUnUR                  UR                  XS-  US-  S5      R                  SSSS5      5        M  UR                  U5        M     U(       a  U$ UU:X  a  U R                  U5      nX4$ )	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   Nr   r(   rh   r'   )r   r  r  r  rk   r  rG   r`   r   	enumerater   r   rl   rm   )rQ   rq   rL  r   rM  rN  rO  intermediatestake_indices	max_indexrr   rt   HWlast_idxr  feat_idxr(  x_inters                      rV   forward_intermediates%EfficientFormer.forward_intermediates  sW   * Y&D(DD&"6s4;;7G"Q IIaLWW
a??Q&99!!##:[[F[[)a-0F(0OHeaA("WW
a<'x'.2diilG!((FAFB)O)W)WXY[\^_ab)cd!((+  1   x		!ArX   
prune_norm
prune_headc                     [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  [        R                  " 5       U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r    )r   r  r  rC   r   r   rG  )rQ   rL  r]  r^  rT  rU  s         rV   prune_intermediate_layers)EfficientFormer.prune_intermediate_layers)  s[     #7s4;;7G"Qkk.9q=1DI!!!R(rX   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rZ   )r  r  r   r   s     rV   forward_features EfficientFormer.forward_features9  s.    IIaLKKNIIaLrX   
pre_logitsc                 T   U R                   S:X  a  UR                  SS9nU R                  U5      nU(       a  U$ U R                  U5      U R	                  U5      p1U R
                  (       a7  U R                  (       a&  [        R                  R                  5       (       d  X4$ X-   S-  $ )Nr  r   ri   r(   )
r  meanr  r  r  r   rb   rG   r`   r   )rQ   rq   rf  x_dists       rV   forward_headEfficientFormer.forward_head?  s    u$1ANN1HIIaL$.."36""t}}UYY=S=S=U=U9 J!##rX   c                 J    U R                  U5      nU R                  U5      nU$ rZ   )rd  rj  r   s     rV   ry   EfficientFormer.forwardM  s'    !!!$a rX   )r   r  r  r  r  r  r  r  r   r  r  r  r  r  r  r}   rZ   )NFFrQ  F)r   FT)%r~   r   r   r   rC   r   r   r   r   r@   rc   r   r   r   r   r   r=   r"  rG   r`   ignorer6  r;  r@  rD  rG  rJ  r   r   r   r[  ra  rd  rj  ry   r   r   r   s   @rV   r   r     s    '3*<#$6: !,0)+*,..-/\\!$&$&'E'#s(OE' c3hE' 	E'
 E' E' "%c	"23E' E' E' E' %*E' BIIE' RYYE'  		?E' E'  "!E'" "#E' E'P- YYR R YY  YY* * YY)		 ) )iC ihsm i YY) ) 8<$$',4 ||4  eCcN344  	4 
 4  4  !%4  
tELL!5tELL7I)I#JJ	K4 p ./$#	3S	>*  	 $$ $ rX   c                 (   SU ;   a  U $ 0 nSSK nSnU R                  5        H  u  pVUR                  S5      (       aH  UR                  SS5      nUR                  SS5      nUR                  S	S
5      nUR                  SS5      nUR	                  SU5      (       a  US-  nUR                  SSU S3U5      nUR                  SSU S3U5      nUR                  SSU S3U5      nUR                  SSU5      nUR                  SS5      nXbU'   M     U$ )z#Remap original checkpoints -> timm zstem.0.weightr   Npatch_embedzpatch_embed.0
stem.conv1zpatch_embed.1z
stem.norm1zpatch_embed.3z
stem.conv2zpatch_embed.4z
stem.norm2znetwork\.(\d+)\.proj\.weightr   znetwork.(\d+).(\d+)r  z
.blocks.\2znetwork.(\d+).projz.downsample.convznetwork.(\d+).normz.downsample.normzlayer_scale_([0-9])z
ls\1.gamma	dist_headr  )reitems
startswithreplacematchsub)
state_dictmodelout_dictrs  	stage_idxrv   rw   s          rV   checkpoint_filter_fnr}  S  s%   *$HI  "<<&&		/<8A		/<8A		/<8A		/<8A883Q77NIFF)WYK{+KQOFF(GI;>N*OQRSFF(GI;>N*OQRSFF)=!<IIk;/ #  OrX   c                 4    U SSS SSS[         [        SSSS	.UE$ )
Nr  )r'   r   r   Tgffffff?bicubicrq  rC  z
apache-2.0)urlr  
input_sizer   fixed_input_sizecrop_pctinterpolationrh  r+  
first_conv
classifierlicenser	   )r  r#  s     rV   _cfgr  n  s7    =tae)%.B"2G  rX   ztimm/)	hf_hub_id)z!efficientformer_l1.snap_dist_in1kz!efficientformer_l3.snap_dist_in1kz!efficientformer_l7.snap_dist_in1kc           	      j    UR                  SS5      n[        [        X4[        [	        USS9S.UD6nU$ )Nout_indicesr*   getter)r  feature_cls)pretrained_filter_fnfeature_cfg)popr   r   r}  r  )variant
pretrainedr#  r  rz  s        rV   _create_efficientformerr    sD    **]A.K 1[hG 	E LrX   r^   c           	      b    [        [        S   [        S   SS9n[        SSU 0[        U40 UD6D6$ )Nr#   r   r  r  r   r  )efficientformer_l1r  EfficientFormer_depthEfficientFormer_widthr  r  r#  
model_argss      rV   r  r    A    $T*(.J
 #mJmRVWaRlekRlmmrX   c           	      b    [        [        S   [        S   SS9n[        SSU 0[        U40 UD6D6$ )Nr$   r*   r  r  )efficientformer_l3r  r  s      rV   r  r    r  rX   c           	      b    [        [        S   [        S   SS9n[        SSU 0[        U40 UD6D6$ )Nr%   r-   r  r  )efficientformer_l7r  r  s      rV   r  r    r  rX   )r`  r  )6r   typingr   r   r   r   r   r   rG   torch.nnrC   	timm.datar
   r   timm.layersr   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r  r  r   r/   r   r   r   r   r   r   r   r   r   r   r}  r  default_cfgsr  r  r  r  r   rX   rV   <module>r     s   < ;   A	 	 	 + + ' <
 

  

 @ @F-BMM -, >299  bii  $bii $N#")) #L#")) #LI299 IXMbii M`6	 %)-* *.* *.*
& 
 no n n no n n no n nrX   