
    NgYP                        d Z ddlmZ ddl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 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 d:d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;d0            Z%ed;d1            Z&ed;d2            Z'ed;d3            Z(ed;d4            Z)ed;d5            Z*ed;d6            Z+ed;d7            Z,ed;d8            Z-ed;d9            Z.dS )<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)OptionalN)nnIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)trunc_normal_DropPath	LayerNorm
LayerScaleClNormMlpClassifierHeadget_act_layer   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsc                   D     e Zd ZdZdddej        efdef fdZd Z	 xZ
S )StemzV Code modified from InternImage:
        https://github.com/OpenGVLab/InternImage
       `   Tmid_normc                 8   t                                                       t          j        ||dz  ddd          | _        |r ||dz            nd | _         |            | _        t          j        |dz  |ddd          | _         ||          | _        d S )N   r   r   kernel_sizestridepadding)	super__init__r   Conv2dconv1norm1actconv2norm2)selfin_chsout_chsr   	act_layer
norm_layer	__class__s         P/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/mambaout.pyr    zStem.__init__   s     	YqL
 
 

 2:CZZ1---t
9;;YqL
 
 

  Z((


    c                 v   |                      |          }| j        E|                    dddd          }|                     |          }|                    dddd          }|                     |          }|                     |          }|                    dddd          }|                     |          }|S )Nr   r   r   r   )r"   r#   permuter$   r%   r&   r'   xs     r-   forwardzStem.forward5   s    JJqMM:!		!Q1%%A

1A		!Q1%%AHHQKKJJqMMIIaAq!!JJqMMr.   )__name__
__module____qualname____doc__r   GELUr   boolr    r3   __classcell__r,   s   @r-   r   r      sx          !g ) ) 	) ) ) ) ) )6
 
 
 
 
 
 
r.   r   c                   ,     e Zd Zddef fd	Zd Z xZS )DownsampleNormFirstr      c                     t                                                        ||          | _        t          j        ||ddd          | _        d S Nr   r   r   r   )r   r    normr   r!   convr'   r(   r)   r+   r,   s       r-   r    zDownsampleNormFirst.__init__D   sW     	Jv&&	I
 
 
			r.   c                     |                      |          }|                    dddd          }|                     |          }|                    dddd          }|S Nr   r   r   r   )rA   r0   rB   r1   s     r-   r3   zDownsampleNormFirst.forwardT   sS    IIaLLIIaAq!!IIaLLIIaAq!!r.   r4   r5   r6   r   r    r3   r:   r;   s   @r-   r=   r=   B   sW          	
 
 
 
 
 
       r.   r=   c                   ,     e Zd Zddef fd	Zd Z xZS )
Downsampler   r>   c                     t                                                       t          j        ||ddd          | _         ||          | _        d S r@   )r   r    r   r!   rB   rA   rC   s       r-   r    zDownsample.__init__^   sY     	I
 
 
	 Jw''			r.   c                     |                     dddd          }|                     |          }|                     dddd          }|                     |          }|S rE   )r0   rB   rA   r1   s     r-   r3   zDownsample.forwardn   sS    IIaAq!!IIaLLIIaAq!!IIaLLr.   rF   r;   s   @r-   rH   rH   \   sW          	( ( ( ( ( (       r.   rH   c                   l     e Zd ZdZddej        dedd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           Tc	           
      X   t                                                       |t          ||z            }	nd }	|| _        || _        |	p|| _         ||          | _        |	r[t          j        t          dt          j
        ||	          fd |            fd ||	          fg                    | _        |	| _        n|| _        t          j                    | _        |dk    rt          j
        |	||          nt          j                    | _        t          j        |          | _        d S )Nfcr$   rA   r   )bias)r   r    int	pool_typein_featureshidden_sizerA   r   
Sequentialr   Linear
pre_logitsnum_featuresIdentityrR   Dropouthead_dropout)r'   rV   num_classesrU   r*   	mlp_ratior+   	drop_raterS   rW   r,   s             r-   r    zMlpHead.__init__z   s1    	 i+566KKK"&&5+J{++	 		, mKryk::;		$K0019 - -  DO
 !,D +D kmmDODORSOO")K4@@@@Y[YdYfYfJy11r.   NFr_   rU   reset_otherc                    ||| _         |r<t          j                    | _        t          j                    | _        | j        | _        |dk    rt          j        | j        |          nt          j                    | _        d S )Nr   )	rU   r   r\   rA   rZ   rV   r[   rY   rR   )r'   r_   rU   rb   s       r-   resetzMlpHead.reset   sm     &DN 	1DI kmmDO $ 0D?JQ")D-{;;;TVT_TaTar.   rZ   c                     | j         dk    r|                    d          }|                     |          }|                     |          }|                     |          }|r|S |                     |          }|S )NrN   )r   r   )rU   meanrA   rZ   r^   rR   r'   r2   rZ   s      r-   r3   zMlpHead.forward   sr    >U""vAIIaLLOOAa   	HGGAJJr.   )NFF)r4   r5   r6   r7   r   r8   r   r    rT   r   strr9   rd   r3   r:   r;   s   @r-   rL   rL   v   s          g !2 !2 !2 !2 !2 !2Fb b b# bTX b b b b	 	T 	 	 	 	 	 	 	 	r.   rL   c                   B     e Zd ZdZddddeej        d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@         ?NrP   c	                 D   t                                                        ||          | _        t          ||z            }
t	          j        ||
dz            | _         |            | _        t          ||z            }|
|
|z
  |f| _        t	          j	        ||||dz  |          | _
        t	          j        |
|          | _        |t          |          nt	          j                    | _        |dk    rt          |          nt	          j                    | _        d S )Nr   )r   r   groupsrP   )r   r    rA   rT   r   rY   fc1r$   split_indicesr!   rB   fc2r   r\   lsr
   	drop_path)r'   dimexpansion_ratior   
conv_ratiols_init_valuer+   r*   ru   kwargshiddenconv_channelsr,   s               r-   r    zGatedConvBlock.__init__   s	    	JsOO	_s*++9S&1*--9;;J,--$f}&<mLI#1$ 
 
 
	 9VS))%2%>*S///BKMM09B),,,BKMMr.   c                    |}|                      |          }|                     |          }t          j        || j        d          \  }}}|                    dddd          }|                     |          }|                    dddd          }|                     |                     |          t          j	        ||fd          z            }| 
                    |          }|                     |          }||z   S )N)rv   r   r   r   r   )rA   rq   torchsplitrr   r0   rB   rs   r$   catrt   ru   )r'   r2   shortcutgics         r-   r3   zGatedConvBlock.forward   s    IIaLLHHQKK+a!3<<<1aIIaAq!!IIaLLIIaAq!!HHTXXa[[59aV#<#<#<<==GGAJJNN18|r.   )
r4   r5   r6   r7   r   r   r8   r    r3   r:   r;   s   @r-   rk   rk      su          " gR R R R R R<      r.   rk   c            
       n     e Zd Zdddddddeej        df
dee         d	ed
edee	         f fdZ
d Z xZS )MambaOutStageNrO   rl   rm   rn    rP   dim_outdepth
downsamplery   c           
        	
 t                                                       p|d| _        |dk    rt          |	          | _        n>|dk    rt          |	          | _        n |k    sJ t          j                    | _        t          j        
	fdt          |          D              | _
        d S )NFrB   )r+   conv_nfc                     g | ]=}t          	t          t          t          f          r|         n           >S ))rv   rw   r   rx   ry   r+   r*   ru   )rk   
isinstancelisttuple)
.0jr*   rx   r   ru   rw   r   ry   r+   s
     r-   
<listcomp>z*MambaOutStage.__init__.<locals>.<listcomp>  sn     &
 &
 &
   /'%+%#*4Yu*N*N])A,,T]	 	 	&
 &
 &
r.   )r   r    grad_checkpointingrH   r   r=   r   r\   rX   rangeblocks)r'   rv   r   r   rw   r   rx   r   ry   r+   r*   ru   r,   s     ` ``` ````r-   r    zMambaOutStage.__init__   s     	.S"'(g*MMMDOO9$$1#w:VVVDOO'>>>> kmmDOm &
 &
 &
 &
 &
 &
 &
 &
 &
 &
 &
 5\\&
 &
 &
 r.   c                     |                      |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|S N)r   r   r   jitis_scriptingr   r   r1   s     r-   r3   zMambaOutStage.forward  sZ    OOA" 	59+A+A+C+C 	t{A..AAAAr.   )r4   r5   r6   r   r   r8   r   rT   ri   floatr    r3   r:   r;   s   @r-   r   r      s        
 &*! -1 g& & c]& 	& & $E?& & & & & &P      r.   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f fd	Zd Ze	j
        j        dd            Ze	j
        j        dd            Ze	j
        j        dej        fd            Zddedee         fdZd ZddefdZd 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   rM   rN   r   r   	   r   r        i@  rn   rl   rm   TNrB   rP   defaultc                    t                                                       || _        || _        d| _        t          |t          t          f          s|g}t          |t          t          f          s|g}t          |          }t          |          }|| _
        g | _        t          ||d         |||          | _        |d         }d t          j        d|t!          |                                        |          D             }d}d}t%          j                    | _        t+          |          D ]}||         }|dk    s|dk    rdnd}||z  }t-          ||||         |
||	|dk    r|nd|||||         	          }| j                            |           |}| xj        t1          ||d
|           gz  c_        |||         z  }|dk    rt3          |||||          | _        n*t7          ||t9          |dz            |||          | _        || _        | j        j        | _        |                     | j                    d S )NNHWCr   )r   r*   r+   c                 6    g | ]}|                                 S  )tolist)r   r2   s     r-   r   z%MambaOut.__init__.<locals>.<listcomp>T  s     eee1AHHJJeeer.   rO   r   r   r   )rv   r   r   r   rx   rw   r   ry   r+   r*   ru   zstages.)num_chs	reductionmoduler   )rU   ra   r+   )rW   rU   r+   ra   )!r   r    r_   ra   
output_fmtr   r   r   r   len	num_stagefeature_infor   stemr   linspacesumr   r   rX   stagesr   r   appenddictrL   headr   rT   r[   head_hidden_sizeapply_init_weights)r'   in_chansr_   global_pooldepthsdimsr+   r*   rx   rw   r   stem_mid_normry   r   drop_path_ratera   head_fnr   prev_dimdp_ratescurcurr_strider   rv   r   stager,   s                             r-   r    zMambaOut.__init__+  s   & 	&" &4-00 	XF$u.. 	6D!),,	KK	"G"!
 
 
	 7eeq.#f++(V(V(\(\]c(d(deeemooy!! 	 	Aq'C%**a!eeQQF6!K!Qi'% /)*Q::B+%#"1+  E Ku%%%H$x;WdabWdWd"e"e"e!ff6!9CCi%#%  DII 01--%%#  DI % $	 6

4%&&&&&r.   c                     t          |t          j        t          j        f          rDt	          |j        d           |j        )t          j                            |j        d           d S d S d S )Ng{Gz?)stdr   )	r   r   r!   rY   r	   weightrS   init	constant_)r'   ms     r-   r   zMambaOut._init_weights  sj    a")RY/00 	-!(,,,,v!!!!&!,,,,,	- 	-!!r.   Fc                 0    t          d|rdnddg          S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)r   r   )r   )r'   coarses     r-   group_matcherzMambaOut.group_matcher  s5    (. $$585
 
 
 	
r.   c                 (    | j         D ]	}||_        
d S r   )r   r   )r'   enabless      r-   set_grad_checkpointingzMambaOut.set_grad_checkpointing  s(     	* 	*A#)A  	* 	*r.   returnc                     | j         j        S r   )r   rR   )r'   s    r-   get_classifierzMambaOut.get_classifier  s    y|r.   r_   r   c                 J    || _         | j                            ||           d S r   )r_   r   rd   )r'   r_   r   s      r-   reset_classifierzMambaOut.reset_classifier  s&    &	[11111r.   c                 Z    |                      |          }|                     |          }|S r   )r   r   r1   s     r-   forward_featureszMambaOut.forward_features  s%    IIaLLKKNNr.   rZ   c                 b    |r|                      ||          n|                      |          }|S )N)rZ   )r   rg   s      r-   forward_headzMambaOut.forward_head  s0    3=ODIIaJI///499Q<<r.   c                 Z    |                      |          }|                     |          }|S r   )r   r   r1   s     r-   r3   zMambaOut.forward  s-    !!!$$a  r.   rh   )Tr   )r4   r5   r6   r7   r   r   r8   r    r   r   r   ignorer   r   Moduler   rT   r   ri   r   r   r9   r   r3   r:   r;   s   @r-   r   r     su        $ $ g#Z' Z' Z' Z' Z' Z'x- - - Y
 
 
 
 Y* * * * Y	    2 2C 2hsm 2 2 2 2  
 $          r.   r   c                    d| v r| d         } d| v r| S dd l }i }|                                 D ]\  }}|                    dd          }|                    dd|          }|                    dd	|          }|                    d
          r|                    d
d          }nW|                    d          rB|                    dd          }|                    dd          }|                    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         r-   checkpoint_filter_fnr     s   *(
j((IIIH  ""  1II,g66FF.0FJJFF02I1MM<<   	3		'<00AA\\'"" 	3		+'<==A		,(?@@A		+z22AOr.   r   c                 6    | ddddddt           t          ddd	|S )
NrM   )r      r   )r      r   )rm   rm   rn   bicubicz
stem.conv1zhead.fc)urlr_   
input_sizetest_input_size	pool_sizecrop_pctinterpolationrf   r   
first_conv
classifierr   )r   rz   s     r-   _cfgr     s7    =]y%.B")   r.   ztimm/)	hf_hub_idgffffff?rn   )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_mambaoutFc                 \    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
pretrainedrz   r   s       r-   _create_mambaoutr    sF     ':1\dKKK  	 E Lr.   c           	      V    t          dd          }t          dd| it          |fi |S )Nr   0   r   r   r   r   r   mambaout_femtor  )r  r   r  r  rz   
model_argss      r-   r  r    s?    \0BCCCJbbbtJGaGaZ`GaGabbbr.   c           	      ^    t          g dg d          }t          dd| it          |fi |S )N)r   r      r   r
  r  mambaout_kober  )r  r  r  s      r-   r  r    sI    ]]]1C1C1CDDDJaa
ad:F`F`Y_F`F`aaar.   c           	      ^    t          g dg d          }t          dd| it          |fi |S )Nr   r   r  mambaout_tinyr  )r  r  r  s      r-   r  r    sI    \\\0C0C0CDDDJaa
ad:F`F`Y_F`F`aaar.   c           	      ^    t          g dg d          }t          dd| it          |fi |S )Nr   rO      r   r   r  mambaout_smallr  )r  r  r  s      r-   r  r    sI    ]]]1D1D1DEEEJbbbtJGaGaZ`GaGabbbr.   c           	      ^    t          g dg d          }t          dd| it          |fi |S )Nr        i   i   r  mambaout_baser  )r  r  r  s      r-   r  r  %  sI    ]]]1E1E1EFFFJaa
ad:F`F`Y_F`F`aaar.   c           	      f    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   ry   r   mambaout_small_rwr  )r"  r  r  s      r-   r"  r"  +  s^    }}     J eeJe$zJdJd]cJdJdeeer.   c           
      b    t          dddddddd	          }t          dd| it          |fi |S )N)r   r      r   r        @      ?Fr   r   r!  r   r   rw   rx   r   r   ry   r   mambaout_base_short_rwr  )r(  r  r  s      r-   r(  r(  8  s[    !	 	 	J jjjtT^OiOibhOiOijjjr.   c           
      b    t          dddddddd	          }t          dd| it          |fi |S )Nr   rO      r   r  g      @r&  Fr   r   r!  r'  mambaout_base_tall_rwr  )r,  r  r  s      r-   r,  r,  G  s[    !	 	 	J ii
idS]NhNhagNhNhiiir.   c                 d    t          ddddddddd	
	  	        }t          dd| it          |fi |S )Nr  r  r%        ?Fr   r   silur!  	r   r   rw   rx   r   r   ry   r*   r   mambaout_base_wide_rwr  )r1  r  r  s      r-   r1  r1  V  ^    !
 
 
J ii
idS]NhNhagNhNhiiir.   c                 d    t          ddddddddd	
	  	        }t          dd| it          |fi |S )Nr*  r  r%  r.  Fr   r   r/  r!  r0  mambaout_base_plus_rwr  )r4  r  r  s      r-   r4  r4  f  r2  r.   c           
      b    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?r/  r!  )r   r   rw   r   r   ry   r*   r   r   r  )r   r  r  s      r-   r   r   v  sZ    	 	 	J aa
ad:F`F`Y_F`F`aaar.   )r   rh   )/r7   collectionsr   typingr   r   r   	timm.datar   r   timm.layersr	   r
   r   r   r   r   _builderr   _manipulater   	_registryr   r   r   r   r=   rH   rL   rk   r   r   r   r   default_cfgsr  r  r  r  r  r  r"  r(  r,  r1  r4  r   r   r.   r-   <module>rA     sY    $ # # # # #              A A A A A A A A n n n n n n n n n n n n n n n n * * * * * * ' ' ' ' ' ' < < < < < < < <* * * * *29 * * *Z    ")   4       49 9 9 9 9bi 9 9 9x2 2 2 2 2RY 2 2 2j0 0 0 0 0BI 0 0 0fV V V V Vry V V Vr  2    %$4  $  $  4  $   '+d' ' ' ,04S, , , +/$S+ + + +/$S+ + + 4844 4 4 9= -8_g9 9 9 ,04, , , T]M]cdddQ)& )& ) )X    c c c c
 b b b b b b b b
 c c c c
 b b b b
 	f 	f 	f 	f k k k k j j j j j j j j j j j j b b b b b br.   