Ë
    éÓ^jõ  ã                   ó"  — d dl Z d dlmZ d dl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mZmZ d dlmZ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„ Z% G d„ dejL                  «      Z' G d„ dejL                  «      Z(ejR                  ddddfde*de*deejL                     de+de+dejX                  fd„Z- G d„ dejL                  «      Z. G d„ dejL                  «      Z/ G d„ dejL                  «      Z0 G d „ d!ejL                  «      Z1 G d"„ d#ejL                  «      Z2 G d$„ d%ejL                  «      Z3 G d&„ d'ejL                  «      Z4 G d(„ d)ejL                  «      Z5 G d*„ d+ejL                  «      Z6 G d,„ dejL                  «      Z7dcd-„Z8 e#i d. e8d/¬0«      “d1 e8d/¬0«      “d2 e8d/¬0«      “d3 e8d/¬0«      “d4 e8d/¬0«      “d5 e8d/¬0«      “d6 e8d/d7¬8«      “d9 e8d/¬0«      “d: e8d/¬0«      “d; e8d/¬0«      “d< e8d/¬0«      “d= e8d/¬0«      “d> e8d/¬0«      “d? e8d/d7¬8«      “d@ e8dAdBd7dCdDdEdF¬G«      “dH e8dIdJd7dCdDdEdF¬G«      “dK e8dLdMd7dCdDdEdF¬G«      “ e8d/dNdCdDdEdF¬O«       e8d/d7dCdDdEdF¬O«       e8d/d7dPeedQdRdF¬S«       e8d/d7dPeedQdRdF¬S«      dTœ¥«      Z9dU„ Z:dddV„Z;e"dddW„«       Z<e"dddX„«       Z=e"dddY„«       Z>e"dddZ„«       Z?e"ddd[„«       Z@e"ddd\„«       ZAe"ddd]„«       ZBe"ddd^„«       ZCe"ddd_„«       ZDe"ddd`„«       ZEe"ddda„«       ZFe"dddb„«       ZGy)eé    N)Úpartial)ÚListÚOptionalÚTupleÚTypeÚUnion)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚOPENAI_CLIP_MEANÚOPENAI_CLIP_STD)	ÚDropPathÚcalculate_drop_path_ratesÚtrunc_normal_Úcreate_conv2dÚConvNormActÚSqueezeExciteÚuse_fused_attnÚClassifierHeadÚLayerNorm2dé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚFastVitc                 ó&   — | sy|| z  dk(  sJ ‚|| z  S )Nr   r   © )Ú
group_sizeÚchannelss     ú^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/fastvit.pyÚ
num_groupsr"   "   s(   € ÙØð ˜*Ñ$¨Ò)Ð)Ð)Ø˜:Ñ%Ð%ó    c                   óŽ  ‡ — e Zd ZdZddddddddej
                  ddfdeded	ed
edededededededede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   FTNÚin_chsÚout_chsÚkernel_sizeÚstrideÚdilationr   Úinference_modeÚuse_seÚuse_actÚuse_scale_branchÚnum_conv_branchesÚ	act_layerÚreturnc                 óž  •— ||dœ}t         ‰| �  «        || _        t        ||«      | _        || _        || _        || _        || _        || _	        || _
        |rt        |fddi|¤Žnt        j                  «       | _        |r#t        ||f|||| j                  ddœ|¤Ž| _        nüd| _        ||k(  r|dk(  rt        j"                  dd|i|¤Žnd| _        |dkD  rtt        j&                  t)        | j                  «      D �cg c]<  }t+        | j                  | j                  f|| j
                  | j                  d	d
œ|¤Ž‘Œ> c}«      | _        nd| _        d| _        |dkD  rA|
r?t+        | j                  | j                  fd| j
                  | j                  d	d
œ|¤Ž| _        |	r |«       | _        yt        j                  «       | _        yc c}w )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.
        ©ÚdeviceÚdtypeÚ
rd_divisorr   T©r(   r)   r*   ÚgroupsÚbiasNÚnum_featuresr   F©r(   r)   r8   Ú	apply_actr   )ÚsuperÚ__init__r+   r"   r8   r)   r*   r(   r&   r'   r/   r   ÚnnÚIdentityÚser   Úreparam_convÚBatchNorm2dÚidentityÚ
ModuleListÚranger   Úconv_kxkÚ
conv_scaleÚact)Úselfr&   r'   r(   r)   r*   r   r+   r,   r-   r.   r/   r0   r4   r5   ÚddÚ_Ú	__class__s                    €r!   r>   zMobileOneBlock.__init__5   så  ø€ ð@ ¨Ñ/ˆÜ‰ÑÔØ,ˆÔÜ  ¨VÓ4ˆŒØˆŒØ ˆŒØ&ˆÔØˆŒØˆŒØ!2ˆÔñ AG”- Ñ<°AÐ<¸Ò<ÌBÏKÉKËMˆŒáÜ -ØØð	!ð (ØØ!Ø—{‘{Øñ	!ð ñ	!ˆDÕð !%ˆDÔð ˜fÒ$¨°1ªô —‘Ñ9¨FÐ9°bÒ9àð ŒMð ! 1Ò$Ü "§¡ô  % T×%;Ñ%;Ó<ö
/ð ô  ØŸ™ØŸ™ðð %0Ø#Ÿ{™{Ø#Ÿ{™{Ø"'ñð óò
/ó 
!�•ð !%�”ð #ˆDŒOØ˜QŠÑ#3Ü"-Ø—K‘KØ—L‘Lð#ð !"ØŸ;™;ØŸ;™;Ø#ñ#ð ñ#�”ñ #*‘9“;ˆ�¬r¯{©{«}ˆ�ùò7
/s   Ã?AG
Úxc                 óŽ  — | j                   �/| j                  | j                  | j                  |«      «      «      S d}| j                  �| j                  |«      }d}| j                  �| j	                  |«      }||z   }| j
                  �| j
                  D ]  }| ||«      z  }Œ | j                  | j                  |«      «      S )zApply forward pass.r   )rB   rI   rA   rD   rH   rG   )rJ   rN   Úidentity_outÚ	scale_outÚoutÚrcs         r!   ÚforwardzMobileOneBlock.forward—   sÀ   € ð ×ÑÐ(Ø—8‘8˜DŸG™G D×$5Ñ$5°aÓ$8Ó9Ó:Ð:ð ˆØ�=‰=Ð$ØŸ=™=¨Ó+ˆLð ˆ	Ø�?‰?Ð&ØŸ™¨Ó*ˆIð ˜,Ñ&ˆØ�=‰=Ð$Ø—m‘mò �Ø‘r˜!“u‘‘ðð �x‰x˜Ÿ™ ›Ó%Ð%r#   c           	      ó<  — | j                   �y| j                  «       \  }}t        | j                  | j                  | j
                  | j                  | j                  | j                  d¬«      | _         || j                   j                  _
        || j                   j                  _
        | j                  «       D ]  \  }}d|v rŒ|j                  «        Œ | j                  d«       | j                  d«       t        | d«      r| j                  d«       d| _        y)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*   r8   r9   rB   rG   rH   rD   )rB   Ú_get_kernel_biasr   r&   r'   r(   r)   r*   r8   ÚweightÚdatar9   Únamed_parametersÚdetach_Ú__delattr__Úhasattrr+   )rJ   Úkernelr9   ÚnameÚparas        r!   ÚreparameterizezMobileOneBlock.reparameterize°   sû   € ð ×ÑÐ(Øà×,Ñ,Ó.‰ˆ�Ü)ØŸ™ØŸ™Ø×(Ñ(Ø—;‘;Ø—]‘]Ø—;‘;Øô
ˆÔð )/ˆ×Ñ× Ñ Ô%Ø&*ˆ×Ñ×ÑÔ#ð ×/Ñ/Ó1ò 	‰JˆD�$Ø Ñ%ØØ�L‰L�Nð	ð
 	×Ñ˜Ô$Ø×Ñ˜Ô&Ü�4˜Ô$Ø×Ñ˜ZÔ(à"ˆÕr#   c                 ó  — d}d}| j                   �[| j                  | j                   «      \  }}| j                  dz  }t        j                  j
                  j                  |||||g«      }d}d}| j                  �| j                  | j                  «      \  }}d}d}| j                  �Et        | j                  «      D ]-  }| j                  | j                  |   «      \  }	}
||	z  }||
z  }Œ/ ||z   |z   }||z   |z   }||fS )z×Method 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   é   )rH   Ú_fuse_bn_tensorr(   Útorchr?   Ú
functionalÚpadrD   rG   rF   r/   )rJ   Úkernel_scaleÚ
bias_scalerh   Úkernel_identityÚbias_identityÚkernel_convÚ	bias_convÚixÚ_kernelÚ_biasÚkernel_finalÚ
bias_finals                r!   rX   zMobileOneBlock._get_kernel_biasÓ   s"  € ð ˆØˆ
Ø�?‰?Ð&Ø'+×';Ñ';¸D¿O¹OÓ'LÑ$ˆL˜*à×"Ñ" aÑ'ˆCÜ Ÿ8™8×.Ñ.×2Ñ2°<À#ÀsÈCÐQTÐAUÓVˆLð ˆØˆØ�=‰=Ð$Ø-1×-AÑ-AÀ$Ç-Á-Ó-PÑ*ˆO˜]ð ˆØˆ	Ø�=‰=Ð$Ü˜D×2Ñ2Ó3ò #�Ø!%×!5Ñ!5°d·m±mÀBÑ6GÓ!H‘�˜Ø˜wÑ&�Ø˜UÑ"‘	ð#ð
 # \Ñ1°OÑCˆØ Ñ+¨mÑ;ˆ
Ø˜ZÐ'Ð'r#   Úbranchc                 ó  — t        |t        «      r†|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }�n2t        |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   j+                  «       }||z  j-                  dddd«      }||z  |||z  |z  z
  fS )a  Method to fuse batchnorm layer with preceding 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©r5   r4   r   rd   éÿÿÿÿ)Ú
isinstancer   ÚconvrY   ÚbnÚrunning_meanÚrunning_varr9   Úepsr?   rC   r^   r&   r8   rf   Úzerosr(   r5   r4   rF   rv   ÚsqrtÚreshape)rJ   rt   r_   r|   r}   ÚgammaÚbetar~   Ú	input_dimÚkernel_valueÚiÚstdÚts                r!   re   zMobileOneBlock._fuse_bn_tensorö   s¶  € ô �fœkÔ*Ø—[‘[×'Ñ'ˆFØ!Ÿ9™9×1Ñ1ˆLØ Ÿ)™)×/Ñ/ˆKØ—I‘I×$Ñ$ˆEØ—9‘9—>‘>ˆDØ—)‘)—-‘-ŠCä˜f¤b§n¡nÔ5Ð5Ð5Ü˜4 Ô-Ø ŸK™K¨4¯;©;Ñ6�	Ü$Ÿ{™{Ø—[‘[ )¨T×-=Ñ-=¸t×?OÑ?OÐPØ Ÿ-™-×-Ñ-Ø!Ÿ=™=×/Ñ/ô �ô
 ˜tŸ{™{Ó+ò �Að ð !Ø˜1˜y™=¨$×*:Ñ*:¸aÑ*?À×AQÑAQÐUVÑAVÐVòðð ".�”Ø—^‘^ˆFØ!×.Ñ.ˆLØ ×,Ñ,ˆKØ—M‘MˆEØ—;‘;ˆDØ—*‘*ˆCØ˜SÑ ×&Ñ&Ó(ˆØ�S‰[×!Ñ! " a¨¨AÓ.ˆØ˜‰z˜4 ,°Ñ"6¸Ñ"<Ñ<Ð<Ð<r#   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   ÚGELUÚintÚboolr   ÚModuler>   rf   ÚTensorrT   rb   r   rX   r   Ú
SequentialrC   re   Ú__classcell__©rM   s   @r!   r%   r%   +   sF  ø„ ñð ØØØ#(Ø Ø Ø%)Ø%&Ø)+¯©ØØñ`=àð`=ð ð`=ð ð	`=ð
 ð`=ð ð`=ð ð`=ð !ð`=ð ð`=ð ð`=ð #ð`=ð  #ð`=ð ˜BŸI™I‘ð`=ð  
õ!`=ðD&˜Ÿ™ð &¨%¯,©,ó &ò2!#ðF!( %¨¯©°e·l±lÐ(BÑ"Có !(ðF*=à˜"Ÿ-™-¨¯©Ð7Ñ8ð*=ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*÷*=r#   r%   c                   óp  ‡ — 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 )ÚReparamLargeKernelConvzàBuilding 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
    Nr&   r'   r(   r)   r   Úsmall_kernelr,   r0   r+   r1   c           	      óV  •— |
|dœ}t         ‰| �  «        || _        t        ||«      | _        || _        || _        || _        || _        |	r#t        ||f||d| j                  ddœ|¤Ž| _
        nkd| _
        t        ||f|| j                  | j                  ddœ|¤Ž| _        |�7||k  sJ d«       ‚t        ||f|| j                  | j                  ddœ|¤Ž| _        |rt        |fd	d
i|¤Žnt        j                   «       | _        |� |«       | _        yt        j                   «       | _        y)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``
        r3   r   Tr7   NFr;   zDThe kernel size for re-param cannot be larger than the large kernel!Úrd_ratiog      Ð?)r=   r>   r)   r"   r8   r&   r'   r(   r—   r   rB   r   Ú
large_convÚ
small_convr   r?   r@   rA   rI   )rJ   r&   r'   r(   r)   r   r—   r,   r0   r+   r4   r5   rK   rM   s                €r!   r>   zReparamLargeKernelConv.__init__,  s_  ø€ ð4 ¨Ñ/ˆÜ‰ÑÔØˆŒÜ  ¨VÓ4ˆŒØˆŒØˆŒà&ˆÔØ(ˆÔÙÜ -ØØð	!ð (ØØØ—{‘{Øñ	!ð ñ	!ˆDÕð !%ˆDÔÜ)ØØðð (Ø—{‘{Ø—{‘{Øñð ñˆDŒOð Ð'à  KÒ/ðZàYóZØ/ä"-ØØð#ð !-ØŸ;™;ØŸ;™;Ø#ñ#ð ñ#�”ñ BH”- Ñ=°$Ð=¸"Ò=ÌRÏ[É[Ë]ˆŒà"+Ð"7‘9“;ˆ�¼R¿[¹[»]ˆ�r#   rN   c                 óè   — | j                   �| j                  |«      }n1| j                  |«      }| j                  �|| j                  |«      z   }| j                  |«      }| j	                  |«      }|S ©N)rB   rš   r›   rA   rI   )rJ   rN   rR   s      r!   rT   zReparamLargeKernelConv.forwardv  sh   € Ø×ÑÐ(Ø×#Ñ# AÓ&‰Cà—/‘/ !Ó$ˆCØ�‰Ð*Ø˜DŸO™O¨AÓ.Ñ.�Ø�g‰g�c‹lˆØ�h‰h�s‹mˆØˆ
r#   c                 ó¢  — | j                  | j                  j                  | j                  j                  «      \  }}t	        | d«      rƒ| j                  | j
                  j                  | j
                  j                  «      \  }}||z  }|t        j                  j                  || j                  | j                  z
  dz  gdz  «      z  }||fS )zÉMethod to obtain re-parameterized kernel and bias.
        Reference: https://github.com/DingXiaoH/RepLKNet-pytorch

        Returns:
            Tuple of (kernel, bias) after fusing branches.
        r›   rd   é   )Ú_fuse_bnrš   rz   r{   r^   r›   r?   rg   rh   r(   r—   )rJ   Úeq_kÚeq_bÚsmall_kÚsmall_bs        r!   Úget_kernel_biasz&ReparamLargeKernelConv.get_kernel_bias�  s²   € ð —]‘] 4§?¡?×#7Ñ#7¸¿¹×9KÑ9KÓL‰
ˆˆdÜ�4˜Ô&Ø#Ÿ}™}¨T¯_©_×-AÑ-AÀ4Ç?Á?×CUÑCUÓVÑˆG�WØ�G‰OˆDØ”B—M‘M×%Ñ%Ø˜4×+Ñ+¨d×.?Ñ.?Ñ?ÀAÑEÐFÈÑJóñ ˆDð �TˆzÐr#   c                 ó„  — | j                  «       \  }}t        | j                  | j                  | j                  | j
                  | j                  d¬«      | _        || j                  j                  _	        || j                  j                  _	        | j                  d«       t        | d«      r| j                  d«       yy)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)   r8   r9   rš   r›   N)r¥   r   r&   r'   r(   r)   r8   rB   rY   rZ   r9   r]   r^   )rJ   r¡   r¢   s      r!   rb   z%ReparamLargeKernelConv.reparameterize‘  s    € ð ×)Ñ)Ó+‰
ˆˆdÜ)Ø�K‰KØ�L‰LØ×(Ñ(Ø—;‘;Ø—;‘;Øô
ˆÔð )-ˆ×Ñ× Ñ Ô%Ø&*ˆ×Ñ×ÑÔ#Ø×Ñ˜Ô&Ü�4˜Ô&Ø×Ñ˜\Õ*ð 'r#   rz   r{   c                 ó  — | j                   }|j                  }|j                  }|j                   }|j                  }|j                  }||z   j                  «       }||z  j                  dddd«      }	||	z  |||z  |z  z
  fS )zéMethod to fuse batchnorm layer with conv layer.

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

        Returns:
            Tuple of (kernel, bias) after fusing batchnorm.
        rx   r   )rY   r|   r}   r9   r~   r€   r�   )
rz   r{   r_   r|   r}   r‚   rƒ   r~   r‡   rˆ   s
             r!   r    zReparamLargeKernelConv._fuse_bn¨  s…   € ð —‘ˆØ—‘ˆØ—n‘nˆØ—	‘	ˆØ�w‰wˆØ�f‰fˆØ˜SÑ ×&Ñ&Ó(ˆØ�S‰[×!Ñ! " a¨¨AÓ.ˆØ˜‰z˜4 ,°Ñ"6¸Ñ"<Ñ<Ð<Ð<r#   )NFNFNN©r1   N)r‰   rŠ   r‹   rŒ   rŽ   r   r�   r?   r�   r>   rf   r‘   rT   r   r¥   rb   ÚstaticmethodÚConv2drC   r    r“   r”   s   @r!   r–   r–   #  s-  ø„ ñð +/Ø Ø-1Ø#(ØØñHKàðHKð ðHKð ð	HKð
 ðHKð ðHKð # 3™-ðHKð ðHKð   §	¡	Ñ*ðHKð !ðHKð 
õHKðT	˜Ÿ™ð 	¨%¯,©,ó 	ð  u§|¡|°U·\±\Ð'AÑ!Bó ó +ð. ð=Ø—)‘)ð=à—‘ð=ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*ò=ó ô=r#   r–   FTr&   r'   r0   r+   r.   r1   c                 ó¢   — ||dœ}t        j                  t        d| |dd|||dœ|¤Žt        d||ddd|||dœ|¤Žt        d||d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.
    r3   é   rd   )r&   r'   r(   r)   r0   r+   r.   r   )r&   r'   r(   r)   r   r0   r+   r.   r   )r?   r’   r%   )r&   r'   r0   r+   r.   r4   r5   rK   s           r!   Úconvolutional_stemr®   Á  sª   € ð&  UÑ	+€BÜ�=‰=Üð 		
ØØØØØØ)Ø-ñ		
ð ñ		
ô 	ð 
	
ØØØØØØØ)Ø-ñ
	
ð ñ
	
ô 	ð 		
ØØØØØØ)Ø-ñ		
ð ñ		
ó- ð  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 )Ú	Attentionz§Multi-headed Self Attention module.

    Source modified from:
    https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py
    Ú
fused_attnNÚdimÚhead_dimÚqkv_biasÚ	attn_dropÚ	proj_dropr1   c                 ó€  •— ||dœ}t         ‰	| �  «        ||z  dk(  sJ d«       ‚|| _        ||z  | _        |dz  | _        t        «       | _        t        j                  ||dz  fd|i|¤Ž| _	        t        j                  |«      | _        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        y)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.
        r3   r   z#dim should be divisible by head_dimg      à¿r­   r9   N)r=   r>   r³   Ú	num_headsÚscaler   r±   r?   ÚLinearÚqkvÚDropoutrµ   Úprojr¶   )
rJ   r²   r³   r´   rµ   r¶   r4   r5   rK   rM   s
            €r!   r>   zAttention.__init__   s±   ø€ ð& ¨Ñ/ˆÜ‰ÑÔØ�X‰~ Ò"ÐIÐ$IÓIÐ"Ø ˆŒØ ™ˆŒØ Ñ%ˆŒ
Ü(Ó*ˆŒä—9‘9˜S #¨¡'Ñ?°Ð?¸BÑ?ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆ�r#   rN   c                 óV  — |j                   \  }}}}||z  }|j                  d«      j                  dd«      }| j                  |«      j	                  ||d| j
                  | j                  «      j                  ddddd«      }|j                  d«      \  }}	}
| j                  rPt        j                  j                  j                  ||	|
| j                  r| j                  j                   nd¬	«      }nL|| j"                  z  }||	j                  dd«      z  }|j%                  d¬
«      }| j                  |«      }||
z  }|j                  dd«      j	                  |||«      }| j'                  |«      }| j)                  |«      }|j                  dd«      j	                  ||||«      }|S )Nrd   éþÿÿÿrx   r­   r   r   rŸ   ç        )Ú	dropout_p)r²   )ÚshapeÚflattenÚ	transposer»   r�   r¸   r³   ÚpermuteÚunbindr±   rf   r?   rg   Úscaled_dot_product_attentionÚtrainingrµ   Úpr¹   Úsoftmaxr½   r¶   )rJ   rN   ÚBÚCÚHÚWÚNr»   ÚqÚkÚvÚattns               r!   rT   zAttention.forward   su  € Ø—W‘W‰
ˆˆ1ˆa�Ø�‰EˆØ�I‰I�a‹L×"Ñ" 2 rÓ*ˆà�H‰H�Q‹Kß‰W�Q˜˜1˜dŸn™n¨d¯m©mÓ<ß‰W�Q˜˜1˜a Ó#ð 	ð
 —*‘*˜Q“-‰ˆˆ1ˆaà�?Š?Ü—‘×#Ñ#×@Ñ@Ø�1�aØ.2¯mªm˜$Ÿ.™.×*Ò*Àð Aó ‰Að
 �D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØ—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�K‰K˜˜1Ó×%Ñ% a¨¨AÓ.ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØ�K‰K˜˜BÓ×'Ñ'¨¨1¨a°Ó3ˆàˆr#   )é    FrÀ   rÀ   NN)r‰   rŠ   r‹   rŒ   rf   ÚjitÚFinalr�   Ú__annotations__rŽ   Úfloatr>   r‘   rT   r“   r”   s   @r!   r°   r°   ø  sŒ   ø… ñð
 —	‘	—‘ Ñ%Ó%ð
 Ø"Ø"Ø"ØØñ/àð/ð ð/ð ð	/ð
 ð/ð ð/ð 
õ/ð@˜Ÿ™ð ¨%¯,©,÷ r#   r°   c                   ó¼   ‡ — e Zd ZdZej
                  dddddfdedededede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.FNÚ
patch_sizer)   r&   Ú	embed_dimr0   Úlkc_use_actr,   r+   r1   c                 ó²   •— |	|
dœ}t         ‰| �  «        t        j                  t	        d||||dd||r|nd|dœ	|¤Žt        d||ddd||dœ|¤Ž«      | _        y)	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``
        r3   r   r­   N)	r&   r'   r(   r)   r   r—   r,   r0   r+   F)r&   r'   r(   r)   r,   r0   r+   r   )r=   r>   r?   r’   r–   r%   r½   )rJ   rÛ   r)   r&   rÜ   r0   rÝ   r,   r+   r4   r5   rK   rM   s               €r!   r>   zPatchEmbed.__init__B  sŽ   ø€ ð, ¨Ñ/ˆÜ‰ÑÔÜ—M‘MÜ"ð ØØ!Ø&ØØØØÙ'2™)¸Ø-ñð ñô ð 	Ø Ø!ØØØØ#Ø-ñ	ð ñ	ó
ˆ�	r#   rN   c                 ó(   — | j                  |«      }|S r�   )r½   ©rJ   rN   s     r!   rT   zPatchEmbed.forwards  s   € Ø�I‰I�a‹LˆØˆr#   )r‰   rŠ   r‹   rŒ   r?   r�   rŽ   r   r�   r�   r>   rf   r‘   rT   r“   r”   s   @r!   rÚ   rÚ   ?  sŸ   ø„ Ù.ð *,¯©Ø %Ø Ø#(ØØñ/
àð/
ð ð/
ð ð	/
ð
 ð/
ð ˜BŸI™I‘ð/
ð ð/
ð ð/
ð !ð/
ð 
õ/
ðb˜Ÿ™ð ¨%¯,©,÷ r#   rÚ   c                   ó<   ‡ — e Zd Z	 	 	 	 ddededefˆ fd„Zd„ Zˆ xZS )ÚLayerScale2dr²   Úinit_valuesÚinplacec           
      óš   •— t         ‰| �  «        || _        t        j                  |t        j                  |dd||¬«      z  «      | _        y )Nr   r3   )r=   r>   rä   r?   Ú	Parameterrf   Úonesr‚   )rJ   r²   rã   rä   r4   r5   rM   s         €r!   r>   zLayerScale2d.__init__y  s>   ø€ ô 	‰ÑÔØˆŒÜ—\‘\ +´·
±
¸3ÀÀ1ÈVÐ[`Ô0aÑ"aÓbˆ�
r#   c                 ón   — | j                   r|j                  | j                  «      S || j                  z  S r�   )rä   Úmul_r‚   rà   s     r!   rT   zLayerScale2d.forward…  s(   € Ø%)§\¢\ˆq�v‰v�d—j‘jÓ!ÐE°q¸4¿:¹:±~ÐEr#   )çñhãˆµøä>FNN)	r‰   rŠ   r‹   rŽ   rØ   r�   r>   rT   r“   r”   s   @r!   râ   râ   x  s<   ø„ ð "&Ø!ØØñ
càð
cð ð
cð õ	
cöFr#   râ   c            	       ó†   ‡ — e Zd ZdZ	 	 	 	 	 ddededee   defˆ fd„Zde	j                  de	j                  fd	„Zdd
„Zˆ xZS )ÚRepMixerzÑReparameterizable 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(   Úlayer_scale_init_valuer+   c           	      óÐ  •— ||dœ}t         ‰| �  «        || _        || _        || _        |rXt        j                  | j                  | j                  f| j                  d| j                  dz  | j                  ddœ|¤Ž| _        yd| _        t        |||fddddd	œ|¤Ž| _	        t        |||fddd
œ|¤Ž| _
        |�t        ||fi |¤Ž| _        yt        j                  «       | _        y)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``
        r3   r   rd   T©r(   r)   Úpaddingr8   r9   NFr   )r   r-   r.   r/   )r   r-   )r=   r>   r²   r(   r+   r?   r«   rB   r%   ÚnormÚmixerrâ   Úlayer_scaler@   )	rJ   r²   r(   rí   r+   r4   r5   rK   rM   s	           €r!   r>   zRepMixer.__init__�  s  ø€ ð" ¨Ñ/ˆÜ‰ÑÔØˆŒØ&ˆÔØ,ˆÔáÜ "§	¡	Ø—‘Ø—‘ð	!ð !×,Ñ,ØØ×(Ñ(¨AÑ-Ø—x‘xØñ	!ð ñ	!ˆDÕð !%ˆDÔÜ&ØØØð	ð ØØ!&Ø"#ñ	ð ñ	ˆDŒIô (ØØØðð Øñð ñˆDŒJð &Ð1Ü#/°Ð5KÑ#RÈrÑ#R�Õ ä#%§;¡;£=�Õ r#   rN   r1   c                 ó®   — | j                   �| j                  |«      }|S || j                  | j                  |«      | j                  |«      z
  «      z   }|S r�   )rB   ró   rò   rñ   rà   s     r!   rT   zRepMixer.forwardË  sV   € Ø×ÑÐ(Ø×!Ñ! !Ó$ˆAð ˆð �D×$Ñ$ T§Z¡Z°£]°T·Y±Y¸q³\Ñ%AÓBÑBˆAØˆr#   c                 óh  — | j                   ry| j                  j                  «        | j                  j                  «        t	        | j
                  t        «      rê| j                  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  }n™| 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                  _        | j'                  «       D ]  \  }}d|v rŒ|j)                  «        Œ | j+                  d«       | j+                  d«       | j+                  d	«       y)
ziReparameterize mixer and norm into a single
        convolutional layer for efficient inference.
        Nrx   r   Tr§   rB   rò   rñ   ró   )r+   rò   rb   rñ   ry   ró   râ   rv   r‚   Ú	unsqueezerB   rY   rf   Úsqueezer9   r   r²   r(   rZ   r[   r\   r]   )rJ   ÚwÚbr`   ra   s        r!   rb   zRepMixer.reparameterizeÒ  s
  € ð ×ÒØà�
‰
×!Ñ!Ô#Ø�	‰	× Ñ Ô"ä�d×&Ñ&¬Ô5Ø—
‘
×$Ñ$ t×'7Ñ'7×'=Ñ'=×'GÑ'GÈÓ'KØ—
‘
×'Ñ'×.Ñ.°·±×1GÑ1G×1NÑ1NÑNñ(ñ ˆAô —‘˜d×.Ñ.×4Ñ4Ó5Ø—
‘
×'Ñ'×,Ñ,¨t¯y©y×/EÑ/E×/JÑ/JÑJñ‰Að
 —
‘
×$Ñ$Ø—*‘*×)Ñ)×0Ñ0ñ1à—)‘)×(Ñ(×/Ñ/ñ0ð ð
 —
‘
×'Ñ'×,Ñ,¨t¯y©y×/EÑ/E×/JÑ/JÑJˆAä)Ø�H‰HØ�H‰HØ×(Ñ(ØØ—8‘8Øô
ˆÔð )*ˆ×Ñ× Ñ Ô%Ø&'ˆ×Ñ×ÑÔ#à×/Ñ/Ó1ò 	‰JˆD�$Ø Ñ%ØØ�L‰L�Nð	ð 	×Ñ˜Ô!Ø×Ñ˜Ô Ø×Ñ˜Õ'r#   )r­   rê   FNNr©   )r‰   rŠ   r‹   rŒ   rŽ   r   rØ   r�   r>   rf   r‘   rT   rb   r“   r”   s   @r!   rì   rì   ‰  si   ø„ ñð  !Ø6:Ø#(ØØñ91àð91ð ð91ð %-¨U¡Oð	91ð
 !õ91ðv˜Ÿ™ð ¨%¯,©,ó ÷*(r#   rì   c                   óà   ‡ — e Zd ZdZddej
                  dddfdedee   dee   de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'   r0   Údropr1   c                 ój  •— ||dœ}t         ‰	| �  «        |xs |}|xs |}t        ||fd|ddœ|¤Ž| _        t	        j
                  ||fddi|¤Ž| _         |«       | _        t	        j
                  ||fddi|¤Ž| _        t	        j                  |«      | _
        | j                  | j                  «       y)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``.
        r3   é   F)r(   r8   r<   r(   r   N)r=   r>   r   rz   r?   r«   Úfc1rI   Úfc2r¼   rý   ÚapplyÚ_init_weights)
rJ   r&   rü   r'   r0   rý   r4   r5   rK   rM   s
            €r!   r>   zConvMlp.__init__  s¿   ø€ ð& ¨Ñ/ˆÜ‰ÑÔØÒ#˜VˆØ)Ò3¨VˆÜØØð
ð ØØñ
ð ñ
ˆŒ	ô —9‘9˜V _ÑJÀ!ÐJÀrÑJˆŒÙ“;ˆŒÜ—9‘9˜_¨gÑKÀ1ÐKÈÑKˆŒÜ—J‘J˜tÓ$ˆŒ	Ø�
‰
�4×%Ñ%Õ&r#   Úmc                 óÖ   — t        |t        j                  «      rOt        |j                  d¬«       |j
                  �+t        j                  j                  |j
                  d«       y y y )Nç{®Gáz”?©r‡   r   )ry   r?   r«   r   rY   r9   ÚinitÚ	constant_©rJ   r  s     r!   r  zConvMlp._init_weights'  sJ   € Ü�aœŸ™Ô#Ü˜!Ÿ(™(¨Õ-Ø�v‰vÐ!Ü—‘×!Ñ! !§&¡&¨!Õ,ð "ð $r#   rN   c                 óÒ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|S r�   )rz   r   rI   rý   r  rà   s     r!   rT   zConvMlp.forward-  sU   € Ø�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØˆr#   )r‰   rŠ   r‹   rŒ   r?   r�   rŽ   r   r   r�   rØ   r>   r  rf   r‘   rT   r“   r”   s   @r!   rû   rû   ÿ  s    ø„ Ù#ð
 .2Ø%)Ø)+¯©ØØØñ#'àð#'ð & c™]ð#'ð ˜c‘]ð	#'ð
 ˜BŸI™I‘ð#'ð ð#'ð 
õ#'ðJ-˜rŸy™yð -¨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e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.
    Nr²   Údim_outÚspatial_shaper+   r1   c           
      óˆ  •— ||dœ}t         ‰| �  «        t        |t        «      rt	        |gdz  «      }t        |t
        «      sJ dt        |«      › d�«       ‚t        |«      dk(  sJ dt        |«      › d�«       ‚|| _        || _	        |xs || _
        || _        |rQt        j                  | j                  | j                  f| j                  d|d   dz  | j                  dd	œ|¤Ž| _        y
d
| _        t        j                  | j                  | j                  |dt        |d   dz  «      f| j                  ddœ|¤Ž| _        y
)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``
        r3   rd   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)r8   r9   )r=   r>   ry   rŽ   Útupler   ÚtypeÚlenr  r²   r  r8   r?   r«   rB   Úpos_enc)	rJ   r²   r  r  r+   r4   r5   rK   rM   s	           €r!   r>   zRepConditionalPosEnc.__init__@  sj  ø€ ð" ¨Ñ/ˆÜ‰ÑÔÜ�m¤SÔ)Ü! = /°AÑ"5Ó6ˆMÜ˜-¬Ô/ð 	
ðÜ˜Ó&Ð' yð2ó	
Ð/ô �=Ó! QÒ&ð 	
ðÜ�}Ó%Ð& ið1ó	
Ð&ð
 +ˆÔØˆŒØ’~ #ˆŒØˆŒáÜ "§	¡	Ø—‘Ø—‘ð	!ð !×.Ñ.ØØ% aÑ(¨AÑ-Ø—{‘{Øñ	!ð ñ	!ˆDÕð !%ˆDÔÜŸ9™9Ø—‘Ø—‘ØØÜ�M !Ñ$¨Ñ)Ó*ð	ð —{‘{Øñ	ð ñ	ˆD�Lr#   rN   c                 ól   — | j                   �| j                  |«      }|S | j                  |«      |z   }|S r�   )rB   r  rà   s     r!   rT   zRepConditionalPosEnc.forward{  s>   € Ø×ÑÐ(Ø×!Ñ! !Ó$ˆAð ˆð —‘˜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<   Œ0 |}|| j
                  j                  z   }| j
                  j                  }t        j                  | j                   | j                  | j                  dt        | j                  d   dz  «      | j                  d¬«      | _        || j                  j                  _        || j                  j                  _        | j#                  «       D ]  \  }}d|v rŒ|j%                  «        Œ | j'                  d«       y )	Nr   r   rw   rd   Trï   rB   r  )r²   r8   rf   r   r  r  rY   r5   r4   rF   r9   r?   r«   r  rŽ   rB   rZ   r[   r\   r]   )	rJ   r„   r…   r†   rv   Úw_finalÚb_finalr`   ra   s	            r!   rb   z#RepConditionalPosEnc.reparameterize‚  s·  € à—H‘H §¡Ñ+ˆ	Ü—{‘{à—‘ØØ×"Ñ" 1Ñ%Ø×"Ñ" 1Ñ%ð	ð —,‘,×%Ñ%×+Ñ+Ø—<‘<×&Ñ&×-Ñ-ô	
ˆô �t—x‘x“ò 	ˆAð ð ØØ�I‘Ø×"Ñ" 1Ñ%¨Ñ*Ø×"Ñ" 1Ñ%¨Ñ*ð,òð	ð !ˆ	ð ˜dŸl™l×1Ñ1Ñ1ˆØ—,‘,×#Ñ#ˆô ŸI™IØ�H‰HØ�L‰LØ×*Ñ*ØÜ˜×*Ñ*¨1Ñ-°Ñ2Ó3Ø—;‘;Øô
ˆÔð )0ˆ×Ñ× Ñ Ô%Ø&-ˆ×Ñ×ÑÔ#à×/Ñ/Ó1ò 	‰JˆD�$Ø Ñ%ØØ�L‰L�Nð	ð 	×Ñ˜Õ#r#   )N©rÿ   rÿ   FNNr©   )r‰   rŠ   r‹   rŒ   rŽ   r   r   r   r�   r>   rf   r‘   rT   rb   r“   r”   s   @r!   r  r  7  s…   ø„ ñð &*Ø9?Ø#(ØØñ9àð9ð ˜c‘]ð9ð !  e¨C°¨H¡oÐ!5Ñ6ð	9ð
 !ð9ð 
õ9ðv˜Ÿ™ð ¨%¯,©,ó ÷+$r#   r  c                   óŒ   ‡ — e Zd ZdZddej
                  ddddddf	ded	ed
edeej                     dededede
fˆ fd„Zd„ Zˆ xZS )ÚRepMixerBlockzãImplementation 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ê   FNr²   r(   Ú	mlp_ratior0   r¶   Ú	drop_pathrí   r+   c                 óR  •— |	|
dœ}t         ‰| �  «        t        |f|||dœ|¤Ž| _        t	        d|t        ||z  «      ||dœ|¤Ž| _        |�t        ||fi |¤Ž| _        nt        j                  «       | _        |dkD  rt        |«      | _        yt        j                  «       | _        y)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``
        r3   )r(   rí   r+   ©r&   rü   r0   rý   NrÀ   r   )r=   r>   rì   Útoken_mixerrû   rŽ   Úmlprâ   ró   r?   r@   r   r  )rJ   r²   r(   r  r0   r¶   r  rí   r+   r4   r5   rK   rM   s               €r!   r>   zRepMixerBlock.__init__·  s½   ø€ ð2 ¨Ñ/ˆÜ‰ÑÔä#Øð
à#Ø#9Ø)ñ	
ð
 ñ
ˆÔô ð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒð "Ð-Ü+¨CÐ1GÑNÈ2ÑNˆDÕä!Ÿ{™{›}ˆDÔØ09¸C²œ )Ó,ˆ�ÄRÇ[Á[Ã]ˆ�r#   c                 óŒ   — | j                  |«      }|| j                  | j                  | j                  |«      «      «      z   }|S r�   )r!  r  ró   r"  rà   s     r!   rT   zRepMixerBlock.forwardè  s=   € Ø×Ñ˜QÓˆØ�—‘˜t×/Ñ/°·±¸³Ó<Ó=Ñ=ˆØˆr#   )r‰   rŠ   r‹   rŒ   r?   r�   rŽ   rØ   r   r�   r�   r>   rT   r“   r”   s   @r!   r  r  °  s“   ø„ ñð  !Ø"Ø)+¯©Ø"Ø"Ø,0Ø#(ØØñ/Sàð/Sð ð/Sð ð	/Sð
 ˜BŸI™I‘ð/Sð ð/Sð ð/Sð %*ð/Sð !õ/Söbr#   r  c                   ó´   ‡ — e Zd 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 )ÚAttentionBlockzßImplementation 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ê   Nr²   r  r0   Ú
norm_layerr¶   r  rí   c
                 ó  •— ||	dœ}
t         ‰| �  «         ||fi |
¤Ž| _        t        dd|i|
¤Ž| _        |�t        ||fi |
¤Ž| _        nt        j                  «       | _        |dkD  rt        |«      nt        j                  «       | _
        t        d|t        ||z  «      ||dœ|
¤Ž| _        |�t        ||fi |
¤Ž| _        nt        j                  «       | _        |dkD  rt        |«      | _        yt        j                  «       | _        y)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
        r3   r²   NrÀ   r   r   )r=   r>   rñ   r°   r!  râ   Úlayer_scale_1r?   r@   r   Ú
drop_path1rû   rŽ   r"  Úlayer_scale_2Ú
drop_path2)rJ   r²   r  r0   r&  r¶   r  rí   r4   r5   rK   rM   s              €r!   r>   zAttentionBlock.__init__õ  sü   ø€ ð. ¨Ñ/ˆÜ‰ÑÔá˜sÑ) bÑ)ˆŒ	Ü$Ñ3¨Ð3°Ñ3ˆÔØ!Ð-Ü!-¨cÐ3IÑ!PÈRÑ!PˆDÕä!#§¡£ˆDÔØ1:¸S²œ( 9Ô-ÄbÇkÁkÃmˆŒäð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒð "Ð-Ü!-¨cÐ3IÑ!PÈRÑ!PˆDÕä!#§¡£ˆDÔØ1:¸S²œ( 9Ó-ˆ�ÄbÇkÁkÃmˆ�r#   c           
      óì   — || j                  | j                  | j                  | j                  |«      «      «      «      z   }|| j	                  | j                  | j                  |«      «      «      z   }|S r�   )r)  r(  r!  rñ   r+  r*  r"  rà   s     r!   rT   zAttentionBlock.forward$  s^   € Ø�—‘ × 2Ñ 2°4×3CÑ3CÀDÇIÁIÈaÃLÓ3QÓ RÓSÑSˆØ�—‘ × 2Ñ 2°4·8±8¸A³;Ó ?Ó@Ñ@ˆØˆr#   )r‰   rŠ   r‹   rŒ   r?   r�   rC   rŽ   rØ   r   r�   r>   rT   r“   r”   s   @r!   r%  r%  î  s‘   ø„ ñð  #Ø)+¯©Ø*,¯.©.Ø"Ø"Ø,0ØØñ-Tàð-Tð ð-Tð ˜BŸI™I‘ð	-Tð
 ˜RŸY™Y™ð-Tð ð-Tð ð-Tð %*õ-Tö^r#   r%  c            %       ó  ‡ — e Zd Zdddddddej                  ej
                  dd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ej                     deej                     dedeee   ef   de	e   dedef$ˆ fd„Zd„ Zˆ xZS )ÚFastVitStageTFrÿ   rd   Nr­   r  rÀ   rê   r²   r  ÚdepthÚtoken_mixer_typeÚ
downsampleÚse_downsampleÚdown_patch_sizeÚdown_strideÚpos_emb_layerr(   r  r0   r&  Úproj_drop_rateÚdrop_path_raterí   rÝ   r+   c                 ó<  •— t         ‰| �  «        ||dœ}d| _        |rt        d||||||||dœ|¤Ž| _        n ||k(  sJ ‚t        j                  «       | _        |	� |	|fd|i|¤Ž| _        nt        j                  «       | _        g }t        |«      D ]r  }|dk(  r'|j                  t        |f|
|||||   ||dœ|¤Ž«       Œ/|dk(  r&|j                  t        |f||||||   |d	œ|¤Ž«       ŒZt        d
j                  |«      «      ‚ t        j                  |Ž | _        y)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.
        r3   F)rÛ   r)   r&   rÜ   r,   r0   rÝ   r+   Nr+   Úrepmixer)r(   r  r0   r¶   r  rí   r+   Ú	attention)r  r0   r&  r¶   r  rí   z"Token mixer type: {} not supportedr   )r=   r>   Úgrad_checkpointingrÚ   r1  r?   r@   Úpos_embrF   Úappendr  r%  Ú
ValueErrorÚformatr’   Úblocks)rJ   r²   r  r/  r0  r1  r2  r3  r4  r5  r(   r  r0   r&  r6  r7  rí   rÝ   r+   r4   r5   rK   r@  Ú	block_idxrM   s                           €r!   r>   zFastVitStage.__init__+  ss  ø€ ôL 	‰ÑÔØ¨Ñ/ˆØ"'ˆÔáÜ(ð 
Ø*Ø"ØØ!Ø$Ø#Ø'Ø-ñ
ð ñ
ˆD�Oð ˜'’>Ð!�>Ü Ÿk™k›mˆDŒOàÐ$Ù(¨ÑVÀÐVÐSUÑVˆD�LäŸ;™;›=ˆDŒLàˆÜ˜u›ò 	ˆIØ :Ò-Ø—‘œmØð
à +Ø'Ø'Ø,Ø,¨YÑ7Ø+AØ#1ñ
ð ñ
õ 
ð " [Ò0Ø—‘œnØð	à'Ø'Ø)Ø,Ø,¨YÑ7Ø+Añ	ð ñ	õ 	ô !Ø8×?Ñ?Ð@PÓQóð ð3	ô8 —m‘m VÐ,ˆ�r#   c                 óð   — | j                  |«      }| j                  |«      }| j                  r6t        j                  j                  «       st        | j                  |«      }|S | j                  |«      }|S r�   )r1  r<  r;  rf   rÕ   Úis_scriptingr   r@  rà   s     r!   rT   zFastVitStage.forward‰  s`   € Ø�O‰O˜AÓˆØ�L‰L˜‹OˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr#   )r‰   rŠ   r‹   r?   r�   rC   rŽ   Ústrr�   r   r�   rØ   r   r   r   r>   rT   r“   r”   s   @r!   r.  r.  *  s8  ø„ ð  $Ø"'Ø#$Ø Ø15Ø Ø"Ø)+¯©Ø*,¯.©.Ø$'Ø8;Ø6:Ø %Ø#(ØØñ+\-àð\-ð ð\-ð ð	\-ð
 "ð\-ð ð\-ð  ð\-ð !ð\-ð ð\-ð $ B§I¡IÑ.ð\-ð ð\-ð ð\-ð ˜BŸI™I‘ð\-ð ˜RŸY™Y™ð\-ð "ð\-ð  " $ u¡+¨uÐ"4Ñ5ð!\-ð" %-¨U¡Oð#\-ð$ ð%\-ð& !õ'\-ö|r#   r.  c            3       ód  ‡ — 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dej                  ej                  dd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d)eej                      d*eej                      d+ed,df2ˆ fd-„Zd.ej                   d,dfd/„Zej                  j(                  d0„ «       Zej                  j(                  dCd1„«       Zej                  j(                  dDd2„«       Zej                  j(                  d,ej                   fd3„«       ZdEded(ee   fd4„Z	 	 	 	 	 dFd5ej4                  d6eeeee   f      d7ed8ed9ed:ed,eeej4                     eej4                  eej4                     f   f   fd;„Z	 	 	 dGd6eeee   f   d<ed=efd>„Zd5ej4                  d,ej4                  fd?„ZdCd5ej4                  d@efdA„Z d5ej4                  d,ej4                  fdB„Z!ˆ xZ"S )Hr   Ú	fork_featr­   ©rd   rd   é   rd   ©r9  r9  r9  r9  ©é@   é€   é   é   ©rŸ   rŸ   rŸ   rŸ   )FTTT)FFFFéè  )NNNNrÿ   rd   rÀ   rê   FTg       @ÚavgNÚin_chansÚlayers.Útoken_mixersÚ
embed_dimsÚ
mlp_ratiosÚdownsamplesÚse_downsamplesÚrepmixer_kernel_sizeÚnum_classesÚpos_embsr3  r4  Ú	drop_rater6  r7  rí   rÝ   Ústem_use_scale_branchÚ	cls_ratioÚglobal_poolr&  r0   r+   r1   c                 óÊ  •— t         ‰(| �  «        ||dœ}|rdn|	| _        || _        || _        g | _        t        ||d   ||fd|i|¤Ž| _        |d   }d}t        ||d¬«      }g }t        t        |«      «      D ]¬  } ||    xs |||    k7  }!t        d$i d|“d||    “d	||    “d
|!“d||    “d|“d|“d|
|    “d||    “d|“d||    “d|“d|“d|“d||    “d|“d|“d|“|¤Ž}"|j                  |"«       ||    }|!r|dz  }| xj
                  t        |d|z  d| › �¬«      gz  c_        Œ® t        j                  |Ž | _        t        | j                   «      | _        |x| _        | _        | j                  r…g d¢| _        t+        | j(                  «      D ]c  \  }#}$|#dk(  r6t,        j.                  j1                  dd «      r	 t        j2                  «       }%n |||#   fi |¤Ž}%d|$› �}&| j5                  |&|%«       Œe nQt7        |d    |z  «      x| _        x| _        }'t9        d$|d    |'d!dd|d|dd"œ	|¤Ž| _        t=        |'|	f||d#œ|¤Ž| _        | jA                  | jB                  «       y )%Nr3   r   r.   r   T)Ú	stagewiser²   r  r/  r1  r2  r3  r4  r5  r0  r(   r  r0   r&  r6  r7  rí   rÝ   r+   rd   rŸ   ústages.)Únum_chsÚ	reductionÚmodule©r   r   rd   r­   Ú
FORK_LAST3rñ   rx   r­   )	r&   r'   r(   r)   r   r+   r,   r0   r/   )Ú	pool_typer\  r   )"r=   r>   rZ  rF  r_  Úfeature_infor®   Ústemr   rF   r  r.  r=  Údictr?   r’   ÚstagesÚ
num_stagesr:   Úhead_hidden_sizeÚout_indicesÚ	enumerateÚosÚenvironÚgetr@   Ú
add_modulerŽ   r%   Ú
final_convr   Úheadr  r  ))rJ   rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r3  r4  r\  r6  r7  rí   rÝ   r]  rF  r^  r_  r&  r0   r+   r4   r5   rK   Úprev_dimr¹   Údprrl  r†   r1  ÚstageÚi_embÚi_layerÚlayerÚ
layer_nameÚfinal_featuresrM   s)                                           €r!   r>   zFastVit.__init__š  sH  ø€ ô: 	‰ÑÔØ¨Ñ/ˆÙ )™1¨{ˆÔØ"ˆŒØ&ˆÔØˆÔô 'ØØ�q‰MØØñ	
ð
 3ð
ð ñ
ˆŒ	ð ˜a‘=ˆØˆÜ'¨¸È$ÔOˆØˆÜ”s˜6“{Ó#ò 	eˆAØ$ Q™ÒD¨8°zÀ!±}Ñ+DˆJÜ ò Ùðà" 1šðð ˜Q’iðñ &ð	ð
 -¨QÒ/ðñ !0ðñ (ðð ' qškðð ".¨a¢ðñ 1ðð % Qš-ðñ $ðñ &ðñ  .ðð  # 1švðñ  (>ð!ñ" (ð#ñ$  .Øñ'ˆEð* �M‰M˜%Ô Ø! !‘}ˆHÙØ˜‘
�Ø×Ò¤$¨xÀ1ÀuÁ9ÐW^Ð_`Ð^aÐUbÔ"cÐ!dÑdÖð7	eô8 —m‘m VÐ,ˆŒÜ˜dŸk™kÓ*ˆŒØ4<Ð<ˆÔ˜DÔ1ð �>Š>ò  ,ˆDÔÜ"+¨D×,<Ñ,<Ó"=ò 	3‘��wØ˜A’:¤"§*¡*§.¡.°¸tÔ"Dðô ŸK™K›M‘Eá& z°%Ñ'8Ñ?¸BÑ?�EØ# G 9Ð-�
Ø—‘ 
¨EÕ2ñ	3ô JMÈZÐXZÉ^Ð^gÑMgÓIhÐhˆDÔÐh Ô 5¸Ü,ð Ø! "‘~Ø&ØØØØ-ØØ#Ø"#ñð ñˆDŒOô 'ØØðð &Ø#ñ	ð
 ñˆDŒIð 	�
‰
�4×%Ñ%Õ&r#   r  c                 ó  — t        |t        j                  «      rjt        |j                  d¬«       t        |t        j                  «      r8|j
                  �+t        j                  j                  |j
                  d«       yyyy)zInit. for classificationr  r  Nr   )ry   r?   rº   r   rY   r9   r  r	  r
  s     r!   r  zFastVit._init_weights  sZ   € ä�aœŸ™Ô#Ü˜!Ÿ(™(¨Õ-Ü˜!œRŸY™YÔ'¨A¯F©FÐ,>Ü—‘×!Ñ! !§&¡&¨!Õ,ð -?Ð'ð $r#   c                 ó   — t        «       S r�   )Úset©rJ   s    r!   Úno_weight_decayzFastVit.no_weight_decay  s	   € ä‹uˆr#   c                 ó2   — t        d|rd¬«      S g d¢¬«      S )Nz^stemz^stages\.(\d+)))z^stages\.(\d+).downsample©r   )z^stages\.(\d+).pos_embr…  )z^stages\.(\d+)\.\w+\.(\d+)N)rj  r@  )rk  )rJ   Úcoarses     r!   Úgroup_matcherzFastVit.group_matcher!  s'   € äØÙ(.Ð$ô
ð 	
ò5ô
ð 	
r#   c                 ó4   — | j                   D ]	  }||_        Œ y r�   )rl  r;  )rJ   ÚenableÚss      r!   Úset_grad_checkpointingzFastVit.set_grad_checkpointing,  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r#   c                 ó.   — | j                   j                  S r�   )rv  Úfcr‚  s    r!   Úget_classifierzFastVit.get_classifier1  s   € à�y‰y�|‰|Ðr#   c                 óJ   — || _         | j                  j                  ||«       y r�   )rZ  rv  Úreset)rJ   rZ  r_  s      r!   Úreset_classifierzFastVit.reset_classifier5  s   € Ø&ˆÔØ�	‰	�‰˜ [Õ1r#   rN   Úindicesrñ   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc                 óÀ  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }| j                  dz
  }
t
        j                  j                  «       s|s| j                  }n| j                  d|	dz    }d}t        |«      D ]#  \  }} ||«      }||v sŒ|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   r  rl  rj  rm  rf   rÕ   rC  rp  r=  ru  )rJ   rN   r’  rñ   r“  r”  r•  ÚintermediatesÚtake_indicesÚ	max_indexÚlast_idxrl  Úfeat_idxry  s                 r!   Úforward_intermediateszFastVit.forward_intermediates9  së   € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið �I‰I�a‹LˆØ—?‘? QÑ&ˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFØˆÜ(¨Ó0ò 	(‰OˆH�eÙ�a“ˆAØ˜<Ò'Ø×$Ñ$ QÕ'ð	(ñ
 Ø Ð à�xÒØ—‘ Ó"ˆAà�-ÐÐr#   Ú
prune_normÚ
prune_headc                 ó    — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   Ú )r   r  rl  r‘  )rJ   r’  rž  rŸ  r™  rš  s         r!   Úprune_intermediate_layersz!FastVit.prune_intermediate_layersg  sM   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙØ×!Ñ! ! RÔ(ØÐr#   c                 ó<  — | j                  |«      }g }t        | j                  «      D ]Q  \  }} ||«      }| j                  sŒ|| j                  v sŒ*t        | d|› �«      } ||«      }|j                  |«       ŒS | j                  r|S | j                  |«      }|S )Nrñ   )rj  rp  rl  rF  ro  Úgetattrr=  ru  )rJ   rN   ÚoutsÚidxÚblockr&  Úx_outs          r!   Úforward_featureszFastVit.forward_featuresu  s–   € à�I‰I�a‹LˆØˆÜ# D§K¡KÓ0ò 	'‰JˆC�Ù�a“ˆAØ�~‹~Ø˜$×*Ñ*Ò*Ü!(¨°°c°U¨|Ó!<�JÙ& q›M�EØ—K‘K Õ&ð	'ð �>Š>àˆKØ�O‰O˜AÓˆØˆr#   Ú
pre_logitsc                 óN   — |r| j                  |d¬«      S | j                  |«      S )NT)rª  )rv  )rJ   rN   rª  s      r!   Úforward_headzFastVit.forward_head†  s$   € Ù0:ˆt�y‰y˜ tˆyÓ,ÐLÀÇ	Á	È!ÃÐLr#   c                 óf   — | j                  |«      }| j                  r|S | j                  |«      }|S r�   )r©  rF  r¬  rà   s     r!   rT   zFastVit.forward‰  s3   € Ø×!Ñ! !Ó$ˆØ�>Š>ØˆHØ×Ñ˜aÓ ˆØˆr#   ©F)Tr�   )NFFr—  F)r   FT)#r‰   rŠ   r‹   rf   rÕ   rÖ   r�   r×   r?   rC   r�   rŽ   r   rD  rØ   r   r�   r   r>   r  Úignorerƒ  r‡  r‹  rŽ  r‘  r‘   r   r   r�  r¢  r©  r¬  rT   r“   r”   s   @r!   r   r   “  s¶  ø… Ø�y‰y�‰˜tÑ$Ó$ðð Ø&2Ø,\Ø*=Ø,4Ø,EØ/KØ()Ø#Ø8CØ#$Ø Ø"Ø$'Ø$'Ø,0Ø %Ø*.Ø#Ø"Ø$Ø*,¯.©.Ø)+¯©Ø#(ØØñ7z'àðz'ð ˜#˜s˜(‘Oðz'ð    S ™/ð	z'ð
 ˜c 3˜h™ðz'ð ˜e S˜jÑ)ðz'ð ˜t S˜yÑ)ðz'ð " $¨ )Ñ,ðz'ð #&ðz'ð ðz'ð ˜H R§Y¡YÑ/°Ð4Ñ5ðz'ð !ðz'ð ðz'ð ðz'ð "ðz'ð  "ð!z'ð" %*ð#z'ð$ ð%z'ð& $(ð'z'ð( ð)z'ð* ð+z'ð, ð-z'ð. ˜RŸY™Y™ð/z'ð0 ˜BŸI™I‘ð1z'ð2 !ð3z'ð8 
õ9z'ðx-˜rŸy™yð -¨Tó -ð ‡Y�Y×Ññó ðð ‡Y�Y×Ñò
ó ð
ð ‡Y�Y×Ñò*ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mó 2ð 8<ØØ$Ø$Ø',ñ, à�|‰|ð, ð ˜e C¨¨c© NÑ3Ñ4ð, ð ð	, ð
 ð, ð ð, ð !%ð, ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó, ð` ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ð %§,¡,ð °5·<±<ó ñ"M˜eŸl™lð M¸ó Mð˜Ÿ™ð ¨%¯,©,÷ r#   c                 ó2   — | dddddt         dt        ddd	œ|¥S )
NrP  )r­   rM  rM  )é   r±  gÍÌÌÌÌÌì?Úbicubiczfastvit-license)ústem.0.conv_kxk.0.convzstem.0.conv_scale.convzhead.fc)ÚurlrZ  Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚlicenser‡   Ú
first_convÚ
classifier)r	   r
   )r´  Úkwargss     r!   Ú_cfgr¾  ‘  s7   € àØØ#ØØØ"Ü%Ø$Ü#Ø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.ptrN  )rÀ   rÀ   rÀ   )ç      ð?rÀ  rÀ  z
apple-amlr)r¿  r´  r·  rZ  r¹  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.ptrÀ  )r¿  r·  rZ  r¹  r‡   rº  é   )rŸ   rŸ   r³  )r¿  r·  rZ  r¹  r‡   r¶  r»  rº  )z!fastvit_mci0.apple_mclip2_dfndr2bz!fastvit_mci2.apple_mclip2_dfndr2bz!fastvit_mci3.apple_mclip2_dfndr2bz!fastvit_mci4.apple_mclip2_dfndr2bc                 óÖ  — d| v r| S d| v rF| j                  «       D ��ci c]*  \  }}|j                  d«      sŒ|j                  dd«      |“Œ, c}}S | j                  d| «      } d| v rd}nd}d	d
l}d	d
l}g }| j                  «       D ]C  \  }}|j                  d|«      }|sŒ|j                  t        |j                  d«      «      «       ŒE t        t        t        |«      «      «      }i }	| j                  «       D �]d  \  }}|r||vrŒ|j                  |d«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd |«      }|j                  d!«      r|j                  d!d"«      }|j                  d#d$«      }|j                  d%«      rŸ|d&k(  rˆt        |j                   d'«      rrt#        |j                   j$                  t&        j(                  «      rD|j                  d&d(«      }|j*                  }t-        j.                  |j0                  d	   «      |	d)<   n|j                  d%d*«      }|j                  d+|«      }d,\  }
}|r,t        |j                  d-«      «      }|j3                  ||«      }
|
�_d.|› �}d/|
› �}|d0z   |v r|j                  |d0z   |d1z   «      }n5|d2z   |v r|j                  |d2z   |d3z   «      }n|j                  ||d4z   «      }||	|<   �Œg |	S c c}}w )5z$ Remap original checkpoints -> timm zstem.0.conv_kxk.0.conv.weightz1module.visual.trunk.stem.0.conv_kxk.0.conv.weightzmodule.visual.trunkzmodule.visual.trunk.r¡  Ú
state_dictz8image_encoder.model.patch_embed.0.rbr_conv.0.conv.weightzimage_encoder.model.r   Nz^(.*?)network\.(\d+)\.proj.*rd   Úpatch_embedrj  Úrbr_convrG   Ú	rbr_scalerH   Úrbr_skiprD   Úconv_expru  Ú
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.rb  z.projz.downsample.projz.pez.pos_emb.pos_encz.blocks)ÚitemsÚ
startswithÚreplacers  ÚreÚbisectÚmatchr=  rŽ   ÚgroupÚlistÚsortedr�  ÚsubÚendswithr^   rv  ry   r�  r?   rº   ÚTrf   r   rÂ   Úbisect_right)rÃ  ÚmodelrÑ   rÒ   ÚprefixrÐ  rÑ  Ú
stage_endsrÒ  Úout_dictÚ	stage_idxÚnet_idxÚ
net_prefixÚstage_prefixs                 r!   Úcheckpoint_filter_fnrâ    sT  € à&¨*Ñ4ØÐà:¸jÑHØEO×EUÑEUÓEW×¹T¸QÀÐ[\×[gÑ[gÐh}Õ[~�—	‘	Ð0°"Ó5°qÑ8ÓÐà—‘ ¨jÓ9€JØAÀZÑOà'‰àˆãÛð €JØ× Ñ Ó"ò 3‰ˆˆ1Ø—‘Ð8¸!Ó<ˆÚØ×Ñœc %§+¡+¨a£.Ó1Õ2ð3ô ”fœS ›_Ó-Ó.€Jà€HØ× Ñ Ó"ó -‰ˆˆ1ÙØ˜Q‰ØØ—	‘	˜& "Ó%ˆAð �I‰I�m VÓ,ˆØ�I‰I�j *Ó-ˆØ�I‰I�k <Ó0ˆØ�I‰I�j *Ó-ˆØ�I‰I�j ,Ó/ˆØ�I‰I�l LÓ1ˆØ�I‰I�i Ó'ˆØ�I‰I�k 8Ó,ˆØ�I‰I�k 8Ó,ˆØ�F‰FÐ)Ð+BÀAÓFˆØ�:‰:�mÔ$Ø—	‘	˜-Ð)<Ó=ˆAØ�I‰I�k ;Ó/ˆØ�<‰<˜Ô Ø�KÒ¤G¨E¯J©J¸Ô$=Ä*ÈUÏZÉZÏ]É]Ô\^×\eÑ\eÔBfà—I‘I˜kÐ+;Ó<�Ø—C‘C�Ü+0¯;©;°q·w±w¸q±zÓ+B�˜Ò(à—I‘I˜g zÓ2�ð —‘Ð+¨QÓ/ˆØ'Ñˆ	�7ÙÜ˜%Ÿ+™+ a›.Ó)ˆGØ×+Ñ+¨J¸Ó@ˆIØÐ Ø# G 9Ð-ˆJØ$ Y KÐ0ˆLØ˜GÑ# qÑ(Ø—I‘I˜j¨7Ñ2°LÐCUÑ4UÓV‘Ø˜eÑ# qÑ(Ø—I‘I˜j¨5Ñ0°,ÐASÑ2SÓT‘à—I‘I˜j¨,¸Ñ*BÓC�àˆ�‹ð[-ð\ €OùóG @s
   žM%¸M%c                 ór   — |j                  dd«      }t        t        | |ft        t	        d|¬«      dœ|¤Ž}|S )Nro  rf  T)Úflatten_sequentialro  )Úpretrained_filter_fnÚfeature_cfg)Úpopr   r   râ  rk  )ÚvariantÚ
pretrainedr½  ro  rÚ  s        r!   Ú_create_fastvitrê  M  sJ   € Ø—*‘*˜]¨LÓ9€KÜ ÜØØðô 2Ü¨D¸kÔJñð ñ€Eð €Lr#   c           	      óN   — t        dddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z%Instantiate FastViT-T8 model variant.)rd   rd   rŸ   rd   )é0   é`   éÀ   é€  ©r­   r­   r­   r­   rI  ©rS  rU  rV  rT  ré  )Ú
fastvit_t8©rk  rê  ©ré  r½  Ú
model_argss      r!   rò  rò  Z  s:   € ô ØØ%ØØEô	€Jô Ñ]°JÐ]Ä$ÀzÑB\ÐU[ÑB\Ñ]Ð]r#   c           	      óN   — t        dddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z&Instantiate FastViT-T12 model variant.rG  rJ  rð  rI  rñ  ré  )Úfastvit_t12ró  rô  s      r!   r÷  r÷  f  ó:   € ô ØØ&ØØEô	€Jô Ñ^°ZÐ^Ä4È
ÑC]ÐV\ÑC]Ñ^Ð^r#   c           	      óN   — t        dddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )z&Instantiate FastViT-S12 model variant.rG  rJ  rO  rI  rñ  ré  )Úfastvit_s12ró  rô  s      r!   rú  rú  r  rø  r#   c                 óv   — 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.rG  rJ  rO  Nr  ©r  ©r9  r9  r9  r:  ©rS  rU  rV  r[  rT  ré  )Úfastvit_sa12©rk  r   r  rê  rô  s      r!   rÿ  rÿ  ~  sO   € ô ØØ&ØØ˜˜d¤GÔ,@ÐPVÔ$WÐXØFô€Jô Ñ_°jÐ_ÄDÈÑD^ÐW]ÑD^Ñ_Ð_r#   c                 óv   — 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Ÿ   rJ  rO  Nr  rü  rý  rþ  ré  )Úfastvit_sa24r   rô  s      r!   r  r  ‹  óO   € ô ØØ&ØØ˜˜d¤GÔ,@ÐPVÔ$WÐXØFô€Jô Ñ_°jÐ_ÄDÈÑD^ÐW]ÑD^Ñ_Ð_r#   c                 óv   — 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.©rH  rH  é   rH  rJ  rO  Nr  rü  rý  rþ  ré  )Úfastvit_sa36r   rô  s      r!   r  r  ˜  r  r#   c                 óv   — 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`  rO  Nr  rü  rý  rþ  ré  )Úfastvit_ma36r   rô  s      r!   r  r  ¥  r  r#   c                 óz   — 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.)rd   rH  é
   rd   rJ  rð  ©FFTTNr  rü  rý  T©rS  rU  rV  rX  r[  rT  rÝ   ré  )Úfastvit_mci0r   rô  s      r!   r  r  ²  sU   € ô ØØ&ØØ1Ø˜˜d¤GÔ,@ÐPVÔ$WÐXØFØô€Jô Ñ_°jÐ_ÄDÈÑD^ÐW]ÑD^Ñ_Ð_r#   c                 óz   — 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Ÿ   rJ  rð  r  Nr  rü  rý  Tr  ré  )Úfastvit_mci1r   rô  s      r!   r  r  Á  óU   € ô ØØ&ØØ1Ø˜˜d¤GÔ,@ÐPVÔ$WÐXØFØô€Jô Ñ_°jÐ_ÄDÈÑD^ÐW]ÑD^Ñ_Ð_r#   c                 óz   — 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  ré  )Úfastvit_mci2r   rô  s      r!   r  r  Ð  r  r#   c                 óÂ   — t        ddddddddt        t        d¬«      t        t        d¬«      fd	d
t        t        d¬«      d¬«
      }t	        dd| it        |fi |¤Ž¤Ž}|S )zInstantiate L model variant.)rd   r  r  rŸ   rd   )rí  rî  rï  rÁ  i   ©rŸ   rŸ   rŸ   rŸ   rŸ   ©FFFFF©FTTTTNr  rü  ©r9  r9  r9  r:  r:  Trê   ©r~   F©
rS  rU  rV  rX  rW  r[  rT  rÝ   r&  r]  ré  )Úfastvit_mci3©rk  r   r  r   rê  ©ré  r½  rõ  rÚ  s       r!   r"  r"  ß  s{   € ô Ø Ø,Ø"Ø:Ø3àØØÜÔ(¸Ô?ÜÔ(¸Ô?ð
ð TØÜœ;¨DÔ1Ø#ô!€Jô$ Ñ`°zÐ`ÄTÈ*ÑE_ÐX^ÑE_Ñ`€EØ€Lr#   c                 óÂ   — t        ddddddddt        t        d¬«      t        t        d¬«      fd	d
t        t        d¬«      d¬«
      }t	        dd| it        |fi |¤Ž¤Ž}|S )zInstantiate XL model variant.)rd   r  r  rŸ   rŸ   )rL  rM  rN  i   i   r  r  r  Nr  rü  r  Trê   r   Fr!  ré  )Úfastvit_mci4r#  r$  s       r!   r&  r&  ø  s{   € ô Ø Ø.Ø"Ø:Ø3àØØÜÔ(¸Ô?ÜÔ(¸Ô?ð
ð TØÜœ;¨DÔ1Ø#ô!€Jô& Ñ`°zÐ`ÄTÈ*ÑE_ÐX^ÑE_Ñ`€EØ€Lr#   )r¡  r®  )Hrq  Ú	functoolsr   Útypingr   r   r   r   r   rf   Útorch.nnr?   Ú	timm.datar	   r
   r   r   Útimm.layersr   r   r   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   r#   r!   ú<module>r2     sÌ  ðó 
Ý ß 5Õ 5ã Ý ç dÓ d÷
÷ 
õ 
õ +Ý +Ý 'ß <àˆ+€ò&ôu=�R—Y‘Yô u=ôp[=˜RŸY™Yô [=ðB &(§W¡WØ$Ø!%ØØñ4Øð4àð4ð ˜Ÿ	™	‘?ð4ð ð	4ð
 ð4ð ‡]�]ó4ônD�—	‘	ô DôN6�—‘ô 6ôrF�2—9‘9ô Fô"s(ˆr�y‰yô s(ôl5ˆb�i‰iô 5ôpv$˜2Ÿ9™9ô v$ôr;�B—I‘Iô ;ô|9�R—Y‘Yô 9ôxf�2—9‘9ô fôR{ˆb�i‰iô {ó|ñ" %ð \&Ø™TØôð\&ð ™dØôð\&ð ™dØôð\&ð ™tØô ð\&ð ™tØô ð\&ð ™tØô ð\&ð ™tØØô ð\&ð& !¡$Øô#ð'\&ð* "¡4Øô$ð+\&ð0 "¡4Øô$ð1\&ð4 #¡DØô%ð5\&ð8 #¡DØô%ð9\&ð< #¡DØô%ð=\&ðB #¡DØØô%ðC\&ðL ¡Ø,ØfØØØ˜|°\ô!ðM\&ðZ ¡Ø,ØfØØØ˜|°\ô!ð[\&ðh ¡Ø,ØfØØØ˜|°\ô!ði\&ñx *.ØØØØ˜|Øô*ñ *.ØØØØ˜|Øô*ñ *.ØØØØ ?ØØ+Øô*ñ *.ØØØØ ?ØØ+Øô*òg\&ó \€ò~IóX
ð ò^ó ð^ð ò_ó ð_ð ò_ó ð_ð ò	`ó ð	`ð ò	`ó ð	`ð ò	`ó ð	`ð ò	`ó ð	`ð ò`ó ð`ð ò`ó ð`ð ò`ó ð`ð òó ðð0 òó ñr#   