
    NgG                        d dl Z d dlmZ d dl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 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 Z  G d de
j!                  Z" G d de
j!                  Z#e
j$        dfde%de%de
j!        de&de
j'        f
dZ( G d de
j!                  Z) G d de
j!                  Z* G d de
j!                  Z+ G d de
j!                  Z, G d  d!e
j!                  Z- G d" d#e
j!                  Z. G d$ d%e
j!                  Z/ G d& d'e
j!                  Z0 G d( d)e
j!                  Z1 G d* de
j!                  Z2dXd,Z3 ei d- e3d./          d0 e3d./          d1 e3d./          d2 e3d./          d3 e3d./          d4 e3d./          d5 e3d.d67          d8 e3d./          d9 e3d./          d: e3d./          d; e3d./          d< e3d./          d= e3d./          d> e3d.d67          d? e3d@dAd6dBdCdDE          dF e3dGdHd6dBdCdDE          dI e3dJdKd6dBdCdDE                    Z4dL Z5dYdMZ6edYdN            Z7edYdO            Z8edYdP            Z9edYdQ            Z:edYdR            Z;edYdS            Z<edYdT            Z=edYdU            Z>edYdV            Z?edYdW            Z@dS )Z    N)partial)ListOptionalTupleUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathtrunc_normal_create_conv2dConvNormActSqueezeExciteuse_fused_attnClassifierHead   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsFastVitc                 *    | sdS || z  dk    sJ || z  S )Nr   r    )
group_sizechannelss     O/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/fastvit.py
num_groupsr      s2     &q *$)))):%%    c                   2    e Zd ZdZddddddddej        f	dededed	ed
edededededededej        ddf fdZ	de
j        de
j        fdZd Zdee
j        e
j        f         fdZdeej        ej        f         dee
j        e
j        f         fdZ xZS )MobileOneBlocka#  MobileOne building block.

    This block has a multi-branched architecture at train-time
    and plain-CNN style architecture at inference time
    For more details, please refer to our paper:
    `An Improved One millisecond Mobile Backbone` -
    https://arxiv.org/pdf/2206.04040.pdf
    r   r   FTin_chsout_chskernel_sizestridedilationr   inference_modeuse_seuse_actuse_scale_branchnum_conv_branches	act_layerreturnNc           	      .    t          t                                                      | _        t	          ||           _        | _        | _         _        | _	        | _
        | _        |rt          |d          nt          j                     _        |r!t!          |||| j        d           _        nd _        ||k    r|dk    rt          j        |          nd _        |dk    r9t          j         fdt+           j                  D                        _        nd _        d _        dk    r0|
r.t1           j	         j
        d j         j        d	
           _        |	r
 |            nt          j                     _        dS )a  Construct a MobileOneBlock module.

        Args:
            in_chs: Number of channels in the input.
            out_chs: Number of channels produced by the block.
            kernel_size: Size of the convolution kernel.
            stride: Stride size.
            dilation: Kernel dilation factor.
            group_size: Convolution group size.
            inference_mode: If True, instantiates model in inference mode.
            use_se: Whether to use SE-ReLU activations.
            use_act: Whether to use activation. Default: ``True``
            use_scale_branch: Whether to use scale branch. Default: ``True``
            num_conv_branches: Number of linear conv branches.
        r   )
rd_divisorTr$   r%   r&   groupsbiasN)num_featuresr   c           
      b    g | ]+}t          j        j        j        j        d           ,S )Fr$   r%   r1   	apply_act)r   r"   r#   r%   r1   ).0_r$   selfs     r   
<listcomp>z+MobileOneBlock.__init__.<locals>.<listcomp>m   sT     	/ 	/ 	/   $/#{#{"'  	/ 	/ 	/r   Fr5   )superr!   __init__r'   r   r1   r%   r&   r$   r"   r#   r+   r   nnIdentityser   reparam_convBatchNorm2didentity
ModuleListrangeconv_kxk
conv_scaler   act)r9   r"   r#   r$   r%   r&   r   r'   r(   r)   r*   r+   r,   	__class__s   `  `         r   r<   zMobileOneBlock.__init__,   s   < 	nd##,,..., V44 &!2 ;AS-A6666bkmm -	 -'!{! ! !D !%D f$$1 F3333 M !1$$ " 	/ 	/ 	/ 	/ 	/  %T%;<<	/ 	/ 	/ 	! 	! !% #DOQ#3"-KL !;;## # # #*<99;;;r{}}r   xc                    | j         ;|                     |                     |                      |                              S d}| j        |                     |          }d}| j        |                     |          }||z   }| j        | j        D ]}| ||          z  }|                     |                     |                    S )zApply forward pass.Nr   )r@   rG   r?   rB   rF   rE   )r9   rI   identity_out	scale_outoutrcs         r   forwardzMobileOneBlock.forward   s     (88DGGD$5$5a$8$899::: =$==++L 	?&**I ,&=$m  rr!uuxx%%%r   c           	         | j         dS |                                 \  }}t          | j        | j        | j        | j        | j        | j        d          | _         || j         j	        _
        || j         j        _
        |                                 D ]\  }}d|v r
|                                 |                     d           |                     d           t          | d          r|                     d           d| _        dS )a  Following works like `RepVGG: Making VGG-style ConvNets Great Again` -
        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched
        architecture used at training time to obtain a plain CNN-like structure
        for inference.
        NT)in_channelsout_channelsr$   r%   r&   r1   r2   r@   rE   rF   rB   )r@   _get_kernel_biasr   r"   r#   r$   r%   r&   r1   weightdatar2   named_parametersdetach___delattr__hasattrr'   )r9   kernelr2   nameparas        r   reparameterizezMobileOneBlock.reparameterize   s    (F,,..)(;];
 
 
 )/ %&*# //11 	 	JD$%%LLNNNN$$$&&&4$$ 	)Z((("r   c                    d}d}| j         P|                     | j                   \  }}| j        dz  }t          j        j                            |||||g          }d}d}| j        |                     | j                  \  }}d}d}| j        Dt          | j
                  D ]/}|                     | j        |                   \  }	}
||	z  }||
z  }0||z   |z   }||z   |z   }||fS )zMethod to obtain re-parameterized kernel and bias.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L83

        Returns:
            Tuple of (kernel, bias) after fusing branches.
        r   N   )rF   _fuse_bn_tensorr$   torchr=   
functionalpadrB   rE   rD   r+   )r9   kernel_scale
bias_scalerc   kernel_identitybias_identitykernel_conv	bias_convix_kernel_biaskernel_final
bias_finals                r   rS   zMobileOneBlock._get_kernel_bias   s    
?&'+';';DO'L'L$L*"a'C 8.22<#sCQTAUVVL =$-1-A-A$--P-P*O] 	=$D233 # #!%!5!5dmB6G!H!Hw&U"		"\1OC+m;
Z''r   branchc                    t          |t                    rI|j        j        }|j        j        }|j        j        }|j        j        }|j        j        }|j        j        }nt          |t          j
                  sJ t          | d          s| j        | j        z  }t          j        | j        || j        | j        f|j        j        |j        j                  }	t'          | j                  D ]}
d|	|
|
|z  | j        dz  | j        dz  f<   |	| _        | j        }|j        }|j        }|j        }|j        }|j        }||z                                   }||z                      dddd          }||z  |||z  |z  z
  fS )a   Method to fuse batchnorm layer with preceeding conv layer.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L95

        Args:
            branch: Sequence of ops to be fused.

        Returns:
            Tuple of (kernel, bias) after fusing batchnorm.
        	id_tensordtypedevicer   r_   )
isinstancer   convrT   bnrunning_meanrunning_varr2   epsr=   rA   rY   r"   r1   ra   zerosr$   rs   rt   rD   rq   sqrtreshape)r9   ro   rZ   ry   rz   gammabetar{   	input_dimkernel_valueistdts                r   r`   zMobileOneBlock._fuse_bn_tensor   s    fk** 	['F!91L )/KI$E9>D)-CCfbn555554-- . K4;6	${[)T-=t?OP --!=/     
 t{++  A  !1y=$*:a*?AQUVAVV  ".^F!.L ,KME;D*CS &&((S[!!"aA..z4,"6"<<<<r   )__name__
__module____qualname____doc__r=   GELUintboolModuler<   ra   TensorrO   r]   r   rS   r   
SequentialrA   r`   __classcell__rH   s   @r   r!   r!   "   s         #(  %)%&#%7Z= Z=Z= Z= 	Z=
 Z= Z= Z= !Z= Z= Z= #Z=  #Z= yZ= 
Z= Z= Z= Z= Z= Z=x& &%, & & & &2!# !# !#F!(%el(B"C !( !( !( !(F)=BM2>9:)=	u|U\)	*)= )= )= )= )= )= )= )=r   r!   c                   0    e Zd ZdZ	 	 	 	 ddededededed	ee         d
edeej                 deddf fdZ	de
j        de
j        fdZdee
j        e
j        f         fdZddZedej        dej        dee
j        e
j        f         fd            Z xZS )ReparamLargeKernelConvzBuilding Block of RepLKNet

    This class defines overparameterized large kernel conv block
    introduced in `RepLKNet <https://arxiv.org/abs/2203.06717>`_

    Reference: https://github.com/DingXiaoH/RepLKNet-pytorch
    NFr"   r#   r$   r%   r   small_kernelr(   r,   r'   r-   c
           	      l   t          t          |                                            || _        t	          ||          | _        || _        || _        || _        || _	        |	r!t          ||||d| j        d          | _        nad| _        t          |||| j        | j        d          | _        |4||k    s
J d            t          |||| j        | j        d          | _        |rt          |d	          nt!          j                    | _        |
 |            nt!          j                    | _        dS )
a!  Construct a ReparamLargeKernelConv module.

        Args:
            in_chs: Number of input channels.
            out_chs: Number of output channels.
            kernel_size: Kernel size of the large kernel conv branch.
            stride: Stride size. Default: 1
            group_size: Group size. Default: 1
            small_kernel: Kernel size of small kernel conv branch.
            act_layer: Activation module. Default: ``nn.GELU``
            inference_mode: If True, instantiates model in inference mode. Default: ``False``
        r   Tr0   NFr5   zDThe kernel size for re-param cannot be larger than the large kernel!g      ?)rd_ratio)r;   r   r<   r%   r   r1   r"   r#   r$   r   r   r@   r   
large_conv
small_convr   r=   r>   r?   rG   )r9   r"   r#   r$   r%   r   r   r(   r,   r'   rH   s             r   r<   zReparamLargeKernelConv.__init__  s^   0 	$d++44666 V44&( 	 -'{! ! !D !%D)'{{  DO ' K///Y 0//"- ,;;## # # <BT-$7777r{}}"+"799;;;R[]]r   rI   c                     | j         |                      |          }n4|                     |          }| j        ||                     |          z   }|                     |          }|                     |          }|S N)r@   r   r   r?   rG   )r9   rI   rM   s      r   rO   zReparamLargeKernelConv.forward`  sr    (##A&&CC//!$$C*DOOA...ggcllhhsmm
r   c                 V   |                      | j        j        | j        j                  \  }}t	          | d          ri|                      | j        j        | j        j                  \  }}||z  }|t          j                            || j	        | j
        z
  dz  gdz            z  }||fS )zMethod to obtain re-parameterized kernel and bias.
        Reference: https://github.com/DingXiaoH/RepLKNet-pytorch

        Returns:
            Tuple of (kernel, bias) after fusing branches.
        r   r_      )_fuse_bnr   rw   rx   rY   r   r=   rb   rc   r$   r   )r9   eq_keq_bsmall_ksmall_bs        r   get_kernel_biasz&ReparamLargeKernelConv.get_kernel_biask  s     ]]4?#79KLL
d4&& 	#}}T_-A4?CUVVGWGODBM%%4+d.??AEFJ  D Tzr   c                 V   |                                  \  }}t          | j        | j        | j        | j        | j        d          | _        || j        j        _	        || j        j
        _	        |                     d           t          | d          r|                     d           dS dS )a  
        Following works like `RepVGG: Making VGG-style ConvNets Great Again` -
        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched
        architecture used at training time to obtain a plain CNN-like structure
        for inference.
        Tr$   r%   r1   r2   r   r   N)r   r   r"   r#   r$   r%   r1   r@   rT   rU   r2   rX   rY   )r9   r   r   s      r   r]   z%ReparamLargeKernelConv.reparameterize{  s     ))++
d)KL(;;
 
 
 )- %&*#&&&4&& 	+\*****	+ 	+r   rw   rx   c                     | j         }|j        }|j        }|j         }|j        }|j        }||z                                   }||z                      dddd          }	||	z  |||z  |z  z
  fS )zMethod to fuse batchnorm layer with conv layer.

        Args:
            conv: Convolutional kernel weights.
            bn: Batchnorm 2d layer.

        Returns:
            Tuple of (kernel, bias) after fusing batchnorm.
        ru   r   )rT   ry   rz   r2   r{   r}   r~   )
rw   rx   rZ   ry   rz   r   r   r{   r   r   s
             r   r   zReparamLargeKernelConv._fuse_bn  s     n	wfS &&((S[!!"aA..z4,"6"<<<<r   )NFNFr-   N)r   r   r   r   r   r   r   r=   r   r<   ra   r   rO   r   r   r]   staticmethodConv2drA   r   r   r   s   @r   r   r     s         +/ -1#(BK BKBK BK 	BK
 BK BK #3-BK BK  	*BK !BK 
BK BK BK BK BK BKH	 	%, 	 	 	 	u|U\'A!B     + + + +. =i=^=	u|U\)	*= = = \= = = = =r   r   Fr"   r#   r,   r'   r-   c                     t          j        t          | |dd||          t          ||ddd||          t          ||dd||                    S )a,  Build convolutional stem with MobileOne blocks.

    Args:
        in_chs: Number of input channels.
        out_chs: Number of output channels.
        inference_mode: Flag to instantiate model in inference mode. Default: ``False``

    Returns:
        nn.Sequential object with stem elements.
       r_   )r"   r#   r$   r%   r,   r'   r   )r"   r#   r$   r%   r   r,   r'   )r=   r   r!   )r"   r#   r,   r'   s       r   convolutional_stemr     s      =)	
 	
 	
 	)	
 	
 	
 	)	
 	
 	
%  r   c                        e Zd ZU dZej        j        e         ed<   	 	 	 	 dde	de	ded	e
d
e
ddf fdZdej        dej        fdZ xZS )	AttentionzMulti-headed Self Attention module.

    Source modified from:
    https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py
    
fused_attn    F        dimhead_dimqkv_bias	attn_drop	proj_dropr-   Nc                    t                                                       ||z  dk    s
J d            || _        ||z  | _        |dz  | _        t                      | _        t          j        ||dz  |          | _	        t          j
        |          | _        t          j        ||          | _        t          j
        |          | _        dS )a}  Build MHSA module that can handle 3D or 4D input tensors.

        Args:
            dim: Number of embedding dimensions.
            head_dim: Number of hidden dimensions per head. Default: ``32``
            qkv_bias: Use bias or not. Default: ``False``
            attn_drop: Dropout rate for attention tensor.
            proj_drop: Dropout rate for projection tensor.
        r   z#dim should be divisible by head_dimg      r   )r2   N)r;   r<   r   	num_headsscaler   r   r=   LinearqkvDropoutr   projr   )r9   r   r   r   r   r   rH   s         r   r<   zAttention.__init__  s    " 	X~"""$I""" %
(**9S#'999I..Ic3''	I..r   rI   c                 t   |j         \  }}}}||z  }|                    d                              dd          }|                     |                              ||d| j        | j                                      ddddd          }|                    d          \  }}	}
| j	        r<t          j        j                            ||	|
| j        r| j        j        nd	          }nS|| j        z  }||	                    dd          z  }|                    d
          }|                     |          }||
z  }|                    dd                              |||          }|                     |          }|                     |          }|                    dd                              ||||          }|S )Nr_   ru   r   r   r   r   r   )	dropout_pr   )shapeflatten	transposer   r~   r   r   permuteunbindr   ra   r=   rb   scaled_dot_product_attentiontrainingr   pr   softmaxr   r   )r9   rI   BCHWNr   qkvattns               r   rO   zAttention.forward  s   W
1aEIIaLL""2r**HHQKKWQ1dndm<<WQ1a## 	
 **Q--1a? 
	#@@1a.2mC$.** A  AA
 DJAq{{2r***D<<B<''D>>$''DqAKK1%%aA..IIaLLNN1KKB''1a33r   )r   Fr   r   )r   r   r   r   ra   jitFinalr   __annotations__r   floatr<   r   rO   r   r   s   @r   r   r     s          
 	%%%%
 """/ // / 	/
 / / 
/ / / / / /: %,        r   r   c                        e Zd ZdZej        dddfdededededej        ded	ed
eddf fdZ	de
j        de
j        fdZ xZS )
PatchEmbedz$Convolutional patch embedding layer.F
patch_sizer%   r"   	embed_dimr,   lkc_use_actr(   r'   r-   Nc	                     t                                                       t          j        t	          ||||dd||r|nd|	  	        t          ||ddd||                    | _        dS )a{  Build patch embedding layer.

        Args:
            patch_size: Patch size for embedding computation.
            stride: Stride for convolutional embedding layer.
            in_chs: Number of channels of input tensor.
            embed_dim: Number of embedding dimensions.
            inference_mode: Flag to instantiate model in inference mode. Default: ``False``
        r   r   N)	r"   r#   r$   r%   r   r   r(   r,   r'   F)r"   r#   r$   r%   r(   r,   r'   )r;   r<   r=   r   r   r!   r   )
r9   r   r%   r"   r   r,   r   r(   r'   rH   s
            r   r<   zPatchEmbed.__init__  s    ( 	M"!&'2<))-
 
 
  !#-  
 
			r   rI   c                 0    |                      |          }|S r   )r   r9   rI   s     r   rO   zPatchEmbed.forwardJ  s    IIaLLr   )r   r   r   r   r=   r   r   r   r   r<   ra   r   rO   r   r   s   @r   r   r     s        .. $&7 % #(*
 *
*
 *
 	*

 *
 y*
 *
 *
 !*
 
*
 *
 *
 *
 *
 *
X %,        r   r   c                   &     e Zd Zd fd	Zd Z xZS )LayerScale2dh㈵>Fc                     t                                                       || _        t          j        |t          j        |dd          z            | _        d S )Nr   )r;   r<   inplacer=   	Parameterra   onesr   )r9   r   init_valuesr   rH   s       r   r<   zLayerScale2d.__init__P  sH    \+
310E0E"EFF


r   c                 X    | j         r|                    | j                  n	|| j        z  S r   )r   mul_r   r   s     r   rO   zLayerScale2d.forwardU  s(    %)\Eqvvdj!!!q4:~Er   )r   F)r   r   r   r<   rO   r   r   s   @r   r   r   O  sY        G G G G G G
F F F F F F Fr   r   c                   \     e Zd ZdZ	 	 	 ddef fdZdej        dej        fd	ZddZ	 xZ
S )RepMixerzReparameterizable token mixer.

    For more details, please refer to our paper:
    `FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization <https://arxiv.org/pdf/2303.14189.pdf>`_
    r   r   Fr'   c           	         t                                                       || _        || _        || _        |r>t          j        | j        | j        | j        d| j        dz  | j        d          | _        dS d| _        t          |||dddd          | _	        t          |||dd	          | _
        |t          ||          | _        dS t          j                    | _        dS )
a  Build RepMixer Module.

        Args:
            dim: Input feature map dimension. :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, H, W)`.
            kernel_size: Kernel size for spatial mixing. Default: 3
            layer_scale_init_value: Initial value for layer scale. Default: 1e-5
            inference_mode: If True, instantiates model in inference mode. Default: ``False``
        r   r_   Tr$   r%   paddingr1   r2   NFr   )r   r)   r*   r+   )r   r)   )r;   r<   r   r$   r'   r=   r   r@   r!   normmixerr   layer_scaler>   )r9   r   r$   layer_scale_init_valuer'   rH   s        r   r<   zRepMixer.__init__`  s    	&, 	1 "	 ,(A-x! ! !D !%D&!&"#  DI (  DJ &1#/5K#L#L   #%;==   r   rI   r-   c                     | j         |                      |          }nA||                     |                     |          |                     |          z
            z   }|S r   )r@   r   r   r   r   s     r   rO   zRepMixer.forward  sV    (!!!$$AAD$$TZZ]]TYYq\\%ABBBAr   Nc                     | j         rdS | j                                         | j                                         t	          | j        t                    r| j        j        | j        j        	                    d          | j        j
        j        | j        j
        j        z
  z  z   }t          j        | j        j                  | j        j
        j        | j        j
        j        z
  z  }nS| j        j        | j        j
        j        z   | j        j
        j        z
  }| j        j
        j        | j        j
        j        z
  }t          | j        | j        | j        d| j        d          | _
        || j
        j        _        || j
        j        _        |                                 D ]\  }}d|v r
|                                 |                     d           |                     d           |                     d	           dS )
ziReparameterize mixer and norm into a single
        convolutional layer for efficient inference.
        Nru   r   Tr   r@   r   r   r   )r'   r   r]   r   rv   r   r   rq   r   	unsqueezer@   rT   ra   squeezer2   r   r   r$   rU   rV   rW   rX   )r9   wbr[   r\   s        r   r]   zRepMixer.reparameterize  s     	F
!!###	  """d&55 	K
$t'7'='G'G'K'K
'.1G1NN( A d.455
',ty/E/JJAA
 
$*)01)(/0 
 
',ty/E/JJA)HH(8
 
 
 )* %&'#//11 	 	JD$%%LLNNNN!!!   '''''r   )r   r   Fr   )r   r   r   r   r   r<   ra   r   rO   r]   r   r   s   @r   r   r   Y  s          #'#(31 31
 !31 31 31 31 31 31j %,    *( *( *( *( *( *( *( *(r   r   c                        e Zd ZdZddej        dfdedee         dee         dej        de	d	df fd
Z
dej        d	dfdZdej        d	ej        fdZ xZS )ConvMlpzConvolutional FFN Module.Nr   r"   hidden_channelsr#   r,   dropr-   c                 ~   t                                                       |p|}|p|}t          ||d|d          | _        t	          j        ||d          | _         |            | _        t	          j        ||d          | _        t	          j	        |          | _
        |                     | j                   dS )a_  Build convolutional FFN module.

        Args:
            in_chs: Number of input channels.
            hidden_channels: Number of channels after expansion. Default: None
            out_chs: Number of output channels. Default: None
            act_layer: Activation layer. Default: ``GELU``
            drop: Dropout rate. Default: ``0.0``.
           F)r$   r1   r6   r   )r$   N)r;   r<   r   rw   r=   r   fc1rG   fc2r   r   apply_init_weights)r9   r"   r   r#   r,   r   rH   s         r   r<   zConvMlp.__init__  s    " 	#V)3V
 
 
	 9V_!DDD9;;9_g1EEEJt$$	

4%&&&&&r   mc                     t          |t          j                  rDt          |j        d           |j        )t          j                            |j        d           d S d S d S )N{Gz?r   r   )rv   r=   r   r   rT   r2   init	constant_r9   r  s     r   r  zConvMlp._init_weights  sc    a## 	-!(----v!!!!&!,,,,,	- 	-!!r   rI   c                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r   )rw   r   rG   r   r   r   s     r   rO   zConvMlp.forward  sa    IIaLLHHQKKHHQKKIIaLLHHQKKIIaLLr   )r   r   r   r   r=   r   r   r   r   r   r<   r  ra   r   rO   r   r   s   @r   r   r     s        ##
 .2%)#%7' '' &c]' c]	'
 y' ' 
' ' ' ' ' 'B-ry -T - - - - %,        r   r   c                        e Zd ZdZ	 	 	 ddedee         deeeeef         f         ddf fd	Zd
e	j
        de	j
        fdZddZ xZS )RepConditionalPosEnca"  Implementation of conditional positional encoding.

    For more details refer to paper:
    `Conditional Positional Encodings for Vision Transformers <https://arxiv.org/pdf/2102.10882.pdf>`_

    In our implementation, we can reparameterize this module to eliminate a skip connection.
    Nr   r   Fr   dim_outspatial_shaper-   c           
         t          t          |                                            t          |t                    rt          |gdz            }t          |t                    sJ dt          |           d            t          |          dk    sJ dt          |           d            || _	        || _
        |p|| _        || _        |r?t          j        | j
        | j        | j	        d|d         dz  | j        d          | _        d	S d	| _        t          j        | j
        | j        |dt	          |d         dz            | j        d
          | _        d	S )at  Build reparameterizable conditional positional encoding

        Args:
            dim: Number of input channels.
            dim_out: Number of embedding dimensions. Default: 768
            spatial_shape: Spatial shape of kernel for positional encoding. Default: (7, 7)
            inference_mode: Flag to instantiate block in inference mode. Default: ``False``
        r_   z/"spatial_shape" must by a sequence or int, get z	 instead.z+Length of "spatial_shape" should be 2, got r   r   Tr   N)r1   r2   )r;   r  r<   rv   r   tupler   typelenr  r   r  r1   r=   r   r@   pos_enc)r9   r   r  r  r'   rH   s        r   r<   zRepConditionalPosEnc.__init__  s    	"D))22444mS)) 	7!=/A"566M-// 	
 	
2&&2 2 2	
 	
 	
 =!!Q&&&1}%%1 1 1 '&&
 +~# 	 "	 .%a(A-{! ! !D !%D9M!$)**{  DLLLr   rI   c                 p    | j         |                      |          }n|                     |          |z   }|S r   )r@   r  r   s     r   rO   zRepConditionalPosEnc.forward<  s9    (!!!$$AAQ!#Ar   c           
         | j         | j        z  }t          j        | j         || j        d         | j        d         f| j        j        j        | j        j        j                  }t          | j                   D ]*}d||||z  | j        d         dz  | j        d         dz  f<   +|}|| j        j        z   }| j        j
        }t          j        | j         | j        | j        dt          | j        d         dz            | j        d          | _        || j        j        _        || j        j
        _        |                                 D ]\  }}d|v r
|                                 |                     d           d S )	Nr   r   rr   r_   Tr   r@   r  )r   r1   ra   r|   r  r  rT   rs   rt   rD   r2   r=   r   r  r   r@   rU   rV   rW   rX   )	r9   r   r   r   rq   w_finalb_finalr[   r\   s	            r   r]   z#RepConditionalPosEnc.reparameterizeC  s   H+	{"1%"1%	 ,%+<&-	
 	
 	
 tx 	 	A  I"1%*"1%*,  !	 dl11,# IHL**1-233;
 
 
 )0 %&-#//11 	 	JD$%%LLNNNN#####r   )Nr  Fr   )r   r   r   r   r   r   r   r   r<   ra   r   rO   r]   r   r   s   @r   r  r    s          &*9? 4 44 c]4 !eCHo!56	4 
4 4 4 4 4 4l %,    +$ +$ +$ +$ +$ +$ +$ +$r   r  c                   n     e Zd ZdZddej        ddddfdeded	ed
ej        dededede	f fdZ
d Z xZS )RepMixerBlockzImplementation of Metaformer block with RepMixer as token mixer.

    For more details on Metaformer structure, please refer to:
    `MetaFormer Is Actually What You Need for Vision <https://arxiv.org/pdf/2111.11418.pdf>`_
    r         @r   r   Fr   r$   	mlp_ratior,   r   	drop_pathr   r'   c	                    t                                                       t          ||||          | _        t	          |t          ||z            ||          | _        |t          ||          | _        nt          j
                    | _        |dk    rt          |          nt          j
                    | _        dS )a,  Build RepMixer Block.

        Args:
            dim: Number of embedding dimensions.
            kernel_size: Kernel size for repmixer. Default: 3
            mlp_ratio: MLP expansion ratio. Default: 4.0
            act_layer: Activation layer. Default: ``nn.GELU``
            proj_drop: Dropout rate. Default: 0.0
            drop_path: Drop path rate. Default: 0.0
            layer_scale_init_value: Layer scale value at initialization. Default: 1e-5
            inference_mode: Flag to instantiate block in inference mode. Default: ``False``
        )r$   r   r'   r"   r   r,   r   Nr   )r;   r<   r   token_mixerr   r   mlpr   r   r=   r>   r   r  )
r9   r   r$   r  r,   r   r  r   r'   rH   s
            r   r<   zRepMixerBlock.__init__x  s    0 	###9)	
 
 
 i00	
 
 
 "-+C1GHHD!{}}D09C),,,R[]]r   c                     |                      |          }||                     |                     |                     |                              z   }|S r   )r  r  r   r   r   s     r   rO   zRepMixerBlock.forward  sH    Qt//<<===r   )r   r   r   r   r=   r   r   r   r   r   r<   rO   r   r   s   @r   r  r  q  s           !"#%7"",0#(+S +S+S +S 	+S
 y+S +S +S %*+S !+S +S +S +S +S +SZ      r   r  c                   |     e Zd ZdZdej        ej        dddfdededej	        dej	        d	ed
edef fdZ
d Z xZS )AttentionBlockzImplementation of metaformer block with MHSA as token mixer.

    For more details on Metaformer structure, please refer to:
    `MetaFormer Is Actually What You Need for Vision <https://arxiv.org/pdf/2111.11418.pdf>`_
    r  r   r   r   r  r,   
norm_layerr   r  r   c                 V   t                                                        ||          | _        t          |          | _        |t          ||          | _        nt          j                    | _        |dk    rt          |          nt          j                    | _
        t          |t          ||z            ||          | _        |t          ||          | _        nt          j                    | _        |dk    rt          |          nt          j                    | _        dS )a  Build Attention Block.

        Args:
            dim: Number of embedding dimensions.
            mlp_ratio: MLP expansion ratio. Default: 4.0
            act_layer: Activation layer. Default: ``nn.GELU``
            norm_layer: Normalization layer. Default: ``nn.BatchNorm2d``
            proj_drop: Dropout rate. Default: 0.0
            drop_path: Drop path rate. Default: 0.0
            layer_scale_init_value: Layer scale value at initialization. Default: 1e-5
        r   Nr   r  )r;   r<   r   r   r  r   layer_scale_1r=   r>   r   
drop_path1r   r   r   layer_scale_2
drop_path2)	r9   r   r  r,   r$  r   r  r   rH   s	           r   r<   zAttentionBlock.__init__  s	   , 	JsOO	$---!-!-c3I!J!JD!#D1:S(9---bkmmi00	
 
 
 "-!-c3I!J!JD!#D1:S(9---bkmmr   c           
      $   ||                      |                     |                     |                     |                                        z   }||                     |                     |                     |                              z   }|S r   )r'  r&  r  r   r)  r(  r   r   s     r   rO   zAttentionBlock.forward  sq     2 243C3CDIIaLL3Q3Q R RSSS 2 2488A;; ? ?@@@r   )r   r   r   r   r=   r   rA   r   r   r   r<   rO   r   r   s   @r   r#  r#    s           ##%7$&N"",0*T *T*T *T y	*T
 	*T *T *T %**T *T *T *T *T *TX      r   r#  c            "            e Zd Zddddddd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de	ej
                 dededej
        dej
        dedede	e         f  fdZd Z xZS )FastVitStageTFr   r_   Nr   r  r   r   r   r  depthtoken_mixer_type
downsamplese_downsampledown_patch_sizedown_stridepos_emb_layerr$   r  r,   r$  proj_drop_ratedrop_path_rater   c                    t                                                       d| _        |rt          ||||||||          | _        n ||k    sJ t          j                    | _        |	 |	||          | _        nt          j                    | _        g }t          |          D ]}|dk    r1|	                    t          ||
|||||         ||                     9|dk    r0|	                    t          |||||||         |                     ot          d	                    |                    t          j        | | _        dS )
aQ  FastViT stage.

        Args:
            dim: Number of embedding dimensions.
            depth: Number of blocks in stage
            token_mixer_type: Token mixer type.
            kernel_size: Kernel size for repmixer.
            mlp_ratio: MLP expansion ratio.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            proj_drop_rate: Dropout rate.
            drop_path_rate: Drop path rate.
            layer_scale_init_value: Layer scale value at initialization.
            inference_mode: Flag to instantiate block in inference mode.
        F)r   r%   r"   r   r(   r,   r   r'   N)r'   repmixer)r$   r  r,   r   r  r   r'   	attention)r  r,   r$  r   r  r   z"Token mixer type: {} not supported)r;   r<   grad_checkpointingr   r/  r=   r>   pos_embrD   appendr  r#  
ValueErrorformatr   blocks)r9   r   r  r-  r.  r/  r0  r1  r2  r3  r$   r  r,   r$  r4  r5  r   r   r'   r>  	block_idxrH   s                        r   r<   zFastVitStage.__init__  s   H 	"' 	,(*"!$#'-	 	 	DOO '>>>> kmmDO$(=PPPDLL;==DLu 	 	I:--m +'',,Y7+A#1	 	 	 	 	 	 	 "[00n''),,Y7+A       !8??@PQQ   mV,r   c                     |                      |          }|                     |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|S r   )r/  r:  r9  ra   r   is_scriptingr   r>  r   s     r   rO   zFastVitStage.forward=  si    OOALLOO" 	59+A+A+C+C 	t{A..AAAAr   )r   r   r   r=   r   rA   r   strr   r   r   r   r<   rO   r   r   s   @r   r,  r,    sF         $"'#$ 15 "#%7$&N$'$'6: 'V- V-V- V- 	V-
 "V- V-  V- !V- V- $BI.V- V- V- yV- 	V- "V-  "!V-" %-UO#V- V- V- V- V- V-p      r   r,  c            1           e Zd ZU ej        j        e         ed<   	 ddddddddd	d
ddddddddddej	        ej
        dfdedeedf         deedf         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eej                 df         dededed ed!ed"ed#eded$ed%ed&ej        d'ej        d(ed)d*f0 fd+Zd,ej        d)d*fd-Zej        j        d.             Zej        j        dDd/            Zej        j        dEd1            Zej        j        d)ej        fd2            ZdFded%ee         fd3Z	 	 	 	 	 dGd5ej        d6eeeee         f                  d7ed8ed9ed:ed)eeej                 eej        eej                 f         f         fd;Z	 	 	 dHd6eeee         f         d=ed>efd?Zd5ej        d)ej        fd@ZdDd5ej        dAefdBZd5ej        d)ej        fdCZ  xZ!S )Ir   	fork_featr   r_   r_      r_   r7  r7  r7  r7  @            r   r   r   r   )FTTT)FFFF  )NNNNr   r_   r   r   Fg       @avgin_chanslayers.token_mixers
embed_dims
mlp_ratiosdownsamplesse_downsamplesrepmixer_kernel_sizenum_classespos_embsr1  r2  	drop_rater4  r5  r   r   	cls_ratioglobal_poolr$  r,   r'   r-   Nc                    t                                                       |rdn|	| _        || _        || _        g | _        t          ||d         ||          | _        |d         }d}d t          j	        d|t          |                                        |          D             }g }t          t          |                    D ]}||         p|||         k    }t          d"i d|d||         d||         d|d||         d	|d
|d|
|         d||         d|d||         d|d|d|d||         d|d|d|}|                    |           ||         }|r|dz  }| xj        t!          |d|z  d|           gz  c_        t#          j        | | _        t          | j                  | _        |x| _        | _        | j        rg d| _        t1          | j                  D ]l\  }} |dk    r5t2          j                            dd           r	 t#          j                    }!n |||                   }!d|  }"|                     |"|!           mnat=          |d         |z            x| _        x| _        }#t?          |d         |#ddd|d|d 	  	        | _         tC          |#|	||!          | _"        | #                    | j$                   d S )#Nr   r   c                 6    g | ]}|                                 S r   )tolist)r7   rI   s     r   r:   z$FastVit.__init__.<locals>.<listcomp>y  s     ```aqxxzz```r   r   r  r-  r/  r0  r1  r2  r3  r.  r$   r  r,   r$  r4  r5  r   r   r'   r_   r   stages.)num_chs	reductionmoduler   r   r_   r   
FORK_LAST3r   ru   r   T)	r"   r#   r$   r%   r   r'   r(   r,   r+   )	pool_typerZ  r   )%r;   r<   rX  rD  r\  feature_infor   stemra   linspacesumsplitrD   r  r,  r;  dictr=   r   stages
num_stagesr3   head_hidden_sizeout_indices	enumerateosenvirongetr>   
add_moduler   r!   
final_convr   headr   r  )%r9   rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  r1  r2  rZ  r4  r5  r   r   rD  r[  r\  r$  r,   r'   prev_dimr   dprrm  r   r/  stagei_embi_layerlayer
layer_namefinal_featuresrH   s%                                       r   r<   zFastVit.__init__N  s   4 	 ):11{"& 'qM	
 
	 a=``5>!^S[[#Q#Q#W#WX^#_#_```s6{{## 	e 	eA$QD8z!}+DJ    H"1 Qii &:	
 -Q// !0 (K 'qkk ".a 10 %Q-- $) &:  .~  #1vv  (>'=!" (K#$  .~%E( MM%   !!}H 
$x1u9Ub_`UbUb"c"c"c!ddmV,dk**4<<D1 > "	  ,||D"+D,<"="= 	3 	3wA::"*..t"D"D: KMMEE&Jz%'899E-G--

E2222	3 JMZXZ^^gMgIhIhhDh 5,!"~&-#"#
 
 
DO '%#	  DI 	

4%&&&&&r   r  c                     t          |t          j                  r^t          |j        d           t          |t          j                  r0|j        +t          j                            |j        d           dS dS dS dS )zInit. for classificationr  r  Nr   )rv   r=   r   r   rT   r2   r  r  r  s     r   r  zFastVit._init_weights  s    a## 	-!(----!RY'' -AF,>!!!&!,,,,,	- 	-- -,>,>r   c                     t                      S r   )setr9   s    r   no_weight_decayzFastVit.no_weight_decay  s    uur   c                 0    t          d|rdng d          S )Nz^stemz^stages\.(\d+)))z^stages\.(\d+).downsampler   )z^stages\.(\d+).pos_embr  )z^stages\.(\d+)\.\w+\.(\d+)N)rh  r>  )rl  )r9   coarses     r   group_matcherzFastVit.group_matcher  s9    (. $$ 5 5 5
 
 
 	
r   Tc                 (    | j         D ]	}||_        
d S r   )rm  r9  )r9   enabless      r   set_grad_checkpointingzFastVit.set_grad_checkpointing  s(     	* 	*A#)A  	* 	*r   c                     | j         j        S r   )rw  fcr  s    r   get_classifierzFastVit.get_classifier  s    y|r   c                 J    || _         | j                            ||           d S r   )rX  rw  reset)r9   rX  r\  s      r   reset_classifierzFastVit.reset_classifier  s&    &	[11111r   NCHWrI   indicesr   
stop_early
output_fmtintermediates_onlyc                    |dv s
J d            g }t          t          | j                  |          \  }}	|                     |          }| j        dz
  }
t
          j                                        s|s| j        }n| j        d|	dz            }d}t          |          D ])\  }} ||          }||v r|	                    |           *|r|S ||
k    r| 
                    |          }||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:

        )r  zOutput shape must be NCHW.r   Nr   )r   r  rm  rh  rn  ra   r   rA  rq  r;  rv  )r9   rI   r  r   r  r  r  intermediatestake_indices	max_indexlast_idxrm  feat_idxrz  s                 r   forward_intermediateszFastVit.forward_intermediates  s   * Y&&&(D&&&"6s4;7G7G"Q"Qi IIaLL?Q&9!!## 	1: 	1[FF[)a-0F(00 	( 	(OHeaA<''$$Q''' 	!  x""A-r   r   
prune_norm
prune_headc                     t          t          | j                  |          \  }}| j        d|dz            | _        |r|                     dd           |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r  rm  r  )r9   r  r  r  r  r  s         r   prune_intermediate_layersz!FastVit.prune_intermediate_layers  s\     #7s4;7G7G"Q"Qik.9q=.1 	)!!!R(((r   c                 @   |                      |          }g }t          | j                  D ]S\  }} ||          }| j        r<|| j        v r3t          | d|           } ||          }|                    |           T| j        r|S |                     |          }|S )Nr   )rh  rq  rm  rD  rp  getattrr;  rv  )r9   rI   outsidxblockr$  x_outs          r   forward_featureszFastVit.forward_features   s    IIaLL#DK00 	' 	'JCaA~ '$***!(|c||!<!<J&JqMMEKK&&&> 	KOOAr   
pre_logitsc                 ^    |r|                      |d          n|                      |          S )NT)r  )rw  )r9   rI   r  s      r   forward_headzFastVit.forward_head1  s,    0:Ltyyty,,,		!Lr   c                 l    |                      |          }| j        r|S |                     |          }|S r   )r  rD  r  r   s     r   rO   zFastVit.forward4  s<    !!!$$> 	Ha  r   F)Tr   )NFFr  F)r   FT)"r   r   r   ra   r   r   r   r   r=   rA   r   r   r   rB  r   r   r   r<   r  ignorer  r  r  r  r  r   r   r   r  r  r  r  rO   r   r   s   @r   r   r   G  sZ        yt$$$$ &2,\*=,4,E/K()#8C#$ "$'$',0 %#"$$&N#%7#(1q' q'q' #s(Oq'  S/	q'
 c3hq' eSj)q' tSy)q' "$),q' #&q' q' HRY/45q' !q' q' q' "q'  "!q'" %*#q'$ %q'& 'q'( )q'* +q', 	-q'. y/q'0 !1q'2 
3q' q' q' q' q' q'f-ry -T - - - - Y   Y
 
 
 
 Y* * * * Y	    2 2C 2hsm 2 2 2 2 8<$$',,  , |,  eCcN34,  	, 
 ,  ,  !%,  
tEL!5tEL7I)I#JJ	K,  ,  ,  , ` ./$#	 3S	>*  	   %, 5<    "M Mel M M M M M %,        r   r  c                 4    | dddddt           t          ddd
|S )	NrN  )r   rK  rK  )   r  g?bicubic)zstem.0.conv_kxk.0.convzstem.0.conv_scale.convzhead.fc)
urlrX  
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifierr   )r  kwargss     r   _cfgr  <  s9    #"%#J   r   zfastvit_t8.apple_in1kztimm/)	hf_hub_idzfastvit_t12.apple_in1kzfastvit_s12.apple_in1kzfastvit_sa12.apple_in1kzfastvit_sa24.apple_in1kzfastvit_sa36.apple_in1kzfastvit_ma36.apple_in1kgffffff?)r  r  zfastvit_t8.apple_dist_in1kzfastvit_t12.apple_dist_in1kzfastvit_s12.apple_dist_in1kzfastvit_sa12.apple_dist_in1kzfastvit_sa24.apple_dist_in1kzfastvit_sa36.apple_dist_in1kzfastvit_ma36.apple_dist_in1kzfastvit_mci0.apple_mclipzapple/mobileclip_s0_timmzXhttps://docs-assets.developer.apple.com/ml-research/datasets/mobileclip/mobileclip_s0.ptrL  )r   r   r   )      ?r  r  )r  r  r  rX  r  r   zfastvit_mci1.apple_mclipzapple/mobileclip_s1_timmzXhttps://docs-assets.developer.apple.com/ml-research/datasets/mobileclip/mobileclip_s1.ptzfastvit_mci2.apple_mclipzapple/mobileclip_s2_timmzXhttps://docs-assets.developer.apple.com/ml-research/datasets/mobileclip/mobileclip_s2.ptc                    d| v r| S |                      d|           } d| v rd}nd}ddl}ddl}g }|                                 D ]R\  }}|                    d|          }|r5|                    t          |                    d	                               St          t          t          |                              }i }	|                                 D ]\  }}|r||vr|                    |d          }|                    d
d          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd|          }|                    d          r|                    dd          }|                    d d!          }|                    d"          r|d#k    ryt          |j        d$          rdt#          |j        j        t&          j                  r@|                    d#d%          }|j        }t-          j        |j        d                   |	d&<   n|                    d"d'          }|                    d(|          }d)\  }
}|r8t          |                    d*                    }|                    ||          }
|
kd+| }d,|
 }|d-z   |v r|                    |d-z   |d.z             }n=|d/z   |v r|                    |d/z   |d0z             }n|                    ||d1z             }||	|<   |	S )2z$ Remap original checkpoints -> timm zstem.0.conv_kxk.0.conv.weight
state_dictz8image_encoder.model.patch_embed.0.rbr_conv.0.conv.weightzimage_encoder.model.r  r   Nz^(.*?)network\.(\d+)\.proj.*r_   patch_embedrh  rbr_convrE   	rbr_scalerF   rbr_skiprB   conv_exprv  
lkb_originr   convffnr   z	se.reducezse.fc1z	se.expandzse.fc2zlayer_scale_([0-9])zlayer_scale_\1.gammar   zlayer_scale.gamma	dist_head	head_distzhead.z	head.projr  zhead.fc.weightzhead.fc.biaszhead.fc.z^network\.(\d+))NNr   znetwork.r`  z.projz.downsample.projz.pez.pos_emb.pos_encz.blocks)rt  rebisectitemsmatchr;  r   grouplistsortedr  replacesubendswith
startswithrY   rw  rv   r  r=   r   Tra   r|   r   bisect_right)r  modelprefixr  r  
stage_endsr   r   r  out_dict	stage_idxnet_idx
net_prefixstage_prefixs                 r   checkpoint_filter_fnr    s   &*44j99JAZOO'IIIMMM J  "" 3 318!<< 	3c%++a..11222fS__--..JH  "" - -1 	&Q		&"%%A IImV,,IIj*--IIk<00IIj*--IIj,//IIlL11IIi''IIk8,,IIk8,,FF)+BAFF::m$$ 	>		-)<==AIIk;//<<   	3KGEJ$=$=*UZ]\^\eBfBfIIk+;<<C+0;qwqz+B+B((IIgz22 +Q//'	7 	A%++a..))G++J@@I -G--J0Y00LG#q((IIj72LCU4UVVe#q((IIj50,AS2STTIIj,*BCCOr   c                     |                     dd          }t          t          | |ft          t	          d|          d|}|S )Nrp  rd  T)flatten_sequentialrp  )pretrained_filter_fnfeature_cfg)popr   r   r  rl  )variant
pretrainedr  rp  r  s        r   _create_fastvitr    s]    **]L99K  2DkJJJ   E Lr   c           	      Z    t          dddd          }t          dd| it          |fi |S )	z%Instantiate FastViT-T8 model variant.)r_   r_   r   r_   )0   `      i  r   r   r   r   rG  rQ  rS  rT  rR  
fastvit_t8r  )r  rl  r  r  r  
model_argss      r   r  r    sP     %E	  J ]]J]$zB\B\U[B\B\]]]r   c           	      Z    t          dddd          }t          dd| it          |fi |S )	z&Instantiate FastViT-T12 model variant.rE  rH  r  rG  r  fastvit_t12r  )r  r  r  s      r   r  r    P     &E	  J ^^Z^4
C]C]V\C]C]^^^r   c           	      Z    t          dddd          }t          dd| it          |fi |S )	z&Instantiate FastViT-S12 model variant.rE  rH  rM  rG  r  fastvit_s12r  )r  r  r  s      r   r  r    r  r   c                     t          ddddddt          t          d          fd          }t          dd
| it          |fi |S )z'Instantiate FastViT-SA12 model variant.rE  rH  rM  Nr  r  r7  r7  r7  r8  rQ  rS  rT  rY  rR  fastvit_sa12r  )r  rl  r   r  r  r  s      r   r  r    sk     &dG,@PV$W$W$WXF  J __j_DD^D^W]D^D^___r   c                     t          ddddddt          t          d          fd          }t          dd
| it          |fi |S )z'Instantiate FastViT-SA24 model variant.)r   r      r   rH  rM  Nr  r  r  r  fastvit_sa24r  )r   r  r  s      r   r   r     k     &dG,@PV$W$W$WXF  J __j_DD^D^W]D^D^___r   c                     t          ddddddt          t          d          fd          }t          dd
| it          |fi |S )z'Instantiate FastViT-SA36 model variant.rF  rF     rF  rH  rM  Nr  r  r  r  fastvit_sa36r  )r  r  r  s      r   r  r    r  r   c                     t          ddddddt          t          d          fd          }t          dd
| it          |fi |S )z'Instantiate FastViT-MA36 model variant.r  )L      i0  i`  rM  Nr  r  r  r  fastvit_ma36r  )r	  r  r  s      r   r	  r	  +  r  r   c                     t          dddddddt          t          d          fdd	
          }t          dd| it          |fi |S )zInstantiate MCi0 model variant.)r_   rF  
   r_   rH  r  FFTTNr  r  r  TrQ  rS  rT  rV  rY  rR  r   fastvit_mci0r  )r  r  r  s      r   r  r  8  sq     &1dG,@PV$W$W$WXF  J __j_DD^D^W]D^D^___r   c                     t          dddddddt          t          d          fdd	
          }t          dd| it          |fi |S )zInstantiate MCi1 model variant.)r   r     r   rH  r  r  Nr  r  r  Tr  fastvit_mci1r  )r  r  r  s      r   r  r  G  q     &1dG,@PV$W$W$WXF  J __j_DD^D^W]D^D^___r   c                     t          dddddddt          t          d          fdd	
          }t          dd| it          |fi |S )zInstantiate MCi2 model variant.)r   r     r   )P      i@  i  r  r  Nr  r  r  Tr  fastvit_mci2r  )r  r  r  s      r   r  r  V  r  r   )r  r  )Arr  	functoolsr   typingr   r   r   r   ra   torch.nnr=   	timm.datar	   r
   timm.layersr   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r  r  r#  r,  r   r  default_cfgsr  r  r  r  r  r  r   r  r	  r  r  r  r   r   r   <module>r#     s   
			       / / / / / / / / / / / /        A A A A A A A A                  * * * * * * + + + + + + ' ' ' ' ' ' < < < < < < < <+& & &n= n= n= n= n=RY n= n= n=bT= T= T= T= T=RY T= T= T=t  "w$	* *** 9* 	*
 ]* * * *ZA A A A A	 A A AH1 1 1 1 1 1 1 1hF F F F F29 F F Fm( m( m( m( m(ry m( m( m(`1 1 1 1 1bi 1 1 1hq$ q$ q$ q$ q$29 q$ q$ q$h7 7 7 7 7BI 7 7 7t6 6 6 6 6RY 6 6 6r` ` ` ` `29 ` ` `Fr r r r rbi r r rj     %$ ;&TT  ;& dd  ;& dd  ;& tt     ;& tt     ;& tt     ;& tt     ;&& !$$# # #';&* "44$ $ $+;&0 "44$ $ $1;&4 #DD% % %5;&8 #DD% % %9;&< #DD% % %=;&B #DD% % %C;&L ,f|! ! !M;&Z ,f|! ! ![;&h ,f|! ! !i;& ; ;|F F FR
 
 
 
 ^ ^ ^ ^ _ _ _ _ _ _ _ _ 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` ` ` ` ` ` ` ` ` ` ` ` ` ` `r   