
    khM                     B   d Z ddl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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 ddlm Z m!Z! ddl"m#Z#m$Z$ dgZ% eeejL                        Z' G d dejP                        Z)	 	 	 	 	 	 d;de*de*de+de+de*de+dee
e+e*e+e*f      fdZ,	 	 	 	 	 d<dee
e+e*e+e*f      de+de*de+de+de-de-d e*de
eejP                     eee-ef      f   fd!Z. G d" dejP                        Z/d#e-d$e0de/fd%Z1d=d&e-dee-ef   fd'Z2 e# e2d()       e2d()       e2d()       e2d()       e2d()       e2        e2        e2        e2d(d*dd+d,-       e2d(d*dd+d,-       e2d(d.d*dd+d,/       e2d(d.d*dd+d,/      d0      Z3e$d>d$e0de/fd1       Z4e$d>d$e0de/fd2       Z5e$d>d$e0de/fd3       Z6e$d>d$e0de/fd4       Z7e$d>d$e0de/fd5       Z8e$d>d$e0de/fd6       Z9e$d>d$e0de/fd7       Z:e$d>d$e0de/fd8       Z;e$d>d$e0de/fd9       Z<e$d>d$e0de/fd:       Z=y)?a   ReXNet

A PyTorch impl of `ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network` -
https://arxiv.org/abs/2007.00992

Adapted from original impl at https://github.com/clovaai/rexnet
Copyright (c) 2020-present NAVER Corp. MIT license

Changes for timm, feature extraction, and rounded channel variant hacked together by Ross Wightman
Copyright 2020 Ross Wightman
    )partial)ceil)AnyDictListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadcreate_act_layerConvNormActDropPathmake_divisibleSEModule   )build_model_with_cfg)efficientnet_init_weights)feature_take_indices)
checkpointcheckpoint_seq)generate_default_cfgsregister_modelRexNet)
norm_layerc                        e Zd ZdZ	 	 	 	 	 	 	 ddedededeeef   dededed	ed
edee	j                     f fdZddedefdZdej                  dej                  fdZ xZS )LinearBottleneckzLinear bottleneck block for ReXNet.

    A mobile inverted residual bottleneck block as used in MobileNetV2 and subsequent models.
    in_chsout_chsstridedilation	exp_ratiose_ratioch_div	act_layerdw_act_layer	drop_pathc           	         t         t        |           |dk(  xr |d   |d   k(  xr ||k  | _        || _        || _        |dk7  r-t        t        ||z        |      }t        |||      | _	        n	|}d| _	        t        ||d||d   |d	      | _
        |dkD  r)t        |t        t        ||z        |      
      | _        nd| _        t        |	      | _        t        ||dd      | _        |
| _        y)a  Initialize LinearBottleneck.

        Args:
            in_chs: Number of input channels.
            out_chs: Number of output channels.
            stride: Stride for depthwise conv.
            dilation: Dilation rates.
            exp_ratio: Expansion ratio.
            se_ratio: Squeeze-excitation ratio.
            ch_div: Channel divisor.
            act_layer: Activation layer for expansion.
            dw_act_layer: Activation layer for depthwise.
            drop_path: Drop path module.
        r   r         ?divisorr'   N   F)kernel_sizer"   r#   groups	apply_act)rd_channels)r2   )superr   __init__use_shortcutin_channelsout_channelsr   roundr   conv_expconv_dw
SEWithNormintser   act_dwconv_pwlr)   )selfr    r!   r"   r#   r$   r%   r&   r'   r(   r)   dw_chs	__class__s               N/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/rexnet.pyr5   zLinearBottleneck.__init__(   s    6 	.0"aK\HQK8A;,F\6U\K\!#?#E&9*<$=vNF')LDMF DM"a[
 a< ^CQYHYDZ\b5cdDGDG&|4#FGQ%H"    expreturnc                 J    |r| j                   j                  S | j                  S )zGet feature channel count.

        Args:
            exp: Return expanded channels if True.

        Returns:
            Number of feature channels.
        )r;   r8   )rA   rF   s     rD   feat_channelszLinearBottleneck.feat_channelsa   s!     -0t||((FT5F5FFrE   xc                    |}| j                   | j                  |      }| j                  |      }| j                  | j                  |      }| j                  |      }| j	                  |      }| j
                  r_| j                  | j                  |      }t        j                  |ddd| j                  f   |z   |dd| j                  df   gd      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        Nr   r   )dim)
r:   r;   r>   r?   r@   r6   r)   torchcatr7   )rA   rJ   shortcuts      rD   forwardzLinearBottleneck.forwardl   s     ==$a ALLO77
AKKNMM!~~)NN1%		1Q$"2"2 223h>!TEUEUEVBV@WX^_`ArE   ))r   r   r+           r   swishrelu6NF)__name__
__module____qualname____doc__r=   r	   floatstrr   nnModuler5   boolrI   rM   TensorrP   __classcell__rC   s   @rD   r   r   "   s     )/" $ '-17#7# 7# 	7#
 CHo7# 7# 7# 7# 7# 7#  		*7#r	G 	G# 	G %,, rE   r   r+   
width_mult
depth_multinitial_chs	final_chsr%   r&   rG   c           
      D   g d}g d}|D cg c]  }t        ||z         }}t        t        |      D 	cg c]  \  }	}|gdg||	   dz
  z  z    c}}	g       }dg|d   z  dgt        |dd       z  z   }
t        |dd       dz  }| dk  r|| z  n|}g }t        |dz        D ]8  }|j	                  t        t        || z        |	             |||dz  dz  z  z  }: d
g|d   |d   z   z  |gt        |dd       z  z   }t        t        ||
||            S c c}w c c}}	w )as  Generate ReXNet block configuration.

    Args:
        width_mult: Width multiplier.
        depth_mult: Depth multiplier.
        initial_chs: Initial channel count.
        final_chs: Final channel count.
        se_ratio: Squeeze-excitation ratio.
        ch_div: Channel divisor.

    Returns:
        List of tuples (out_channels, exp_ratio, stride, se_ratio).
    )r      rf   r/   r/      )r   rf   rf   rf   r   rf   r   r      Nr/   r+   r,   rQ   rf   )	r   sum	enumeraterangeappendr   r9   listzip)ra   rb   rc   rd   r%   r&   layersstrideselementidx
exp_ratiosdepthbase_chsout_chs_listi	se_ratioss                   rD   
_block_cfgry      sT   *  F G8>?Wd7Z'(?F?9U\K]^<3G9sfSkAo66^`bcGvayA3VABZ#88Jq	NQE+5+;{Z'H L5A: 3N5J1F+GQWXYI!c!1223 q	F1I-.(c&*o1MMIL*gyABB @^s
   DD
	block_cfgprev_chsoutput_strider'   r(   drop_path_ratec                 <   |g}g }	d}
d}g }t        |       }t        |       D ]  \  }\  }}}}|}|dkD  r0|dk(  rdnd|dz
   }|	t        |d   |
|      gz  }	|
|k\  r||z  }d}||z  |dz
  z  }|dkD  rt        |      nd	}|j	                  t        ||||||f|||||

             |
|z  }
|}|}||d   j                         gz  } t        d|z  |      }|	t        |d   |
dt        |      dz
         gz  }	|j	                  t        |||             ||	fS )a  Build ReXNet blocks from configuration.

    Args:
        block_cfg: Block configuration list.
        prev_chs: Previous channel count.
        width_mult: Width multiplier.
        ch_div: Channel divisor.
        output_stride: Target output stride.
        act_layer: Activation layer name.
        dw_act_layer: Depthwise activation layer name.
        drop_path_rate: Drop path rate.

    Returns:
        Tuple of (features list, feature_info list).
    rf   r   r   stemz	features.)num_chs	reductionmodulerQ   N)
r    r!   r$   r"   r#   r%   r&   r'   r(   r)   i   r,   r.   )	lenrj   dictr   rl   r   rI   r   r   )rz   r{   ra   r&   r|   r'   r(   r}   feat_chsfeature_infocurr_strider#   features
num_blocks	block_idxchsr$   r"   r%   next_dilationfname	block_dprr)   pen_chss                           rD   _build_blocksr      s   2 zHLKHHYJ9B99M 35	5CFH A:'1nFIi!m_2MET(2,+V[\]]Lm+ (6 1"Y.*q.A	+4r>HY't	(.%
 	 	v Xb\//122334 TJ.?GT(2,+PYZ]^fZgjkZkYlNmnooLOOK'YGH\!!rE   c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'dededededededed	ed
edededededef fdZej                  j                  d(dedeeef   fd       Zej                  j                  d)deddfd       Zej                  j                  dej"                  fd       Zd*dedee   ddfdZ	 	 	 	 	 d+dej*                  deeeee   f      dededededeeej*                     eej*                  eej*                     f   f   fdZ	 	 	 d,deeee   f   d ed!edee   fd"Zdej*                  dej*                  fd#Zd(dej*                  d$edej*                  fd%Zdej*                  dej*                  fd&Z xZS )-r   zReXNet model architecture.

    Based on `ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network`
    - https://arxiv.org/abs/2007.00992
    in_chansnum_classesglobal_poolr|   rc   rd   ra   rb   r%   r&   r'   r(   	drop_rater}   c           
         t         t        |           || _        || _        d| _        |dv sJ |dk  rd|z  nd}t        t        ||z        |
      }t        ||dd|      | _	        t        |||||	|
      }t        ||||
||||      \  }| _        |d	   j                  x| _        | _        t!        j"                  | | _        t'        | j                  |||      | _        t+        |        y
)a  Initialize ReXNet.

        Args:
            in_chans: Number of input channels.
            num_classes: Number of classes for classification.
            global_pool: Global pooling type.
            output_stride: Output stride.
            initial_chs: Initial channel count.
            final_chs: Final channel count.
            width_mult: Width multiplier.
            depth_mult: Depth multiplier.
            se_ratio: Squeeze-excitation ratio.
            ch_div: Channel divisor.
            act_layer: Activation layer name.
            dw_act_layer: Depthwise activation layer name.
            drop_rate: Dropout rate.
            drop_path_rate: Drop path rate.
        F)          r+   r   r,   r/   rf   )r"   r'   r   N)r4   r   r5   r   r   grad_checkpointingr   r9   r   r   ry   r   r   r8   num_featureshead_hidden_sizer[   
Sequentialr   r   headr   )rA   r   r   r   r|   rc   rd   ra   rb   r%   r&   r'   r(   r   r}   stem_base_chsstem_chsrz   r   rC   s                      rD   r5   zRexNet.__init__   s    F 	fd$&&""'++++5+;Z!%
(B"CVT(Aa9U	z:{IxY_`	&3	'
#$# 5=RL4M4MMD1x0"4#4#4k;PYZ	!$'rE   coarserG   c                      t        dd      }|S )zGroup matcher for parameter groups.

        Args:
            coarse: Whether to use coarse grouping.

        Returns:
            Dictionary of grouped parameters.
        z^stemz^features\.(\d+))r   blocks)r   )rA   r   matchers      rD   group_matcherzRexNet.group_matcher1  s     &
 rE   enableNc                     || _         y)zEnable or disable gradient checkpointing.

        Args:
            enable: Whether to enable gradient checkpointing.
        N)r   )rA   r   s     rD   set_grad_checkpointingzRexNet.set_grad_checkpointingA  s     #)rE   c                 .    | j                   j                  S )zTGet the classifier module.

        Returns:
            Classifier module.
        )r   fc)rA   s    rD   get_classifierzRexNet.get_classifierJ  s     yy||rE   c                 J    || _         | j                  j                  ||       y)zReset the classifier.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        N)r   r   reset)rA   r   r   s      rD   reset_classifierzRexNet.reset_classifierS  s     '		[1rE   rJ   indicesnorm
stop_early
output_fmtintermediates_onlyc                 |   |dv sJ d       g }| j                   D cg c]"  }t        |d   j                  d      d         $ }	}t        t	        |	      |      \  }
}|
D cg c]  }|	|   	 }
}|	|   }| j                  |      }t        j                  j                         s|s| j                  }n| j                  d|dz    }t        |      D ]Z  \  }}| j                  r+t        j                  j                         st        ||      }n ||      }||
v sJ|j                  |       \ |r|S ||fS c c}w 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:

        )NCHWzOutput shape must be NCHW.r   .r   Nr   )r   r=   splitr   r   r   rM   jitis_scriptingr   rj   r   r   rl   )rA   rJ   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexrw   stagesfeat_idxstages                   rD   forward_intermediateszRexNet.forward_intermediates]  s=   * Y&D(DD&EIEVEVWTc$x...s3B78W
W"6s:"Pi/;<!
1<<y)	 IIaL99!!#:]]F]]>IM2F(0 	(OHe&&uyy/E/E/Gua(!H<'$$Q'	(   -/ X<s   'D4!D9
prune_norm
prune_headc                    | j                   D cg c]"  }t        |d   j                  d      d         $ }}t        t	        |      |      \  }}||   }| j
                  d|dz    | _        |r| j                  dd       |S c c}w )aE  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep.
            prune_norm: Whether to prune normalization layer.
            prune_head: Whether to prune the classifier head.

        Returns:
            List of indices that were kept.
        r   r   r   Nr   r    )r   r=   r   r   r   r   r   )rA   r   r   r   r   r   r   r   s           rD   prune_intermediate_layersz RexNet.prune_intermediate_layers  s      FJEVEVWTc$x...s3B78W
W"6s:"Piy)	ny1}5!!!R( Xs   'Bc                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S )zForward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r   r   rM   r   r   r   r   rA   rJ   s     rD   forward_featureszRexNet.forward_features  sU     IIaL""599+A+A+Ct}}a0A  a ArE   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )zForward pass through head.

        Args:
            x: Input features.
            pre_logits: Return features before final linear layer.

        Returns:
            Classification logits or features.
        )r   )r   )rA   rJ   r   s      rD   forward_headzRexNet.forward_head  s(     7Atyyzy2RdiiPQlRrE   c                 J    | j                  |      }| j                  |      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r   r   r   s     rD   rP   zRexNet.forward  s)     !!!$a rE   )r/     avgr   r      r+   r+   gUUUUUU?r   rR   rS   g?rQ   rT   )T)N)NFFr   F)r   FT)rU   rV   rW   rX   r=   rZ   rY   r5   rM   r   ignorer]   r   r   r   r   r[   r\   r   r   r   r^   r
   r   r	   r   r   r   r   rP   r_   r`   s   @rD   r   r      s    #$!#!  # ##$ '"$&=(=( =( 	=(
 =( =( =( =( =( =( =( =( =( =( "=(~ YYD T#s(^   YY)T )T ) ) YY		  2C 2hsm 2W[ 2 8<$$',. ||.  eCcN34.  	. 
 .  .  !%.  
tELL!5tELL7I)I#JJ	K. d ./$#	3S	>*  	
 
c0%,, 5<<  
Sell 
S 
S 
S %,, rE   variant
pretrainedc                 B    t        d      }t        t        | |fd|i|S )zCreate a ReXNet model.

    Args:
        variant: Model variant name.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        ReXNet model instance.
    T)flatten_sequentialfeature_cfg)r   r   r   )r   r   kwargsr   s       rD   _create_rexnetr     s8     $/K  	
  rE   urlc                 2    | dddddt         t        dddd	|S )
zCreate default configuration dictionary.

    Args:
        url: Model weight URL.
        **kwargs: Additional configuration options.

    Returns:
        Configuration dictionary.
    r   )r/      r   )   r   g      ?bicubicz	stem.convzhead.fcmit)r   r   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )r   r   s     rD   _cfgr     s5     4}SYI%.B!
 # rE   ztimm/)	hf_hub_idgffffff?)r/      r   z
apache-2.0)r   r   test_crop_pcttest_input_sizer   i-.  )r   r   r   r   r   r   )zrexnet_100.nav_in1kzrexnet_130.nav_in1kzrexnet_150.nav_in1kzrexnet_200.nav_in1kzrexnet_300.nav_in1kzrexnetr_100.untrainedzrexnetr_130.untrainedzrexnetr_150.untrainedzrexnetr_200.sw_in12k_ft_in1kzrexnetr_300.sw_in12k_ft_in1kzrexnetr_200.sw_in12kzrexnetr_300.sw_in12kc                     t        d| fi |S )zReXNet V1 1.0x
rexnet_100r   r   r   s     rD   r   r     s     ,
=f==rE   c                      t        d| fddi|S )zReXNet V1 1.3x
rexnet_130ra   ?r   r   s     rD   r   r          ,
MsMfMMrE   c                      t        d| fddi|S )zReXNet V1 1.5x
rexnet_150ra         ?r   r   s     rD   r   r     r   rE   c                      t        d| fddi|S )zReXNet V1 2.0x
rexnet_200ra          @r   r   s     rD   r   r   #  r   rE   c                      t        d| fddi|S )zReXNet V1 3.0x
rexnet_300ra         @r   r   s     rD   r   r   )  r   rE   c                      t        d| fddi|S )z*ReXNet V1 1.0x w/ rounded (mod 8) channelsrexnetr_100r&   r   r   r   s     rD   r  r  /  s     -HAHHHrE   c                 "    t        d| fddd|S )z*ReXNet V1 1.3x w/ rounded (mod 8) channelsrexnetr_130r   r   ra   r&   r   r   s     rD   r  r  5       -XAXQWXXrE   c                 "    t        d| fddd|S )z*ReXNet V1 1.5x w/ rounded (mod 8) channelsrexnetr_150r   r   r  r   r   s     rD   r  r  ;  r  rE   c                 "    t        d| fddd|S )z*ReXNet V1 2.0x w/ rounded (mod 8) channelsrexnetr_200r   r   r  r   r   s     rD   r	  r	  A  r  rE   c                 "    t        d| fddd|S )z+ReXNet V1 3.0x w/ rounded (mod 16) channelsrexnetr_300r   r   r  r   r   s     rD   r  r  G  s     -YBYRXYYrE   )r+   r+   r   r   rQ   r   )r   r   rR   rS   rQ   )r   rT   )>rX   	functoolsr   mathr   typingr   r   r   r   r	   r
   rM   torch.nnr[   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   _efficientnet_builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__BatchNorm2dr<   r\   r   rY   r=   ry   rZ   r   r   r]   r   r   default_cfgsr   r   r   r   r   r  r  r  r	  r   rE   rD   <module>r     s  
   : :   A i i * < + 3 <* X"..9
_ryy _F  %C%C%C %C 	%C
 %C %C 
%UC&
'(%CX  # "<"c5#u456<"<" <" 	<"
 <" <" <" <" 4		?Dc3h001<"~aRYY aHC T  *c T#s(^ & %'2'2'2'2'2!V!V!V$(S-Q]%_ %)S-Q]%_ !S-Q]_ !S-Q]_'& 4 >4 >f > >
 N4 Nf N N
 N4 Nf N N
 N4 Nf N N
 N4 Nf N N
 ID Iv I I
 YD Yv Y Y
 YD Yv Y Y
 YD Yv Y Y
 ZD Zv Z ZrE   