
    kh                     .   d Z ddgZddlmZmZmZmZ ddl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 d	d
lmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZm Z  ddde!xs e"xs e#fdZ$dede!xs e"xs e#de%de%fdZ&de%xs e"e%df   de%xs e"e%df   fdZ' G d dejP                        Z) G d dejP                        Z* G d dejP                        Z+ G d dejP                        Z, G d  d!ejP                        Z- G d" d#ejP                        Z. ee.        G d$ d%ejP                        Z/ G d& d'ejP                        Z0	 	 dfd(e%d)e%d*e%d+e1d,e2d-e2d.e3d/e2fd0Z4 G d1 d2ejj                        Z6 G d3 d4ejP                        Z7 G d5 d6ejP                        Z8 G d7 d8ejP                        Z9 G d9 dejP                        Z: G d: dejP                        Z;dgd;Z< e i d< e<d=>      d? e<d=>      d@ e<d=dAdBdCD      dE e<d=dFdGdCD      dH e<d=>      dI e<d=dAdBdCD      dJ e<d=dFdGdCD      dK e<d=>      dL e<d=dAdBdCD      dM e<d=dFdGdCD      dN e<d=dCO      dP e<d=dCO      dQ e<d=dAdBdCD      dR e<d=dFdGdCD      dS e<d=dTdUdCD      dV e<d=dCO      dW e<d=dAdBdCD       e<d=dXdYdCD       e<d=dTdUdCD      dZ      Z=dhd[Z>dhd\Z?edhd]       Z@edhd^       ZAedhd_       ZBedhd`       ZCedhda       ZDedhdb       ZEedhdc       ZFy)ia   EfficientViT (by MIT Song Han's Lab)

Paper: `Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition`
    - https://arxiv.org/abs/2205.14756

Adapted from official impl at https://github.com/mit-han-lab/efficientvit
EfficientVitEfficientVitLarge    )ListOptionalTupleUnion)partialNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dcreate_conv2dGELUTanh   )build_model_with_cfg)feature_take_indices)register_notrace_module)checkpoint_seq)register_modelgenerate_default_cfgsxc                     t        | t        t        f      rt        |       S t        |      D cg c]  }|  c}S c c}w N)
isinstancelisttuplerange)r   repeat_time_s      X/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/efficientvit_mit.pyval2listr!      s2    !dE]#Aw[)*!A***s   	;min_len
idx_repeatc                     t        |       } t        |       dkD  r+t        |t        |       z
        D cg c]  }| |   	 c}| || t        |       S c c}w )Nr   )r!   lenr   r   )r   r"   r#   r   s       r    	val2tupler&       sN    A
1vz;@3q6AQ;R#SaAjM#S*Z 8O $Ts   Akernel_size.returnc                     t        | t              r"t        | D cg c]  }t        |       c}      S | dz  dkD  sJ d       | dz  S c c}w )N   r   z kernel size should be odd number)r   r   get_same_padding)r'   kss     r    r+   r+   )   sQ    +u%[Ar&r*ABBQ"F$FF"a Bs   Ac                   h     e Zd Zddddddej                  ej
                  fdedef fdZd Z xZ	S )	ConvNormAct   r   F        in_channelsout_channelsc           	      ,   t         t        |           t        j                  |d      | _        t        |||||||      | _        |	r	 |	|      nt        j                         | _	        |
 |
d      | _
        y t        j                         | _
        y )NFinplace)r'   stridedilationgroupsbias)num_featuresT)superr.   __init__nnDropoutdropoutr   convIdentitynormact)selfr1   r2   r'   r6   r7   r8   r9   r?   
norm_layer	act_layer	__class__s              r    r<   zConvNormAct.__init__2   s{     	k4)+zz'59!#
	 >HJL9R[[]	.7.C9T*    c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r   )r?   r@   rB   rC   rD   r   s     r    forwardzConvNormAct.forwardM   s;    LLOIIaLIIaLHHQKrH   )
__name__
__module____qualname__r=   BatchNorm2dReLUintr<   rK   __classcell__rG   s   @r    r.   r.   1   sD    
 >>''WW W6rH   r.   c                   ~     e Zd Zdddej                  ej                  fej
                  dffdedef fdZd Z xZ	S )	DSConvr/   r   FNr1   r2   c                     t         t        |           t        |d      }t        |d      }t        |d      }t	        ||||||d   |d   |d         | _        t	        ||d|d   |d   |d         | _        y )Nr*   r   )r8   rE   rF   r9   r   rE   rF   r9   )r;   rU   r<   r&   r.   
depth_conv
point_conv)	rD   r1   r2   r'   r6   use_biasrE   rF   rG   s	           r    r<   zDSConv.__init__V   s     	fd$&Xq)z1-
i+	%!!}l!	
 &!!}l!
rH   c                 J    | j                  |      }| j                  |      }|S r   )rX   rY   rJ   s     r    rK   zDSConv.forwardx   s#    OOAOOArH   
rL   rM   rN   r=   rO   ReLU6rQ   r<   rK   rR   rS   s   @r    rU   rU   U   sG    
 NNBNN388T" 
 
  
DrH   rU   c                        e Zd Zdddddej                  ej                  fej
                  dffdedef fdZd Z xZ	S )		ConvBlockr/   r   NFr1   r2   c
           
         t         t        |           t        |d      }t        |d      }t        |	d      }	|xs t	        ||z        }t        |||||d   |	d   |d         | _        t        |||d|d   |	d   |d         | _        y )Nr*   r   rW   r   )r;   r_   r<   r&   roundr.   conv1conv2rD   r1   r2   r'   r6   mid_channelsexpand_ratiorZ   rE   rF   rG   s             r    r<   zConvBlock.__init__   s     	i')Xq)z1-
i+	#Hu[<-G'H !!}l!

 !!!}l!

rH   c                 J    | j                  |      }| j                  |      }|S r   )rb   rc   rJ   s     r    rK   zConvBlock.forward   s!    JJqMJJqMrH   r\   rS   s   @r    r_   r_   ~   sM    
 NNBNN388T"#
#
 #
JrH   r_   c            	            e Zd Zdddddej                  ej                  ej                  fej
                  ej
                  dffdedef fdZd	 Z xZ	S )
MBConvr/   r   N   Fr1   r2   c
                 V   t         t        |           t        |d      }t        |d      }t        |	d      }	|xs t	        ||z        }t        ||dd|d   |	d   |d         | _        t        ||||||d   |	d   |d         | _        t        ||d|d   |	d   |d         | _        y )Nr/   r   r   )r6   rE   rF   r9   r6   r8   rE   rF   r9   r*   rW   )	r;   ri   r<   r&   ra   r.   inverted_convrX   rY   rd   s             r    r<   zMBConv.__init__   s     	fd$&Xq)z1-
i+	#Hu[<-G'H(!!}l!
 &!!}l!	
 &!!}l!
rH   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r   )rm   rX   rY   rJ   s     r    rK   zMBConv.forward   s3    q!OOAOOArH   r\   rS   s   @r    ri   ri      sY    
 NNBNNBNNC88RXXt,,
,
 ,
\rH   ri   c            	            e Zd Zddddddej                  ej                  fej
                  dffdedef fdZd	 Z xZ	S )
FusedMBConvr/   r   Nrj   Fr1   r2   c                    t         t        |           t        |d      }t        |	d      }	t        |
d      }
|xs t	        ||z        }t        ||||||	d   |
d   |d         | _        t        ||d|	d   |
d   |d         | _        y )Nr*   r   rl   r   rW   )r;   rp   r<   r&   ra   r.   spatial_convrY   )rD   r1   r2   r'   r6   re   rf   r8   rZ   rE   rF   rG   s              r    r<   zFusedMBConv.__init__   s     	k4)+Xq)z1-
i+	#Hu[<-G'H'!!}l!	
 &!!}l!
rH   c                 J    | j                  |      }| j                  |      }|S r   )rr   rY   rJ   s     r    rK   zFusedMBConv.forward  s%    a OOArH   r\   rS   s   @r    rp   rp      sP    
 NNBNN388T"$
$
 $
LrH   rp   c            	            e Zd ZdZdddddej
                  fdej                  ddf	d	ed
edexs ddef fdZ	d Z
d Z xZS )LiteMLAz(Lightweight multi-scale linear attentionN      ?   FNN)   h㈵>r1   r2   headsheads_ratioc                    t         t        |           || _        |xs t	        ||z  |z        }||z  }t        |d      }t        |d      }t        |d      }|| _        t        |d|z  d|d   |d   |d         | _        t        j                  |
D cg c]j  }t        j                  t        j                  d|z  d|z  |t        |      d|z  |d         t        j                  d|z  d|z  dd|z  |d               l c}      | _         |	d	      | _        t        |dt!        |
      z   z  |d|d   |d   |d         | _        y c c}w )
Nr*   r/   r   r   )r9   rE   rF   )paddingr8   r9   )r8   r9   Fr4   )r;   ru   r<   epsrQ   r&   dimr.   qkvr=   
ModuleList
SequentialConv2dr+   aggregkernel_funcr%   proj)rD   r1   r2   r{   r|   r   rZ   rE   rF   r   scalesr   	total_dimscalerG   s                 r    r<   zLiteMLA.__init__  sp    	gt%'>[C/+=>CK	Xq)z1-
i+		M!!!}l
 mm  %
  MM			M	M,U3y=!! 		!i-Y!e)RZ[\R]^
%
  'u5S[)!!!}l
	!%
s   A/Ec                    |j                   }|j                         |j                         |j                         }}}|j                  dd      |z  }||z  }|dd df   |ddd f   | j                  z   z  }|j	                  |      S )N.)dtypefloat	transposer   to)rD   qkvr   kvouts          r    _attnzLiteMLA._attnH  s    '')QWWY	a1[[R 1$"f#ss(ms38}txx78vve}rH   c                 N   |j                   \  }}}}| j                  |      }|g}| j                  D ]  }|j                   ||              t	        j
                  |d      }|j                  |dd| j                  z  ||z        j                  dd      }|j                  dd      \  }	}
}| j                  |	      }	| j                  |
      }
t        j                  |ddd	      }t        j                  j                         sHt	        j                  |j                   j"                  d
      5  | j%                  |	|
|      }d d d        n| j%                  |	|
|      }j                  dd      j                  |d||      }| j'                  |      }|S # 1 sw Y   @xY w)Nr   )r   r   r/   r   )r   r   constantrv   )modevalueF)device_typeenabled)shaper   r   appendtorchcatreshaper   r   chunkr   Fpadjitis_scriptingautocastdevicetyper   r   )rD   r   Br   HWr   multi_scale_qkvopr   r   r   r   s                r    rK   zLiteMLA.forwardP  s{   WW
1a hhqk%++ 	,B""2c7+	,))O;)11!RTXXq1uMWWXZ\^_!''r'21a QQEE!V*B7yy%%'AHHMM5I *jjAq)* * **Q1%C mmB#++Ar1a8iin
* *s   4FF$)rL   rM   rN   __doc__r=   rO   rP   rQ   r   r<   r   rK   rR   rS   s   @r    ru   ru     sj    2 " "..)GG6
6
 6
 {d	6

 6
prH   ru   c                   X     e Zd Zdddej                  ej
                  f fd	Zd Z xZS )EfficientVitBlockrv          c                     t         t        |           t        t	        ||||d |f      t        j                               | _        t        t        |||dd d |f||d f      t        j                               | _	        y )N)r1   r2   r|   r   rE   TTF)r1   r2   rf   rZ   rE   rF   )
r;   r   r<   ResidualBlockru   r=   rA   context_moduleri   local_module)rD   r1   r|   head_dimrf   rE   rF   rG   s          r    r<   zEfficientVitBlock.__init__q  s     	/1+'(' *- KKM	
 *'(), $
3$i6 KKM

rH   c                 J    | j                  |      }| j                  |      }|S r   )r   r   rJ   s     r    rK   zEfficientVitBlock.forward  s'    "a rH   )	rL   rM   rN   r=   rO   	Hardswishr<   rK   rR   rS   s   @r    r   r   p  s'     >>,,
@rH   r   c                        e Zd Z	 	 ddeej
                     deej
                     deej
                     f fdZd Z xZS )r   mainshortcutpre_normc                     t         t        |           ||nt        j                         | _        || _        || _        y r   )r;   r   r<   r=   rA   r   r   r   )rD   r   r   r   rG   s       r    r<   zResidualBlock.__init__  s4     	mT+-$,$8bkkm	 rH   c                     | j                  | j                  |            }| j                  || j                  |      z   }|S r   )r   r   r   )rD   r   ress      r    rK   zResidualBlock.forward  s;    iia()==$a((C
rH   rx   )	rL   rM   rN   r   r=   Moduler<   rK   rR   rS   s   @r    r   r     sL     )-(,		!ryy!	! 299%	! 299%		!rH   r   r1   r2   r6   rf   rE   rF   
fewer_norm
block_typec                 ,   |dv sJ |dk(  rC|dk(  rt        | |||rdnd|rd |fn||d f      }|S t        | |||rdnd|rd |fn||d f      }|S |dk(  r"t        | ||||rdnd|rd d |fn|||d f      }|S t        | ||||rdnd|rd |fn||d f      }|S )	N)defaultlargefusedr   r   )TFF)r1   r2   r6   rZ   rE   rF   r   )r1   r2   r6   rf   rZ   rE   rF   )rU   r_   ri   rp   )	r1   r2   r6   rf   rE   rF   r   r   blocks	            r    build_local_blockr     s    6666q"')*4%1;D*-$d+EL L; ')*4%1;D*-$d+E: L) "'))0:,7AD$
3z$i6E& L  '))*4%1;D*-$d+E LrH   c                         e Zd Zd fd	Z xZS )Stemc                 "   t         	|           d| _        | j                  dt	        ||dd||             d}t        |      D ]H  }| j                  d| t        t        ||dd|||      t        j                                      |dz  }J y )	Nr*   in_convr/   )r'   r6   rE   rF   r   r   r   )r1   r2   r6   rf   rE   rF   r   )
r;   r<   r6   
add_moduler.   r   r   r   r=   rA   )
rD   in_chsout_chsdepthrE   rF   r   
stem_blockr   rG   s
            r    r<   zStem.__init__  s    aJ)	
 
u 	AOOc*.! '!(!")') 1  !OJ	rH   )r   )rL   rM   rN   r<   rR   rS   s   @r    r   r     s     rH   r   c                   (     e Zd Z	 d fd	Zd Z xZS )EfficientVitStagec	                    t         t        |           t        t	        ||d||||      d       g}	|}|r0t        |      D ]!  }
|	j                  t        |||||             # nMt        d|      D ]>  }|	j                  t        t	        ||d|||      t        j                                      @ t        j                  |	 | _        y )Nr*   )r1   r2   r6   rf   rE   rF   r   r1   r   rf   rE   rF   r   )r1   r2   r6   rf   rE   rF   )r;   r   r<   r   r   r   r   r   r=   rA   r   blocks)rD   r   r   r   rE   rF   rf   r   	vit_stager   r   irG   s               r    r<   zEfficientVitStage.__init__  s     	/1"$)%#$ 
  5\ 	%$*!)%1#-"+	 1e_ m%$*%, %1#-"+ KKM
 
 mmV,rH   c                 $    | j                  |      S r   r   rJ   s     r    rK   zEfficientVitStage.forward5      {{1~rH   FrL   rM   rN   r<   rK   rR   rS   s   @r    r   r     s     5-nrH   r   c                   *     e Zd Z	 	 d fd	Zd Z xZS )EfficientVitLargeStagec	                    t         t        |           t        t	        ||d|rdnd|||xs ||rdnd      d       g}	|}|r0t        |      D ]!  }
|	j                  t        ||d||             # nRt        |      D ]D  }|	j                  t        t	        ||d	d
||||rdnd      t        j                                      F t        j                  |	 | _        y )Nr*         r   r   )r1   r2   r6   rf   rE   rF   r   r   rj   r   r   r   )r;   r   r<   r   r   r   r   r   r=   rA   r   r   )rD   r   r   r   rE   rF   r   r   r   r   r   r   rG   s               r    r<   zEfficientVitLargeStage.__init__:  s     	$d46"$#,R"%#$2
(29	 
  5\ 	%$*!)%&#-"+	 5\ m%$*%, %&#-"+#-0:9	 KKM  mmV,rH   c                 $    | j                  |      S r   r   rJ   s     r    rK   zEfficientVitLargeStage.forwardt  r   rH   )FFr   rS   s   @r    r   r   9  s     8-trH   r   c                        e Zd Zddej                  ej
                  ddfdedee   deded	e	d
ef fdZ
dded	ee	   fdZddefdZ xZS )ClassifierHead  r0   avgrz   r1   widthsnum_classesr?   	pool_typenorm_epsc	                 2   t         t        |           || _        |d   | _        |sJ d       t        ||d   d||      | _        t        |d      | _        t        j                  t        j                  |d   |d   d	      t        j                  |d   |
      |	 |d      nt        j                         t        j                  |d      |dkD  r%t        j                  |d   |d	            | _        y t        j                               | _        y )Nr   Cannot disable poolingr   r   )rE   rF   Tr   flattenFr9   r   r4   )r;   r   r<   r   r:   r.   r   r   global_poolr=   r   Linear	LayerNormrA   r>   
classifier)
rD   r1   r   r   r?   rE   rF   r   r   rG   s
            r    r<   zClassifierHead.__init__y  s     	nd,."2J222y";q	1_hi/)TR--IIfQi7LL1'0'<Id#"++-JJw.<G!OBIIfQi48

 RTQ\Q\Q^
rH   c                     ||sJ d       t        |d      | _        |dkD  r0t        j                  | j                  |d      | j
                  d<   y t        j                         | j
                  d<   y )Nr   Tr   r   r   r   )r   r   r=   r   r:   r   rA   )rD   r   r   s      r    resetzClassifierHead.reset  sc     66693iQUWD?"$))D,=,={QU"VDOOB"$++-DOOBrH   
pre_logitsc                    | j                  |      }| j                  |      }|rV | j                  d   |      } | j                  d   |      } | j                  d   |      } | j                  d   |      }|S | j                  |      }|S )Nr   r   r*   r/   )r   r   r   rD   r   r   s      r    rK   zClassifierHead.forward  s    LLOQ""1%A""1%A""1%A""1%A  "ArH   r   r   )rL   rM   rN   r=   rO   r   rQ   r   r   strr<   r   r   boolrK   rR   rS   s   @r    r   r   x  s    
  >>,,

 S	
 	

 
 
 
40 0# 0T rH   r   c                   8    e Zd Zdddddej                  ej
                  ddddf fd	Zej                  j                  dd	       Z
ej                  j                  dd
       Zej                  j                  dej                  fd       Zd dedee   fdZ	 	 	 	 	 d!dej$                  deeeee   f      dededededeeej$                     eej$                  eej$                     f   f   fdZ	 	 	 d"deeee   f   dedefdZd ZddefdZd Z xZS )#r   r/    r   r   r   r0   r   c                    t         t        |           d| _        || _        || _        t        ||d   |d   ||      | _        | j                  j                  }g | _	        t        j                         | _        |d   }t        t        |dd  |dd              D ]c  \  }\  }}| j                  j                  t!        ||||||||dk\               |dz  }|}| xj                  t#        ||d|       gz  c_	        e || _        t'        | j$                  |	||
| j                        | _        | j(                  j$                  | _        y )	NFr   r   r*   )r   rE   rF   rf   r   r   stages.num_chs	reductionmodule)r   r   r?   r   )r;   r   r<   grad_checkpointingr   r   r   stemr6   feature_infor=   r   stages	enumeratezipr   r   dictr:   r   headhead_hidden_size)rD   in_chansr   depthsr   rf   rE   rF   r   head_widths	drop_rater   r6   r1   r   wdrG   s                    r    r<   zEfficientVit.__init__  sZ    	lD*,"'&& 6!9fQiYO	!! mmoQi"3vabz6!":#>? 	eIAv1KK0%#)!q&	  	 aKFK${fW^_`^aUb"c!dd	e ("#&&
	 !%		 6 6rH   c                 ,    t        d|rdnddg      }|S Nz^stemz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)r
  r   r  rD   coarsematchers      r    group_matcherzEfficientVit.group_matcher  '    (.$455
 rH   c                     || _         y r   r	  rD   enables     r    set_grad_checkpointingz#EfficientVit.set_grad_checkpointing  
    "(rH   r(   c                 4    | j                   j                  d   S Nr   r  r   rD   s    r    get_classifierzEfficientVit.get_classifier      yy##B''rH   r   r   c                 J    || _         | j                  j                  ||       y r   r   r  r   rD   r   r   s      r    reset_classifierzEfficientVit.reset_classifier      &		[1rH   r   indicesrB   
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%   r  r
  r   r   r   r  r	  r   r   rD   r   r1  rB   r2  r3  r4  intermediatestake_indices	max_indexr  feat_idxstages                r    forward_intermediatesz"EfficientVit.forward_intermediates      * Y&D(DD&"6s4;;7G"Qi IIaL99!!#:[[F[[)a-0F(0 	(OHe&&uyy/E/E/G"61-!H<'$$Q'	(   -rH   
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%   r  r/  rD   r1  rA  rB  r;  r<  s         r    prune_intermediate_layersz&EfficientVit.prune_intermediate_layers$  M     #7s4;;7G"Qikk.9q=1!!!R(rH   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r   r
  r	  r   r   r   r   r  rJ   s     r    forward_featureszEfficientVit.forward_features2  R    IIaL""599+A+A+Ct{{A.A  AArH   r   c                 N    |r| j                  ||      S | j                  |      S N)r   r  r   s      r    forward_headzEfficientVit.forward_head:  %    6@tyyzy2RdiiPQlRrH   c                 J    | j                  |      }| j                  |      }|S r   rL  rQ  rJ   s     r    rK   zEfficientVit.forward=  '    !!!$a rH   r   Tr   NFFr7  Fr   FT)rL   rM   rN   r=   rO   r   r<   r   r   ignorer  r$  r   r*  rQ   r   r   r/  Tensorr   r   r   r   r?  rH  rL  rQ  rK   rR   rS   s   @r    r   r     s    >>,,27h YY  YY) ) YY(		 ( (2C 2hsm 2 8<$$',, ||,  eCcN34,  	, 
 ,  ,  !%,  
tELL!5tELL7I)I#JJ	K, ` ./$#	3S	>*  	S$ SrH   c                   $    e Zd Zddddej                  edddddf fd	Zej                  j                  dd	       Z
ej                  j                  dd
       Zej                  j                  dej                  fd       Zd dedee   fdZ	 	 	 	 	 d!dej$                  deeeee   f      dededededeeej$                     eej$                  eej$                     f   f   fdZ	 	 	 d"deeee   f   dedefdZd ZddefdZd Z xZS )#r   r/   r  r   r   r0   r   gHz>c                    t         t        |           d| _        || _        |
| _        || _        t        || j                        }t        ||d   |d   ||d      | _	        | j                  j                  }g | _        t        j                         | _        |d   }t        t!        |dd  |dd              D ]f  \  }\  }}| j                  j#                  t%        |||||||dk\  |dk\  	             |dz  }|}| xj                  t'        ||d
|       gz  c_        h || _        t+        | j(                  ||
|	| j                  || j                        | _        | j,                  j(                  | _        y )NFr   r   r   )r   r   r/   r*   )r   rE   rF   r   r   r   r  r  )r   r   r?   r   rF   r   )r;   r   r<   r	  r   r   r   r	   r   r
  r6   r  r=   r   r  r  r  r   r   r  r:   r   r  r  )rD   r  r   r  r   rE   rF   r   r  r  r   r   r6   r1   r   r  r  rG   s                    r    r<   zEfficientVitLarge.__init__D  s    	/1"'&& ZT]];
 6!9fQiY[bc	!! mmoQi"3vabz6!":#>? 	eIAv1KK5%#!q&6	  	 aKFK${fW^_`^aUb"c!dd	e ("#&&]]
	 !%		 6 6rH   c                 ,    t        d|rdnddg      }|S r  r  r  s      r    r  zEfficientVitLarge.group_matcher|  r  rH   c                     || _         y r   r!  r"  s     r    r$  z(EfficientVitLarge.set_grad_checkpointing  r%  rH   r(   c                 4    | j                   j                  d   S r'  r(  r)  s    r    r*  z EfficientVitLarge.get_classifier  r+  rH   r   r   c                 J    || _         | j                  j                  ||       y r   r-  r.  s      r    r/  z"EfficientVitLarge.reset_classifier  r0  rH   r   r1  rB   r2  r3  r4  c                    |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 r6  r8  r9  s                r    r?  z'EfficientVitLarge.forward_intermediates  r@  rH   rA  rB  c                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S rD  rF  rG  s         r    rH  z+EfficientVitLarge.prune_intermediate_layers  rI  rH   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r   rK  rJ   s     r    rL  z"EfficientVitLarge.forward_features  rM  rH   r   c                 N    |r| j                  ||      S | j                  |      S rO  rP  r   s      r    rQ  zEfficientVitLarge.forward_head  rR  rH   c                 J    | j                  |      }| j                  |      }|S r   rT  rJ   s     r    rK   zEfficientVitLarge.forward  rU  rH   r   rV  r   rW  rX  )rL   rM   rN   r=   rO   r   r<   r   r   rY  r  r$  r   r*  rQ   r   r   r/  rZ  r   r   r   r   r?  rH  rL  rQ  rK   rR   rS   s   @r    r   r   C  s    >>67p YY  YY) ) YY(		 ( (2C 2hsm 2 8<$$',, ||,  eCcN34,  	, 
 ,  ,  !%,  
tELL!5tELL7I)I#JJ	K, ` ./$#	3S	>*  	S$ SrH   c           
      .    | dt         t        dddddd	|S )Nr   zstem.in_conv.convzhead.classifier.4gffffff?)r/      rg  )   rh  )	urlr   meanstd
first_convr   crop_pct
input_size	pool_sizer
   )ri  kwargss     r    _cfgrq    s1    %#))#  rH   zefficientvit_b0.r224_in1kztimm/)	hf_hub_idzefficientvit_b1.r224_in1kzefficientvit_b1.r256_in1k)r/      rs  )rw   rw   rv   )rr  rn  ro  rm  zefficientvit_b1.r288_in1k)r/      rt  )	   ru  zefficientvit_b2.r224_in1kzefficientvit_b2.r256_in1kzefficientvit_b2.r288_in1kzefficientvit_b3.r224_in1kzefficientvit_b3.r256_in1kzefficientvit_b3.r288_in1kzefficientvit_l1.r224_in1k)rr  rm  zefficientvit_l2.r224_in1kzefficientvit_l2.r256_in1kzefficientvit_l2.r288_in1kzefficientvit_l2.r384_in1k)r/     rv  )   rw  zefficientvit_l3.r224_in1kzefficientvit_l3.r256_in1k)r/   @  rx  )
   ry  )zefficientvit_l3.r320_in1kzefficientvit_l3.r384_in1kc                 h    |j                  dd      }t        t        | |fdt        d|      i|}|S Nout_indices)r   r   r*   r/   feature_cfgT)flatten_sequentialr|  )popr   r   r  variant
pretrainedrp  r|  models        r    _create_efficientvitr  J  sG    **]L9K  DkJ	
 E LrH   c                 h    |j                  dd      }t        t        | |fdt        d|      i|}|S r{  )r  r   r   r  r  s        r    _create_efficientvit_larger  V  sG    **]L9K  DkJ	
 E LrH   c           	      N    t        dddd      }t        dd| it        |fi |S )N)rw   r   r   @      )r   r*   r*   r*   r*   r   )   i   r   r  r   r  r  )efficientvit_b0r  r  r  rp  
model_argss      r    r  r  b  s6    #ObVbdJgjgDQ[Lf_eLfggrH   c           	      N    t        dddd      }t        dd| it        |fi |S )N)r   r   r  r  rs  )r   r*   r/   r/   r   r   )i   i@  r  r  )efficientvit_b1r  r  s      r    r  r  i  6    %oXdfJgjgDQ[Lf_eLfggrH   c           	      N    t        dddd      }t        dd| it        |fi |S )N)r   0   `      rv  )r   r/   r   r   rj   r   i 	  i 
  r  r  )efficientvit_b2r  r  s      r    r  r  p  r  rH   c           	      N    t        dddd      }t        dd| it        |fi |S )Nr   r  r  rs     )r   r   rj   rj   ru  r   r  r  r  )efficientvit_b3r  r  s      r    r  r  w  s6    &YegJgjgDQ[Lf_eLfggrH   c           	      N    t        dddd      }t        dd| it        |fi |S )Nr  )r   r   r   rj   rj   r   i   i  r  r  )efficientvit_l1r  r  r  s      r    r  r  ~  7    &YegJ%mJmRVWaRlekRlmmrH   c           	      N    t        dddd      }t        dd| it        |fi |S )Nr  r   r*   r*   rw   rw   r   r  r  r  )efficientvit_l2r  r  s      r    r  r    r  rH   c           	      N    t        dddd      }t        dd| it        |fi |S )N)r  r  rs  r  r  r  r   )i   i   r  r  )efficientvit_l3r  r  s      r    r  r    s7    (2[giJ%mJmRVWaRlekRlmmrH   )r   )r   r   )Fr   )rE  r   )Gr   __all__typingr   r   r   r   	functoolsr	   r   torch.nnr=   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   	_registryr   r   r   r   anyr!   rQ   r&   r+   r   r.   rU   r_   ri   rp   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   rq  default_cfgsr  r  r  r  r  r  r  r  r  r  rH   r    <module>r     s   .
/ / /      A E E * + 1 ' <+$$ +%%#  S  #"8sCx  S=SE#s(O  !")) !H&RYY &R)		 )X3RYY 3l*")) *Z]bii ]@   $		 $NBII 4 !#333 3 	3
 3 3 3 3l2== :9		 9x<RYY <~/RYY /dV299 VrZ		 Zz % X&"X&  "	X&   FS"X&   FS"X&  "X&$   FS"%X&,   FS"-X&4  "5X&:   FS";X&B   FS"CX&J  "KX&R  "SX&Z   FS"[X&b   FS"cX&j   Hs"kX&r  "sX&z   FS"{X&B "& Hs" "& Hs"KX& Xv		 h h h h h h h h n n n n n nrH   