
    ^jt                        d Z dgZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmc mZ ddlmZmZ ddlmZmZmZmZmZmZmZ dd	lmZ dd
l m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z)  G d dej                  jT                        Z+ G d dejX                        Z- G d dejX                        Z. G d dejX                        Z/ G d dejX                        Z0 G d dejX                        Z1 G d dej                  jX                        Z2 G d dejX                        Z3 e#e3        G d dejX                        Z4 G d  dejX                        Z5d! Z6d6d"Z7 e) e7d#d$%       e7d#&       e7d#&       e7d#d$%       e7d#&       e7d#&       e7d#d$%       e7d#&       e7d#&       e7d#d'd(d)*       e7d#d+d,d)d-.      d/      Z8d7d0Z9e(d7d1       Z:e(d7d2       Z;e(d7d3       Z<e(d7d4       Z=e(d7d5       Z>y)8z TinyViT

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                        e Zd Z	 	 	 	 	 	 	 	 ddedededededededef fd	Z ej                         d
        Z xZ	S )ConvNormin_chsout_chsksstridepaddilationgroupsbn_weight_initc           	         |	|
d}t         |           t        j                  |||||||fddi|| _        t        j
                  |fi || _        t        j                  j                  j                  | j                  j                  |       t        j                  j                  j                  | j                  j                  d       y )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               _/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/tiny_vit.pyr.   zConvNorm.__init__   s     /IIfgr63&cW\c`bc	../B/?a0    c           	      B   | j                   | j                  }}|j                  |j                  |j                  z   dz  z  }|j                  |d d d d d f   z  }|j
                  |j                  |j                  z  |j                  |j                  z   dz  z  z
  }t        j                  j                  |j                  d      | j                   j                  z  |j                  d      |j                  dd  | j                   j                  | j                   j                  | j                   j                  | j                   j                        }|j                  j                   j#                  |       |j
                  j                   j#                  |       |S )Ng      ?r   r      )r#   paddingr%   r&   )r1   r3   r7   running_varepsr,   running_meanr4   r/   r0   sizer&   shaper#   r?   r%   datacopy_)r8   cr3   wbms         r;   fusezConvNorm.fuse2   s5   		4772II"&&0S88HHqD$,--GGboo		1^^bff$,- -HHOOFF1I		(((!&&)QWWQR[99##TYY->->I[I[dhdmdmdtdt  v 	
A	!r<   )r   r   r   r   r   r   NN)
__name__
__module____qualname__intfloatr.   r4   no_gradrK   __classcell__r:   s   @r;   r   r      s    
 $%11 1 	1
 1 1 1 1 "1( U]]_ r<   r   c                   R     e Zd Z	 	 ddededeej                     f fdZd Z xZ	S )
PatchEmbedr    r!   	act_layerc                     ||d}t         |           d| _        t        ||dz  dddfi || _         |       | _        t        |dz  |dddfi || _        y )Nr)      r>      r   )r-   r.   r#   r   conv1actconv2)r8   r    r!   rV   r*   r+   r9   r:   s          r;   r.   zPatchEmbed.__init__B   sd     /fglAq!BrB
;glGQ1CC
r<   c                 l    | j                  |      }| j                  |      }| j                  |      }|S N)rZ   r[   r\   r8   xs     r;   forwardzPatchEmbed.forwardQ   s.    JJqMHHQKJJqMr<   NN
rL   rM   rN   rO   r
   r/   Moduler.   ra   rR   rS   s   @r;   rU   rU   A   s=     DD D BII	Dr<   rU   c                   Z     e Zd Z	 	 ddedededeej                     def
 fdZd Z	 xZ
S )	MBConvr    r!   expand_ratiorV   	drop_pathc                 n   ||d}t         
|           t        ||z        }	t        ||	fddi|| _         |       | _        t        |	|	fddd|	d|| _         |       | _        t        |	|fddd|| _         |       | _	        |dkD  rt        |      | _        y t        j                         | _        y )Nr)   r"   r   rY   r"   r#   r$   r&           )r"   r'   )r-   r.   rO   r   rZ   act1r\   act2conv3act3r   r/   Identityrh   )r8   r    r!   rg   rV   rh   r*   r+   r9   mid_chsr:   s             r;   r.   zMBConv.__init__Y   s     /f|+,fg:!:r:
K	gw\1QAg\Y[\
K	gwO1SOBO
K	09B),BKKMr<   c                    |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }||z  }| j                  |      }|S r^   )rZ   rl   r\   rm   rn   rh   ro   )r8   r`   shortcuts      r;   ra   zMBConv.forwardn   sq    JJqMIIaLJJqMIIaLJJqMNN1	XIIaLr<   rb   )rL   rM   rN   rO   rP   r
   r/   rd   r.   ra   rR   rS   s   @r;   rf   rf   X   sS     RR R  	R
 BIIR R*
r<   rf   c                   R     e Zd Z	 	 ddededeej                     f fdZd Z xZ	S )PatchMergingdimout_dimrV   c                     ||d}t         |           t        ||dddfi || _         |       | _        t        ||dddfd|i|| _         |       | _        t        ||dddfi || _        y )Nr)   r   r   rY   r>   r&   )r-   r.   r   rZ   rl   r\   rm   rn   )r8   rv   rw   rV   r*   r+   r9   r:   s          r;   r.   zPatchMerging.__init__|   s|     /c7Aq!:r:
K	gw1aNN2N
K	gw1a>2>
r<   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S r^   )rZ   rl   r\   rm   rn   r_   s     r;   ra   zPatchMerging.forward   sH    JJqMIIaLJJqMIIaLJJqMr<   rb   rc   rS   s   @r;   ru   ru   {   s9     ?? ? BII	? r<   ru   c                   n     e Zd Z	 	 	 	 ddededeej                     deee	e   f   def
 fdZ
d Z xZS )		ConvLayerrv   depthrV   rh   conv_expand_ratioc                     ||d}t         
|           || _        || _        t	        j
                  t        |      D 	cg c]'  }	t        ||||t        |t              r||	   n|fi |) c}	 | _
        y c c}	w Nr)   )r-   r.   rv   r|   r/   
Sequentialrangerf   
isinstancelistblocks)r8   rv   r|   rV   rh   r}   r*   r+   r9   ir:   s             r;   r.   zConvLayer.__init__   s     /
mm 5\
&
  ! *9d ;	! 
&
 
 
&
s   ,A5c                 (    | j                  |      }|S r^   )r   r_   s     r;   ra   zConvLayer.forward   s    KKNr<   )rk         @NN)rL   rM   rN   rO   r
   r/   rd   r	   rP   r   r.   ra   rR   rS   s   @r;   r{   r{      sa     46')  BII	
 UDK/0  %4r<   r{   c                        e Zd Zddej                  ej
                  dddfdedee   dee   deej                     deej                     de
f fd	Zd
 Z xZS )NormMlpNrk   in_featureshidden_featuresout_features
norm_layerrV   dropc	                 P   ||d}	t         
|           |xs |}|xs |} ||fi |	| _        t        j                  ||fi |	| _         |       | _        t        j                  |      | _        t        j                  ||fi |	| _	        t        j                  |      | _
        y r   )r-   r.   normr/   Linearfc1r[   Dropoutdrop1fc2drop2)r8   r   r   r   r   rV   r   r*   r+   r9   r:   s             r;   r.   zNormMlp.__init__   s     /#2{)8[{1b1	99[/@R@;ZZ%
99_lAbAZZ%
r<   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S r^   )r   r   r[   r   r   r   r_   s     r;   ra   zNormMlp.forward   sU    IIaLHHQKHHQKJJqMHHQKJJqMr<   )rL   rM   rN   r/   	LayerNormGELUrO   r   r
   rd   rP   r.   ra   rR   rS   s   @r;   r   r      s~     .2*.*,,,)+&& &c]& #3-	&
 RYY& BII& &,r<   r   c                   6    e Zd ZU ej                  j
                  e   ed<   ee	ej                  f   ed<   	 	 	 	 	 ddededededeeef   f
 fdZ ej                         d fd		       Zd
ej                   dej                  fdZd ZddZddZddZ xZS )	Attention
fused_attnattention_bias_cacherv   key_dim	num_heads
attn_ratio
resolutionc                 D   ||d}t         |           t        |t              rt	        |      dk(  sJ || _        |dz  | _        || _        t        ||z        | _	        | j                  |z  | _
        || _        || _        t               | _        t        j                   |fi || _        t        j$                  ||| j                  d|z  z   z  fi || _        t        j$                  | j                  |fi || _        |d   |d   z  }	|d   |d   z  }
t*        j                  j-                  t+        j.                  ||
fi |      | _        | j3                  dt+        j.                  |	|	f|t*        j4                        d       i | _        | j9                          y )	Nr)   r>   g      r   r   attention_bias_idxsF)
persistent)r-   r.   r   tuplelenr   scaler   rO   val_dimrw   r   r   r   r   r/   r   r   r   qkvprojr4   	Parameteremptyattention_biasesregister_bufferlongr   reset_parameters)r8   rv   r   r   r   r   r*   r+   r9   Nnum_offsetsr:   s              r;   r.   zAttention.__init__   su    /*e,ZA1EEE"_
:/0||i/$$(*LL++	99S)t||a'k/I"JQbQIIdllC626	qMJqM) mjm3 % 2 25;;y+3\Y[3\ ]!KKAvUZZ@ 	 	

 %'! 	r<   c                 R    t         |   |       |r| j                  ri | _        y y y r^   )r-   trainr   )r8   moder:   s     r;   r   zAttention.train  s)    dD--(*D% .4r<   r*   returnc                 4   t         j                  j                         s| j                  r| j                  d d | j
                  f   S t        |      }|| j                  vr*| j                  d d | j
                  f   | j                  |<   | j                  |   S r^   )r4   jit
is_tracingtrainingr   r   strr   )r8   r*   
device_keys      r;   get_attention_biaseszAttention.get_attention_biases  s    99!T]]((D,D,D)DEEVJ!:!::8<8M8MaQUQiQiNi8j))*5,,Z88r<   c                    | j                  |j                        }|j                  \  }}}| j                  |      }| j	                  |      }|j                  ||| j                  d      j                  | j                  | j                  | j                  gd      \  }}}	|j                  dddd      }|j                  dddd      }|	j                  dddd      }	| j                  rt        j                  |||	|      }n@|| j                  z  }||j                  dd      z  }
|
|z   }
|
j!                  d      }
|
|	z  }|j                  dd      j#                  ||| j$                        }| j'                  |      }|S )	NrY   )rv   r   r>   r   )	attn_mask)r   r*   rD   r   r   viewr   splitr   r   permuter   Fscaled_dot_product_attentionr   	transposesoftmaxreshaperw   r   )r8   r`   	attn_biasBr   _r   qkvattns              r;   ra   zAttention.forward  sW   --ahh7	''1aIIaLhhqk((1a4::DLL$,,X\XdXd;ekl:m1aIIaAq!IIaAq!IIaAq!??..q!Q)LADJJAq{{2r**D)#D<<B<'DqAKK1%%aDLL9IIaLr<   c                 v    t         j                  j                  | j                         | j	                          y)z"Initialize parameters and buffers.N)r/   r5   zeros_r   _init_buffersr8   s    r;   r   zAttention.reset_parameters)  s$    
t,,-r<   c           	      H   | j                   j                  }t        t        j                  t        | j                  d         t        | j                  d                     }t        |      }i }g }|D ]W  }|D ]P  }t        |d   |d   z
        t        |d   |d   z
        f}||vrt        |      ||<   |j                  ||          R Y | j                   j                  t        j                  ||t        j                        j                  ||             i | _        y)z.Compute and fill non-persistent buffer values.r   r   r)   N)r   r*   r   	itertoolsproductr   r   r   absappendrF   r4   tensorr   r   r   )	r8   r*   pointsr   attention_offsetsidxsp1p2offsets	            r;   r   zAttention._init_buffers.  s   ))00i''dooa.@(A5YZI[C\]^K 	7B 7bebem,c"Q%"Q%-.@A!22034E0F%f--f56	7	7 	  &&u||Duzz'Z'_'_`acd'ef$&!r<   c                 $    | j                          y)z"Initialize non-persistent buffers.N)r   r   s    r;   init_non_persistent_buffersz%Attention.init_non_persistent_buffers>  s    r<   )   rX   )   r   NNT)r   N)rL   rM   rN   r4   r   Finalbool__annotations__r   r   TensorrO   r   r.   rQ   r   r*   r   ra   r   r   r   rR   rS   s   @r;   r   r      s    		%%sELL011 *2% %  %  	% 
 %  c3h% N U]]_+ +
95<< 9ELL 92
' r<   r   c                        e Zd ZdZdddddej
                  ddfdeded	ed
ededededeej                     f fdZ
d ZdefdZ xZS )TinyVitBlocka5   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   rk   rY   Nrv   r   window_size	mlp_ratior   rh   local_conv_sizerV   c                    |	|
d}t         |           || _        || _        |dkD  sJ d       || _        || _        ||z  dk(  sJ d       ||z  }||f}t        |||fd|d|| _        |dkD  rt        |      nt        j                         | _        t        d|t        ||z        ||d|| _        |dkD  rt        |      nt        j                         | _        |d	z  }t!        ||f|d||d
|| _        y )Nr)   r   z"window_size must be greater than 0z"dim must be divisible by num_headsr   )r   r   rk   )r   r   rV   r   r>   rj    )r-   r.   rv   r   r   r   r   r   r   r/   rp   
drop_path1r   rO   mlp
drop_path2r   
local_conv)r8   rv   r   r   r   r   rh   r   rV   r*   r+   r9   head_dimwindow_resolutionr$   r:   s                  r;   r.   zTinyVitBlock.__init__R  s4    /"QD DD&"Y!#I%II#)#(+6
 (
 
	 2;R(9-R[[] 
i0	

 
 2;R(9-R[[]""3es[^ebder<   c           	         |j                   \  }}}}||z  }|}|| j                  k(  rI|| j                  k(  r:|j                  |||      }| j                  |      }|j	                  ||||      }n| j                  || j                  z  z
  | j                  z  }| j                  || j                  z  z
  | j                  z  }	|dkD  xs |	dkD  }
|
rt        j                  |ddd|	d|f      }||z   ||	z   }}|| j                  z  }|| j                  z  }|j	                  ||| j                  || j                  |      j                  dd      j                  ||z  |z  | j                  | j                  z  |      }| j                  |      }|j	                  |||| j                  | j                  |      j                  dd      j                  ||||      }|
r|d d d |d |f   j                         }|| j                  |      z   }|j                  dddd      }| j                  |      }|j                  |||      j                  dd      }|| j                  | j                  |            z   }|j	                  ||||      S Nr   r>   rY   r   )rD   r   r   r   r   r   r$   r   
contiguousr   r   r   r   r   )r8   r`   r   HWCLrs   pad_bpad_rr?   pHpWnHnWs                  r;   ra   zTinyVitBlock.forward  s~   WW
1aE   Q$*:*:%:		!Q"A		!Aq!Q"A%%D,<,<(<<@P@PPE%%D,<,<(<<@P@PPEai,519GEE!aAua78 YE	Bt'''Bt'''Bq"d..D4D4DaHRRSTVWX``BT--0@0@@!A 		!A q"b$"2"2D4D4DaHRRSTVWX``abdfhjlmnAa!RaRiL++-tq))IIaAq!OOAIIaA((A.,,vvaAq!!r<   r   c                 n    d| j                    d| j                   d| j                   d| j                   S )Ndim=z, num_heads=z, window_size=z, mlp_ratio=)rv   r   r   r   r   s    r;   
extra_reprzTinyVitBlock.extra_repr  s@    dhhZ|DNN+; <"../|DNN;KM 	Mr<   )rL   rM   rN   __doc__r/   r   rO   rP   r
   rd   r.   ra   r   r  rR   rS   s   @r;   r   r   C  s    $  !!!#$)+-f-f -f 	-f
 -f -f -f !-f BII-f^&"PMC Mr<   r   c                        e Zd ZdZdddddej
                  ddfdededed	ed
edededeee	e   f   de
eej                        dedeej                     f fdZd ZdefdZ xZS )TinyVitStagea   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   rk   NrY   rv   rw   r|   r   r   r   r   rh   
downsampler   rV   c                 d   ||d}t         |           || _        || _        |	 |	d|||d|| _        n t        j                         | _        ||k(  sJ t        j                  t        |      D cg c]+  }t        d|||||t        |t              r||   n||
|d|- c} | _        y c c}w )Nr)   )rv   rw   rV   )rv   r   r   r   r   rh   r   rV   r   )r-   r.   r|   rw   r  r/   rp   r   r   r   r   r   r   )r8   rv   rw   r|   r   r   r   r   rh   r  r   rV   r*   r+   r9   r   r:   s                   r;   r.   zTinyVitStage.__init__  s      /
 !( # 	DO !kkmDO'>!> mm 5\&#   
#'#*4Y*E)A,9 /#
 
&# $ &#s   30B-c                     | j                  |      }|j                  dddd      }| j                  |      }|j                  dddd      }|S r   )r  r   r   r_   s     r;   ra   zTinyVitStage.forward  sJ    OOAIIaAq!KKNIIaAq!r<   r   c                 :    d| j                    d| j                   S )Nr  z, depth=)rw   r|   r   s    r;   r  zTinyVitStage.extra_repr  s    dll^8DJJ<88r<   )rL   rM   rN   r  r/   r   rO   rP   r	   r   r   r
   rd   r.   ra   r   r  rR   rS   s   @r;   r
  r
    s    .  "3548#$)+.$.$ .$ 	.$
 .$ .$ .$ .$ UDK/0.$ !bii1.$ !.$ BII.$`9C 9r<   r
  c                   N    e Zd Zddddddddd	d
dddej                  ddfdedededeedf   deedf   deedf   deedf   dededede	dedede
ej                     f fdZd6de	fdZd6dej                  de	fd Zej                   j"                  d!        Zej                   j"                  d"        Zej                   j"                  d7d#       Zej                   j"                  d6d$       Zej                   j"                  d%ej                  fd&       Zd8dedee   fd'Z	 	 	 	 	 d9d(ej2                  d)eeeee   f      d*e	d+e	d,ed-e	d%eeej2                     eej2                  eej2                     f   f   fd.Z	 	 	 d:d)eeee   f   d/e	d0e	fd1Zd2 Zd7d3e	fd4Zd5 Z  xZ!S );r   rY     avg)`        i   r>   r>      r>   )rY   r        r   r   r   r   r   rk   皙?FNin_chansnum_classesglobal_pool
embed_dims.depthsr   window_sizesr   	drop_ratedrop_path_rateuse_checkpointmbconv_expand_ratior   rV   c                    t         |           ||d}|| _        || _        || _        t        |      | _        || _        || _        t        d||d   |d|| _
        t        |
t        |            }t        j                         | _        | j                  j                   }|d   }g | _        t%        | j                        D ]  }|dk(  rt'        d|||   ||d ||    |d|}n`||   }|t        |d |       t        |d |dz           }
t)        d||dz
     |||   ||   ||   | j                  |	||
t*        |d|}|}|dz  }| j                  j-                  |       | xj"                  t/        ||d| 	      gz  c_         |d
   x| _        | _        t5        t6        d      }t9        | j0                  |f||d|| _        | j=                  d       y )Nr)   r   )r    r!   rV   )rv   r|   rV   rh   r}   r   )rv   rw   r|   r   r   r   r   r   rh   r  rV   r>   zstages.)num_chs	reductionmoduler   gh㈵>)rA   )	pool_typer   Fneeds_resetr   )r-   r.   r  r  r  r   
num_stagesr   grad_checkpointingrU   patch_embedr   sumr/   r   stagesr#   feature_infor   r{   r
  ru   r   dictnum_featureshead_hidden_sizer   r   r   headinit_weights)r8   r  r  r  r  r  r   r   r   r!  r"  r#  r$  r   rV   r*   r+   r9   dprr#   prev_dim	stage_idxstagerw   norm_layer_cfr:   s                            r;   r.   zTinyVit.__init__  sJ   & 	/& f+""0% 
qM
 	
 (FD mmo!!((a=t/ 	j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=	jB 5?rNBD16)
 "$	

 
	 	e,r<   r+  c                 P    | j                  t        | j                  |             y )Nr*  )applyr   _init_weights)r8   r+  s     r;   r6  zTinyVit.init_weightsY  s    

74--;GHr<   rJ   c                    t        |t        j                        rOt        |j                  d       |j
                  +t        j                  j                  |j
                  d       y y |rt        |d      r|j                          y y y )Ng{Gz?)stdr   r   )
r   r/   r   r   r7   r,   r5   r6   hasattrr   )r8   rJ   r+  s      r;   r>  zTinyVit._init_weights\  se    a#!((,vv!!!!&&!, "WQ(:;  <[r<   c                     dhS Nr   r   r   s    r;   no_weight_decay_keywordsz TinyVit.no_weight_decay_keywordsd  s    "##r<   c                 n    | j                         j                         D ch c]	  }d|v s| c}S c c}w rC  )
state_dictkeysr_   s     r;   no_weight_decayzTinyVit.no_weight_decayh  s.    ??,113Oa7IQ7NOOOs   	22c                 ,    t        d|rdnddg      }|S )Nz^patch_embedz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)stemr   )r2  )r8   coarsematchers      r;   group_matcherzTinyVit.group_matcherl  s'     (.$455
 r<   c                     || _         y r^   )r-  )r8   enables     r;   set_grad_checkpointingzTinyVit.set_grad_checkpointingw  s
    "(r<   r   c                 .    | j                   j                  S r^   )r5  fcr   s    r;   get_classifierzTinyVit.get_classifier{  s    yy||r<   c                 L    || _         | j                  j                  ||       y )N)r)  )r  r5  reset)r8   r  r  s      r;   reset_classifierzTinyVit.reset_classifier  s    &		{;r<   r`   indicesr   
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]Z  \  }}| j                  r+t        j
                  j                         st        ||      }n ||      }||v sJ|j                  |       \ |r|S ||fS )a   Forward features that returns intermediates.

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

        )NCHWzOutput shape must be NCHW.Nr   )r   r   r0  r.  r4   r   is_scripting	enumerater-  r   r   )r8   r`   rW  r   rX  rY  rZ  intermediatestake_indices	max_indexr0  feat_idxr:  s                r;   forward_intermediateszTinyVit.forward_intermediates  s    * Y&D(DD&"6s4;;7G"Qi Q99!!#:[[F[[)a-0F(0 	(OHe&&uyy/E/E/Gua(!H<'$$Q'	(   -r<   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r0  rV  )r8   rW  rd  re  r`  ra  s         r;   prune_intermediate_layersz!TinyVit.prune_intermediate_layers  sM     #7s4;;7G"Qikk.9q=1!!!R(r<   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r^   )r.  r-  r4   r   r]  r   r0  r_   s     r;   forward_featureszTinyVit.forward_features  sU    Q""599+A+A+Ct{{A.A  AAr<   
pre_logitsc                 V    |r| j                  ||      }|S | j                  |      }|S )N)rk  )r5  )r8   r`   rk  s      r;   forward_headzTinyVit.forward_head  s1    3=DIIaJI/ DH99Q<r<   c                 J    | j                  |      }| j                  |      }|S r^   )rj  rm  r_   s     r;   ra   zTinyVit.forward  s'    !!!$a r<   r   Fr^   )NFFr\  F)r   FT)"rL   rM   rN   r/   r   rO   r   r   rP   r   r
   rd   r.   r6  r>  r4   r   ignorerD  rH  rM  rP  rS  r   rV  r   r	   r   rc  rh  rj  rm  ra   rR   rS   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-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                 $   d| j                         v r| d   } |j                         }i }| j                         D ]S  \  }}|j                  d      rd|v r3t	        |j
                  ||   j                  d d d         j
                  }|||<   U |S )Nmodelr   r   r   )rG  rF  itemsendswithr   TrD   )rF  rr  	target_sdout_dictr   r   s         r;   checkpoint_filter_fnrx    s    *//##(
  "IH  " 1::+,"/Yq\5G5G"5MNPPA Or<   c                 0    | dt         t        ddddddd
|S )	Nr  zpatch_embed.conv1.convzhead.fc)r   r   )rY      rz  gffffff?z
apache-2.0)
urlr  meanr@  
first_conv
classifier	pool_size
input_sizecrop_pctlicenser   )r{  kwargss     r;   _cfgr    s4    %#.#  r<   ztimm/iQU  )	hf_hub_idr  )r  )rY   r  r  )r  r  g      ?)r  r  r  r  )rY      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                 r    |j                  dd      }t        t        | |ft        d|      t        d|}|S )Nout_indices)r   r   r>   rY   T)flatten_sequentialr  )feature_cfgpretrained_filter_fn)popr   r   r2  rx  )variant
pretrainedr  r  rr  s        r;   _create_tiny_vitr  $  sJ    **]L9K  DkJ1 E Lr<   c                 n    t        g dg dg dg dd      }|j                  |       t        d| fi |S )N)@         i@  r  )r>   rX      
   r  rk   r  r  r   r   r"  tiny_vit_5m_224r2  updater  r  r  model_kwargss      r;   r  r  1  s>    &"L -zJ\JJr<   c                 n    t        g dg dg dg dd      }|j                  |       t        d| fi |S )N)r  r     i  r  )r>   rX   r   r   r  r  r  tiny_vit_11m_224r  r  s      r;   r  r  >  s>    &"L .
KlKKr<   c                 n    t        g dg dg dg dd      }|j                  |       t        d| fi |S )Nr  r  r  i@  r  rY   r  r     r  g?r  tiny_vit_21m_224r  r  s      r;   r  r  K  s>    & "L .
KlKKr<   c                 n    t        g dg dg dg dd      }|j                  |       t        d| fi |S )Nr  r  r  )r  r  r  r  r  r  tiny_vit_21m_384r  r  s      r;   r  r  X  >    & %L .
KlKKr<   c                 n    t        g dg dg dg dd      }|j                  |       t        d| fi |S )Nr  r  r  )r  r      r  r  r  tiny_vit_21m_512r  r  s      r;   r  r  e  r  r<   )rg  ro  )?r  __all__r   	functoolsr   typingr   r   r   r   r	   r
   r   r4   torch.nnr/   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   rd   rU   rf   ru   r{   r   r   r   r
  r   rx  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<   