
    RЦit                        S r S/rSSKrSSKJr  SSKJr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s  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  SS	K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 S\R                  RT                  5      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\R                  RX                  5      r2 " S S\RX                  5      r3\#" \35         " S S\RX                  5      r4 " S  S\RX                  5      r5S! r6S6S" jr7\)" \7" S#S$S%9\7" S#S&9\7" S#S&9\7" S#S$S%9\7" S#S&9\7" S#S&9\7" S#S$S%9\7" S#S&9\7" S#S&9\7" S#S'S(S)S*9\7" S#S+S,S)S-S.9S/.5      r8S7S0 jr9\(S7S1 j5       r:\(S7S2 j5       r;\(S7S3 j5       r<\(S7S4 j5       r=\(S7S5 j5       r>g)8zTinyViT

Paper: `TinyViT: Fast Pretraining Distillation for Small Vision Transformers`
    - https://arxiv.org/abs/2207.10666

Adapted from official impl at https://github.com/microsoft/Cream/tree/main/TinyViT
TinyVit    N)partial)DictListOptionalTupleUnionTypeAnyIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)LayerNorm2dNormMlpClassifierHeadDropPathtrunc_normal_resize_rel_pos_bias_table_levituse_fused_attncalculate_drop_path_rates   )build_model_with_cfg)feature_take_indices)register_notrace_module)
checkpointcheckpoint_seq)register_modelgenerate_default_cfgsc                      ^  \ rS rSr        SS\S\S\S\S\S\S\S	\4U 4S
 jjjr\R                  " 5       S 5       r	Sr
U =r$ )ConvNorm   in_chsout_chsksstridepaddilationgroupsbn_weight_initc           	        > XS.n[         TU ]  5         [        R                  " XX4XVU4SS0UD6U l        [        R
                  " U40 UD6U l        [        R                  R                  R                  U R                  R                  U5        [        R                  R                  R                  U R                  R                  S5        g )NdevicedtypebiasFr   )super__init__nnConv2dconvBatchNorm2dbntorchinit	constant_weightr-   )selfr!   r"   r#   r$   r%   r&   r'   r(   r+   r,   dd	__class__s               S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/tiny_vit.pyr/   ConvNorm.__init__   s     /IIfr3&cW\c`bc	../B/?a0    c           
      :   U R                   U R                  p!UR                  UR                  UR                  -   S-  -  nUR                  US S 2S S S 4   -  nUR
                  UR                  UR                  -  UR                  UR                  -   S-  -  -
  n[        R                  R                  UR                  S5      U R                   R                  -  UR                  S5      UR                  SS  U R                   R                  U R                   R                  U R                   R                  U R                   R                  S9nUR                  R                   R#                  U5        UR
                  R                   R#                  U5        U$ )Ng      ?r   r      )r$   paddingr&   r'   )r2   r4   r8   running_varepsr-   running_meanr5   r0   r1   sizer'   shaper$   rA   r&   datacopy_)r9   cr4   wbms         r<   fuseConvNorm.fuse2   s3   		4772II"&&0S88HHqD$,--GGboo		1^^bff$,- -HHOOFF1I		(((!&&)QWWQR[99##TYY->->I[I[dhdmdmdtdt  v 	
A	!r>   )r4   r2   )r   r   r   r   r   r   NN)__name__
__module____qualname____firstlineno__intfloatr/   r5   no_gradrM   __static_attributes____classcell__r;   s   @r<   r   r      s    
 $%11 1 	1
 1 1 1 1 "1 1( ]]_ r>   r   c                   `   ^  \ rS rSr  SS\S\S\\R                     4U 4S jjjrS r	Sr
U =r$ )	
PatchEmbedA   r!   r"   	act_layerc                    > XES.n[         TU ]  5         SU l        [        XS-  SSS40 UD6U l        U" 5       U l        [        US-  USSS40 UD6U l        g )Nr*      r@      r   )r.   r/   r$   r   conv1actconv2)r9   r!   r"   r\   r+   r,   r:   r;   s          r<   r/   PatchEmbed.__init__B   s`     /flAq!BrB
;glGQ1CC
r>   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ N)r`   ra   rb   r9   xs     r<   forwardPatchEmbed.forwardQ   s.    JJqMHHQKJJqMr>   )ra   r`   rb   r$   NNrO   rP   rQ   rR   rS   r
   r0   Moduler/   rh   rV   rW   rX   s   @r<   rZ   rZ   A   sH     DD D BII	D D r>   rZ   c                   h   ^  \ rS rSr  S
S\S\S\S\\R                     S\4
U 4S jjjr	S r
S	rU =r$ )MBConvX   r!   r"   expand_ratior\   	drop_pathc                 h  > XgS.n[         T
U ]  5         [        X-  5      n	[        X4SS0UD6U l        U" 5       U l        [        X4SSSU	S.UD6U l        U" 5       U l        [        X4SSS.UD6U l        U" 5       U l	        US:  a  [        U5      U l        g [        R                  " 5       U l        g )Nr*   r#   r   r_   r#   r$   r%   r'           )r#   r(   )r.   r/   rS   r   r`   act1rb   act2conv3act3r   r0   Identityrq   )r9   r!   r"   rp   r\   rq   r+   r,   r:   mid_chsr;   s             r<   r/   MBConv.__init__Y   s     /f+,f:!:r:
K	g\1QAg\Y[\
K	gO1SOBO
K	09B),BKKMr>   c                     U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X-  nU R                  U5      nU$ re   )r`   ru   rb   rv   rw   rq   rx   )r9   rg   shortcuts      r<   rh   MBConv.forwardn   so    JJqMIIaLJJqMIIaLJJqMNN1	IIaLr>   )ru   rv   rx   r`   rb   rw   rq   rj   )rO   rP   rQ   rR   rS   rT   r
   r0   rl   r/   rh   rV   rW   rX   s   @r<   rn   rn   X   s^     RR R  	R
 BIIR R R*
 
r>   rn   c                   `   ^  \ rS rSr  SS\S\S\\R                     4U 4S jjjrS r	Sr
U =r$ )	PatchMerging{   dimout_dimr\   c                    > XES.n[         TU ]  5         [        XSSS40 UD6U l        U" 5       U l        [        X"SSS4SU0UD6U l        U" 5       U l        [        X"SSS40 UD6U l        g )Nr*   r   r   r_   r@   r'   )r.   r/   r   r`   ru   rb   rv   rw   )r9   r   r   r\   r+   r,   r:   r;   s          r<   r/   PatchMerging.__init__|   st     /cAq!:r:
K	g1aNN2N
K	g1a>2>
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$ re   )r`   ru   rb   rv   rw   rf   s     r<   rh   PatchMerging.forward   sH    JJqMIIaLJJqMIIaLJJqMr>   )ru   rv   r`   rb   rw   rj   rk   rX   s   @r<   r   r   {   sC     ?? ? BII	? ?  r>   r   c                   |   ^  \ rS rSr    S
S\S\S\\R                     S\\	\
\	   4   S\	4
U 4S jjjrS rS	rU =r$ )	ConvLayer   r   depthr\   rq   conv_expand_ratioc                    > XgS.n[         T
U ]  5         Xl        X l        [        R
                  " [        U5       V	s/ s H,  n	[        UUUU[        U[        5      (       a  XI   OU40 UD6PM.     sn	6 U l
        g s  sn	f Nr*   )r.   r/   r   r   r0   
Sequentialrangern   
isinstancelistblocks)r9   r   r   r\   rq   r   r+   r,   r:   ir;   s             r<   r/   ConvLayer.__init__   s     /
mm 5\
&
 " ! *9d ; ;	  "
&
 
 
&
s   3A:c                 (    U R                  U5      nU$ re   )r   rf   s     r<   rh   ConvLayer.forward   s    KKNr>   )r   r   r   )rt         @NN)rO   rP   rQ   rR   rS   r
   r0   rl   r	   rT   r   r/   rh   rV   rW   rX   s   @r<   r   r      sk     46')  BII	
 UDK/0  % 4 r>   r   c                      ^  \ 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$ )NormMlp   Nrt   in_featureshidden_featuresout_features
norm_layerr\   dropc	                 f  > XxS.n	[         T
U ]  5         U=(       d    UnU=(       d    UnU" U40 U	D6U l        [        R                  " X40 U	D6U l        U" 5       U l        [        R                  " U5      U l        [        R                  " X#40 U	D6U l	        [        R                  " U5      U l
        g r   )r.   r/   normr0   Linearfc1ra   Dropoutdrop1fc2drop2)r9   r   r   r   r   r\   r   r+   r,   r:   r;   s             r<   r/   NormMlp.__init__   s     /#2{)8[{1b1	99[@R@;ZZ%
99_AbAZZ%
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                  U5      nU$ re   )r   r   ra   r   r   r   rf   s     r<   rh   NormMlp.forward   sU    IIaLHHQKHHQKJJqMHHQKJJqMr>   )ra   r   r   r   r   r   )rO   rP   rQ   rR   r0   	LayerNormGELUrS   r   r
   rl   rT   r/   rh   rV   rW   rX   s   @r<   r   r      s     .2*.*,,,)+&& &c]& #3-	&
 RYY& BII& & &, r>   r   c                   P  ^  \ rS rSr% \R
                  R                  \   \S'   \	\
\R                  4   \S'        SS\S\S\S\S\\\4   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S jrSS jrSS jrSrU =r$ )	Attention   
fused_attnattention_bias_cacher   key_dim	num_heads
attn_ratio
resolutionc           	      <  > XgS.n[         TU ]  5         [        U[        5      (       a  [	        U5      S:X  d   eX0l        US-  U l        X l        [        XB-  5      U l	        U R                  U-  U l
        X@l        XPl        [        5       U l        [        R                   " U40 UD6U l        [        R$                  " XU R                  SU-  -   -  40 UD6U l        [        R$                  " U R                  U40 UD6U l        US   US   -  n	US   US   -  n
[*        R                  R-                  [*        R.                  " X:40 UD65      U l        U R3                  S[*        R.                  " X4U[*        R4                  S9SS9  0 U l        U R9                  5         g )	Nr*   r@   g      r   r   attention_bias_idxsF)
persistent)r.   r/   r   tuplelenr   scaler   rS   val_dimr   r   r   r   r   r0   r   r   r   qkvprojr5   	Parameteremptyattention_biasesregister_bufferlongr   reset_parameters)r9   r   r   r   r   r   r+   r,   r:   Nnum_offsetsr;   s              r<   r/   Attention.__init__   sf    /*e,,ZA1EEE"_
:/0||i/$$(*LL++	99St||a'k/I"JQbQIIdllC626	qMJqM) mjm3 % 2 25;;y3\Y[3\ ]!KKvUZZ@ 	 	

 %'! 	r>   c                 f   > [         TU ]  U5        U(       a  U R                  (       a  0 U l        g g g re   )r.   trainr   )r9   moder;   s     r<   r   Attention.train  s)    dD--(*D% .4r>   r+   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   $ re   )r5   jit
is_tracingtrainingr   r   strr   )r9   r+   
device_keys      r<   get_attention_biasesAttention.get_attention_biases  s    99!!T]]((D,D,D)DEEVJ!:!::8<8M8MaQUQiQiNi8j))*5,,Z88r>   c                    U R                  UR                  5      nUR                  u  p4nU R                  U5      nU R	                  U5      nUR                  X4U R                  S5      R                  U R                  U R                  U R                  /SS9u  pxn	UR                  SSSS5      nUR                  SSSS5      nU	R                  SSSS5      n	U R                  (       a  [        R                  " XxXS9nO9XpR                  -  nXxR                  SS5      -  n
X-   n
U
R!                  SS9n
X-  nUR                  SS5      R#                  X4U R$                  5      nU R'                  U5      nU$ )	Nr_   )r   r   r@   r   )	attn_mask)r   r+   rF   r   r   viewr   splitr   r   permuter   Fscaled_dot_product_attentionr   	transposesoftmaxreshaper   r   )r9   rg   	attn_biasBr   _r   qkvattns              r<   rh   Attention.forward  sC   --ahh7	''aIIaLhhqk((14::DLL$,,X\XdXd;ekl:maIIaAq!IIaAq!IIaAq!??..qQLAJJA{{2r**D#D<<B<'DAKK1%%aDLL9IIaLr>   c                 v    [         R                  R                  U R                  5        U R	                  5         g)z"Initialize parameters and buffers.N)r0   r6   zeros_r   _init_buffersr9   s    r<   r   Attention.reset_parameters)  s$    
t,,-r>   c           	      H   U R                   R                  n[        [        R                  " [        U R                  S   5      [        U R                  S   5      5      5      n[        U5      n0 n/ nU HY  nU HP  n[        US   US   -
  5      [        US   US   -
  5      4nX;  a  [        U5      XH'   UR                  XH   5        MR     M[     U R                   R                  [        R                  " XQ[        R                  S9R                  X35      5        0 U l        g)z.Compute and fill non-persistent buffer values.r   r   r*   N)r   r+   r   	itertoolsproductr   r   r   absappendrH   r5   tensorr   r   r   )	r9   r+   pointsr   attention_offsetsidxsp1p2offsets	            r<   r   Attention._init_buffers.  s    ))00i''dooa.@(A5YZI[C\]^KBbebem,c"Q%"Q%-.@A2034E0F%--56	   	  &&u||Duzz'Z'_'_`a'ef$&!r>   c                 $    U R                  5         g)z"Initialize non-persistent buffers.N)r   r   s    r<   init_non_persistent_buffers%Attention.init_non_persistent_buffers>  s    r>   )r   r   r   r   r   r   r   r   r   r   r   r   r   )   r^   )   r   NNT)r   N)rO   rP   rQ   rR   r5   r   Finalbool__annotations__r   r   TensorrS   r   r/   rU   r   r+   r   rh   r   r   r   rV   rW   rX   s   @r<   r   r      s    		%%sELL011 *2% %  %  	% 
 %  c3h%  % N ]]_+ +
95<< 9ELL 92
'  r>   r   c                      ^  \ rS rSrSrSSSSS\R                  SS4S\S	\S
\S\S\S\S\S\	\R                     4U 4S jjjrS rS\4S jrSrU =r$ )TinyVitBlockiC  a  TinyViT Block.

Args:
    dim (int): Number of input channels.
    num_heads (int): Number of attention heads.
    window_size (int): Window size.
    mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
    drop (float, optional): Dropout rate. Default: 0.0
    drop_path (float, optional): Stochastic depth rate. Default: 0.0
    local_conv_size (int): the kernel size of the convolution between
                           Attention and MLP. Default: 3
    act_layer: the activation function. Default: nn.GELU
   r   rt   r_   Nr   r   window_size	mlp_ratior   rq   local_conv_sizer\   c                   > XS.n[         TU ]  5         Xl        X l        US:  d   S5       eX0l        X@l        X-  S:X  d   S5       eX-  nX34n[        UUU4SUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        [        SU[        X-  5      UUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        US	-  n[!        X4USXS
.UD6U l        g )Nr*   r   z"window_size must be greater than 0z"dim must be divisible by num_headsr   )r   r   rt   )r   r   r\   r   r@   rs    )r.   r/   r   r   r	  r
  r   r   r   r0   ry   
drop_path1r   rS   mlp
drop_path2r   
local_conv)r9   r   r   r	  r
  r   rq   r  r\   r+   r,   r:   head_dimwindow_resolutionr%   r;   s                  r<   r/   TinyVitBlock.__init__R  s    /"QD DD&"!#I%II##(6
 (
 
	 2;R(9-R[[] 
0	

 
 2;R(9-R[[]""3esebder>   c           	         UR                   u  p#pEX4-  nUnX0R                  :X  aF  X@R                  :X  a7  UR                  X&U5      nU R                  U5      nUR	                  X#XE5      nGOU R                  X0R                  -  -
  U R                  -  nU R                  X@R                  -  -
  U R                  -  n	US:  =(       d    U	S:  n
U
(       a  [
        R                  " USSSU	SU45      nX8-   XI-   pXR                  -  nXR                  -  nUR	                  X-U R                  XR                  U5      R                  SS5      R                  X--  U-  U R                  U R                  -  U5      nU R                  U5      nUR	                  X-XR                  U R                  U5      R                  SS5      R                  X+X5      nU
(       a  US S 2S U2S U24   R                  5       nXpR                  U5      -   nUR                  SSSS5      nU R                  U5      nUR                  X%U5      R                  SS5      nXR                  U R                  U5      5      -   nUR	                  X#XE5      $ Nr   r@   r_   r   )rF   r	  r   r   r   r   r%   r   
contiguousr  r   r  r  r  )r9   rg   r   HWCLr}   pad_bpad_rrA   pHpWnHnWs                  r<   rh   TinyVitBlock.forward  sF   WW
aE   Q*:*:%:		!"A		!AqQ"A%%,<,<(<<@P@PPE%%,<,<(<<@P@PPEai,519GEE!aAua78 Y	'''B'''Bqd..4D4DaHRRSTVWX``T--0@0@@!A 		!A qb"2"2D4D4DaHRRSTVWX``abhjnAa!RaRiL++-q))IIaAq!OOAIIaA((A.,,vvaA!!r>   r   c                 n    SU R                    SU R                   SU R                   SU R                   3$ )Ndim=z, num_heads=z, window_size=z, mlp_ratio=)r   r   r	  r
  r   s    r<   
extra_reprTinyVitBlock.extra_repr  s@    dhhZ|DNN+; <"../|DNN;KM 	Mr>   )	r   r   r  r  r  r  r
  r   r	  )rO   rP   rQ   rR   __doc__r0   r   rS   rT   r
   rl   r/   rh   r   r%  rV   rW   rX   s   @r<   r  r  C  s    $  !!!#$)+-f-f -f 	-f
 -f -f -f !-f BII-f -f^&"PMC M Mr>   r  c                      ^  \ rS rSrSrSSSSS\R                  SS4S\S\S	\S
\S\S\S\S\	\\
\   4   S\\\R                        S\S\\R                     4U 4S jjjrS rS\4S jrSrU =r$ )TinyVitStagei  a  A basic TinyViT layer for one stage.

Args:
    dim (int): Number of input channels.
    out_dim: the output dimension of the layer
    depth (int): Number of blocks.
    num_heads (int): Number of attention heads.
    window_size (int): Local window size.
    mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
    drop (float, optional): Dropout rate. Default: 0.0
    drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
    downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
    local_conv_size: the kernel size of the depthwise convolution between attention and MLP. Default: 3
    act_layer: the activation function. Default: nn.GELU
r   rt   Nr_   r   r   r   r   r	  r
  r   rq   
downsampler  r\   c                 r  > XS.n[         TU ]  5         X0l        X l        U	b  U	" SUUUS.UD6U l        O![
        R                  " 5       U l        X:X  d   e[
        R                  " [        U5       Vs/ s H0  n[        SUUUUU[        U[        5      (       a  X   OUU
US.UD6PM2     sn6 U l        g s  snf )Nr*   )r   r   r\   )r   r   r	  r
  r   rq   r  r\   r  )r.   r/   r   r   r*  r0   ry   r   r   r  r   r   r   )r9   r   r   r   r   r	  r
  r   rq   r*  r  r\   r+   r,   r:   r   r;   s                   r<   r/   TinyVitStage.__init__  s      /
 !( # 	DO !kkmDO>!> mm 5\&# "  
#'#*4Y*E*E),9 /#
 
 "&# $ &#s   37B4c                     U R                  U5      nUR                  SSSS5      nU R                  U5      nUR                  SSSS5      nU$ r  )r*  r   r   rf   s     r<   rh   TinyVitStage.forward  sJ    OOAIIaAq!KKNIIaAq!r>   r   c                 :    SU R                    SU R                   3$ )Nr$  z, depth=)r   r   r   s    r<   r%  TinyVitStage.extra_repr  s    dll^8DJJ<88r>   )r   r   r*  r   )rO   rP   rQ   rR   r'  r0   r   rS   rT   r	   r   r   r
   rl   r/   rh   r   r%  rV   rW   rX   s   @r<   r)  r)    s    .  "3548#$)+.$.$ .$ 	.$
 .$ .$ .$ .$ UDK/0.$ !bii1.$ !.$ BII.$ .$`9C 9 9r>   r)  c                   z  ^  \ rS rSrSSSSSSSS	S
SSS	S\R
                  SS4S\S\S\S\\S4   S\\S4   S\\S4   S\\S4   S\	S\	S\	S\
S\	S\S\\R                     4U 4S jjjrS8S\
4S jjrS8S \R                  S\
4S! jjr\R"                  R$                  S" 5       r\R"                  R$                  S# 5       r\R"                  R$                  S9S$ j5       r\R"                  R$                  S8S% j5       r\R"                  R$                  S&\R                  4S' j5       rS:S\S\\   4S( jjr     S;S)\R4                  S*\\\\\   4      S+\
S,\
S-\S.\
S&\\\R4                     \\R4                  \\R4                     4   4   4S/ jjr   S<S*\\\\   4   S0\
S1\
4S2 jjrS3 rS9S4\
4S5 jjr S6 r!S7r"U =r#$ )=r   i  r_     avg)`        i   r@   r@      r@   )r_   r8        r  r  r   r  r   rt   皙?FNin_chansnum_classesglobal_pool
embed_dims.depthsr   window_sizesr
  	drop_ratedrop_path_rateuse_checkpointmbconv_expand_ratior  r\   c                   > [         TU ]  5         UUS.nX l        Xl        XPl        [        U5      U l        Xl        Xl        [        SUUS   US.UD6U l
        [        U
[        U5      5      n[        R                  " 5       U l        U R                  R                   nUS   n/ U l        [%        U R                  5       H  nUS:X  a  ['        SUUU   UUS UU    US.UD6nO`UU   nU[        US U 5      [        US US-    5       n
[)        SUUS-
     UUU   UU   UU   U R                  U	UU
[*        US.UD6nUnUS-  nU R                  R-                  U5        U =R"                  [/        UUSU 3S	9/-  sl        M     US
   =U l        U l        [5        [6        SS9n[9        U R0                  U4UUS.UD6U l        U R=                  SS9  g )Nr*   r   )r!   r"   r\   )r   r   r\   rq   r   r   )r   r   r   r   r	  r
  r   r  rq   r*  r\   r@   zstages.)num_chs	reductionmoduler   gh㈵>)rC   )	pool_typer   Fneeds_resetr  )r.   r/   r>  r=  rA  r   
num_stagesr
  grad_checkpointingrZ   patch_embedr   sumr0   r   stagesr$   feature_infor   r   r)  r   r   dictnum_featureshead_hidden_sizer   r   r   headinit_weights)r9   r=  r>  r?  r@  rA  r   rB  r
  rC  rD  rE  rF  r  r\   r+   r,   r:   dprr$   prev_dim	stage_idxstager   norm_layer_cfr;   s                            r<   r/   TinyVit.__init__  s9   & 	/& f+""0% 
qM
 	
 (FD mmo!!((a=t/IA~!   +'!"46)#45&9  %Y/!$S
);%<SUVAW=X!Y$ "9q=1# +'	2 ,Y 7"nn"$3,+'  #!KKu%$x6T[\e[fRg"h!ii= 0B 5?rNBD16)
 "$	

 
	 	e,r>   rM  c                 J    U R                  [        U R                  US95        g )NrL  )applyr   _init_weights)r9   rM  s     r<   rX  TinyVit.init_weightsY  s    

74--;GHr>   rL   c                 0   [        U[        R                  5      (       aM  [        UR                  SS9  UR
                  b+  [        R                  R                  UR
                  S5        g g U(       a#  [        US5      (       a  UR                  5         g g g )Ng{Gz?)stdr   r   )
r   r0   r   r   r8   r-   r6   r7   hasattrr   )r9   rL   rM  s      r<   ra  TinyVit._init_weights\  sk    a##!((,vv!!!!&&!, "WQ(:;;  <[r>   c                     S1$ Nr   r  r   s    r<   no_weight_decay_keywords TinyVit.no_weight_decay_keywordsd  s    "##r>   c                 z    U R                  5       R                  5        Vs1 s H  nSU;   d  M  UiM     sn$ s  snf rh  )
state_dictkeysrf   s     r<   no_weight_decayTinyVit.no_weight_decayh  s4    ??,113O3a7IQ7N3OOOs   
88c                 0    [        SU(       a  SOSS/S9nU$ )Nz^patch_embedz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)stemr   )rT  )r9   coarsematchers      r<   group_matcherTinyVit.group_matcherl  s'     (.$455
 r>   c                     Xl         g re   )rO  )r9   enables     r<   set_grad_checkpointingTinyVit.set_grad_checkpointingw  s    "(r>   r   c                 .    U R                   R                  $ re   )rW  fcr   s    r<   get_classifierTinyVit.get_classifier{  s    yy||r>   c                 B    Xl         U R                  R                  XS9  g )N)rK  )r>  rW  reset)r9   r>  r?  s      r<   reset_classifierTinyVit.reset_classifier  s    &		;r>   rg   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[        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   r   rR  rP  r5   r   is_scripting	enumeraterO  r   r   )r9   rg   r  r   r  r  r  intermediatestake_indices	max_indexrR  feat_idxr\  s                r<   forward_intermediatesTinyVit.forward_intermediates  s    * Y&D(DD&"6s4;;7G"Q Q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   r   rR  r  )r9   r  r  r  r  r  s         r<   prune_intermediate_layers!TinyVit.prune_intermediate_layers  sK     #7s4;;7G"Qkk.9q=1!!!R(r>   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$ re   )rP  rO  r5   r   r  r   rR  rf   s     r<   forward_featuresTinyVit.forward_features  sX    Q""599+A+A+C+Ct{{A.A  AAr>   
pre_logitsc                 X    U(       a  U R                  XS9nU$ U R                  U5      nU$ )N)r  )rW  )r9   rg   r  s      r<   forward_headTinyVit.forward_head  s/    3=DIIaI/ DH99Q<r>   c                 J    U R                  U5      nU R                  U5      nU$ re   )r  r  rf   s     r<   rh   TinyVit.forward  s'    !!!$a r>   )rA  rS  rO  rW  rV  r=  r
  r>  rU  rN  rP  rR  r  Fre   )NFFr  F)r   FT)$rO   rP   rQ   rR   r0   r   rS   r   r   rT   r  r
   rl   r/   rX  ra  r5   r   ignoreri  rn  rt  rx  r|  r   r  r  r	   r   r  r  r  r  rh   rV   rW   rX   s   @r<   r   r     s    #$*=&2)7,9!!$'#(),#$)+#Y-Y- Y- 	Y-
 c3hY- #s(OY- S#XY-  S/Y- Y- Y- "Y- !Y- "'Y- !Y- BIIY- Y-vI I!ryy !t ! YY$ $ YYP P YY  YY) ) YY		  <C <hsm < 8<$$',+ ||+  eCcN34+  	+ 
 +  +  !%+  
tELL!5tELL7I)I#JJ	K+ ^ ./$#	3S	>*  	$  r>   c                 6   SU R                  5       ;   a  U S   n UR                  5       n0 nU R                  5        HY  u  pEUR                  S5      (       a  M  SU;   a2  [	        UR
                  X$   R                  S S S2   5      R
                  nXSU'   M[     U$ )Nmodelr   r   r   )rm  rl  itemsendswithr   TrF   )rl  r  	target_sdout_dictr   r   s         r<   checkpoint_filter_fnr    s    *//##(
  "IH  "::+,,"/Y\5G5G"5MNPPA # Or>   c                 0    U S[         [        SSSSSSS.
UE$ )	Nr2  zpatch_embed.conv1.convzhead.fc)r  r  )r_      r  gffffff?z
apache-2.0)
urlr>  meanrd  
first_conv
classifier	pool_size
input_sizecrop_pctlicenser   )r  kwargss     r<   _cfgr    s4    %#.#  r>   ztimm/iQU  )	hf_hub_idr>  )r  )r_   r6  r6  )r9  r9  g      ?)r  r  r  r  )r_      r  )   r  squash)r  r  r  r  	crop_mode)ztiny_vit_5m_224.dist_in22kz"tiny_vit_5m_224.dist_in22k_ft_in1kztiny_vit_5m_224.in1kztiny_vit_11m_224.dist_in22kz#tiny_vit_11m_224.dist_in22k_ft_in1kztiny_vit_11m_224.in1kztiny_vit_21m_224.dist_in22kz#tiny_vit_21m_224.dist_in22k_ft_in1kztiny_vit_21m_224.in1kz#tiny_vit_21m_384.dist_in22k_ft_in1kz#tiny_vit_21m_512.dist_in22k_ft_in1kc                 l    UR                  SS5      n[        [        U U4[        SUS9[        S.UD6nU$ )Nout_indices)r   r   r@   r_   T)flatten_sequentialr  )feature_cfgpretrained_filter_fn)popr   r   rT  r  )variant
pretrainedr  r  r  s        r<   _create_tiny_vitr  $  sJ    **]L9K  DkJ1 E Lr>   c                 h    [        / SQ/ SQ/ SQ/ SQSS9nUR                  U5        [        SU 40 UD6$ )N)@         i@  r7  )r@   r^      
   r;  rt   r@  rA  r   rB  rD  tiny_vit_5m_224rT  updater  r  r  model_kwargss      r<   r  r  1  s>    &"L -zJ\JJr>   c                 h    [        / SQ/ SQ/ SQ/ SQSS9nUR                  U5        [        SU 40 UD6$ )N)r  r     i  r7  )r@   r^   r   r   r;  r<  r  tiny_vit_11m_224r  r  s      r<   r  r  >  s>    &"L .
KlKKr>   c                 h    [        / SQ/ SQ/ SQ/ SQSS9nUR                  U5        [        SU 40 UD6$ )Nr4  r5  r6  i@  r7  r_   r8  r9     r;  g?r  tiny_vit_21m_224r  r  s      r<   r  r  K  s>    & "L .
KlKKr>   c                 h    [        / SQ/ SQ/ SQ/ SQSS9nUR                  U5        [        SU 40 UD6$ )Nr  r7  r  )r9  r9  r:  r9  r<  r  tiny_vit_21m_384r  r  s      r<   r  r  X  >    & %L .
KlKKr>   c                 h    [        / SQ/ SQ/ SQ/ SQSS9nUR                  U5        [        SU 40 UD6$ )Nr  r7  r  )r  r      r  r<  r  tiny_vit_21m_512r  r  s      r<   r  r  e  r  r>   )r  r  )?r'  __all__r   	functoolsr   typingr   r   r   r   r	   r
   r   r5   torch.nnr0   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   r   	_registryr   r   r   r   rl   rZ   rn   r   r   r   r   r  r)  r   r  r  default_cfgsr  r  r  r  r  r  r  r>   r<   <module>r     sN   +   @ @ @     A^ ^ ^ * + 1 3 <!uxx"" !H . RYY  F299 4		 @bii Bj jZhM299 hMV  %I9299 I9XPbii Pf  %"&#
 +/+ ! $($
 ,0, " $($
 ,0, " ,0 Hs,
 ,0 Hsh,[2& 2j
 	K 	K 	L 	L 	L 	L 	L 	L 	L 	Lr>   