
    ^j7\                        d Z ddl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ZmZ ddlmZ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gZ ddddZ!ddddZ" G d dej                  jF                        Z$ G d de
jJ                        Z& G d de
jF                        Z' G d de
jF                        Z( G d de
jF                        Z) G d de
jF                        Z* G d d e
jF                        Z+ G d! d"e
jF                        Z, G d# d$e
jF                        Z- G d% de
jF                        Z.d& Z/d0d'Z0 e e0d()       e0d()       e0d()      d*      Z1d1d+Z2ed1d,e.fd-       Z3ed1d,e.fd.       Z4ed1d,e.fd/       Z5y)2a   EfficientFormer

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

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

Modifications and timm support by / Copyright 2022, Ross Wightman
    )DictListOptionalTupleTypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPath
LayerScaleLayerScale2dMlpcalculate_drop_path_ratestrunc_normal_	to_2tuplendgrid   )build_model_with_cfg)feature_take_indices)checkpoint_seq)generate_default_cfgsregister_modelEfficientFormer0   `      i  )@      i@  i   )r        i   )l1l3l7            )r*   r*      r)   )r)   r)         c                        e Zd ZU eeej                  f   ed<   	 	 	 	 	 	 	 ddededede	def
 fdZ
 ej                         d fd	       Zd	ej                  d
ej                  fdZd Z xZS )	Attentionattention_bias_cachedimkey_dim	num_heads
attn_ratio
resolutionc           
         ||d}t         |           || _        |dz  | _        || _        ||z  | _        t        ||z        | _        | j                  |z  | _        || _	        t        j                  || j
                  dz  | j                  z   fi || _        t        j                  | j                  |fi || _        t        |      }t        j                   t#        t        j$                  |d   |t        j&                        t        j$                  |d   |t        j&                                    j)                  d      }	|	dd d d f   |	dd d d f   z
  j+                         }
|
d   |d   z  |
d   z   }
t        j                  j-                  t        j.                  ||d   |d   z  fi |      | _        | j3                  d|
       i | _        y )Ndevicedtypeg      r(   r   r   .attention_bias_idxs)super__init__r3   scaler2   key_attn_dimintval_dimval_attn_dimr4   nnLinearqkvprojr   torchstackr   arangelongflattenabs	Parameterzerosattention_biasesregister_bufferr0   )selfr1   r2   r3   r4   r5   r8   r9   ddposrel_pos	__class__s              f/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/efficientformer.pyr<   zAttention.__init__7   s    /"_
#i/:/0 LL94$99S$"3"3a"7$:K:K"KRrRIId//;;	z*
kk&LLAvUZZHLLAvUZZH
  71: 	 sAt|$s3a<'88==?1:
1-; % 2 25;;y*UV-ZdefZgJg3nkm3n o2G<$&!    c                 R    t         |   |       |r| j                  ri | _        y y y N)r;   trainr0   )rP   moderT   s     rU   rY   zAttention.trainY   s)    dD--(*D% .4rV   r8   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 rX   )rF   jit
is_tracingtrainingrN   r:   strr0   )rP   r8   
device_keys      rU   get_attention_biaseszAttention.get_attention_biases_   s    99!T]]((D,D,D)DEEVJ!:!::8<8M8MaQUQiQiNi8j))*5,,Z88rV   c                 >   |j                   \  }}}| j                  |      }|j                  ||| j                  d      j	                  dddd      }|j                  | j                  | j                  | j                  gd      \  }}}||j                  dd      z  | j                  z  }	|	| j                  |j                        z   }	|	j                  d      }	|	|z  j                  dd      j                  ||| j                        }| j                  |      }|S )Nr   r(   r   r'   r1   )shaperD   reshaper3   permutesplitr2   r@   	transposer=   rb   r8   softmaxrA   rE   )
rP   xBNCrD   qkvattns
             rU   forwardzAttention.forwardh   s    ''1ahhqkkk!Q3;;Aq!QG))T\\4<<FA)N1aAKKB''4::5d//99|||#AX  A&..q!T5F5FGIIaLrV   )r"       r-   r*      NNT)__name__
__module____qualname__r   r`   rF   Tensor__annotations__r?   floatr<   no_gradrY   r8   rb   ru   __classcell__rT   s   @rU   r/   r/   4   s    sELL011  ! ' '  ' 	 '
  '  'D U]]_+ +
95<< 9ELL 9rV   r/   c            
            e Zd Zej                  ej
                  ddfdededeej                     deej                     f fdZ	 xZ
S )Stem4Nin_chsout_chs	act_layer
norm_layerc           
         ||d}t         |           d| _        | j                  dt	        j
                  ||dz  fdddd|       | j                  d ||dz  fi |       | j                  d	 |              | j                  d
t	        j
                  |dz  |fdddd|       | j                  d ||fi |       | j                  d |              y )Nr7   r*   conv1r(   r'   r   kernel_sizestridepaddingnorm1act1conv2norm2act2)r;   r<   r   
add_modulerB   Conv2d)	rP   r   r   r   r   r8   r9   rQ   rT   s	           rU   r<   zStem4.__init__x   s     /67a<!jQWXbc!jgi!jkGqL!?B!?@	,7a<!kaXYcd!khj!klG!:r!:;	,rV   )ry   rz   r{   rB   ReLUBatchNorm2dr?   r   Moduler<   r   r   s   @rU   r   r   w   sY    
 *,*,..-- - BII	-
 RYY- -rV   r   c                        e Zd ZdZdddej
                  ddfdedededed	ee   d
eej                     f fdZ
d Z xZS )
Downsamplez
    Downsampling via strided conv w/ norm
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H/stride, W/stride]
    r'   r(   Nr   r   r   r   r   r   c	                     ||d}	t         
|           ||dz  }t        j                  ||f|||d|	| _         ||fi |	| _        y )Nr7   r(   r   )r;   r<   rB   r   convnorm)rP   r   r   r   r   r   r   r8   r9   rQ   rT   s             rU   r<   zDownsample.__init__   s\     /?!Q&GIIfgm;v_fmjlm	w-"-	rV   c                 J    | j                  |      }| j                  |      }|S rX   )r   r   rP   rm   s     rU   ru   zDownsample.forward   s!    IIaLIIaLrV   )ry   rz   r{   __doc__rB   r   r?   r   r   r   r<   ru   r   r   s   @rU   r   r      sp      !%)*,.... . 	.
 . c]. RYY.$rV   r   c                   $     e Zd Z fdZd Z xZS )Flatc                 "    t         |           y rX   )r;   r<   )rP   rT   s    rU   r<   zFlat.__init__   s    rV   c                 H    |j                  d      j                  dd      }|S )Nr(   r   )rJ   rk   r   s     rU   ru   zFlat.forward   s!    IIaL""1a(rV   )ry   rz   r{   r<   ru   r   r   s   @rU   r   r      s    rV   r   c                   0     e Zd ZdZddef fdZd Z xZS )PoolingzP
    Implementation of pooling for PoolFormer
    --pool_size: pooling size
    	pool_sizec                 d    t         |           t        j                  |d|dz  d      | _        y )Nr   r(   F)r   r   count_include_pad)r;   r<   rB   	AvgPool2dpool)rP   r   rT   s     rU   r<   zPooling.__init__   s)    LL1i1n`ef	rV   c                 *    | j                  |      |z
  S rX   )r   r   s     rU   ru   zPooling.forward   s    yy|arV   )r'   )ry   rz   r{   r   r?   r<   ru   r   r   s   @rU   r   r      s    
g# g rV   r   c                        e Zd 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 )ConvMlpWithNormz`
    Implementation of MLP with 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    N        in_featureshidden_featuresout_featuresr   r   dropc	                    ||d}	t         
|           |xs |}|xs |}t        j                  ||dfi |	| _        |	 ||fi |	nt        j
                         | _         |       | _        t        j                  ||dfi |	| _        |	 ||fi |	nt        j
                         | _	        t        j                  |      | _        y )Nr7   r   )r;   r<   rB   r   fc1Identityr   actfc2r   Dropoutr   )rP   r   r   r   r   r   r   r8   r9   rQ   rT   s             rU   r<   zConvMlpWithNorm.__init__   s     /#2{)8[99[/1CC:D:PZ626VXVaVaVc
;99_lADD7A7MZ33SUS^S^S`
JJt$	rV   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S rX   )r   r   r   r   r   r   r   s     rU   ru   zConvMlpWithNorm.forward   sb    HHQKJJqMHHQKIIaLHHQKJJqMIIaLrV   )ry   rz   r{   r   rB   GELUr   r?   r   r   r   r~   r<   ru   r   r   s   @rU   r   r      s     .2*.)+*,..%% &c]% #3-	%
 BII% RYY% %,rV   r   c                        e Zd Zdej                  ej
                  dddddfdededeej                     deej                     d	ed
edef fdZ
d Z xZS )MetaBlock1d      @r   h㈵>Nr1   	mlp_ratior   r   	proj_drop	drop_pathlayer_scale_init_valuec
                    ||	d}
t         |            ||fi |
| _        t        |fi |
| _        t        ||fi |
| _        |dkD  rt        |      nt        j                         | _
         ||fi |
| _        t        d|t        ||z        ||d|
| _        t        ||fi |
| _        |dkD  rt        |      | _        y t        j                         | _        y )Nr7   r   )r   r   r   r    )r;   r<   r   r/   token_mixerr   ls1r   rB   r   
drop_path1r   r   r?   mlpls2
drop_path2)rP   r1   r   r   r   r   r   r   r8   r9   rQ   rT   s              rU   r<   zMetaBlock1d.__init__   s     /*r*
$S/B/c#9@R@1:R(9-R[[]*r*
 
i0	

 
 c#9@R@1:R(9-R[[]rV   c           
      
   || j                  | j                  | j                  | j                  |                        z   }|| j	                  | j                  | j                  | j                  |                        z   }|S rX   )r   r   r   r   r   r   r   r   r   s     rU   ru   zMetaBlock1d.forward  sc    )9)9$**Q-)H IJJ$**Q-)@ ABBrV   )ry   rz   r{   rB   r   	LayerNormr?   r~   r   r   r<   ru   r   r   s   @rU   r   r      s    
  ")+*,,,!!,0SS S BII	S
 RYYS S S %*S<rV   r   c                        e Zd Zddej                  ej
                  dddddf	dededed	eej                     d
eej                     dededef fdZ
d Z xZS )MetaBlock2dr'   r   r   r   Nr1   r   r   r   r   r   r   r   c                    |	|
d}t         |           t        |      | _        t	        ||fi || _        |dkD  rt        |      nt        j                         | _	        t        |ft        ||z        |||d|| _        t	        ||fi || _        |dkD  rt        |      | _        y t        j                         | _        y )Nr7   )r   r   )r   r   r   r   )r;   r<   r   r   r   r   r   rB   r   r   r   r?   r   r   r   )rP   r1   r   r   r   r   r   r   r   r8   r9   rQ   rT   s               rU   r<   zMetaBlock2d.__init__  s     /"Y7%;BrB1:R(9-R[[]"
i0!
 
  %;BrB1:R(9-R[[]rV   c                     || j                  | j                  | j                  |                  z   }|| j                  | j	                  | j                  |                  z   }|S rX   )r   r   r   r   r   r   r   s     rU   ru   zMetaBlock2d.forward1  sR    )9)9!)< =>>! 566rV   )ry   rz   r{   rB   r   r   r?   r~   r   r   r<   ru   r   r   s   @rU   r   r     s    
 !)+*,..!!,0SS S 	S
 BIIS RYYS S S %*S<rV   r   c                        e Zd Zddddej                  ej
                  ej                  dddddfded	ed
edededede	de
ej                     de
ej                     de
ej                     de	de	de	f fdZd Z xZS )EfficientFormerStageTr   r'   r   r   r   Nr1   dim_outdepth
downsamplenum_vitr   r   r   r   norm_layer_clr   r   r   c                 8   ||d}t         |           d| _        |rt        d|||	d|| _        |}n ||k(  sJ t        j                         | _        g }|r||k\  r|j                  t                      t        |      D ]  }||z
  dz
  }|r+||kD  r&|j                  t        |f|||
|||   |d|       8|j                  t        |f||||	|||   |d|       |sa||k(  sg|j                  t                       t        j                  | | _        y )Nr7   F)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r;   r<   grad_checkpointingr   r   rB   r   appendr   ranger   r   
Sequentialblocks)rP   r1   r   r   r   r   r   r   r   r   r   r   r   r   r8   r9   rQ   r   	block_idx
remain_idxrT   s                       rU   r<   zEfficientFormerStage.__init__9  sQ   $ /"'(bWQ[b_abDOC'>!> kkmDOw%'MM$&!u 	*I*Q.J7Z/	"+"+#0"+"+I"6/E	 	
 
"+"+"+#-"+"+I"6/E
 
 w*4MM$&)9	*< mmV,rV   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S rX   )r   r   rF   r]   is_scriptingr   r   r   s     rU   ru   zEfficientFormerStage.forwardz  sS    OOA""599+A+A+Ct{{A.A  AArV   )ry   rz   r{   rB   r   r   r   r?   boolr~   r   r   r<   ru   r   r   s   @rU   r   r   7  s      $!)+*,..-/\\!!,0!?-?- ?- 	?-
 ?- ?- ?- ?- BII?- RYY?-  		??- ?- ?- %*?-BrV   r   c            !           e Zd Zdddddddddd	ej                  ej
                  ej                  d
d
d
ddfdeedf   deedf   dedede	de
eedf      dededededeej                     deej                     deej                     dededef  fdZd Zej$                  j&                  d        Zej$                  j&                  d3d       Zej$                  j&                  d4d        Zej$                  j&                  d!ej                  fd"       Zd5dede
e	   fd#Zej$                  j&                  d4d$       Z	 	 	 	 	 d6d%ej4                  d&e
eeee   f      d'ed(ed)e	d*ed!eeej4                     eej4                  eej4                     f   f   fd+Z	 	 	 d7d&eeee   f   d,ed-efd.Zd/ Zd3d0efd1Z d2 Z! xZ"S )8r   r&   r   r'     avgNr   r*   r   r   depths.
embed_dimsin_chansnum_classesglobal_pooldownsamplesr   
mlp_ratiosr   r   r   r   r   	drop_rateproj_drop_ratedrop_path_ratec                 &   t         |           ||d}|| _        || _        || _        t        ||d   fd|i|| _        |d   }t        |      | _        | j                  dz
  }t        ||d      }|xs dd| j                  dz
  z  z   }g }g | _
        t        | j                        D ]r  }t        |||   ||   f||   ||k(  r|nd|	|||||||   |
d	
|}||   }|j                  |       | xj                  t        ||   d
|d
z   z  d|       gz  c_
        t t        j                   | | _        |d   x| _        | _         || j$                  fi || _        t        j*                  |      | _        |dkD  r!t        j.                  | j$                  |fi |nt        j0                         | _        |dkD  rt        j.                  |d   |fi |nt        j0                         | _        d| _        | j9                  | j:                         y )Nr7   r   r   r   T)	stagewiseFrx   )
r   r   r   r   r   r   r   r   r   r   r(   stages.)num_chs	reductionmodulerd   F)r;   r<   r   r   r   r   stemlen
num_stagesr   feature_infor   r   r   dictrB   r   stagesnum_featureshead_hidden_sizer   r   	head_droprC   r   head	head_distdistilled_trainingapply_init_weights)rP   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r9   kwargsrQ   prev_dim
last_stagedprr   istagerT   s                              rU   r<   zEfficientFormer.__init__  s.   , 	/& &(JqMOjOBO	a= f+__q(
'$O!OX4??Q;N0O%Ot' 	iA(1q	 'q>#$
?#$#+%(a&'= E  "!}HMM% $z!}AaC[bcdbeYf"g!hh'	i( mmV, 5?rNBD1!$"3"3:r:	I.GRUVBIId//CC\^\g\g\i	ITWX:b>;E"E^`^i^i^k"'

4%%&rV   c                    t        |t        j                        rjt        |j                  d       t        |t        j                        r8|j
                  +t        j                  j                  |j
                  d       y y y y )Ng{Gz?)stdr   )
isinstancerB   rC   r   weightbiasinit	constant_)rP   ms     rU   r  zEfficientFormer._init_weights  sZ    a#!((,!RYY'AFF,>!!!&&!, -?' $rV   c                 ^    | j                         D ch c]  \  }}d|v s| c}}S c c}}w )NrN   )named_parameters)rP   rr   _s      rU   no_weight_decayzEfficientFormer.no_weight_decay  s+    "335Qda9Kq9PQQQs   ))c                 $    t        dddg      }|S )Nz^stem)z^stages\.(\d+)N)z^norm)i )r   r   )r   )rP   coarsematchers      rU   group_matcherzEfficientFormer.group_matcher  s    -/CD
 rV   c                 4    | j                   D ]	  }||_         y rX   )r   r   )rP   enabless      rU   set_grad_checkpointingz&EfficientFormer.set_grad_checkpointing  s     	*A#)A 	*rV   r[   c                 2    | j                   | j                  fS rX   r   r  )rP   s    rU   get_classifierzEfficientFormer.get_classifier  s    yy$..((rV   c                 (   || _         ||| _        |dkD  r t        j                  | j                  |      nt        j
                         | _        |dkD  r&t        j                  | j                  |      | _        y t        j
                         | _        y )Nr   )r   r   rB   rC   r   r   r   r  )rP   r   r   s      rU   reset_classifierz EfficientFormer.reset_classifier  sq    &"*DALqBIId//=VXVaVaVc	FQTUo4#4#4kB[][f[f[hrV   c                     || _         y rX   )r  )rP   r  s     rU   set_distilled_trainingz&EfficientFormer.set_distilled_training  s
    "(rV   rm   indicesr   
stop_early
output_fmtintermediates_onlyc           	         |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }|j                  \  }
}}}| j
                  dz
  }t        j                  j                         s|s| j                  }n| j                  d|	dz    }d}t        |      D ]  \  }} ||      }||k  r|j                  \  }
}}}||v s)||k(  rQ|r| j                  |      n|}|j                  |j                  |
|dz  |dz  d      j                  dddd             |j                  |        |r|S ||k(  r| j                  |      }||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.r   Nr   r(   rd   r'   )r   r   r   r   rg   r   rF   r]   r   	enumerater   r   rh   ri   )rP   rm   r&  r   r'  r(  r)  intermediatestake_indices	max_indexrn   rp   HWlast_idxr   feat_idxr
  x_inters                      rU   forward_intermediatesz%EfficientFormer.forward_intermediates  sg   * Y&D(DD&"6s4;;7G"Qi IIaLWW
1a??Q&99!!#:[[F[[)a-0F(0 		,OHeaA("WW
1a<'x'.2diilG!((AFAFB)O)W)WXY[\^_ab)cd!((+		,   x		!A-rV   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   rB   r   r   r#  )rP   r&  r6  r7  r.  r/  s         rU   prune_intermediate_layersz)EfficientFormer.prune_intermediate_layers)  s]     #7s4;;7G"Qikk.9q=1DI!!!R(rV   c                 l    | j                  |      }| j                  |      }| j                  |      }|S rX   )r   r   r   r   s     rU   forward_featuresz EfficientFormer.forward_features9  s.    IIaLKKNIIaLrV   
pre_logitsc                 6   | j                   dk(  r|j                  d      }| j                  |      }|r|S | j                  |      | j	                  |      }}| j
                  r.| j                  r"t        j                  j                         s||fS ||z   dz  S )Nr   r   re   r(   )
r   meanr   r   r  r  r_   rF   r]   r   )rP   rm   r=  x_dists       rU   forward_headzEfficientFormer.forward_head?  s    u$1ANN1HIIaL$.."36""t}}UYY=S=S=Uf9 J!##rV   c                 J    | j                  |      }| j                  |      }|S rX   )r<  rA  r   s     rU   ru   zEfficientFormer.forwardM  s'    !!!$a rV   r   rx   rX   )NFFr+  F)r   FT)#ry   rz   r{   rB   r   r   r   r   r?   r`   r   r   r~   r   r   r<   r  rF   r]   ignorer  r  r  r!  r#  r%  r|   r   r   r5  r:  r<  rA  ru   r   r   s   @rU   r   r     s    '3*<#$6: !,0)+*,..-/\\!$&$&'E'#s(OE' c3hE' 	E'
 E' E' "%c	"23E' E' E' E' %*E' BIIE' RYYE'  		?E' E'  "!E'" "#E'P- YYR R YY  YY* * YY)		 ) )iC ihsm i YY) ) 8<$$',4 ||4  eCcN344  	4 
 4  4  !%4  
tELL!5tELL7I)I#JJ	K4 p ./$#	3S	>*  	 $$ $rV   c                    d| v r| S i }ddl }d}| j                         D ]  \  }}|j                  d      rH|j                  dd      }|j                  dd      }|j                  d	d
      }|j                  dd      }|j	                  d|      r|dz  }|j                  dd| d|      }|j                  dd| d|      }|j                  dd| d|      }|j                  dd|      }|j                  dd      }|||<    |S )z$ Remap original checkpoints -> timm zstem.0.weightr   Npatch_embedzpatch_embed.0
stem.conv1zpatch_embed.1z
stem.norm1zpatch_embed.3z
stem.conv2zpatch_embed.4z
stem.norm2znetwork\.(\d+)\.proj\.weightr   znetwork.(\d+).(\d+)r   z
.blocks.\2znetwork.(\d+).projz.downsample.convznetwork.(\d+).normz.downsample.normzlayer_scale_([0-9])z
ls\1.gamma	dist_headr  )reitems
startswithreplacematchsub)
state_dictmodelout_dictrH  	stage_idxrr   rs   s          rU   checkpoint_filter_fnrR  S  s(   *$HI  " 1<<&		/<8A		/<8A		/<8A		/<8A883Q7NIFF)WYK{+KQOFF(GI;>N*OQRSFF(GI;>N*OQRSFF)=!<IIk;/  OrV   c                 4    | ddd dddt         t        dddd	|S )
Nr   )r'   r   r   Tgffffff?bicubicrF  r   z
apache-2.0)urlr   
input_sizer   fixed_input_sizecrop_pctinterpolationr?  r  
first_conv
classifierlicenser	   )rU  r  s     rU   _cfgr]  n  s7    =tae)%.B"2G  rV   ztimm/)	hf_hub_id)z!efficientformer_l1.snap_dist_in1kz!efficientformer_l3.snap_dist_in1kz!efficientformer_l7.snap_dist_in1kc                 r    |j                  dd      }t        t        | |ft        t	        |d      d|}|S )Nout_indicesr*   getter)r`  feature_cls)pretrained_filter_fnfeature_cfg)popr   r   rR  r   )variant
pretrainedr  r`  rO  s        rU   _create_efficientformerrh    sF    **]A.K *1[hG 	E LrV   r[   c           	      h    t        t        d   t        d   d      }t        dd| it        |fi |S )Nr#   r   r   r   r   rg  )efficientformer_l1r   EfficientFormer_depthEfficientFormer_widthrh  rg  r  
model_argss      rU   rk  rk    A    $T*(.J
 #mJmRVWaRlekRlmmrV   c           	      h    t        t        d   t        d   d      }t        dd| it        |fi |S )Nr$   r*   rj  rg  )efficientformer_l3rl  ro  s      rU   rs  rs    rq  rV   c           	      h    t        t        d   t        d   d      }t        dd| it        |fi |S )Nr%   r-   rj  rg  )efficientformer_l7rl  ro  s      rU   ru  ru    rq  rV   )r9  r   )6r   typingr   r   r   r   r   r   rF   torch.nnrB   	timm.datar
   r   timm.layersr   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rn  rm  r   r/   r   r   r   r   r   r   r   r   r   r   rR  r]  default_cfgsrh  rk  rs  ru  r   rV   rU   <module>r     s   < ;   A	 	 	 + + ' <
 

  

 @ @F-BMM -, >299  bii  $bii $N#")) #L#")) #LI299 IXMbii M`6	 %)-* *.* *.*
& 
 no n n no n n no n nrV   