Ë
    éÓ^jå_  ã                   óª  — d 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 ddlmZmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ  G d„ de
j>                  «      Z  G d„ de
j>                  «      Z! G d„ de
j>                  «      Z" G d„ de
j>                  «      Z# G d„ de
j>                  «      Z$ G d„ de
j>                  «      Z% G d„ de
j>                  «      Z&d„ Z'd9d„Z( e e(d¬«       e(d¬«       e(d¬«       e(d¬«       e(d¬«       e(d¬«       e(ddd ¬!«       e(ddd ¬!«       e(ddd ¬!«       e(d¬«       e(dd"d"d#d$¬%«       e(dd&¬'«       e(d(d)d*¬+«      d,œ«      Z)d:d-„Z*ed:d.„«       Z+ed:d/„«       Z,ed:d0„«       Z-ed:d1„«       Z.ed:d2„«       Z/ed:d3„«       Z0ed:d4„«       Z1ed:d5„«       Z2ed:d6„«       Z3ed:d7„«       Z4ed:d8„«       Z5y);zú
MambaOut models for image classification.
Some implementations are modified from:
timm (https://github.com/rwightman/pytorch-image-models),
MetaFormer (https://github.com/sail-sg/metaformer),
InceptionNeXt (https://github.com/sail-sg/inceptionnext)
é    )ÚOrderedDict)ÚListÚOptionalÚTupleÚTypeÚUnionN)Únn©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Útrunc_normal_ÚDropPathÚcalculate_drop_path_ratesÚ	LayerNormÚ
LayerScaleÚClNormMlpClassifierHeadÚget_act_layeré   )Úbuild_model_with_cfg)Úfeature_take_indices)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsc                   ó–   ‡ — e Zd ZdZdddej
                  eddfdededed	e	ej                     d
e	ej                     f
ˆ fd„Zd„ Zˆ xZS )ÚStemzV Code modified from InternImage:
        https://github.com/OpenGVLab/InternImage
    é   é`   TNÚin_chsÚout_chsÚmid_normÚ	act_layerÚ
norm_layerc                 ó  •— ||dœ}t         ‰	| �  «        t        j                  ||dz  fddddœ|¤Ž| _        |r ||dz  fi |¤Žnd | _         |«       | _        t        j                  |dz  |fddddœ|¤Ž| _         ||fi |¤Ž| _        y )N©ÚdeviceÚdtypeé   r   r   ©Úkernel_sizeÚstrideÚpadding)	ÚsuperÚ__init__r	   ÚConv2dÚconv1Únorm1ÚactÚconv2Únorm2)
Úselfr   r   r    r!   r"   r%   r&   ÚddÚ	__class__s
            €ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/mambaout.pyr-   zStem.__init__   sº   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—Y‘YØØ�q‰Lð
ð ØØñ
ð ñ
ˆŒ
ñ 8@‘Z ¨1¡Ñ3°Ò3ÀTˆŒ
Ù“;ˆŒÜ—Y‘YØ�q‰LØð
ð ØØñ
ð ñ
ˆŒ
ñ   Ñ.¨2Ñ.ˆ�
ó    c                 ó@  — | j                  |«      }| j                  �9|j                  dddd«      }| j                  |«      }|j                  dddd«      }| j                  |«      }| j	                  |«      }|j                  dddd«      }| j                  |«      }|S )Nr   r'   r   r   )r/   r0   Úpermuter1   r2   r3   ©r4   Úxs     r7   ÚforwardzStem.forward;   sŽ   € Ø�J‰J�q‹MˆØ�:‰:Ð!Ø—	‘	˜!˜Q  1Ó%ˆAØ—
‘
˜1“ˆAØ—	‘	˜!˜Q  1Ó%ˆAØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØ�I‰I�a˜˜A˜qÓ!ˆØ�J‰J�q‹MˆØˆr8   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   ÚGELUr   ÚintÚboolr   ÚModuler-   r=   Ú__classcell__©r6   s   @r7   r   r      sn   ø„ ñð ØØ!Ø)+¯©Ø*3ØØñ/àð/ð ð/ð ð	/ð
 ˜BŸI™I‘ð/ð ˜RŸY™Y™õ/ö@
r8   r   c                   óX   ‡ — e Zd Zddeddfdededeej                     fˆ fd„Zd„ Z	ˆ xZ
S )	ÚDownsampleNormFirstr   éÆ   Nr   r   r"   c                 óˆ   •— ||dœ}t         ‰| �  «         ||fi |¤Ž| _        t        j                  ||fddddœ|¤Ž| _        y ©Nr$   r   r'   r   r(   )r,   r-   Únormr	   r.   Úconv©r4   r   r   r"   r%   r&   r5   r6   s          €r7   r-   zDownsampleNormFirst.__init__J   s[   ø€ ð ¨Ñ/ˆÜ‰ÑÔÙ˜vÑ,¨Ñ,ˆŒ	Ü—I‘IØØð
ð ØØñ
ð ñ
ˆ�	r8   c                 óš   — | j                  |«      }|j                  dddd«      }| j                  |«      }|j                  dddd«      }|S ©Nr   r   r   r'   )rM   r:   rN   r;   s     r7   r=   zDownsampleNormFirst.forward^   sI   € Ø�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr8   ©r>   r?   r@   r   rC   r   r	   rE   r-   r=   rF   rG   s   @r7   rI   rI   H   sB   ø„ ð ØØ*3ØØñ
àð
ð ð
ð ˜RŸY™Y™õ	
ö(r8   rI   c                   óX   ‡ — e Zd Zddeddfdededeej                     fˆ fd„Zd„ Z	ˆ xZ
S )	Ú
Downsampler   rJ   Nr   r   r"   c                 óˆ   •— ||dœ}t         ‰| �  «        t        j                  ||fddddœ|¤Ž| _         ||fi |¤Ž| _        y rL   )r,   r-   r	   r.   rN   rM   rO   s          €r7   r-   zDownsample.__init__h   s]   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—I‘IØØð
ð ØØñ
ð ñ
ˆŒ	ñ ˜wÑ-¨"Ñ-ˆ�	r8   c                 óš   — |j                  dddd«      }| j                  |«      }|j                  dddd«      }| j                  |«      }|S rQ   )r:   rN   rM   r;   s     r7   r=   zDownsample.forward|   sI   € Ø�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØˆr8   rR   rG   s   @r7   rT   rT   f   sB   ø„ ð ØØ*3ØØñ.àð.ð ð.ð ˜RŸY™Y™õ	.ö(r8   rT   c                   óÐ   ‡ — e Zd ZdZddej
                  deddddf	ded	ed
ede	ej                     dee   de	ej                     dedefˆ fd„Zdd	ed
ee   defd„Zddefd„Zˆ xZS )ÚMlpHeadz MLP classification head
    éè  Úavgé   ç        TNÚin_featuresÚnum_classesÚ	pool_typer!   Ú	mlp_ratior"   Ú	drop_rateÚbiasc                 óD  •— |	|
dœ}t         ‰| �  «        |�t        ||z  «      }nd }|| _        || _        |xs || _         ||fi |¤Ž| _        |rUt        j                  t        dt        j                  ||fi |¤Žfd |«       fd ||fi |¤Žfg«      «      | _        || _        n || _        t        j                  «       | _        |dkD  r#t        j                  | j                  |fd|i|¤Žnt        j                  «       | _        t        j                  |«      | _        y )Nr$   Úfcr1   rM   r   rb   )r,   r-   rC   r_   r]   Úhidden_sizerM   r	   Ú
Sequentialr   ÚLinearÚ
pre_logitsÚnum_featuresÚIdentityrd   ÚDropoutÚhead_dropout)r4   r]   r^   r_   r!   r`   r"   ra   rb   r%   r&   r5   re   r6   s                €r7   r-   zMlpHead.__init__ˆ   s  ø€ ð ¨Ñ/ˆÜ‰ÑÔØÐ Ü˜i¨+Ñ5Ó6‰KàˆKØ"ˆŒØ&ˆÔØ&Ò5¨+ˆÔá˜{Ñ1¨bÑ1ˆŒ	ÙÜ Ÿm™m¬KØ”r—y‘y ¨kÑ@¸RÑ@ÐAØ™	›Ð$Ø™ KÑ6°2Ñ6Ð7ð9ó -ó ˆDŒOð
 !,ˆDÕà +ˆDÔÜ Ÿk™k›mˆDŒOàP[Ð^_ÒP_”"—)‘)˜D×-Ñ-¨{ÑLÀÐLÈÒLÔeg×epÑepÓerˆŒÜŸJ™J yÓ1ˆÕr8   Úreset_otherc                 ó(  — |�|| _         |rCt        j                  «       | _        t        j                  «       | _        | j
                  | _        |dkD  r&t        j                  | j                  |«      | _        y t        j                  «       | _        y )Nr   )	r_   r	   rj   rM   rh   r]   ri   rg   rd   )r4   r^   r_   rm   s       r7   ÚresetzMlpHead.reset®   sh   € ØÐ Ø&ˆDŒNÙÜŸ™›ˆDŒIÜ Ÿk™k›mˆDŒOØ $× 0Ñ 0ˆDÔØ?JÈQº”"—)‘)˜D×-Ñ-¨{Ó;ˆ�ÔTV×T_ÑT_ÓTaˆ�r8   rh   c                 óÖ   — | j                   dk(  r|j                  d«      }| j                  |«      }| j                  |«      }| j	                  |«      }|r|S | j                  |«      }|S )NrZ   )r   r'   )r_   ÚmeanrM   rh   rl   rd   ©r4   r<   rh   s      r7   r=   zMlpHead.forward·   s`   € Ø�>‰>˜UÒ"Ø—‘�v“ˆAØ�I‰I�a‹LˆØ�O‰O˜AÓˆØ×Ñ˜aÓ ˆÙØˆHØ�G‰G�A‹JˆØˆr8   )NF©F)r>   r?   r@   rA   r	   rB   r   rC   Ústrr   rE   r   ÚfloatrD   r-   ro   r=   rF   rG   s   @r7   rX   rX   „   sÀ   ø„ ñð  $Ø"Ø)+¯©Ø'(Ø*3Ø!ØØØñ$2àð$2ð ð$2ð ð	$2ð
 ˜BŸI™I‘ð$2ð   ‘}ð$2ð ˜RŸY™Y™ð$2ð ð$2ð õ$2ñLb ð b°¸#±ð bÐTXó bñ	 T÷ 	r8   rX   c                   ó¬   ‡ — e Zd ZdZddddeej                  dddf	deded	ed
ede	e   de
ej                     de
ej                     defˆ fd„Zd„ Zˆ xZS )ÚGatedConvBlockaã   Our implementation of Gated CNN Block: https://arxiv.org/pdf/1612.08083
    Args:
        conv_ratio: control the number of channels to conduct depthwise convolution.
            Conduct convolution on partial channels can improve paraitcal efficiency.
            The idea of partial channels is from ShuffleNet V2 (https://arxiv.org/abs/1807.11164) and
            also used by InceptionNeXt (https://arxiv.org/abs/2303.16900) and FasterNet (https://arxiv.org/abs/2303.03667)
    çUUUUUU@é   ç      ð?Nr\   ÚdimÚexpansion_ratior)   Ú
conv_ratioÚls_init_valuer"   r!   Ú	drop_pathc                 ó  •— |	|
dœ}t         ‰| �  «         ||fi |¤Ž| _        t        ||z  «      }t	        j
                  ||dz  fi |¤Ž| _         |«       | _        t        ||z  «      }|||z
  |f| _        t	        j                  ||f||dz  |dœ|¤Ž| _
        t	        j
                  ||fi |¤Ž| _        |�t        |fi |¤Žnt	        j                  «       | _        |dkD  rt        |«      | _        y t	        j                  «       | _        y )Nr$   r'   )r)   r+   Úgroupsr\   )r,   r-   rM   rC   r	   rg   Úfc1r1   Úsplit_indicesr.   rN   Úfc2r   rj   Úlsr   r   )r4   r{   r|   r)   r}   r~   r"   r!   r   r%   r&   Úkwargsr5   ÚhiddenÚconv_channelsr6   s                  €r7   r-   zGatedConvBlock.__init__Ì   s  ø€ ð ¨Ñ/ˆÜ‰ÑÔÙ˜sÑ) bÑ)ˆŒ	Ü�_ sÑ*Ó+ˆÜ—9‘9˜S &¨1¡*Ñ3°Ñ3ˆŒÙ“;ˆŒÜ˜J¨Ñ,Ó-ˆØ$ f¨}Ñ&<¸mÐLˆÔÜ—I‘IØØð
ð $Ø 1Ñ$Ø ñ
ð ñ
ˆŒ	ô —9‘9˜V SÑ/¨BÑ/ˆŒØ+8Ð+D”*˜SÑ' BÒ'Ì"Ï+É+Ë-ˆŒØ09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�r8   c                 óÊ  — |}| j                  |«      }| j                  |«      }t        j                  || j                  d¬«      \  }}}|j                  dddd«      }| j                  |«      }|j                  dddd«      }| j                  | j                  |«      t        j                  ||fd¬«      z  «      }| j                  |«      }| j                  |«      }||z   S )Néÿÿÿÿ)r{   r   r   r   r'   )rM   r‚   ÚtorchÚsplitrƒ   r:   rN   r„   r1   Úcatr…   r   )r4   r<   ÚshortcutÚgÚiÚcs         r7   r=   zGatedConvBlock.forwardî   sÃ   € ØˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆÜ—+‘+˜a ×!3Ñ!3¸Ô<‰ˆˆ1ˆaØ�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØ�H‰H�T—X‘X˜a“[¤5§9¡9¨a°¨V¸Ô#<Ñ<Ó=ˆØ�G‰G�A‹JˆØ�N‰N˜1ÓˆØ�8‰|Ðr8   )r>   r?   r@   rA   r   r	   rB   rC   ru   r   r   rE   r-   r=   rF   rG   s   @r7   rw   rw   Ã   sŸ   ø„ ñð &+Ø Ø #Ø-1Ø*3Ø)+¯©Ø!ØØñ Ràð Rð #ð Rð ð	 Rð
 ð Rð $ E™?ð Rð ˜RŸY™Y™ð Rð ˜BŸI™I‘ð Rð õ RöDr8   rw   c                   óÀ   ‡ — e Zd Zdddddddeej
                  dddfded	ee   d
edededede	dee   de
ej                     de
ej                     defˆ fd„Zd„ Zˆ xZS )ÚMambaOutStageNr[   rx   ry   rz   Ú r\   r{   Údim_outÚdepthr|   r)   r}   Ú
downsampler~   r"   r!   r   c                 ó®  •— ||dœ}t         ‰| �  «        |xs |}d| _        |dk(  rt        ||fd|	i|¤Ž| _        n:|dk(  rt        ||fd|	i|¤Ž| _        n ||k(  sJ ‚t        j                  «       | _        t        j                  t        |«      D �cg c]1  }t        d||||||	|
t        |t        t        f«      r||   n|dœ|¤Ž‘Œ3 c}Ž | _        y c c}w )Nr$   FrN   r"   Úconv_nf)r{   r|   r)   r}   r~   r"   r!   r   © )r,   r-   Úgrad_checkpointingrT   r—   rI   r	   rj   rf   Úrangerw   Ú
isinstanceÚlistÚtupleÚblocks)r4   r{   r•   r–   r|   r)   r}   r—   r~   r"   r!   r   r%   r&   r5   Újr6   s                   €r7   r-   zMambaOutStage.__init__þ   sù   ø€ ð  ¨Ñ/ˆÜ‰ÑÔØ’.˜SˆØ"'ˆÔà˜ÒÜ(¨¨gÑSÀ*ÐSÐPRÑSˆD�OØ˜9Ò$Ü1°#°wÑ\È:Ð\ÐY[Ñ\ˆD�Oà˜'’>Ð!�>Ü Ÿk™k›mˆDŒOä—m‘mô ˜5“\ö&
ð ô ð 
ØØ /Ø'Ø%Ø+Ø%Ø#Ü*4°YÄÄuÀÔ*N˜) Aš,ÐT]ñ
ð ó
ò&
ð ˆ�ùò &
s   Â6Cc                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S ©N)r—   r›   r‹   ÚjitÚis_scriptingr   r    r;   s     r7   r=   zMambaOutStage.forward*  sS   € Ø�O‰O˜AÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr8   )r>   r?   r@   r   r	   rB   rC   r   ru   rt   r   rE   r-   r=   rF   rG   s   @r7   r“   r“   ü   s¼   ø„ ð
 &*ØØ%*Ø Ø #Ø Ø-1Ø*3Ø)+¯©Ø!ØØñ*àð*ð ˜c‘]ð*ð ð	*ð
 #ð*ð ð*ð ð*ð ð*ð $ E™?ð*ð ˜RŸY™Y™ð*ð ˜BŸI™I‘ð*ð õ*öXr8   r“   c            !       óÌ  ‡ — e Zd ZdZdddddeej                  ddd	d
dddddddfdededede	edf   de	edf   de
ej                     de
ej                     dededededee   dedededef ˆ fd „Zd!„ Zej$                  j&                  d5d"„«       Zej$                  j&                  d6d#„«       Zej$                  j&                  d$ej                  fd%„«       Zd7dedee   fd&„Z	 	 	 	 	 d8d'ej0                  d(eeeee   f      d)ed*ed+ed,ed$eeej0                     e	ej0                  eej0                     f   f   fd-„Z	 	 	 d9d(eeee   f   d.ed/efd0„Zd1„ Zd5d2efd3„Zd4„ Zˆ xZ S ):ÚMambaOuta<   MetaFormer
        A PyTorch impl of : `MetaFormer Baselines for Vision`  -
          https://arxiv.org/abs/2210.13452

    Args:
        in_chans (int): Number of input image channels. Default: 3.
        num_classes (int): Number of classes for classification head. Default: 1000.
        depths (list or tuple): Number of blocks at each stage. Default: [3, 3, 9, 3].
        dims (int): Feature dimension at each stage. Default: [96, 192, 384, 576].
        downsample_layers: (list or tuple): Downsampling layers before each stage.
        drop_path_rate (float): Stochastic depth rate. Default: 0.
        output_norm: norm before classifier head. Default: partial(nn.LayerNorm, eps=1e-6).
        head_fn: classification head. Default: nn.Linear.
        head_dropout (float): dropout for MLP classifier. Default: 0.
    r   rY   rZ   ©r   r   é	   r   ©r   éÀ   é€  i@  rz   rx   ry   TNrN   r\   ÚdefaultÚin_chansr^   Úglobal_poolÚdepths.Údimsr"   r!   r}   r|   r)   Ústem_mid_normr~   r—   Údrop_path_ratera   Úhead_fnc                 óÆ  •— t         ‰| �  «        ||dœ}|| _        || _        || _        d| _        t        |t        t        f«      s|g}t        |t        t        f«      s|g}t        |«      }t        |«      }|| _        g | _        t        ||d   f|||dœ|¤Ž| _        |d   }t        ||d¬«      }d}d}t!        j"                  «       | _        t'        |«      D ]ˆ  }||   }|dk(  s|dkD  rdnd	}||z  }t)        d||||   |
||	|dkD  r|nd
|||||   dœ|¤Ž}| j$                  j+                  |«       |}| xj                  t-        ||d|› �¬«      gz  c_        |||   z  }ŒŠ |dk(  rt/        ||f|||dœ|¤Ž| _        n#t3        ||ft5        |dz  «      |||dœ|¤Ž| _        || _        | j0                  j6                  | _        | j;                  | j<                  «       y )Nr$   ÚNHWCr   )r    r!   r"   T)Ú	stagewiser[   r'   r   r”   )r{   r•   r–   r)   r}   r|   r—   r~   r"   r!   r   zstages.)Únum_chsÚ	reductionÚmoduler­   )r_   ra   r"   )re   r_   r"   ra   rš   )r,   r-   r^   r®   ra   Ú
output_fmtr�   rž   rŸ   r   ÚlenÚ	num_stageÚfeature_infor   Ústemr   r	   rf   Ústagesrœ   r“   ÚappendÚdictrX   Úheadr   rC   ri   Úhead_hidden_sizeÚapplyÚ_init_weights)r4   r®   r^   r¯   r°   r±   r"   r!   r}   r|   r)   r²   r~   r—   r³   ra   r´   r%   r&   r5   r½   Úprev_dimÚdp_ratesÚcurÚcurr_strider�   r{   r*   Ústager6   s                                €r7   r-   zMambaOut.__init__D  sT  ø€ ô* 	‰ÑÔØ¨Ñ/ˆØ&ˆÔØ ˆŒØ"ˆŒØ ˆŒÜ˜&¤4¬ -Ô0Ø�XˆFÜ˜$¤¤u Ô.Ø�6ˆDÜ! )Ó,ˆ	ä˜“Kˆ	Ø"ˆŒØˆÔäØØ�‰Gð
ð #ØØ!ñ
ð ñ
ˆŒ	ð ˜‘7ˆÜ,¨^¸VÈtÔTˆØˆØˆÜ—m‘m“oˆŒÜ�yÓ!ò 	ˆAØ�q‘'ˆCØ%¨Ò*¨a°!ªe‘Q¸ˆFØ˜6Ñ!ˆKÜ!ð ØØØ˜Q‘iØ'Ø%Ø /Ø)*¨Qª™:°BØ+Ø%Ø#Ø" 1™+ñð ñˆEð �K‰K×Ñ˜uÔ%ØˆHà×Ò¤$¨xÀ;ÐY`ÐabÐ`cÐWdÔ"eÐ!fÑfÕØ�6˜!‘9Ñ‰Cð-	ð0 �iÒäØØðð &Ø#Ø%ñð ñˆD�Iô 0ØØðô   ¨1¡Ó-Ø%Ø%Ø#ñð ñˆDŒIð %ˆÔØ $§	¡	× 6Ñ 6ˆÔà�
‰
�4×%Ñ%Õ&r8   c                 óö   — t        |t        j                  t        j                  f«      rOt	        |j
                  d¬«       |j                  �+t        j                  j                  |j                  d«       y y y )Ng{®Gáz”?)Ústdr   )	r�   r	   r.   rg   r   Úweightrb   ÚinitÚ	constant_)r4   Úms     r7   rÆ   zMambaOut._init_weights¨  sS   € Ü�aœ"Ÿ)™)¤R§Y¡YÐ/Ô0Ü˜!Ÿ(™(¨Õ,Ø�v‰vÐ!Ü—‘×!Ñ! !§&¡&¨!Õ,ð "ð 1r8   c                 ó2   — t        d|rd¬«      S ddg¬«      S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)r¿   r    )rÂ   )r4   Úcoarses     r7   Úgroup_matcherzMambaOut.group_matcher®  s/   € äØÙ(.Ð$ô
ð 	
ð 6Ø8ð5ô
ð 	
r8   c                 ó4   — | j                   D ]	  }||_        Œ y r£   )rÀ   r›   )r4   ÚenableÚss      r7   Úset_grad_checkpointingzMambaOut.set_grad_checkpointing¸  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r8   Úreturnc                 ó.   — | j                   j                  S r£   )rÃ   rd   )r4   s    r7   Úget_classifierzMambaOut.get_classifier½  s   € à�y‰y�|‰|Ðr8   c                 óJ   — || _         | j                  j                  ||«       y r£   )r^   rÃ   ro   )r4   r^   r¯   s      r7   Úreset_classifierzMambaOut.reset_classifierÁ  s   € Ø&ˆÔØ�	‰	�‰˜ [Õ1r8   r<   ÚindicesrM   Ú
stop_earlyr»   Úintermediates_onlyc           	      óè  — |dv sJ d«       ‚|dk(  }g }t        t        | j                  «      |«      \  }	}
| j                  |«      }t        j
                  j                  «       s|s| j                  }n| j                  d|
dz    }t        |«      D ]#  \  }} ||«      }||	v sŒ|j                  |«       Œ% |r/|D �cg c]$  }|j                  dddd«      j                  «       ‘Œ& }}|r|S ||fS c c}w )	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:

        )ÚNCHWr¶   z*Output format must be one of NCHW or NHWC.râ   Nr   r   r   r'   )r   r¼   rÀ   r¿   r‹   r¤   r¥   Ú	enumeraterÁ   r:   Ú
contiguous)r4   r<   rÞ   rM   rß   r»   rà   Úchannel_firstÚintermediatesÚtake_indicesÚ	max_indexrÀ   Úfeat_idxrË   Úys                  r7   Úforward_intermediateszMambaOut.forward_intermediatesÅ  s  € ð* Ð-Ñ-Ð[Ð/[Ó[Ð-Ø" fÑ,ˆØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið �I‰I�a‹LˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	(‰OˆH�eÙ�a“ˆAØ˜<Ò'Ø×$Ñ$ QÕ'ð	(ñ
 àIVÖWÀA˜QŸY™Y q¨!¨Q°Ó2×=Ñ=Õ?ÐWˆMÐWáØ Ð à�-ÐÐùò Xs   Â<)C/Ú
prune_normÚ
prune_headc                 ó    — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r”   )r   r¼   rÀ   rÝ   )r4   rÞ   rì   rí   rç   rè   s         r7   Úprune_intermediate_layersz"MambaOut.prune_intermediate_layersô  sM   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙØ×!Ñ! ! RÔ(ØÐr8   c                 óJ   — | j                  |«      }| j                  |«      }|S r£   )r¿   rÀ   r;   s     r7   Úforward_featureszMambaOut.forward_features  s!   € Ø�I‰I�a‹LˆØ�K‰K˜‹NˆØˆr8   rh   c                 óV   — |r| j                  ||¬«      }|S | j                  |«      }|S )N)rh   )rÃ   rr   s      r7   Úforward_headzMambaOut.forward_head  s1   € Ù3=ˆD�I‰I�a JˆIÓ/ˆØˆð DHÇ9Á9ÈQÃ<ˆØˆr8   c                 óJ   — | j                  |«      }| j                  |«      }|S r£   )rñ   ró   r;   s     r7   r=   zMambaOut.forward  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr8   rs   )Tr£   )NFFrâ   F)r   FT)!r>   r?   r@   rA   r   r	   rB   rC   rt   r   r   rE   ru   rD   r   r-   rÆ   r‹   r¤   ÚignorerÔ   rØ   rÛ   rÝ   ÚTensorr   r   rë   rï   rñ   ró   r=   rF   rG   s   @r7   r§   r§   3  sˆ  ø„ ñð$ Ø#Ø$Ø&2Ø$7Ø*3Ø)+¯©Ø #Ø%(Ø Ø"&Ø-1Ø$Ø$&Ø!Ø$ØØñ'b'àðb'ð ðb'ð ð	b'ð
 ˜#˜s˜(‘Oðb'ð ˜˜S˜‘/ðb'ð ˜RŸY™Y™ðb'ð ˜BŸI™I‘ðb'ð ðb'ð #ðb'ð ðb'ð  ðb'ð $ E™?ðb'ð ðb'ð "ðb'ð  ð!b'ð" õ#b'òH-ð ‡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ó- ðb ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	òñ
¨$ó ör8   r§   c                 ó°  — d| v r| d   } d| v r| S dd l }i }| j                  «       D ]­  \  }}|j                  dd«      }|j                  dd|«      }|j                  dd	|«      }|j	                  d
«      r|j                  d
d«      }nG|j	                  d«      r6|j                  dd«      }|j                  dd«      }|j                  dd«      }|||<   Œ¯ |S )NÚmodelzstem.conv1.weightr   zdownsample_layers.0.zstem.zstages.([0-9]+).([0-9]+)zstages.\1.blocks.\2zdownsample_layers.([0-9]+)zstages.\1.downsampleznorm.z
head.norm.zhead.z	head.fc1.zhead.pre_logits.fc.zhead.pre_logits.norm.z	head.fc2.zhead.fc.)ÚreÚitemsÚreplaceÚsubÚ
startswith)Ú
state_dictrø   rù   Úout_dictÚkÚvs         r7   Úcheckpoint_filter_fnr    sé   € Ø�*ÑØ Ñ(ˆ
Ø˜jÑ(ØÐãØ€HØ× Ñ Ó"ò ‰ˆˆ1Ø�I‰IÐ,¨gÓ6ˆØ�F‰FÐ.Ð0FÈÓJˆØ�F‰FÐ0Ð2IÈ1ÓMˆà�<‰<˜Ô à—	‘	˜' <Ó0‰AØ�\‰\˜'Ô"Ø—	‘	˜+Ð'<Ó=ˆAØ—	‘	˜,Ð(?Ó@ˆAØ—	‘	˜+ zÓ2ˆAØˆ�Šðð €Or8   c                 ó4   — | ddddddt         t        ddd	d
œ|¥S )NrY   )r   éà   r  )r   é   r  )ry   ry   rz   Úbicubicz
stem.conv1zhead.fcz
apache-2.0)Úurlr^   Ú
input_sizeÚtest_input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationrq   rÍ   Ú
first_convÚ
classifierÚlicenser
   )r  r†   s     r7   Ú_cfgr  *  s5   € àØ¨=È]Ø¨¸yÜ%Ô.BØ"°)Øñð ðð r8   ztimm/)Ú	hf_hub_idgffffffî?rz   )r  r  Útest_crop_pct)r   r¬   r¬   Úsquash)é   r  )r  r  r	  Ú	crop_moder
  i-.  )r  r^   )r   é    r  )r   r«   r«   )é   r  )r  r	  r
  )zmambaout_femto.in1kzmambaout_kobe.in1kzmambaout_tiny.in1kzmambaout_small.in1kzmambaout_base.in1kzmambaout_small_rw.sw_e450_in1kz#mambaout_base_short_rw.sw_e500_in1kz"mambaout_base_tall_rw.sw_e500_in1kz"mambaout_base_wide_rw.sw_e500_in1kz+mambaout_base_plus_rw.sw_e150_in12k_ft_in1kz0mambaout_base_plus_rw.sw_e150_r384_in12k_ft_in1kz#mambaout_base_plus_rw.sw_e150_in12kÚtest_mambaoutc                 óN   — t        t        | |ft        t        dd¬«      dœ|¤Ž}|S )N)r   r   r'   r   T)Úout_indicesÚflatten_sequential)Úpretrained_filter_fnÚfeature_cfg)r   r§   r  rÂ   )ÚvariantÚ
pretrainedr†   rø   s       r7   Ú_create_mambaoutr   b  s6   € Ü Ü�'˜:ðä1Ü \ÀdÔKñð ñ	€Eð €Lr8   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )Nr¨   ©é0   r   r«   r  ©r°   r±   r  )Úmambaout_femto©rÂ   r   ©r  r†   Ú
model_argss      r7   r%  r%  m  s-   € ä˜\Ð0BÔC€JÜÑb¸ÐbÄtÈJÑGaÐZ`ÑGaÑbÐbr8   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )N)r   r   é   r   r"  r$  r  )Úmambaout_kober&  r'  s      r7   r+  r+  s  s-   € äš]Ò1CÔD€JÜÑa¸
ÐaÄdÈ:ÑF`ÐY_ÑF`ÑaÐar8   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )Nr¨   rª   r$  r  )Úmambaout_tinyr&  r'  s      r7   r-  r-  x  s-   € äš\Ò0CÔD€JÜÑa¸
ÐaÄdÈ:ÑF`ÐY_ÑF`ÑaÐar8   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )N©r   r[   é   r   rª   r$  r  )Úmambaout_smallr&  r'  s      r7   r1  r1  ~  s-   € äš]Ò1DÔE€JÜÑb¸ÐbÄtÈJÑGaÐZ`ÑGaÑbÐbr8   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )Nr/  ©é€   é   i   i   r$  r  )Úmambaout_baser&  r'  s      r7   r6  r6  „  s-   € äš]Ò1EÔF€JÜÑa¸
ÐaÄdÈ:ÑF`ÐY_ÑF`ÑaÐar8   c           	      óZ   — t        g d¢g d¢dddd¬«      }t        d	d| it        |fi |¤Ž¤ŽS )
Nr/  rª   Fr™   ç�íµ ÷Æ°>Únorm_mlp)r°   r±   r²   r—   r~   r´   r  )Úmambaout_small_rwr&  r'  s      r7   r:  r:  Š  s>   € äÚÚ ØØØØô€Jô Ñe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer8   c           
      óV   — t        dddddddd¬	«      }t        dd
| it        |fi |¤Ž¤ŽS )N)r   r   é   r   r3  ç      @ç      ô?Fr™   r8  r9  ©r°   r±   r|   r}   r²   r—   r~   r´   r  )Úmambaout_base_short_rwr&  r'  s      r7   r@  r@  —  sE   € äØØ!ØØØØØØô	€Jô ÑjÀÐjÌtÐT^ÑOiÐbhÑOiÑjÐjr8   c           
      óV   — t        dddddddd¬	«      }t        dd
| it        |fi |¤Ž¤ŽS )N©r   r[   é   r   r3  g      @r>  Fr™   r8  r9  r?  r  )Úmambaout_base_tall_rwr&  r'  s      r7   rD  rD  ¦  sE   € äØØ!ØØØØØØô	€Jô ÑiÀ
ÐiÌdÐS]ÑNhÐagÑNhÑiÐir8   c                 óX   — t        ddddddddd	¬
«	      }t        dd| it        |fi |¤Ž¤ŽS )Nr/  r3  r=  ç      ø?Fr™   r8  Úsilur9  ©	r°   r±   r|   r}   r²   r—   r~   r!   r´   r  )Úmambaout_base_wide_rwr&  r'  s      r7   rI  rI  µ  óH   € äØØ!ØØØØØØØô
€Jô ÑiÀ
ÐiÌdÐS]ÑNhÐagÑNhÑiÐir8   c                 óX   — t        ddddddddd	¬
«	      }t        dd| it        |fi |¤Ž¤ŽS )NrB  r3  r=  rF  Fr™   r8  rG  r9  rH  r  )Úmambaout_base_plus_rwr&  r'  s      r7   rL  rL  Å  rJ  r8   c           
      óV   — t        dddddddd¬	«      }t        dd
| it        |fi |¤Ž¤ŽS )N)r   r   r   r   )é   é    r#  é@   r   Fr™   g-Cëâ6?rG  r9  )r°   r±   r|   r²   r—   r~   r!   r´   r  )r  r&  r'  s      r7   r  r  Õ  sD   € äØØØØØØØØô	€Jô Ña¸
ÐaÄdÈ:ÑF`ÐY_ÑF`ÑaÐar8   )r”   rs   )6rA   Úcollectionsr   Útypingr   r   r   r   r   r‹   r	   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r   rE   r   rI   rT   rX   rw   r“   r§   r  r  Údefault_cfgsr   r%  r+  r-  r1  r6  r:  r@  rD  rI  rL  r  rš   r8   r7   ú<module>rZ     s„  ðñõ $ß 5Õ 5ã Ý ç A÷ J÷  Jñ  JÝ *Ý +Ý 'ß <ô/ˆ2�9‰9ô /ôd˜"Ÿ)™)ô ô<�—‘ô ô<<ˆb�i‰iô <ô~6�R—Y‘Yô 6ôr4�B—I‘Iô 4ôn[ˆr�y‰yô [ò|ó2	ñ %áØôáØôáØôáØôáØôñ '+Øô'ñ ,0ØØ Sô,ñ +/ØØ Sô+ñ +/ØØ Sô+ñ 48Øô4ñ 9=ØØ °-È8Ð_gô9ñ ,0ØØô,ñ  ]ÀMÐ]cÔdñQ)&ó )€óXð òcó ðcð
 òbó ðbð òbó ðbð
 òcó ðcð
 òbó ðbð
 ò	fó ð	fð òkó ðkð òjó ðjð òjó ðjð òjó ðjð òbó ñbr8   