
    RЦiu                        S r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
  SSKrSSKJr  SSKJs  Jr  SSKJ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J r   S
SK!J"r"  S
SK#J$r$  S
SK%J&r&J'r'  S
SK(J)r)J*r*  S/r+ " S S\RX                  5      r- " S S\RX                  5      r. " S S\RX                  5      r/ " S S\RX                  5      r0 " S S\RX                  5      r1 " S S\RX                  5      r2 " S S\5      r3 " S S\5      r4 " S  S!\R:                  5      r5 " S" S#\RX                  5      r6 " S$ S%\RX                  5      r7 " S& S'\RX                  5      r8 " S( S)\RX                  5      r9 " S* S+\RX                  5      r: " S, S\RX                  5      r;S- r<SS. jr=SS/ jr>\)" 0 S0\>" S1S2S39_S4\>" S1S2S39_S5\>" S1S2S39_S6\>" S1S7S39_S8\>" S1S7S39_S9\>" S1S:9_S;\>" S1S:9_S<\>" S1S:9_S=\>" S1S:9_S>\>" S1S:9_S?\>" S1S@SA9_SB\>" S1S@SCSDSE9_SF\>" S1S@SA9_SG\>" S1S@SCSDSE9_SH\>" S1S@SISJ9_SK\>" S1S@SA9_SL\>" S1S@SCSDSE9_0 SM\>" S1S@SA9_SN\>" S1S@SCSDSE9_SO\>" S1S@SISJ9_SP\>" S1S@SA9_SQ\>" S1S@SCSDSE9_SR\>" S1S@SA9_SS\>" S1S@SCSDSE9_ST\>" S1S@SISJ9_SU\>" S1S@SA9_SV\>" S1S@SCSDSE9_SW\>" S1S@SA9_SX\>" S1S@SCSDSE9_SY\>" S1S@SISJ9_SZ\>" S1S@SA9_S[\>" S1S@SCSDSE9_S\\>" S1S@SA9_S]\>" S1S@SCSDSE9_E0 S^\>" S1S@SISJ9_S_\>" S1S@SA9_S`\>" S1S@SCSDSE9_Sa\>" S1S@SA9_Sb\>" S1S@SCSDSE9_Sc\>" S1S@SISJ9_Sd\>" S1S@SA9_Se\>" S1S@SCSDSE9_Sf\>" S1S@SA9_Sg\>" S1S@SCSDSE9_Sh\>" S1S@SISJ9_Si\>" S1S@SA9_Sj\>" S1S@SCSDSE9_Sk\>" S1S@SA9_Sl\>" S1S@SCSDSE9_Sm\>" S1S@SISJ9_E5      r?\*SSn\;4So jj5       r@\*SSn\;4Sp jj5       rA\*SSn\;4Sq jj5       rB\*SSn\;4Sr jj5       rC\*SSn\;4Ss jj5       rD\*SSn\;4St jj5       rE\*SSn\;4Su jj5       rF\*SSn\;4Sv jj5       rG\*SSn\;4Sw jj5       rH\*SSn\;4Sx jj5       rI\*SSn\;4Sy jj5       rJ\*SSn\;4Sz jj5       rK\*SSn\;4S{ jj5       rL\*SSn\;4S| jj5       rM\*SSn\;4S} jj5       rN\*SSn\;4S~ jj5       rO\*SSn\;4S jj5       rP\*SSn\;4S jj5       rQg)a  
Poolformer from MetaFormer is Actually What You Need for Vision https://arxiv.org/abs/2111.11418

IdentityFormer, RandFormer, PoolFormerV2, ConvFormer, and CAFormer
from MetaFormer Baselines for Vision https://arxiv.org/abs/2210.13452

All implemented models support feature extraction and variable input resolution.

Original implementation by Weihao Yu et al.,
adapted for timm by Fredo Guan and Ross Wightman.

Adapted from https://github.com/sail-sg/metaformer, original copyright below
    )OrderedDict)partial)ListOptionalTupleUnionTypeN)Tensor)FinalIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)	trunc_normal_DropPathcalculate_drop_path_ratesSelectAdaptivePool2d
GroupNorm1	LayerNormLayerNorm2dMlpuse_fused_attn   )build_model_with_cfg)feature_take_indices)
checkpointcheckpoint_seq)generate_default_cfgsregister_model
MetaFormerc            	       l   ^  \ rS rSrSr   S	S\S\S\\\R                        4U 4S jjjr
S rSrU =r$ )
Stem;   zW
Stem implemented by a layer of convolution.
Conv2d params constant across all models.
in_channelsout_channels
norm_layerc                    > XES.n[         TU ]  5         [        R                  " UU4SSSS.UD6U l        U(       a  U" U40 UD6U l        g [        R
                  " 5       U l        g )Ndevicedtype         kernel_sizestridepadding)super__init__nnConv2dconvIdentitynorm)selfr#   r$   r%   r(   r)   dd	__class__s          U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/metaformer.pyr2   Stem.__init__A   sj     /II
 
 
	 7AJ|2r2	bkkm	    c                 J    U R                  U5      nU R                  U5      nU$ Nr5   r7   r8   xs     r;   forwardStem.forwardU   !    IIaLIIaLr=   r@   NNN__name__
__module____qualname____firstlineno____doc__intr   r	   r3   Moduler2   rC   __static_attributes____classcell__r:   s   @r;   r!   r!   ;   sU     59TT T !bii1	T T( r=   r!   c                   |   ^  \ rS rSrSr     SS\S\S\S\S\S\\\R                        4U 4S	 jjjr
S
 rSrU =r$ )Downsampling[   z5
Downsampling implemented by a layer of convolution.
r#   r$   r.   r/   r0   r%   c	                    > XxS.n	[         T
U ]  5         U(       a	  U" U40 U	D6O[        R                  " 5       U l        [        R
                  " UU4UUUS.U	D6U l        g )Nr'   r-   )r1   r2   r3   r6   r7   r4   r5   )r8   r#   r$   r.   r/   r0   r%   r(   r)   r9   r:   s             r;   r2   Downsampling.__init__`   sc     /5?J{1b1R[[]	II
 $
 
	r=   c                 J    U R                  U5      nU R                  U5      nU$ r?   )r7   r5   rA   s     r;   rC   Downsampling.forwardw   rE   r=   r@   )r   r   NNNrG   rQ   s   @r;   rS   rS   [   st     48

 
 	

 
 
 !bii1
 
. r=   rS   c            	       T   ^  \ rS rSrSr     S
S\S\S\S\4U 4S jjjrS r	S	r
U =r$ )Scale}   z*
Scale vector by element multiplications.
dim
init_value	trainableuse_nchwc                    > XVS.n[         TU ]  5         U(       a  USS4OU4U l        [        R                  " U[
        R                  " U40 UD6-  US9U l        g )Nr'   r   requires_grad)r1   r2   shaper3   	Parametertorchonesscale)	r8   r\   r]   r^   r_   r(   r)   r9   r:   s	           r;   r2   Scale.__init__   sQ     /$,c1a[3&
\\*uzz#/D/D"DT]^
r=   c                 P    XR                   R                  U R                  5      -  $ r?   )rg   viewrc   rA   s     r;   rC   Scale.forward   s    ::??4::...r=   )rg   rc   )      ?TTNN)rH   rI   rJ   rK   rL   rM   floatboolr2   rC   rO   rP   rQ   s   @r;   rZ   rZ   }   sY     !$"!__ _ 	_
 _ _/ /r=   rZ   c                   >   ^  \ rS rSrSrSS\4U 4S jjjrS rSrU =r	$ )SquaredReLU   z0
Squared ReLU: https://arxiv.org/abs/2109.08668
inplacec                 T   > [         TU ]  5         [        R                  " US9U l        g )Nrr   )r1   r2   r3   ReLUrelu)r8   rr   r:   s     r;   r2   SquaredReLU.__init__   s    GGG,	r=   c                 L    [         R                  " U R                  U5      5      $ r?   )re   squarerv   rA   s     r;   rC   SquaredReLU.forward   s    ||DIIaL))r=   )rv   F)
rH   rI   rJ   rK   rL   rn   r2   rC   rO   rP   rQ   s   @r;   rp   rp      s#    - - -* *r=   rp   c                   h   ^  \ rS rSrSr        SS\S\S\S\S\\   S\4U 4S	 jjjr	S
 r
SrU =r$ )StarReLU   z 
StarReLU: s * relu(x) ** 2 + b
scale_value
bias_valuescale_learnablebias_learnablemoderr   c	                 ,  > XxS.n	[         T
U ]  5         X`l        [        R                  " US9U l        [        R                  " U[        R                  " S0 U	D6-  US9U l	        [        R                  " U[        R                  " S0 U	D6-  US9U l
        g )Nr'   rt   ra   )r   )r1   r2   rr   r3   ru   rv   rd   re   rf   rg   bias)r8   r   r   r   r   r   rr   r(   r)   r9   r:   s             r;   r2   StarReLU.__init__   su     /GGG,	\\+

0C0C"CSbc
LLejj.Ab.A!AQ_`	r=   c                 ^    U R                   U R                  U5      S-  -  U R                  -   $ )Nr,   )rg   rv   r   rA   s     r;   rC   StarReLU.forward   s'    zzDIIaLA--		99r=   )r   rr   rv   rg   )rl           TTNFNN)rH   rI   rJ   rK   rL   rm   rn   r   strr2   rC   rO   rP   rQ   s   @r;   r}   r}      s|     "% #$(#'"&!aa a "	a
 !a 3-a a a$: :r=   r}   c                   ~   ^  \ rS rSr% Sr\\   \S'           SS\S\S\	\   S\S\
S	\
S
\4U 4S jjjrS rSrU =r$ )	Attention   z`
Vanilla self-attention from Transformer: https://arxiv.org/abs/1706.03762.
Modified from timm.

fused_attnr\   head_dim	num_headsqkv_bias	attn_drop	proj_drop	proj_biasc
                 
  > XS.n[         TU ]  5         X l        US-  U l        [	        5       U l        U(       a  UOX-  U l        U R                  S:X  a  SU l        U R                  U R                  -  U l        [        R                  " XR                  S-  4SU0UD6U l
        [        R                  " U5      U l        [        R                  " U R                  U4SU0UD6U l        [        R                  " U5      U l        g )Nr'   g      r   r      r   )r1   r2   r   rg   r   r   r   attention_dimr3   LinearqkvDropoutr   projr   )r8   r\   r   r   r   r   r   r   r(   r)   kwargsr9   r:   s               r;   r2   Attention.__init__   s     / %
(*&/S_>>QDN!^^dmm;99S"4"4q"8NxN2NI.IId00#LILL	I.r=   c                    UR                   u  p#nU R                  U5      R                  X#SU R                  U R                  5      R                  SSSSS5      nUR                  S5      u  pgnU R                  (       a>  [        R                  " XgUU R                  (       a  U R                  R                  OSS9nOEXgR                  SS	5      -  U R                  -  n	U	R                  S	S
9n	U R                  U	5      n	X-  nUR                  SS5      R                  X#U5      nU R!                  U5      nU R#                  U5      nU$ )Nr   r,   r   r   r+   r   )	dropout_p)r\   )rc   r   reshaper   r   permuteunbindr   Fscaled_dot_product_attentiontrainingr   p	transposerg   softmaxr   r   )
r8   rB   BNCr   qkvattns
             r;   rC   Attention.forward   s   ''ahhqk!!!4>>4==IQQRSUVXY[\^_`**Q-a??..a.2mm$..**A
 B++tzz9D<<B<'D>>$'DAKK1%%aA.IIaLNN1r=   )	r   r   r   r   r   r   r   r   rg   )    NFr   r   FNN)rH   rI   rJ   rK   rL   r   rn   __annotations__rM   r   rm   r2   rC   rO   rP   rQ   s   @r;   r   r      s     d
 '+"!!#// /  }	/
 / / / / /> r=   r   c                   0   ^  \ rS rSrS\4U 4S jjrSrU =r$ )GroupNorm1NoBias   num_channelsc                 d   > [         TU ]  " U40 UD6  UR                  SS5      U l        S U l        g Nepsư>r1   r2   getr   r   r8   r   r   r:   s      r;   r2   GroupNorm1NoBias.__init__   .    00::eT*	r=   r   r   rH   rI   rJ   rK   rM   r2   rO   rP   rQ   s   @r;   r   r          S  r=   r   c                   0   ^  \ rS rSrS\4U 4S jjrSrU =r$ )LayerNorm2dNoBiasi  r   c                 d   > [         TU ]  " U40 UD6  UR                  SS5      U l        S U l        g r   r   r   s      r;   r2   LayerNorm2dNoBias.__init__  r   r=   r   r   rQ   s   @r;   r   r     r   r=   r   c                   0   ^  \ rS rSrS\4U 4S jjrSrU =r$ )LayerNormNoBiasi	  r   c                 d   > [         TU ]  " U40 UD6  UR                  SS5      U l        S U l        g r   r   r   s      r;   r2   LayerNormNoBias.__init__
  r   r=   r   r   rQ   s   @r;   r   r   	  r   r=   r   c                      ^  \ rS rSrSrS\\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$ )SepConvi  zT
Inverted separable convolution from MobileNetV2: https://arxiv.org/abs/1801.04381.
r,   Fr*   r   Nr\   expansion_ratio
act1_layer
act2_layerr   r.   r0   c
                   > XS.n[         TU ]  5         [        X!-  5      n[        R                  " X4SUS.UD6U l        [        U[        5      (       a  U" S0 UD6OU" 5       U l        [        R                  " UU4UUUUS.UD6U l	        [        U[        5      (       a  U" S0 UD6OU" 5       U l
        [        R                  " X4SUS.UD6U l        g )Nr'   r   )r.   r   )r.   r0   groupsr    )r1   r2   rM   r3   r4   pwconv1
issubclassr}   act1dwconvact2pwconv2)r8   r\   r   r   r   r   r.   r0   r(   r)   r   r9   mid_channelsr:   s                r;   r2   SepConv.__init__  s     /?01yySSPRS(2:x(H(HJ$$jl	ii
 $
 
 )3:x(H(HJ$$jl	yySSPRSr=   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?   )r   r   r   r   r   rA   s     r;   rC   SepConv.forward3  sH    LLOIIaLKKNIIaLLLOr=   )r   r   r   r   r   )rH   rI   rJ   rK   rL   r}   r3   r6   rM   rm   r	   rN   rn   r2   rC   rO   rP   rQ   s   @r;   r   r     s     &'*2*,++ TT #T RYY	T
 RYYT T T T T< r=   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	$ )Poolingi<  zL
Implementation of pooling for PoolFormer: https://arxiv.org/abs/2111.11418
	pool_sizec                 `   > [         TU ]  5         [        R                  " USUS-  SS9U l        g )Nr   r,   F)r/   r0   count_include_pad)r1   r2   r3   	AvgPool2dpool)r8   r   r   r:   s      r;   r2   Pooling.__init__A  s)    LL1i1n`ef	r=   c                 ,    U R                  U5      nX!-
  $ r?   r   )r8   rB   ys      r;   rC   Pooling.forwardE  s    IIaLur=   r   )r   )
rH   rI   rJ   rK   rL   rM   r2   rC   rO   rP   rQ   s   @r;   r   r   <  s&    g# g g r=   r   c                      ^  \ rS rSrSrSS\\SSSS4S\S	\S
\S\	\
R                     S\	\
R                     S\S\4U 4S jjjrS rSrU =r$ )MlpHeadiJ  zMLP classification head
      r+   r   TNr\   num_classes	mlp_ratio	act_layerr%   	drop_rater   c
                 &  > XS.n
[         TU ]  5         [        X1-  5      n[        R                  " X4SU0U
D6U l        U" 5       U l        U" U40 U
D6U l        [        R                  " X4SU0U
D6U l        [        R                  " U5      U l
        g )Nr'   r   )r1   r2   rM   r3   r   fc1actr7   fc2r   	head_drop)r8   r\   r   r   r   r%   r   r   r(   r)   r9   hidden_featuresr:   s               r;   r2   MlpHead.__init__N  s     /io.99SCCC;5"5	99_KKKI.r=   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?   )r   r   r7   r   r   rA   s     r;   rC   MlpHead.forwardc  sI    HHQKHHQKIIaLNN1HHQKr=   )r   r   r   r   r7   )rH   rI   rJ   rK   rL   rp   r   rM   rm   r	   r3   rN   rn   r2   rC   rO   rP   rQ   s   @r;   r   r   J  s      $ )4*3!// / 	/
 BII/ RYY/ / / /* r=   r   c                      ^  \ rS rSrSr\\S\SSSSSSS4S\S\	\
R                     S	\	\
R                     S
\S\	\
R                     S\S\S\S\\   S\\   4U 4S jjjrS rSrU =r$ )MetaFormerBlockil  z)
Implementation of one MetaFormer block.
Fr   TNr\   token_mixermlp_actmlp_biasr%   r   	drop_pathr_   layer_scale_init_valueres_scale_init_valuec                   > XS.n[         TU ]  5         [        [        4XUS.UD6n[        [        4XUS.UD6nU" U40 UD6U l        U" SXS.UDUD6U l        US:  a  [        U5      O[        R                  " 5       U l	        U	b  U" 5       O[        R                  " 5       U l
        U
b  U" 5       O[        R                  " 5       U l        U" U40 UD6U l        [        U[        SU-  5      4UUUUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        U	b  U" 5       O[        R                  " 5       U l        U
b  U" 5       U l        g [        R                  " 5       U l        g )Nr'   )r\   r]   r_   )r\   r   r   r+   )r   r   dropuse_convr   )r1   r2   r   rZ   norm1r   r   r3   r6   
drop_path1layer_scale1
res_scale1norm2r   rM   mlp
drop_path2layer_scale2
res_scale2)r8   r\   r   r   r   r%   r   r   r_   r  r  r(   r)   r   r9   ls_layerrs_layerr:   s                    r;   r2   MetaFormerBlock.__init__q  sW     /5fcW_fcef5dcU]dacd*r*
&T3TrTVT1:R(9-R[[]*@*LHJRTR]R]R_(<(H(*bkkm*r*
CL
 
 
 2;R(9-R[[]*@*LHJRTR]R]R_(<(H(*bkkmr=   c           
      F   U R                  U5      U R                  U R                  U R                  U R	                  U5      5      5      5      -   nU R                  U5      U R                  U R                  U R                  U R                  U5      5      5      5      -   nU$ r?   )
r	  r  r  r   r  r  r  r  r  r
  rA   s     r;   rC   MetaFormerBlock.forward  s    OOA$$TZZ]3 OOAHHTZZ]+ r=   )
r  r  r  r  r  r  r
  r	  r  r   )rH   rI   rJ   rK   rL   r   r}   r   rM   r	   r3   rN   rn   rm   r   r2   rC   rO   rP   rQ   s   @r;   r   r   l  s     ,3'/"*5!!!6:48'\'\ bii'\ "))_	'\
 '\ RYY'\ '\ '\ '\ %-UO'\ #+5/'\ '\R r=   r   c                   ^  ^  \ rS rSrS\R
                  \S\\SS/S-  SSSS4S\S\S\S	\	\R                     S
\	\R                     S\S\\	\R                        S\	\R                     S\S\\   S\\   S\\   4U 4S jjjr\R"                  R$                  SS j5       rS\4S jrSrU =r$ )MetaFormerStagei  r,   Fr   Nin_chsout_chsdepthr   r   r   downsample_normr%   r   dp_ratesr  r  c                   > XS.n[         TU ]  5         SU l        [        U[        5      (       + U l        X:X  a  [        R                  " 5       O[        UU4SSSUS.UD6U l	        [        R                  " [        U5       Vs/ s H(  n[        SUUUUUU	U
U   UUU R
                  S.
UDUD6PM*     sn6 U l        g s  snf )	Nr'   Fr   r,   r   )r.   r/   r0   r%   )
r\   r   r   r   r%   r   r   r  r  r_   r   )r1   r2   grad_checkpointingr   r   r_   r3   r6   rS   
downsample
Sequentialranger   blocks)r8   r  r  r  r   r   r   r  r%   r   r  r  r  r(   r)   r   r9   ir:   s                     r;   r2   MetaFormerStage.__init__  s    $ /"'&{I>> ,2+<"++-,C
 &C
 C
 mm <&!  a '6 '
#!qk#9!5]]'
 '
 '
  &! " &!s   /B<c                     Xl         g r?   )r  )r8   enables     r;   set_grad_checkpointing&MetaFormerStage.set_grad_checkpointing  s    "(r=   rB   c                    U R                  U5      nUR                  u  p#pEU R                  (       d"  UR                  X#S5      R	                  SS5      nU R
                  (       a:  [        R                  R                  5       (       d  [        U R                  U5      nOU R                  U5      nU R                  (       d"  UR	                  SS5      R                  X#XE5      nU$ )Nr   r   r,   )r  rc   r_   r   r   r  re   jitis_scriptingr   r   )r8   rB   r   r   HWs         r;   rC   MetaFormerStage.forward  s    OOAWW
a}}		!#--a3A""599+A+A+C+Ct{{A.AAA}}Aq!))!5Ar=   )r   r  r  r_   T)rH   rI   rJ   rK   r3   r6   r}   r   rM   r	   rN   rn   r   rm   r   r2   re   r(  ignorer%  r
   rC   rO   rP   rQ   s   @r;   r  r    s    +-;;'/"9D*5!%'D1H6:48/"/" /" 	/"
 bii/" "))_/" /" &d299o6/" RYY/" /" 5k/" %-UO/" #+5//" /"b YY) )  r=   r  c            #         ^  \ rS rSrSrSSSSS\\SS	S	S	S
S\\\SS
S
4S\	S\	S\
S\\	S4   S\\	S4   S\\\R                     \\\R                        4   S\\R                     S\S\S\S\S\\\\\   4      S\\\\   S4   \\\      4   S\\\R                        S\\\R                     \\\R                        4   S\\R                     S\4"U 4S jjjrS  r\R.                  R0                  S4S! j5       r\R.                  R0                  S"\R                  4S# j5       rS5S\	S\\
   4S$ jjr     S6S%\R8                  S&\\\	\\	   4      S'\S(\S)\
S*\S"\\\R8                     \\R8                  \\R8                     4   4   4S+ jjr   S7S&\\	\\	   4   S,\S-\4S. jjrS8S%\S/\4S0 jjrS%\4S1 jr S%\4S2 jr!S3r"U =r#$ )9r   i  a  MetaFormer
    A PyTorch impl of : `MetaFormer Baselines for Vision`  -
      https://arxiv.org/abs/2210.13452

Args:
    in_chans (int): Number of input image channels.
    num_classes (int): Number of classes for classification head.
    global_pool: Pooling for classifier head.
    depths (list or tuple): Number of blocks at each stage.
    dims (list or tuple): Feature dimension at each stage.
    token_mixers (list, tuple or token_fcn): Token mixer for each stage.
    mlp_act: Activation layer for MLP.
    mlp_bias (boolean): Enable or disable mlp bias term.
    drop_path_rate (float): Stochastic depth rate.
    drop_rate (float): Dropout rate.
    layer_scale_init_values (list, tuple, float or None): Init value for Layer Scale.
        None means not use the layer scale. Form: https://arxiv.org/abs/2103.17239.
    res_scale_init_values (list, tuple, float or None): Init value for res Scale on residual connections.
        None means not use the res scale. From: https://arxiv.org/abs/2110.09456.
    downsample_norm (nn.Module): Norm layer used in stem and downsampling layers.
    norm_layers (list, tuple or norm_fcn): Norm layers for each stage.
    output_norm: Norm layer before classifier head.
    use_mlp_head: Use MLP classification head.
r   r   avgr,   r,      r,   @      i@     Fr   N)NNrl   rl   Tin_chansr   global_pooldepths.dimstoken_mixersr   r   drop_path_rateproj_drop_rater   layer_scale_init_valuesres_scale_init_valuesr  norm_layersoutput_normuse_mlp_headc                   > [         TU ]  5         UUS.nU[        4;   a  [        U40 UD6nX l        Xl        US   U l        Xl        UU l        [        U5      U l
        [        U[        [        45      (       d  U/n[        U[        [        45      (       d  U/n[        U[        [        45      (       d  U/U R                  -  n[        U[        [        45      (       d  U/U R                  -  n[        U[        [        45      (       d  U/U R                  -  n[        U[        [        45      (       d  U/U R                  -  nSU l        / U l        [!        UUS   4SU0UD6U l        / nUS   n[%        XSS9n['        U R                  5       Hf  nU[)        UUU   4UU   UU   UUU
UU   UU   UU   UUU   S.
UDUD6/-  nUU   nU =R                  [+        UU   S	US	-   -  S
U 3S9/-  sl        Mh     [,        R.                  " U6 U l        US:  az  U R                  (       a5  [3        U R                  U4SU R                  0UD6nU R                  U l        OI[,        R6                  " U R                  U40 UD6nU R                  U l        O[,        R8                  " 5       n[,        R.                  " [;        S[=        US94SU" U R                  40 UD64SU(       a  [,        R>                  " S5      O[,        R8                  " 5       4SU R                  (       a  [,        R@                  " U5      O[,        R8                  " 5       4SU4/5      5      U l!        U RE                  U RF                  5        g )Nr'   r   Fr   r%   T)	stagewise)
r  r   r   r   r   r  r  r  r  r%   r,   zstages.)num_chs	reductionmoduler   r8  	pool_typer7   flattenr   r  fc)$r1   r2   r}   r   r   r7  num_featuresr   rB  len
num_stages
isinstancelisttupler  feature_infor!   stemr   r  r  dictr3   r  stagesr   head_hidden_sizer   r6   r   r   Flattenr   headapply_init_weights)r8   r7  r   r8  r9  r:  r;  r   r   r<  r=  r   r>  r?  r  r@  rA  rB  r(   r)   r   r9   rU  prev_dimr  r!  finalr:   s                              r;   r2   MetaFormer.__init__  sW   . 	/xk!g,,G&  H"(f+ &4-00XF$u..6D,u66(>DOO;L+e}55&-$//9K1D%=AA'>&?$//&Q#/$??%:$;doo$M!"'G
 '
 	
	 7,^tTt'AQ Qi(O!(!!'>q'A%:1%= /&q>    F  AwH$tAw!ac(U\]^\_S`"a!bb% (( mmV, ?   1 1;_$.._\^_(,(9(9%		$"3"3[GBG(,(9(9%KKMEMM+0;GH[!2!29b9:

1"++-Hd.?.?RZZ	*R[[]S5M/
 # 	 	

4%%&r=   c                     [        U[        R                  [        R                  45      (       aM  [	        UR
                  SS9  UR                  b+  [        R                  R                  UR                  S5        g g g )Ng{Gz?)stdr   )	rO  r3   r4   r   r   weightr   init	constant_)r8   ms     r;   rZ  MetaFormer._init_weightsx  sV    a"))RYY/00!((,vv!!!!&&!, " 1r=   c                 T    Xl         U R                   H  nUR                  US9  M     g )N)r$  )r  rU  r%  )r8   r$  stages      r;   r%  !MetaFormer.set_grad_checkpointing~  s'    "([[E(((7 !r=   returnc                 .    U R                   R                  $ r?   )rX  rK  )r8   s    r;   get_classifierMetaFormer.get_classifier  s    yy||r=   c                    X4S.nXl         UbY  [        US9U R                  l        U(       a  [        R
                  " S5      O[        R                  " 5       U R                  l        US:  aX  U R                  (       a$  [        U R                  U4SU R                  0UD6nO8[        R                  " U R                  U40 UD6nO[        R                  " 5       nX`R                  l        g )Nr'   rH  r   r   r   )r   r   rX  r8  r3   rW  r6   rJ  rB  r   rL  r   r   rK  )r8   r   r8  r(   r)   r9   r\  s          r;   reset_classifierMetaFormer.reset_classifier  s    /&"$8;$ODII!1<

1"++-DII?   1 1;_$.._\^_		$"3"3[GBGKKME		r=   rB   indicesr7   
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        [        U R                  5      U5      u  pU R                  U5      n[        R
                  R                  5       (       d  U(       d  U R                  n
OU R                  SU	S-    n
[        U
5       He  u  pU R                  (       a/  [        R
                  R                  5       (       d  [        X5      nOU" U5      nX;   d  MT  UR                  U5        Mg     U(       a  U$ 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.Nr   )r   rM  rU  rS  re   r(  r)  	enumerater  r   append)r8   rB   ro  r7   rp  rq  rr  intermediatestake_indices	max_indexrU  feat_idxrf  s                r;   forward_intermediates MetaFormer.forward_intermediates  s    * Y&D(DD&"6s4;;7G"Q IIaL99!!##:[[F[[)a-0F(0OH&&uyy/E/E/G/Gu(!H'$$Q'  1   r=   
prune_norm
prune_headc                     [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r    )r   rM  rU  rm  )r8   ro  r}  r~  rx  ry  s         r;   prune_intermediate_layers$MetaFormer.prune_intermediate_layers  sK     #7s4;;7G"Qkk.9q=1!!!R(r=   
pre_logitsc                 "   U R                   R                  U5      nU R                   R                  U5      nU R                   R                  U5      nU R                   R	                  U5      nU(       a  U$ U R                   R                  U5      $ r?   )rX  r8  r7   rJ  r  rK  )r8   rB   r  s      r;   forward_headMetaFormer.forward_head  sg    II!!!$IINN1IIa IINN1q3DIILLO3r=   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$ r?   )rS  r  re   r(  r)  r   rU  rA   s     r;   forward_featuresMetaFormer.forward_features  sU    IIaL""599+A+A+C+Ct{{A.A  AAr=   c                 J    U R                  U5      nU R                  U5      nU$ r?   )r  r  rA   s     r;   rC   MetaFormer.forward  s'    !!!$a r=   )r   rR  r  rX  rV  r7  r   rL  rN  rU  rS  rB  r-  rF   )NFFrt  F)r   FTr{   )$rH   rI   rJ   rK   rL   r   r}   r   r   rM   r   r   r   r	   r3   rN   r   rn   rm   r   r2   rZ  re   r(  r.  r%  rj  rm  r
   r{  r  r  r  rC   rO   rP   rQ   s   @r;   r   r     s   6 #$&2$7JQ'/"$&$&"KO_u9JIZ+6!%)i'i' i' 	i'
 #s(Oi' S/i'  RYYd299o1F FGi' "))_i' i' "i' "i' i' &.eE4;4F.G%Hi' $)x/C)Dd8TY?F[)[#\i' &d299o6i'  tBIIT"))_0EEF!i'" bii#i'$ %i' i'V- YY8 8
 YY		  C hsm $ 8<$$',+ ||+  eCcN34+  	+ 
 +  +  !%+  
tELL!5tELL7I)I#JJ	K+ ^ ./$#	3S	>*  	4f 4$ 4&   r=   c                    SU ;   a  U $ SS K n0 nSU ;   nUR                  5       nU R                  5        GH  u  pgU(       a  UR                  SSU5      n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S5      nUR	                  SS5      nUR	                  SS5      nUR                  SSU5      nUR	                  SS5      nUR	                  SS5      nUR                  SSU5      n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S U5      nUR                  S!S"U5      nUR
                  XV   :w  aA  UR                  5       XV   R                  5       :X  a  UR                  XV   R
                  5      nXsU'   GM     U$ )#Nzstem.conv.weightr   znetwork.0.0.mlp.fc1.weightzlayer_scale_([0-9]+)zlayer_scale\1.scalez	network.1zdownsample_layers.1z	network.3zdownsample_layers.2z	network.5zdownsample_layers.3z	network.2z	network.4z	network.6networkrU  zdownsample_layers.([0-9]+)zstages.\1.downsamplezdownsample.projzdownsample.convzpatch_embed.projzpatch_embed.convz([0-9]+).([0-9]+)z\1.blocks.\2zstages.0.downsamplepatch_embedrS  	post_normr7   pre_normz^headhead.fcz^normz	head.norm)re
state_dictitemssubreplacerc   numelr   )r  modelr  out_dictis_poolformerv1model_state_dictr   r   s           r;   checkpoint_filter_fnr    s   Z'H2j@O'')  ".0FJA		+'<=A		+'<=A		+'<=A		+{3A		+{3A		+{3A		)X.AFF02I1MII'):;II(*<=FF'!<II+];IImV,IIk6*IIj&)FF8Y*FF8[!,77&))aggi;K;N;T;T;V.V		*-334A3 #4 Or=   c           	          [        S [        UR                  SS5      5       5       5      nUR                  SU5      n[	        [
        U U4[        [        SUS9S.UD6nU$ )Nc              3   *   #    U  H	  u  pUv   M     g 7fr?   r   ).0r!  _s      r;   	<genexpr>%_create_metaformer.<locals>.<genexpr>  s     \.[da.[s   r9  r1  out_indicesT)flatten_sequentialr  )pretrained_filter_fnfeature_cfg)rQ  ru  r   popr   r   r  rT  )variant
pretrainedr   default_out_indicesr  r  s         r;   _create_metaformerr    sl    \i

8\8Z.[\\**],?@K  2DkJ E Lr=   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr   )r      r  )r*   r*   rl   bicubicr  z	stem.convz
apache-2.0)urlr   
input_sizer   crop_pctinterpolationmeanr_  
classifier
first_convlicenser   )r  r   s     r;   _cfgr    s3    =v)%.B{  r=   zpoolformer_s12.sail_in1kztimm/g?)	hf_hub_idr  zpoolformer_s24.sail_in1kzpoolformer_s36.sail_in1kzpoolformer_m36.sail_in1kgffffff?zpoolformer_m48.sail_in1kzpoolformerv2_s12.sail_in1k)r  zpoolformerv2_s24.sail_in1kzpoolformerv2_s36.sail_in1kzpoolformerv2_m36.sail_in1kzpoolformerv2_m48.sail_in1kzconvformer_s18.sail_in1kzhead.fc.fc2)r  r  zconvformer_s18.sail_in1k_384)r     r  )   r  )r  r  r  r   z!convformer_s18.sail_in22k_ft_in1kz%convformer_s18.sail_in22k_ft_in1k_384zconvformer_s18.sail_in22kiQU  )r  r  r   zconvformer_s36.sail_in1kzconvformer_s36.sail_in1k_384z!convformer_s36.sail_in22k_ft_in1kz%convformer_s36.sail_in22k_ft_in1k_384zconvformer_s36.sail_in22kzconvformer_m36.sail_in1kzconvformer_m36.sail_in1k_384z!convformer_m36.sail_in22k_ft_in1kz%convformer_m36.sail_in22k_ft_in1k_384zconvformer_m36.sail_in22kzconvformer_b36.sail_in1kzconvformer_b36.sail_in1k_384z!convformer_b36.sail_in22k_ft_in1kz%convformer_b36.sail_in22k_ft_in1k_384zconvformer_b36.sail_in22kzcaformer_s18.sail_in1kzcaformer_s18.sail_in1k_384zcaformer_s18.sail_in22k_ft_in1kz#caformer_s18.sail_in22k_ft_in1k_384zcaformer_s18.sail_in22kzcaformer_s36.sail_in1kzcaformer_s36.sail_in1k_384zcaformer_s36.sail_in22k_ft_in1kz#caformer_s36.sail_in22k_ft_in1k_384zcaformer_s36.sail_in22kzcaformer_m36.sail_in1kzcaformer_m36.sail_in1k_384zcaformer_m36.sail_in22k_ft_in1kz#caformer_m36.sail_in22k_ft_in1k_384zcaformer_m36.sail_in22kzcaformer_b36.sail_in1kzcaformer_b36.sail_in1k_384zcaformer_b36.sail_in22k_ft_in1kz#caformer_b36.sail_in22k_ft_in1k_384zcaformer_b36.sail_in22krh  c                 r    [        S/ SQ/ SQS [        R                  S[        SS SS.	UD6n[	        S	SU 0UD6$ )
Nr1  r3  Th㈵>F	r9  r:  r  r   r   r@  r>  r?  rB  r  r   )poolformer_s12rT  r3   GELUr   r  r  r   model_kwargss      r;   r  r    sO     
  $"
 
L V:VVVr=   c                 r    [        S/ SQ/ SQS [        R                  S[        SS SS.	UD6n[	        S	SU 0UD6$ )
Nr+   r+   r  r+   r3  Tr  Fr  r  r   )poolformer_s24r  r  s      r;   r  r    O     
  $"
 
L V:VVVr=   c                 r    [        S/ SQ/ SQS [        R                  S[        SS SS.	UD6n[	        S	SU 0UD6$ )
Nr2  r2     r2  r3  Tr   Fr  r  r   )poolformer_s36r  r  s      r;   r  r    r  r=   c                 r    [        S/ SQ/ SQS [        R                  S[        SS SS.	UD6n[	        S	SU 0UD6$ )
Nr  `      r     Tr   Fr  r  r   )poolformer_m36r  r  s      r;   r  r    r  r=   c                 r    [        S/ SQ/ SQS [        R                  S[        SS SS.	UD6n[	        S	SU 0UD6$ )
N   r     r  r  Tr   Fr  r  r   )poolformer_m48r  r  s      r;   r  r    r  r=   c                 L    [        S/ SQ/ SQ[        SS.UD6n[        SSU 0UD6$ )Nr1  r3  Fr9  r:  r@  rB  r  r   )poolformerv2_s12rT  r   r  r  s      r;   r  r    s<      $	
 L XZX<XXr=   c                 L    [        S/ SQ/ SQ[        SS.UD6n[        SSU 0UD6$ )Nr  r3  Fr  r  r   )poolformerv2_s24r  r  s      r;   r  r    <      $	
 L XZX<XXr=   c                 L    [        S/ SQ/ SQ[        SS.UD6n[        SSU 0UD6$ )Nr  r3  Fr  r  r   )poolformerv2_s36r  r  s      r;   r  r  )  r  r=   c                 L    [        S/ SQ/ SQ[        SS.UD6n[        SSU 0UD6$ )Nr  r  Fr  r  r   )poolformerv2_m36r  r  s      r;   r  r  4  r  r=   c                 L    [        S/ SQ/ SQ[        SS.UD6n[        SSU 0UD6$ )Nr  r  Fr  r  r   )poolformerv2_m48r  r  s      r;   r  r  ?  r  r=   c                 T    [        S/ SQ/ SQ[        [        S.UD6n[        SSU 0UD6$ )Nr   r   	   r   r3  r9  r:  r;  r@  r  r   )convformer_s18rT  r   r   r  r  s      r;   r  r  J  s<      %	
 L V:VVVr=   c                 T    [        S/ SQ/ SQ[        [        S.UD6n[        SSU 0UD6$ )Nr   r  r  r   r3  r  r  r   )convformer_s36r  r  s      r;   r  r  U  <      %	
 L V:VVVr=   c                 T    [        S/ SQ/ SQ[        [        S.UD6n[        SSU 0UD6$ )Nr  r  r  r  i@  r  r  r   )convformer_m36r  r  s      r;   r  r  `  r  r=   c                 T    [        S/ SQ/ SQ[        [        S.UD6n[        SSU 0UD6$ )Nr  r5     r6  r  r  r  r   )convformer_b36r  r  s      r;   r  r  k  s<     !%	
 L V:VVVr=   c           	          [        S/ SQ/ SQ[        [        [        [        /[        /S-  [        /S-  -   S.UD6n[        SSU 0UD6$ )Nr  r3  r,   r  r  r   )caformer_s18rT  r   r   r   r   r  r  s      r;   r  r  v  sZ      w	9=&'!+.?!.CC	
 L TT|TTr=   c           	          [        S/ SQ/ SQ[        [        [        [        /[        /S-  [        /S-  -   S.UD6n[        SSU 0UD6$ )Nr  r3  r,   r  r  r   )caformer_s36r  r  s      r;   r  r    Z      w	9=&'!+.?!.CC	
 L TT|TTr=   c           	          [        S/ SQ/ SQ[        [        [        [        /[        /S-  [        /S-  -   S.UD6n[        SSU 0UD6$ )Nr  r  r,   r  r  r   )caformer_m36r  r  s      r;   r  r    r  r=   c           	          [        S/ SQ/ SQ[        [        [        [        /[        /S-  [        /S-  -   S.UD6n[        SSU 0UD6$ )Nr  r  r,   r  r  r   )caformer_b36r  r  s      r;   r  r    sZ     !w	9=&'!+.?!.CC	
 L TT|TTr=   r{   )r  )RrL   collectionsr   	functoolsr   typingr   r   r   r   r	   re   torch.nnr3   torch.nn.functional
functionalr   r
   	torch.jitr   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__rN   r!   rS   rZ   rp   r}   r   r   r   r   r   r   r   r   r  r   r  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r=   r;   <module>r     s  8 $  5 5       A
 
 
 + + 3 <.299 @299 D/BII /.
*")) 
*:ryy :69		 9~z  bll )bii )Xbii bii D;bii ;|Fbii FRr rl"J 	 % V&!V& !	V& !V& !V& !V&" !$"9#V&$ !$"9%V&& !$"9'V&( !$"9)V&* !$"9+V&.  !"/V&4 #D ]h%P5V&: ( *";V&@ ,T ]h.PAV&F   e"5GV&N  !"OV&T #D ]h%PUV&Z ( *"[V&` ,T ]h.PaV&f   e"5gV&n  !"oV&t #D ]h%PuV&z ( *"{V&@ ,T ]h.PAV&F   e"5GV&N  !"OV&T #D ]h%PUV&Z ( *"[V&` ,T ]h.PaV&f   e"5gV&n d "oV&t !$ ]h#PuV&z &t ("{V&@ *4 ]h,PAV&F t e 5GV&N d "OV&T !$ ]h#PUV&Z &t ("[V&` *4 ]h,PaV&f t e 5gV&n d "oV&t !$ ]h#PuV&z &t ("{V&@ *4 ]h,PAV&F t e 5GV&N d "OV&T !$ ]h#PUV&Z &t ("[V&` *4 ]h,PaV&f t e 5gV& Vr W* W W W* W W W* W W W* W W W* W W YJ Y Y YJ Y Y YJ Y Y YJ Y Y YJ Y Y W* W W W* W W W* W W W* W W U
 U U U
 U U U
 U U U
 U Ur=   