Ë
    éÓ^jh  ã                   ó<  — d Z ddlZddlmZmZmZmZ ddlZddlm	c m
Z ddlm	Z	 ddl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mZmZ dd
lmZmZmZmZm Z m!Z! ddl"m#Z$ g Z%dgd„Z&dhd„Z'did„Z(djd„Z) e* e e&dddd¬«       e&dddd¬«       e'ddddddd¬«       e'ddddddd¬«       e'ddddddd¬«      fddddd d!¬"«       e e&dd#d¬$«       e&ddd¬$«       e'dddddd¬%«       e'dddd&dd¬%«       e'dddd'dd¬%«      fddddd d(¬"«       e e&dd#d¬$«       e&ddd¬$«       e'dddd'dd¬%«       e'dd)dd*dd¬%«       e'dd+dd,dd¬%«      fddddd d-¬"«       e e&dd#d¬$«       e&ddd¬$«       e'dddd'dd¬%«       e'dd)dd*dd¬%«       e'dd+dd,dd¬%«      fddddd. e*d/¬0«      d-¬1«       e)d«       e)d2«       e)d3«       e)d«       e)d4«       e)d5«       e)d«      ¬6«      Z+e G d7„ d8e	jX                  «      «       Z- G d9„ d:e	jX                  «      Z. G d;„ d<e	jX                  «      Z/e G d=„ d>e	jX                  «      «       Z0 ed?e-«        ed@e0«       dkdA„Z1dkdB„Z2dldC„Z3 ei dD e3dE¬F«      “dG e3dE¬F«      “dH e3dE¬F«      “dI e3dEdJ¬K«      “dL e3dEdJ¬K«      “dM e3dEdJ¬K«      “dN e3dEdJ¬K«      “dO e3dEdJ¬K«      “dP e3dEdJ¬K«      “dQ e3dEdJ¬K«      “dR e3dEdJ¬K«      “dS e3dEdJ¬K«      “dT e3dEdJ¬K«      “dU e3dEdVdWd¬X«      “dY e3dEdVdWd¬X«      “dZ e3dEdVdWd¬X«      “«      Z4edmd[efd\„«       Z5edmd[efd]„«       Z6edmd[efd^„«       Z7edmd[efd_„«       Z8edmd[efd`„«       Z9edmd[efda„«       Z:edmd[efdb„«       Z;edmd[efdc„«       Z<edmd[efdd„«       Z=edmd[efde„«       Z> ee?dRdSdTdUdYdZdfœ«       y)na   MobileViT

Paper:
V1: `MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer` - https://arxiv.org/abs/2110.02178
V2: `Separable Self-attention for Mobile Vision Transformers` - https://arxiv.org/abs/2206.02680

MobileVitBlock and checkpoints adapted from https://github.com/apple/ml-cvnets (original copyright below)
License: https://github.com/apple/ml-cvnets/blob/main/LICENSE (Apple open source)

Rest of code, ByobNet, and Transformer block hacked together by / Copyright 2022, Ross Wightman
é    N)ÚCallableÚTupleÚOptionalÚType)Únn)Ú	to_2tupleÚmake_divisibleÚ
GroupNorm1ÚConvMlpÚDropPathÚis_exportableé   )Úbuild_model_with_cfg)Úregister_notrace_module)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecations)Úregister_blockÚByoBlockCfgÚByoModelCfgÚByobNetÚLayerFnÚ
num_groups)ÚBlockc                 ó<   — t        d| ||d|t        dd¬«      ¬«      S )NÚbottler   T)Ú	bottle_inÚ
linear_out)ÚtypeÚdÚcÚsÚgsÚbrÚblock_kwargs)r   Údict©r    r!   r"   r$   s       ú`/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/mobilevit.pyÚ_inverted_residual_blockr)   !   s&   € äØ˜˜a 1¨¨rÜ D°TÔ:ô<ð <ó    é   c                 óX   — t        | |||¬«      t        dd|dt        |||¬«      ¬«      fS )Nr'   Ú	mobilevitr   )Útransformer_dimÚtransformer_depthÚ
patch_size)r   r    r!   r"   r%   ©r)   r   r&   ©r    r!   r"   r.   r/   r0   r$   s          r(   Ú_mobilevit_blockr3   (   s>   € ô 	! 1¨¨Q°2Ô6ÜØ  Q¨!ÜØ /Ø"3Ø%ô'ô	
ð	ð 	r*   é   ç       @ç      à?c                 óZ   — t        | |||¬«      t        dd|d|dt        ||¬«      ¬«      fS )Nr'   Ú
mobilevit2r   )r/   r0   )r   r    r!   r"   r$   r#   r%   r1   )r    r!   r"   r/   r0   r$   Útransformer_brs          r(   Ú_mobilevitv2_blockr:   6   s?   € ô 	! 1¨¨Q°2Ô6ÜØ  a¨1°ÀAÜØ"3Ø%ô'ô	
ðð r*   ç      ð?c                 óL  — d}| dk7  r%t        |D �cg c]  }t        || z  «      ‘Œ c}«      }t        t        d|d   dd¬«      t        d|d   dd¬«      t	        d|d   dd¬«      t	        d|d	   dd
¬«      t	        d|d
   dd	¬«      ft        d| z  «      dddd¬«      }|S c c}w )N)é@   é€   é   é€  i   r;   r   r   r5   r'   r4   )r    r!   r"   r/   é   r+   é    Ú3x3Ú Úsilu)ÚblocksÚstem_chsÚ	stem_typeÚ	stem_poolÚ
downsampleÚ	act_layer)ÚtupleÚintr   r)   r:   )Ú
multiplierÚchsr!   Úcfgs       r(   Ú_mobilevitv2_cfgrQ   C   s¼   € Ø
"€CØ�SÒÜ°#Ö6¨Q”S˜˜Z™Õ(Ò6Ó7ˆÜ
ä$ q¨C°©F°a¸CÔ@Ü$ q¨C°©F°a¸CÔ@Ü  c¨!¡f°ÀQÔGÜ  c¨!¡f°ÀQÔGÜ  c¨!¡f°ÀQÔGð
ô �R˜*‘_Ó%ØØØØô€Cð €Jùò 7s   ‘B!é   r'   rA   é   é0   r=   r2   éP   é`   rC   rD   rE   i@  )rF   rG   rH   rI   rJ   rK   Únum_featuresrB   )r    r!   r"   )r    r!   r"   r.   r/   r0   éx   é�   r@   r>   éÀ   é    éð   i€  Úseg      À?)Úrd_ratio)rF   rG   rH   rI   rJ   Ú
attn_layerÚattn_kwargsrW   g      è?g      ô?g      ø?g      ü?)Úmobilevit_xxsÚmobilevit_xsÚmobilevit_sÚsemobilevit_sÚmobilevitv2_050Úmobilevitv2_075Úmobilevitv2_125Úmobilevitv2_100Úmobilevitv2_150Úmobilevitv2_175Úmobilevitv2_200c            &       ó  ‡ — e Zd ZdZdddddddddd	d
dddddej
                  ddfdedee   dedededee   de	eef   dedee   dededededede
dededeej                     f$ˆ fd„Zd ej                   d!ej                   fd"„Zˆ xZS )#ÚMobileVitBlockzS MobileViT block
        Paper: https://arxiv.org/abs/2110.02178?context=cs.LG
    NrA   r   r;   ©r   r   r5   r4   é   r+   ç        FÚin_chsÚout_chsÚkernel_sizeÚstrideÚbottle_ratioÚ
group_sizeÚdilationÚ	mlp_ratior.   r/   r0   Ú	num_headsÚ	attn_dropÚdropÚ	no_fusionÚdrop_path_rateÚlayersÚtransformer_norm_layerc                 ó¾  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        ||«      }|xs |}|	xs t	        ||z  «      }	 |j
                  ||f||||d   dœ|¤Ž| _        t        j                  ||	fdddœ|¤Ž| _	        t        j                  t        |
«      D �cg c]!  }t        |	f||d||||j                  |dœ|¤Ž‘Œ# c}Ž | _         ||	fi |¤Ž| _         |j
                  |	|fddd	œ|¤Ž| _        |rd | _        n |j
                  ||z   |f|dd	œ|¤Ž| _        t%        |«      | _        | j&                  d   | j&                  d   z  | _        y c c}w )
N©ÚdeviceÚdtyper   ©rs   rt   Úgroupsrw   r   F©rs   ÚbiasT)rx   ry   Úqkv_biasrz   Ú	proj_dropÚ	drop_pathrK   Ú
norm_layer©rs   rt   )ÚsuperÚ__init__r   r   r	   Úconv_norm_actÚconv_kxkr   ÚConv2dÚconv_1x1Ú
SequentialÚrangeÚTransformerBlockÚactÚtransformerÚnormÚ	conv_projÚconv_fusionr   r0   Ú
patch_area)Úselfrq   rr   rs   rt   ru   rv   rw   rx   r.   r/   r0   ry   rz   r{   r|   r}   r~   r   r‚   rƒ   ÚkwargsÚddr…   Ú_Ú	__class__s                            €r(   rŽ   zMobileVitBlock.__init__©   s­  ø€ ð0 ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ˜J¨Ó/ˆØÒ#˜VˆØ)ÒR¬^¸LÈ6Ñ<QÓ-Rˆà,˜×,Ñ,ØØð
ð $ØØØ˜a‘[ñ
ð ñ
ˆŒô Ÿ	™	 &¨/Ð[ÀqÈuÑ[ÐXZÑ[ˆŒäŸ=™=ô Ð,Ó-ö+
ð ô Øðà#Ø#ØØ#ØØ(Ø Ÿ*™*Ø1ñð óò+
ð ˆÔñ +¨?ÑA¸bÑAˆŒ	à-˜×-Ñ-¨o¸wÐfÐTUÐ^_ÑfÐceÑfˆŒáØ#ˆDÕà3˜v×3Ñ3°F¸WÑ4DÀgÐwÐ[fÐopÑwÐtvÑwˆDÔä# JÓ/ˆŒØŸ/™/¨!Ñ,¨t¯©¸qÑ/AÑAˆ�ùò3+
s   Â#&EÚxÚreturnc                 ó^  — |}| j                  |«      }| j                  |«      }| j                  \  }}|j                  \  }}}}t	        j
                  ||z  «      |z  t	        j
                  ||z  «      |z  }
}	|	|z  |
|z  }}||z  }d}|	|k7  s|
|k7  rt        j                  ||	|
fdd¬«      }d}|j                  ||z  |z  |||«      j                  dd«      }|j                  |||| j                  «      j                  dd«      j                  || j                  z  |d«      }| j                  |«      }| j                  |«      }|j                  «       j                  || j                  |d«      }|j                  dd«      j                  ||z  |z  |||«      }|j                  dd«      j                  ||||z  ||z  «      }|rt        j                  |||fdd¬«      }| j                  |«      }| j                   �(| j!                  t#        j$                  ||fd¬	«      «      }|S )
NFÚbilinear©ÚsizeÚmodeÚalign_cornersTr   r4   rA   éÿÿÿÿ©Údim)r�   r’   r0   ÚshapeÚmathÚceilÚFÚinterpolateÚreshapeÚ	transposer›   r—   r˜   Ú
contiguousÚviewr™   rš   ÚtorchÚcat)rœ   r¡   ÚshortcutÚpatch_hÚpatch_wÚBÚCÚHÚWÚnew_hÚnew_wÚnum_patch_hÚnum_patch_wÚnum_patchesr°   s                  r(   ÚforwardzMobileVitBlock.forwardî   s#  € Øˆð �M‰M˜!ÓˆØ�M‰M˜!Óˆð  Ÿ?™?Ñˆ�Ø—W‘W‰
ˆˆ1ˆa�Ü—y‘y  W¡Ó-°Ñ7¼¿¹À1ÀwÁ;Ó9OÐRYÑ9YˆuˆØ#(¨GÑ#3°U¸gÑ5E�[ˆØ! KÑ/ˆØˆØ�AŠ:˜ !šä—‘˜a u¨e n¸:ÐUZÔ[ˆAØˆKð �I‰I�a˜!‘e˜kÑ)¨7°KÀÓI×SÑSÐTUÐWXÓYˆà�I‰I�a˜˜K¨¯©Ó9×CÑCÀAÀqÓI×QÑQÐRSÐVZ×VeÑVeÑReÐgrÐtvÓwˆð ×Ñ˜QÓˆØ�I‰I�a‹Lˆð �L‰L‹N×Ñ  4§?¡?°KÀÓDˆØ�K‰K˜˜1Ó×%Ñ% a¨!¡e¨kÑ&9¸;ÈÐQXÓYˆà�K‰K˜˜1Ó×%Ñ% a¨¨K¸'Ñ,AÀ;ÐQXÑCXÓYˆÙÜ—‘˜a q¨! f°:ÈUÔSˆAà�N‰N˜1ÓˆØ×ÑÐ'Ø× Ñ ¤§¡¨H°a¨=¸aÔ!@ÓAˆAØˆr*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú	LayerNormrM   r   Úfloatr   Úboolr   r   ÚModulerŽ   rµ   ÚTensorrÃ   Ú__classcell__©r    s   @r(   rm   rm   ¤   s\  ø„ ñð &*Ø ØØ"%Ø(,Ø(.Ø"Ø-1Ø%&ØØØ!ØØ#Ø$&Ø"Ø68·l±lØØñ+CBàðCBð ˜c‘]ðCBð ð	CBð
 ðCBð  ðCBð ! ™ðCBð ˜C ˜H‘oðCBð ðCBð & c™]ðCBð  #ðCBð ðCBð ðCBð ðCBð ðCBð  ð!CBð" "ð#CBð$ ð%CBð& %)¨¯©¡Oõ'CBðJ(˜Ÿ™ð (¨%¯,©,÷ (r*   rm   c                   óf  ‡ — e Zd ZdZ	 	 	 	 	 ddededededdf
ˆ fd„Zd	ej                  dej                  fd
„Z
ej                  j                  «       dd	ej                  deej                     dej                  fd„«       Zdd	ej                  deej                     dej                  fd„Zˆ xZS )ÚLinearSelfAttentiona·  
    This layer applies a self-attention with linear complexity, as described in `https://arxiv.org/abs/2206.02680`
    This layer can be used for self- as well as cross-attention.
    Args:
        embed_dim (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`
        attn_drop (float): Dropout value for context scores. Default: 0.0
        bias (bool): Use bias in learnable layers. Default: True
    Shape:
        - Input: :math:`(N, C, P, N)` where :math:`N` is the batch size, :math:`C` is the input channels,
        :math:`P` is the number of pixels in the patch, and :math:`N` is the number of patches
        - Output: same as the input
    .. note::
        For MobileViTv2, we unfold the feature map [B, C, H, W] into [B, C, P, N] where P is the number of pixels
        in a patch and N is the number of patches. Because channel is the first dimension in this unfolded tensor,
        we use point-wise convolution (instead of a linear layer). This avoids a transpose operation (which may be
        expensive on resource-constrained devices) that may be required to convert the unfolded tensor from
        channel-first to channel-last format in case of a linear layer.
    NÚ	embed_dimrz   r‰   r‡   r¢   c                 ó*  •— ||dœ}t         ‰| �  «        || _        t        j                  d|dd|z  z   |ddœ|¤Ž| _        t        j                  |«      | _        t        j                  d|||ddœ|¤Ž| _        t        j                  |«      | _	        y )Nr�   r   r4   )Úin_channelsÚout_channelsr‡   rs   © )
r�   rŽ   rÑ   r   r‘   Úqkv_projÚDropoutrz   Úout_projÚout_drop)	rœ   rÑ   rz   r‰   r‡   r‚   rƒ   rž   r    s	           €r(   rŽ   zLinearSelfAttention.__init__-  s¤   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ"ˆŒäŸ	™	ð 
Ø!Ø˜a )™mÑ,ØØñ	
ð
 ñ
ˆŒô Ÿ™ IÓ.ˆŒÜŸ	™	ð 
Ø!Ø"ØØñ	
ð
 ñ
ˆŒô Ÿ
™
 9Ó-ˆ�r*   r¡   c                 ó’  — | j                  |«      }|j                  d| j                  | j                  gd¬«      \  }}}t        j                  |d¬«      }| j                  |«      }||z  j                  dd¬«      }t        j                  |«      |j                  |«      z  }| j                  |«      }| j                  |«      }|S )Nr   rª   r©   T©r«   Úkeepdim)rÖ   ÚsplitrÑ   r¯   Úsoftmaxrz   ÚsumÚreluÚ	expand_asrØ   rÙ   )	rœ   r¡   ÚqkvÚqueryÚkeyÚvalueÚcontext_scoresÚcontext_vectorÚouts	            r(   Ú_forward_self_attnz&LinearSelfAttention._forward_self_attnK  s¶   € à�m‰m˜AÓˆð
  ŸI™I q¨$¯.©.¸$¿.¹.Ð&IÈq˜IÓQÑˆˆs�Eô Ÿ™ 5¨bÔ1ˆØŸ™¨Ó7ˆð  Ñ.×3Ñ3¸ÀDÐ3ÓIˆô �f‰f�U‹m˜n×6Ñ6°uÓ=Ñ=ˆØ�m‰m˜CÓ ˆØ�m‰m˜CÓ ˆØˆ
r*   Úx_prevc                 óf  — |j                   \  }}}}|j                   dd  \  }}||k(  sJ d«       ‚t        j                  || j                  j                  d | j
                  dz    | j                  j                  d | j
                  dz    ¬«      }	|	j                  d| j
                  gd¬«      \  }
}t        j                  || j                  j                  | j
                  dz      | j                  j                  �&| j                  j                  | j
                  dz      nd ¬«      }t        j                  |
d¬«      }| j                  |«      }||z  j                  dd¬«      }t        j                  |«      |j                  |«      z  }| j                  |«      }| j                  |«      }|S )	NéþÿÿÿzJThe number of pixels in a patch for query and key_value should be the samer   )Úweightr‡   rª   r©   TrÛ   )r¬   r¯   Úconv2drÖ   rí   rÑ   r‡   rÝ   rÞ   rz   rß   rà   rá   rØ   rÙ   )rœ   r¡   rê   Ú
batch_sizeÚin_dimÚkv_patch_areaÚkv_num_patchesÚq_patch_areaÚq_num_patchesÚqkrã   rä   rå   ræ   rç   rè   s                   r(   Ú_forward_cross_attnz'LinearSelfAttention._forward_cross_attnc  s‹  € ð =>¿G¹GÑ9ˆ
�F˜M¨>Ø&'§g¡g¨b¨c lÑ#ˆ�mð ˜\Ò)ð	XàWó	XØ)ô
 �X‰XØØ—=‘=×'Ñ'Ð(;¨¯©¸!Ñ);Ð<Ø—‘×#Ñ#Ð$7 T§^¡^°aÑ%7Ð8ô
ˆð —X‘X˜q $§.¡.Ð1°q�XÓ9‰
ˆˆsä—‘ØØ—=‘=×'Ñ'¨¯©¸Ñ(:Ñ;Ø;?¿=¹=×;MÑ;MÐ;Y�—‘×#Ñ# D§N¡N°QÑ$6Ò7Ð_cô
ˆô Ÿ™ 5¨bÔ1ˆØŸ™¨Ó7ˆð  Ñ.×3Ñ3¸ÀDÐ3ÓIˆô �f‰f�U‹m˜n×6Ñ6°uÓ=Ñ=ˆØ�m‰m˜CÓ ˆØ�m‰m˜CÓ ˆØˆ
r*   c                 óN   — |€| j                  |«      S | j                  ||¬«      S )N)rê   )ré   rö   )rœ   r¡   rê   s      r(   rÃ   zLinearSelfAttention.forwardŽ  s.   € Øˆ>Ø×*Ñ*¨1Ó-Ð-à×+Ñ+¨A°fÐ+Ó=Ð=r*   )rp   rp   TNN©N)rÄ   rÅ   rÆ   rÇ   rM   rÉ   rÊ   rŽ   rµ   rÌ   ré   ÚjitÚignorer   rö   rÃ   rÍ   rÎ   s   @r(   rÐ   rÐ     sâ   ø„ ñð,  #Ø"ØØØñ.àð.ð ð.ð ð	.ð
 ð.ð 
õ.ð< E§L¡Lð °U·\±\ó ð0 ‡Y�Y×ÑÓñ( U§\¡\ð (¸8ÀEÇLÁLÑ;Qð (Ð]b×]iÑ]iò (ó ð(ñT>˜Ÿ™ð >¨x¸¿¹Ñ/Eð >ÐQV×Q]ÑQ]÷ >r*   rÐ   c                   óî   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddedededededeeej                        d	eeej                        d
dfˆ fd„Z
ddej                  deej                     d
ej                  fd„Zˆ xZS )ÚLinearTransformerBlockaF  
    This class defines the pre-norm transformer encoder with linear self-attention in `MobileViTv2 paper <>`_
    Args:
        embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, P, N)`
        mlp_ratio (float): Inner dimension ratio of the FFN relative to embed_dim
        drop (float): Dropout rate. Default: 0.0
        attn_drop (float): Dropout rate for attention in multi-head attention. Default: 0.0
        drop_path (float): Stochastic depth rate Default: 0.0
        norm_layer (Callable): Normalization layer. Default: layer_norm_2d
    Shape:
        - Input: :math:`(B, C_{in}, P, N)` where :math:`B` is batch size, :math:`C_{in}` is input embedding dim,
            :math:`P` is number of pixels in a patch, and :math:`N` is number of patches,
        - Output: same shape as the input
    NrÑ   rx   r{   rz   rŠ   rK   r‹   r¢   c
                 óJ  •— ||	dœ}
t         ‰| �  «        |xs t        j                  }|xs t        } ||fi |
¤Ž| _        t        d|||dœ|
¤Ž| _        t        |«      | _	         ||fi |
¤Ž| _
        t        d|t        ||z  «      ||dœ|
¤Ž| _        t        |«      | _        y )Nr�   )rÑ   rz   r‰   )Úin_featuresÚhidden_featuresrK   r{   rÕ   )r�   rŽ   r   ÚSiLUr
   Únorm1rÐ   Úattnr   Ú
drop_path1Únorm2r   rM   ÚmlpÚ
drop_path2)rœ   rÑ   rx   r{   rz   rŠ   rK   r‹   r‚   rƒ   rž   r    s              €r(   rŽ   zLinearTransformerBlock.__init__¥  s¹   ø€ ð ¨Ñ/ˆÜ‰ÑÔØÒ(¤§¡ˆ	ØÒ-¤:ˆ
á 	Ñ0¨RÑ0ˆŒ
Ü'Ðg°)ÀyÐ\`ÑgÐdfÑgˆŒ	Ü" 9Ó-ˆŒá 	Ñ0¨RÑ0ˆŒ
Üð Ø!Ü 	¨IÑ 5Ó6ØØñ	ð
 ñˆŒô # 9Ó-ˆ�r*   r¡   rê   c                 óF  — |€3|| j                  | j                  | j                  |«      «      «      z   }n9|}| j                  |«      }| j                  ||«      }| j                  |«      |z   }|| j                  | j	                  | j                  |«      «      «      z   }|S rø   )r  r  r  r  r  r  )rœ   r¡   rê   Úress       r(   rÃ   zLinearTransformerBlock.forwardÃ  s�   € Øˆ>à�D—O‘O D§I¡I¨d¯j©j¸«mÓ$<Ó=Ñ=‰Að ˆCØ—
‘
˜1“ˆAØ—	‘	˜!˜VÓ$ˆAØ—‘ Ó" SÑ(ˆAð �—‘ §¡¨¯©°A«Ó 7Ó8Ñ8ˆØˆr*   )r5   rp   rp   rp   NNNNrø   )rÄ   rÅ   rÆ   rÇ   rM   rÉ   r   r   r   rË   rŽ   rµ   rÌ   rÃ   rÍ   rÎ   s   @r(   rü   rü   •  s½   ø„ ñð$  #ØØ"Ø"Ø37Ø48ØØñ.àð.ð ð.ð ð	.ð
 ð.ð ð.ð    R§Y¡Y¡Ñ0ð.ð !  b§i¡i¡Ñ1ð.ð 
õ.ñ<˜Ÿ™ð ¨x¸¿¹Ñ/Eð ÐQV×Q]ÑQ]÷ r*   rü   c                    óð   ‡ — e Zd ZdZddddddddd	d
d
d
deddfdedee   dededee   deeef   dedee   dededededede	de
ej                     fˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚMobileVitV2Blockz8
    This class defines the `MobileViTv2 block <>`_
    NrA   r;   r   rn   r5   r4   ro   rp   rq   rr   rs   ru   rv   rw   rx   r.   r/   r0   rz   r{   r}   r~   r   c                 óˆ  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        ||«      }|xs |}|xs t	        ||z  «      } |j
                  ||f|d||d   dœ|¤Ž| _        t        j                  ||fdddœ|¤Ž| _	        t        j                  t        |	«      D �cg c]  }t        |f|||||j                  |dœ|¤Ž‘Œ! c}Ž | _         ||fi |¤Ž| _         |j
                  ||fddddœ|¤Ž| _        t#        |
«      | _        | j$                  d   | j$                  d   z  | _        t)        «       | _        y c c}w )	Nr�   r   r   r„   Fr†   )rx   rz   r{   rŠ   rK   r‹   )rs   rt   Ú	apply_act)r�   rŽ   r   r   r	   r�   r�   r   r‘   r’   r“   r”   rü   r–   r—   r˜   r™   r   r0   r›   r   Úcoreml_exportable)rœ   rq   rr   rs   ru   rv   rw   rx   r.   r/   r0   rz   r{   r}   r~   r   r‚   rƒ   r�   rž   r…   rŸ   r    s                         €r(   rŽ   zMobileVitV2Block.__init__Ù  s~  ø€ ð* ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ˜J¨Ó/ˆØÒ#˜VˆØ)ÒR¬^¸LÈ6Ñ<QÓ-Rˆà,˜×,Ñ,ØØð
ð $ØØØ˜a‘[ñ
ð ñ
ˆŒô Ÿ	™	 &¨/Ð[ÀqÈuÑ[ÐXZÑ[ˆŒäŸ=™=ô Ð,Ó-ö+
ð ô #Øð	à#Ø#ØØ(Ø Ÿ*™*Ø1ñ	ð ó	ò+
ð ˆÔñ +¨?ÑA¸bÑAˆŒ	à-˜×-Ñ-¨o¸wÐwÐTUÐ^_ÐkpÑwÐtvÑwˆŒä# JÓ/ˆŒØŸ/™/¨!Ñ,¨t¯©¸qÑ/AÑAˆŒÜ!.£ˆÕùò'+
s   Â#$D?r¡   r¢   c                 ó´  — |j                   \  }}}}| j                  \  }}t        j                  ||z  «      |z  t        j                  ||z  «      |z  }	}||z  |	|z  }}
|
|z  }||k7  s|	|k7  rt	        j
                  |||	fdd¬«      }| j                  |«      }| j                  |«      }|j                   d   }| j                  rt	        j                  |||f||f¬«      }n*|j                  |||
|||«      j                  ddddd	d
«      }|j                  ||d|«      }| j                  |«      }| j                  |«      }| j                  r2|j                  |||z  |z  |
|«      }t	        j                  ||¬«      }nD|j                  |||||
|«      j                  ddd
d	dd«      }|j                  |||
|z  ||z  «      }| j                  |«      }|S )Nr¤   Tr¥   r   rŒ   r   rA   é   r4   r+   r©   )Úupscale_factor)r¬   r0   r­   r®   r¯   r°   r�   r’   r  Úunfoldr±   Úpermuter—   r˜   Úpixel_shuffler™   )rœ   r¡   rº   r»   r¼   r½   r¸   r¹   r¾   r¿   rÀ   rÁ   rÂ   s                r(   rÃ   zMobileVitV2Block.forward  sæ  € Ø—W‘W‰
ˆˆ1ˆa�ØŸ?™?Ñˆ�Ü—y‘y  W¡Ó-°Ñ7¼¿¹À1ÀwÁ;Ó9OÐRYÑ9YˆuˆØ#(¨GÑ#3°U¸gÑ5E�[ˆØ! KÑ/ˆØ�AŠ:˜ !šÜ—‘˜a u¨e n¸:ÐUYÔZˆAð �M‰M˜!ÓˆØ�M‰M˜!Óˆð �G‰G�A‰JˆØ×!Ò!Ü—‘˜¨°'Ð(:ÀGÈWÐCUÔV‰Aà—	‘	˜!˜Q ¨W°kÀ7ÓK×SÑSÐTUÐWXÐZ[Ð]^Ð`aÐcdÓeˆAØ�I‰I�a˜˜B Ó,ˆð ×Ñ˜QÓˆØ�I‰I�a‹Lˆð ×!Ò!à—	‘	˜!˜Q ™[¨7Ñ2°KÀÓMˆAÜ—‘ °'Ô:‰Aà—	‘	˜!˜Q ¨°+¸{ÓK×SÑSÐTUÐWXÐZ[Ð]^Ð`aÐcdÓeˆAØ—	‘	˜!˜Q ¨gÑ 5°{ÀWÑ7LÓMˆAà�N‰N˜1ÓˆØˆr*   )rÄ   rÅ   rÆ   rÇ   r
   rM   r   rÉ   r   r   r   r   rË   rŽ   rµ   rÌ   rÃ   rÍ   rÎ   s   @r(   r
  r
  Ó  s  ø„ ñð &*Ø Ø"%Ø()Ø(.Ø"Ø-1Ø%&ØØ!ØØ$&Ø"Ø6@ØØñ%:1àð:1ð ˜c‘]ð:1ð ð	:1ð
  ð:1ð ! ™ð:1ð ˜C ˜H‘oð:1ð ð:1ð & c™]ð:1ð  #ð:1ð ð:1ð ð:1ð ð:1ð "ð:1ð ð:1ð  %)¨¯©¡Oõ!:1ðx#˜Ÿ™ð #¨%¯,©,÷ #r*   r
  r-   r8   c                 ód   — t        t        | |f|s	t        |    nt        |   t        d¬«      dœ|¤ŽS ©NT)Úflatten_sequential)Ú	model_cfgÚfeature_cfg©r   r   Ú
model_cfgsr&   ©ÚvariantÚcfg_variantÚ
pretrainedr�   s       r(   Ú_create_mobilevitr  ?  ó>   € ÜÜ�˜*ðá-8”*˜WÒ%¼jÈÑ>UÜ¨DÔ1ñð ñ	ð r*   c                 ód   — t        t        | |f|s	t        |    nt        |   t        d¬«      dœ|¤ŽS r  r  r  s       r(   Ú_create_mobilevit2r"  G  r   r*   c                 ó$   — | ddddddddd	d
ddœ|¥S )Niè  )rA   r?   r?   )ro   ro   gÍÌÌÌÌÌì?Úbicubic)rp   rp   rp   )r;   r;   r;   z	stem.convzhead.fcFzcvnets-license)ÚurlÚnum_classesÚ
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convÚ
classifierÚfixed_input_sizeÚlicenserÕ   )r%  r�   s     r(   Ú_cfgr1  O  s5   € à 4°}ÐSYØ¨)Ø \Ø!°Ø!Ø#ñð ðð r*   zmobilevit_xxs.cvnets_in1kztimm/)Ú	hf_hub_idzmobilevit_xs.cvnets_in1kzmobilevit_s.cvnets_in1kzmobilevitv2_050.cvnets_in1kgÑ"Ûù~jì?)r2  r)  zmobilevitv2_075.cvnets_in1kzmobilevitv2_100.cvnets_in1kzmobilevitv2_125.cvnets_in1kzmobilevitv2_150.cvnets_in1kzmobilevitv2_175.cvnets_in1kzmobilevitv2_200.cvnets_in1kz$mobilevitv2_150.cvnets_in22k_ft_in1kz$mobilevitv2_175.cvnets_in22k_ft_in1kz$mobilevitv2_200.cvnets_in22k_ft_in1kz(mobilevitv2_150.cvnets_in22k_ft_in1k_384)rA   r@   r@   )é   r3  )r2  r'  r(  r)  z(mobilevitv2_175.cvnets_in22k_ft_in1k_384z(mobilevitv2_200.cvnets_in22k_ft_in1k_384r¢   c                 ó   — t        dd| i|¤ŽS )Nr  )ra   ©r  ©r  r�   s     r(   ra   ra   Œ  s   € äÑN¸ÐNÀvÑNÐNr*   c                 ó   — t        dd| i|¤ŽS )Nr  )rb   r5  r6  s     r(   rb   rb   ‘  s   € äÑM¸
ÐMÀfÑMÐMr*   c                 ó   — t        dd| i|¤ŽS )Nr  )rc   r5  r6  s     r(   rc   rc   –  s   € äÑL°zÐLÀVÑLÐLr*   c                 ó   — t        dd| i|¤ŽS )Nr  )re   r5  r6  s     r(   re   re   ›  ó   € äÑP¸:ÐPÈÑPÐPr*   c                 ó   — t        dd| i|¤ŽS )Nr  )rf   r5  r6  s     r(   rf   rf      r:  r*   c                 ó   — t        dd| i|¤ŽS )Nr  )rh   r5  r6  s     r(   rh   rh   ¥  r:  r*   c                 ó   — t        dd| i|¤ŽS )Nr  )rg   r5  r6  s     r(   rg   rg   ª  r:  r*   c                 ó   — t        dd| i|¤ŽS )Nr  )ri   r5  r6  s     r(   ri   ri   ¯  r:  r*   c                 ó   — t        dd| i|¤ŽS )Nr  )rj   r5  r6  s     r(   rj   rj   ´  r:  r*   c                 ó   — t        dd| i|¤ŽS )Nr  )rk   r5  r6  s     r(   rk   rk   ¹  r:  r*   )Úmobilevitv2_150_in22ft1kÚmobilevitv2_175_in22ft1kÚmobilevitv2_200_in22ft1kÚmobilevitv2_150_384_in22ft1kÚmobilevitv2_175_384_in22ft1kÚmobilevitv2_200_384_in22ft1k)ç      @)r+   rG  )r4   r5   r6   )r;   )NF)rD   )F)@rÇ   r­   Útypingr   r   r   r   rµ   Útorch.nn.functionalr   Ú
functionalr¯   Útimm.layersr   r	   r
   r   r   r   Ú_builderr   Ú_features_fxr   Ú	_registryr   r   r   Úbyobnetr   r   r   r   r   r   Úvision_transformerr   r•   Ú__all__r)   r3   r:   rQ   r&   r  rË   rm   rÐ   rü   r
  r  r"  r1  Údefault_cfgsra   rb   rc   re   rf   rh   rg   ri   rj   rk   rÄ   rÕ   r*   r(   ú<module>rS     sï  ðñ
ó ß 2Ó 2ã ß Ð Ý ç _× _Ý *Ý 1ß YÑ Yß [× [Ý 9à
€ó<óó
óñ* Ùá$ q¨B°!¸Ô<Ù$ q¨B°!¸Ô<Ù˜q B¨!¸RÐSTÐabÐgjÔkÙ˜q B¨!¸RÐSTÐabÐgjÔkÙ˜q B¨!¸RÐSTÐabÐgjÔkð
ð ØØØØØôñ  á$ q¨B°!Ô4Ù$ q¨B°!Ô4Ù˜q B¨!¸RÐSTÐabÔcÙ˜q B¨!¸SÐTUÐbcÔdÙ˜q B¨!¸SÐTUÐbcÔdð
ð ØØØØØôñ  á$ q¨B°!Ô4Ù$ q¨B°!Ô4Ù˜q B¨!¸SÐTUÐbcÔdÙ˜q C¨1¸cÐUVÐcdÔeÙ˜q C¨1¸cÐUVÐcdÔeð
ð ØØØØØôñ  á$ q¨B°!Ô4Ù$ q¨B°!Ô4Ù˜q B¨!¸SÐTUÐbcÔdÙ˜q C¨1¸cÐUVÐcdÔeÙ˜q C¨1¸cÐUVÐcdÔeð
ð ØØØØÙ #Ô&Øôñ" % SÓ)Ù$ SÓ)Ù$ TÓ*Ù$ SÓ)Ù$ SÓ)Ù$ TÓ*Ù$ SÓ)ôQI€
ðX ôq�R—Y‘Yó qó ðqôhy>˜"Ÿ)™)ô y>ôx;˜RŸY™Yô ;ð| ôd�r—y‘yó dó ðdñN ˆ{˜NÔ +Ù ˆ|Ð-Ô .óóó	ñ %ð .&Ø¡°Ô!8ð.&à¡¨wÔ 7ð.&ð ™t¨gÔ6ð.&ð
 "¡4ØØô$ð.&ð "¡4ØØô$ð.&ð "¡4ØØô$ð.&ð "¡4ØØô$ð.&ð" "¡4ØØô$ð#.&ð( "¡4ØØô$ð).&ð. "¡4ØØô$ð/.&ð6 +©DØØô-ð7.&ð< +©DØØô-ð=.&ðB +©DØØô-ðC.&ðJ /±ØØ ¨H¸sô1DðK.&ðP /±ØØ ¨H¸sô1DðQ.&ðV /±ØØ ¨H¸sô1DðW.&ó .€ðb ñO°ò Oó ðOð ñN°ò Nó ðNð ñM¨wò Mó ðMð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQð ñQ°7ò Qó ðQñ ˜HØ FØ FØ Fà$NØ$NØ$Nñ'õ r*   