
    kh                        d Z ddlZddlmZmZ ddlmZ ddlmZ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mZmZ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)m*Z* ddgZ+e G d d             Z,de-de.de.fdZ/	 dsdee.   dee-   dee.   de-deee.   ee.   f   f
dZ0	 dtde-de.de-de.de.d e.deee.   e.ee.   f   fd!Z1	 	 	 	 	 dud"e.d#e.d$e.d%e.d&e.d'ee	   d(e2dejf                  fd)Z4	 	 	 	 	 dud"e.d#e.d$e.d%e.d&e.d'ee	   d(e2dejj                  fd*Z6	 	 	 dvd+ee7   d"e.d#e.d$e.d%e.d&ee.e.f   d'ee	   d(e2deejf                     fd,Z8 G d- d.ejf                        Z9 G d/ d0ejf                        Z: G d1 d2ejf                        Z; G d3 dejf                        Z<dwd5ejf                  d6e7d7e2ddfd8Z=d9e
e7ef   de
e7ef   fd:Z> e?dxi d; e,d<d=d>dd?@      dA e,d<dBdCdDdE@      dF e,d<dBdCdDdEdGH      dI e,dJdKdLd<dD@      dM e,dNdOdPdDdD@      dQ e,dRdSdTd<dU@      dV e,dWdXdTdJdY@      dZ e,d[d\d]d^d_@      d` e,dadbdcdNdd@      de e,dRdfdgdhd_@      di e,djdkdldmdn@      do e,dpdqdrdsdE@      dt e,dudvdwdjd_@      dx e,d<d=d>dd?dyz      d{ e,dJd|d}ddDdyz      d~ e,dJdddDddyz      d e,dNdddDddyz      d e,dNdddDddydG      d e,dJddd<ddyz      d e,dRddd<ddyz      d e,d[ddLddEdyz      d e,dmddddYdyz      d e,ddddNdddyz      d e,ddddNdddydG      d e,djdkdldmdndyz      d e,ddddmdUdyz      d e,ddddddyz      d e,ddddddyz      d e,ddddddyz      d e,ddddddyz      d e,d[ddLddEdyd eedD            d e,dEd[ddLddydd      d e,dYdmddddyddd	      d e,ddDdddddyddddë      d e,ddJdddddyddddë      d e,ddJdddddyddddë      Z@de7de2de<fd̄ZAdyde7de
e7ef   fd΄ZBdyde7de
e7ef   fdτZCdyde7de
e7ef   fdЄZD e(i d eBddӬԫ      d eBdd֬ԫ      d eBddجԫ      d eBddڬԫ      d eBdҬܫ      d eBdҬܫ      d eBdҬܫ      d eBdd      d eBdd      d eBd4      d eBddd      d eBddd      d eBd4      d eBdddddd      d eBdddddd      d eBddԫ      d eDddԫ      i d eDddԫ      d eDddԫ      d eDddԫ      d eDdҐd ԫ      d eDdҐdԫ      d eDdҐdԫ      d eDdҐdԫ      d eDdҐdԫ      d	 eDdҐd
ԫ      d eDdҐdԫ      d eDdҐdԫ      d eDdҐdԫ      d eDdҐdԫ      d eDdҐddddd      d eDdҐddddd      d eDdҐddddd      d eDdҐdd      i d  eDdҐd!d      d" eDdҐd#d      d$ eDdҐd%d&d'ddd(      d) eDdҐd%d&d*ddd(      d+ eDdҐd%d&d,ddd(      d- eDdҐd%d&d.ddd(      d/ eDdҐd0dd%d&1      d2 eDdҐd3dd%d&1      d4 eDdҐd5dd%d&1      d6 eCdҬܫ      d7 eCdҬܫ      d8 eCdҬܫ      d9 eCdҬܫ      d: eCdҬܫ      d; eCdҬܫ      d< eCdҬܫ      d= eCdҬܫ      i d> eCdҬܫ      d? eCdҬܫ      d@ eCdҬܫ      dA eCdҬܫ      dB eCdҬܫ      dC eCdҬܫ      dD eCdҬܫ      dE eCdҬܫ      dF eCdҬܫ      dG eCdҬܫ      dH eCdҬܫ      dI eCdҬܫ      dJ eCdҬܫ      dK eCdҬܫ      dL eCdҬܫ      dM eCdҬܫ            ZEe)dzde2de<fdN       ZFe)dzde2de<fdO       ZGe)dzde2de<fdP       ZHe)dzde2de<fdQ       ZIe)dzde2de<fdR       ZJe)dzde2de<fdS       ZKe)dzde2de<fdT       ZLe)dzde2de<fdU       ZMe)dzde2de<fdV       ZNe)dzde2de<fdW       ZOe)dzde2de<fdX       ZPe)dzde2de<fdY       ZQe)dzde2de<fdZ       ZRe)dzde2de<fd[       ZSe)dzde2de<fd\       ZTe)dzde2de<fd]       ZUe)dzde2de<fd^       ZVe)dzde2de<fd_       ZWe)dzde2de<fd`       ZXe)dzde2de<fda       ZYe)dzde2de<fdb       ZZe)dzde2de<fdc       Z[e)dzde2de<fdd       Z\e)dzde2de<fde       Z]e)dzde2de<fdf       Z^e)dzde2de<fdg       Z_e)dzde2de<fdh       Z`e)dzde2de<fdi       Zae)dzde2de<fdj       Zbe)dzde2de<fdk       Zce)dzde2de<fdl       Zde)dzde2de<fdm       Zee)dzde2de<fdn       Zfe)dzde2de<fdo       Zge)dzde2de<fdp       Zhe)dzde2de<fdq       Zi e*ejdrdi       y({  a  RegNet X, Y, Z, and more

Paper: `Designing Network Design Spaces` - https://arxiv.org/abs/2003.13678
Original Impl: https://github.com/facebookresearch/pycls/blob/master/pycls/models/regnet.py

Paper: `Fast and Accurate Model Scaling` - https://arxiv.org/abs/2103.06877
Original Impl: None

Based on original PyTorch impl linked above, but re-wrote to use my own blocks (adapted from ResNet here)
and cleaned up with more descriptive variable names.

Weights from original pycls impl have been modified:
* first layer from BGR -> RGB as most PyTorch models are
* removed training specific dict entries from checkpoints and keep model state_dict only
* remap names to match the ones here

Supports weight loading from torchvision and classy-vision (incl VISSL SEER)

A number of custom timm model definitions additions including:
* stochastic depth, gradient checkpointing, layer-decay, configurable dilation
* a pre-activation 'V' variant
* only known RegNet-Z model definitions with pretrained weights

Hacked together by / Copyright 2020 Ross Wightman
    N)	dataclassreplace)partial)AnyCallableDictListOptionalUnionTupleIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadAvgPool2dSameConvNormActSEModuleDropPathGroupNormAct)get_act_layerget_norm_act_layercreate_conv2dmake_divisible   )build_model_with_cfg)feature_take_indices)checkpoint_seqnamed_apply)generate_default_cfgsregister_modelregister_model_deprecationsRegNet	RegNetCfgc                       e Zd ZU dZdZeed<   dZeed<   dZe	ed<   dZ
e	ed	<   d
Zeed<   dZe	ed<   dZe	ed<   dZe	ed<   dZeed<   dZee   ed<   dZeed<   dZeed<   dZeed<   dZeeef   ed<   dZeeef   ed<   y)r#   z"RegNet architecture configuration.   depthP   w0q=
ףPE@waHzG@wm   
group_size      ?bottle_ratio        se_ratiogroup_min_ratio    
stem_widthconv1x1
downsampleF
linear_outpreactr   num_featuresrelu	act_layer	batchnorm
norm_layerN)__name__
__module____qualname____doc__r&   int__annotations__r(   r*   floatr,   r.   r0   r2   r3   r5   r7   r
   strr8   boolr9   r:   r<   r   r   r>        N/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/regnet.pyr#   r#   -   s    ,E3OBLBBJL%HeOUJ )J)JFDL#&,IuS(]#,'2Jc8m$2rI   fqreturnc                 6    t        t        | |z        |z        S )zConverts a float to the closest non-zero int divisible by q.

    Args:
        f: Input float value.
        q: Quantization divisor.

    Returns:
        Quantized integer value.
    )rC   round)rK   rL   s     rJ   quantize_floatrP   A   s     uQU|a  rI   widthsbottle_ratiosgroups	min_ratioc           	         t        | |      D cg c]  \  }}t        ||z         }}}t        ||      D cg c]  \  }}t        ||       }}}|r*t        ||      D cg c]  \  }}t        |||       }}}n(t        ||      D cg c]  \  }}t	        ||       }}}t        ||      D cg c]  \  }}t        ||z         } }}| |fS c c}}w c c}}w c c}}w c c}}w c c}}w )a,  Adjusts the compatibility of widths and groups.

    Args:
        widths: List of channel widths.
        bottle_ratios: List of bottleneck ratios.
        groups: List of group sizes.
        min_ratio: Minimum ratio for divisibility.

    Returns:
        Tuple of adjusted widths and groups.
    )ziprC   minr   rP   )	rQ   rR   rS   rT   wbbottleneck_widthsgw_bots	            rJ   adjust_widths_groups_compr]   N   s    " 14FM0JK1QUKK,/8I,JK5c!UmKFKQTUfhnQopXUA^E1i@ppFIJ[]cFde(%^E15ee-01BM-RSc%!)nSFS6> LK qeSs   CC$C!C'6C-   width_slopewidth_initial
width_multr&   r.   quantc                    | dk\  r|dkD  r|dkD  r||z  dk(  sJ t        j                  |t         j                        | z  |z   }t        j                  t        j                  ||z        t        j                  |      z        }t        j                  |t        j                  ||      z  |z        |z  }t        t        j                  |            t        |j                         j                               dz   }
}	t        j                  t        |	      D cg c]  }| c}t         j                        }|j                         j                         |	|j                         fS c c}w )au  Generates per block widths from RegNet parameters.

    Args:
        width_slope: Slope parameter for width progression.
        width_initial: Initial width.
        width_mult: Width multiplier.
        depth: Network depth.
        group_size: Group convolution size.
        quant: Quantization factor.

    Returns:
        Tuple of (widths, num_stages, groups).
    r   r   )dtype)torcharangefloat32rO   logmathpowlenuniquerC   maxitemtensorrangeint32tolist)r_   r`   ra   r&   r.   rb   widths_cont
width_expsrQ   
num_stages	max_stage_rS   s                rJ   generate_regnetrx   j   s   * ! 1j1nY^I^bcIccc ,,uEMM:[H=XKUYY{]'BCdhhzFZZ[J[[-%))J
*KKuTUX]]FV 45s:>>;K;P;P;R7SVW7W	J\\uZ/@A!:AUF::< *fmmo== Bs   	E+in_chsout_chskernel_sizestridedilationr>   r9   c           	          |xs t         j                  }|dk(  r|dk(  rdn|}|dkD  r|nd}|rt        | ||||      S t        | |||||d      S )am  Create convolutional downsampling module.

    Args:
        in_chs: Input channels.
        out_chs: Output channels.
        kernel_size: Convolution kernel size.
        stride: Convolution stride.
        dilation: Convolution dilation.
        norm_layer: Normalization layer.
        preact: Use pre-activation.

    Returns:
        Downsampling module.
    r   )r|   r}   F)r|   r}   r>   	apply_act)nnBatchNorm2dr   r   )ry   rz   r{   r|   r}   r>   r9   s          rJ   downsample_convr      su    . -r~~J{x1}!+K&?xH
 	
 !
 	
rI   c                 >   |xs t         j                  }|dk(  r|nd}t        j                         }|dkD  s|dkD  r,|dk(  r|dkD  rt        nt         j                  }	 |	d|dd      }|rt        | |dd      }
nt        | |dd|d      }
t        j                  ||
g S )a  Create average pool downsampling module.

    AvgPool Downsampling as in 'D' ResNet variants. This is not in RegNet space but I might experiment.

    Args:
        in_chs: Input channels.
        out_chs: Output channels.
        kernel_size: Convolution kernel size.
        stride: Convolution stride.
        dilation: Convolution dilation.
        norm_layer: Normalization layer.
        preact: Use pre-activation.

    Returns:
        Sequential downsampling module.
    r      TF)	ceil_modecount_include_padr|   )r|   r>   r   )r   r   Identityr   	AvgPool2dr   r   
Sequential)ry   rz   r{   r|   r}   r>   r9   
avg_stridepoolavg_pool_fnconvs              rJ   downsample_avgr      s    2 -r~~J#q=aJ;;=DzX\'1Q8a<mR\\1jDERVWa:67AaJZ_`==4,''rI   downsample_typec                     | dv sJ ||k7  s|dk7  s|d   |d   k7  r6t        ||d   ||      }| sy| dk(  rt        ||fi |S t        ||fd|i|S t        j                         S )a  Create shortcut connection for residual blocks.

    Args:
        downsample_type: Type of downsampling ('avg', 'conv1x1', or None).
        in_chs: Input channels.
        out_chs: Output channels.
        kernel_size: Kernel size for conv downsampling.
        stride: Stride for downsampling.
        dilation: Dilation rates.
        norm_layer: Normalization layer.
        preact: Use pre-activation.

    Returns:
        Shortcut module or None.
    )avgr6    Nr   r   )r|   r}   r>   r9   Nr   r{   )dictr   r   r   r   )	r   ry   rz   r{   r|   r}   r>   r9   dargss	            rJ   create_shortcutr      s    2 ::::FaK8A;(1++EFXa[ZX^_%!&';U;;"67UUuUU{{}rI   c                        e Zd ZdZdddddddej
                  ej                  ddfd	ed
ededeeef   de	dede	de
dededede	f fdZddZdej                   dej                   fdZ xZS )
BottleneckzRegNet Bottleneck block.

    This is almost exactly the same as a ResNet Bottleneck. The main difference is the SE block is moved from
    after conv3 to after conv2. Otherwise, it's just redefining the arguments for groups/bottleneck channels.
    r   r   r         ?r6   FNr1   ry   rz   r|   r}   r0   r.   r2   r7   r8   r<   r>   drop_path_ratec           	      v   t         t        |           t        |
      }
t	        t        ||z              }||z  }t        |
|      }t        ||fddi|| _        t        ||fd||d   ||d|| _	        |r+t	        t        ||z              }t        |||
      | _        nt        j                         | _        t        ||fddd	|| _        |	rt        j                         n |
       | _        t!        |||d|||
      | _        |dkD  rt%        |      | _        yt        j                         | _        y)a  Initialize RegNet Bottleneck block.

        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            stride: Convolution stride.
            dilation: Dilation rates for conv2 and shortcut.
            bottle_ratio: Bottleneck ratio (reduction factor).
            group_size: Group convolution size.
            se_ratio: Squeeze-and-excitation ratio.
            downsample: Shortcut downsampling type.
            linear_out: Use linear activation for output.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            drop_block: Drop block layer.
            drop_path_rate: Stochastic depth drop rate.
        r<   r>   r{   r      r   )r{   r|   r}   rS   
drop_layerrd_channelsr<   F)r{   r   )r{   r|   r}   r>   N)superr   __init__r   rC   rO   r   r   conv1conv2r   ser   r   conv3act3r   r7   r   	drop_path)selfry   rz   r|   r}   r0   r.   r2   r7   r8   r<   r>   
drop_blockr   bottleneck_chsrS   cargsse_channels	__class__s                     rJ   r   zBottleneck.__init__  s>   B 	j$(*!),	U7\#9:;:-yZ@ PQP%P
 	
 a[!	
 	

 eFX$567K~;R[\DGkkmDG baSXb\ab
%/BKKMY[	)!
 6Da5G.1R[[]rI   rM   c                 ~    t         j                  j                  | j                  j                  j
                         y)z1Zero-initialize the last batch norm in the block.N)r   initzeros_r   bnweightr   s    rJ   zero_init_lastzBottleneck.zero_init_lastP  s     
tzz}}++,rI   xc                    |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  #| j                  |      | j	                  |      z   }| j                  |      }|S zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r   r   r   r   r7   r   r   r   r   shortcuts      rJ   forwardzBottleneck.forwardT  sw     JJqMJJqMGGAJJJqM??& q!DOOH$==AIIaLrI   rM   Nr?   r@   rA   rB   r   ReLUr   rC   r   rE   rF   rG   r   r   r   re   Tensorr   __classcell__r   s   @rJ   r   r     s     (."#"'$"$''#%>>$&B[B[ B[ 	B[
 CHoB[  B[ B[ B[ B[ B[  B[ !B[ "B[H- %,, rI   r   c                        e Zd ZdZdddddddej
                  ej                  ddfd	ed
ededeeef   de	dede	de
dededede	f fdZddZdej                   dej                   fdZ xZS )PreBottleneckznPre-activation RegNet Bottleneck block.

    Similar to Bottleneck but with pre-activation normalization.
    r   r   r   r6   FNr1   ry   rz   r|   r}   r0   r.   r2   r7   r8   r<   r>   r   c           	      ^   t         t        |           t        ||
      }t	        t        ||z              }||z  } ||      | _        t        ||d      | _         ||      | _	        t        ||d||d   |      | _
        |r+t	        t        ||z              }t        |||
      | _        nt        j                         | _         ||      | _        t        ||d      | _        t#        |||d||d      | _        |dkD  rt'        |      | _        y	t        j                         | _        y	)
a  Initialize pre-activation RegNet Bottleneck block.

        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            stride: Convolution stride.
            dilation: Dilation rates for conv2 and shortcut.
            bottle_ratio: Bottleneck ratio (reduction factor).
            group_size: Group convolution size.
            se_ratio: Squeeze-and-excitation ratio.
            downsample: Shortcut downsampling type.
            linear_out: Use linear activation for output.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            drop_block: Drop block layer.
            drop_path_rate: Stochastic depth drop rate.
        r   )r{   r   r   )r{   r|   r}   rS   r   T)r{   r|   r}   r9   N)r   r   r   r   rC   rO   norm1r   r   norm2r   r   r   r   r   norm3r   r   r7   r   r   )r   ry   rz   r|   r}   r0   r.   r2   r7   r8   r<   r>   r   r   norm_act_layerr   rS   r   r   s                     rJ   r   zPreBottleneck.__init__p  s   B 	mT+-+J	BU7\#9:;:-#F+
"6>qI
#N3
"a[

 eFX$567K~;R[\DGkkmDG#N3
">7J
)
 6Da5G.1R[[]rI   rM   c                      y)z?Zero-initialize the last batch norm (no-op for pre-activation).NrH   r   s    rJ   r   zPreBottleneck.zero_init_last  s    rI   r   c                 V   | j                  |      }|}| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }| j                  #| j                  |      | j                  |      z   }|S r   )	r   r   r   r   r   r   r   r7   r   r   s      rJ   r   zPreBottleneck.forward  s     JJqMJJqMJJqMJJqMGGAJJJqMJJqM??& q!DOOH$==ArI   r   r   r   s   @rJ   r   r   j  s     (."#"'$"$''#%>>$&A[A[ A[ 	A[
 CHoA[  A[ A[ A[ A[ A[  A[ !A[ "A[F %,, rI   r   c                        e Zd ZdZdefdedededededeee      d	e	f fd
Z
dej                  dej                  fdZ xZS )RegStagezRegNet stage (sequence of blocks with the same output shape).

    A stage consists of multiple bottleneck blocks with the same output dimensions.
    Nr&   ry   rz   r|   r}   drop_path_ratesblock_fnc                    t         t        |           d| _        |dv rdnd}	t	        |      D ]U  }
|
dk(  r|nd}|
dk(  r|n|}|	|f}|||
   nd}dj                  |
dz         }| j                  | |||f|||d	|       |}	W y)
a  Initialize RegNet stage.

        Args:
            depth: Number of blocks in stage.
            in_chs: Input channels.
            out_chs: Output channels.
            stride: Stride for first block.
            dilation: Dilation rate.
            drop_path_rates: Drop path rates for each block.
            block_fn: Block class to use.
            **block_kwargs: Additional block arguments.
        F)r   r   r   r   r   Nr1   zb{})r|   r}   r   )r   r   r   grad_checkpointingrp   format
add_module)r   r&   ry   rz   r|   r}   r   r   block_kwargsfirst_dilationiblock_strideblock_in_chsblock_dilationdprnamer   s                   rJ   r   zRegStage.__init__  s    . 	h&("'&&0au 	&A%&!V6L%&!V6L,h7N(7(C/!$C<<A&DOO  (+#& #
 &N#	&rI   r   rM   c                     | j                   r:t        j                  j                         st	        | j                         |      }|S | j                         D ]
  } ||      } |S )zForward pass through all blocks in the stage.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r   re   jitis_scriptingr   children)r   r   blocks      rJ   r   zRegStage.forward  sZ     ""599+A+A+Ct}}2A   !HrI   )r?   r@   rA   rB   r   rC   r
   r	   rE   r   r   re   r   r   r   r   s   @rJ   r   r     s~     6:!+,&,& ,& 	,&
 ,& ,& &d5k2,& ,&\ %,, rI   r   c                   6    e Zd ZdZ	 	 	 	 	 	 	 d#dededededededed	ef fd
Z		 	 	 d$dedededede
eeeef      eeef   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j2                  deeeee   f      dededededeeej2                     e
ej2                  eej2                     f   f   fdZ	 	 	 d)deeee   f   dededee   fdZdej2                  dej2                  fdZd%dej2                  d edej2                  fd!Zdej2                  dej2                  fd"Z xZ S )*r"   zRegNet-X, Y, and Z Models.

    Paper: https://arxiv.org/abs/2003.13678
    Original Impl: https://github.com/facebookresearch/pycls/blob/master/pycls/models/regnet.py
    cfgin_chansnum_classesoutput_strideglobal_pool	drop_rater   r   c	           
      z   t         |           || _        || _        |dv sJ t	        |fi |	}|j
                  }
t        |j                  |j                        }|j                  rt        ||
dd      | _        nt        ||
dfddi|| _        t        |
dd      g| _        |
}d}| j                  |||	      \  }}t        |      d
k(  sJ |j                  rt         nt"        }t%        |      D ]h  \  }}dj'                  |dz         }| j)                  |t+        d||d||       |d   }||d   z  }| xj                  t        |||      gz  c_        j |j,                  r0t        ||j,                  fddi|| _        |j,                  | _        nV|j0                  xs |j                  }|r t3        |j                               nt5        j6                         | _        || _        | j,                  | _        t;        | j,                  |||      | _        t?        tA        tB        |      |        y)a  Initialize RegNet model.

        Args:
            cfg: Model architecture configuration.
            in_chans: Number of input channels.
            num_classes: Number of classifier classes.
            output_stride: Output stride of network, one of (8, 16, 32).
            global_pool: Global pooling type.
            drop_rate: Dropout rate.
            drop_path_rate: Stochastic depth drop-path rate.
            zero_init_last: Zero-init last weight of residual path.
            kwargs: Extra kwargs overlayed onto cfg.
        )r^      r4   r   r   r   r   r|   stem)num_chs	reductionmodule)r   r      zs{}r   )ry   r   rz   r{   )in_featuresr   	pool_typer   )r   NrH   )"r   r   r   r   r   r5   r   r<   r>   r9   r   r   r   feature_info_get_stage_argsrk   r   r   	enumerater   r   r   r:   
final_convr8   r   r   r   head_hidden_sizer   headr   r   _init_weights)r   r   r   r   r   r   r   r   r   kwargsr5   na_args
prev_widthcurr_strideper_stage_argscommon_argsr   r   
stage_args
stage_name	final_actr   s                        rJ   r   zRegNet.__init__  s@   2 	&"+++c$V$ ^^
3>>J::%h
AaHDI#Hj!QAQQDI!*&QR  
&*&:&:') '; '
#
 >"a'''$'JJ=J&~6 	fMAza!e,JOO %% ! "	 $I.J:h//K$z[Yc"d!ee	f  )*c6F6FaTUaY`aDO # 0 0D4#**I@I:mCMM:<r{{}DO *D $ 1 1"))#!	
	 	GM.I4PrI   default_striderM   c           	      n   t        |j                  |j                  |j                  |j                  |j
                        \  }}}t        j                  t        j                  |      d      \  }}	|j                         |	j                         }	}t        |      D 
cg c]  }
|j                   }}
g }g }d}d}t        |      D ]8  }
||k\  r||z  }d}n|}||z  }|j                  |       |j                  |       : t        j                  d|t        |	            }t        j                  t        j                  |	dd       d      }t        j                   ||j                               }|D cg c]  }|j                          }}t#        ||||j$                  	      \  }}g d
}t'        ||||	|||      D cg c]  }t)        t'        ||             }}t)        |j*                  |j,                  |j.                  |j0                  |j2                        }||fS c c}
w c c}w c c}w )aM  Generate stage arguments from configuration.

        Args:`
            cfg: RegNet configuration.
            default_stride: Default stride for stages.
            output_stride: Target output stride.
            drop_path_rate: Stochastic depth rate.

        Returns:
            Tuple of (per_stage_args, common_args).
        T)return_countsr   r   r   N)dim)rT   )rz   r|   r}   r&   r0   r.   r   )r7   r2   r8   r<   r>   )rx   r*   r(   r,   r&   r.   re   rl   ro   rr   rp   r0   appendlinspacesumcumsumtensor_splitr]   r3   rV   r   r7   r2   r8   r<   r>   )r   r   r  r   r   rQ   ru   stage_gsstage_widthsstage_depthsrw   stage_brstage_stridesstage_dilations
net_strider}   r|   
dpr_tensorsplit_indices	stage_dprr   	arg_namesparamsr   r   s                            rJ   r   zRegNet._get_stage_argsn  s   & (7svvsvvsvvsyyZ]ZhZh'i$
H &+\\%,,v2FVZ%["l%1%8%8%:L<O<O<Ql.3J.?@C$$@@
z" 	-A]*N*'f$
  (""8,	- ^^A~s<7HI
U\\,s2C%D!L&&z=3G3G3IJ	-67cSZZ\7	7 ";(H8K8K"Mho	 m_lHV^`ij
-3DY'(
 
 ~~\\~~mm~~
 {**E A" 8
s    H(8H-H2coarsec                 .    t        d|rd      S d      S )z"Group parameters for optimization.z^stemz^s(\d+)z^s(\d+)\.b(\d+))r   blocks)r   )r   r  s     rJ   group_matcherzRegNet.group_matcher  s&     !':
 	
-?
 	
rI   enableNc                 T    t        | j                               dd D ]	  }||_         y)z)Enable or disable gradient checkpointing.r   r  N)listr   r   )r   r  ss      rJ   set_grad_checkpointingzRegNet.set_grad_checkpointing  s-     dmmo&q, 	*A#)A 	*rI   c                 .    | j                   j                  S )zGet the classifier head.)r   fcr   s    rJ   get_classifierzRegNet.get_classifier  s     yy||rI   c                 L    || _         | j                  j                  ||       y)zReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        )r   N)r   r   reset)r   r   r   s      rJ   reset_classifierzRegNet.reset_classifier  s      '		{;rI   r   indicesnorm
stop_early
output_fmtintermediates_onlyc                 @   |dv sJ d       g }t        d|      \  }}	d}
| j                  |      }|
|v r|j                  |       d}|r|d|	 }|D ]/  }|
dz  }
 t        | |      |      }|
|v s|j                  |       1 |r|S |
dk(  r| j	                  |      }||fS )	a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.   r   s1s2s3s4Nr   r   )r   r   r  getattrr   )r   r   r&  r'  r(  r)  r*  intermediatestake_indices	max_indexfeat_idxlayer_namesns                rJ   forward_intermediateszRegNet.forward_intermediates  s    * Y&D(DD&"6q'"Bi IIaL|#  #.%jy1K 	(AMH a #A<'$$Q'		(   q="A-rI   
prune_norm
prune_headc                     t        d|      \  }}d}||d }|D ]!  }t        | |t        j                                # |dk  rt        j                         | _        |r| j                  dd       |S )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.  Nr   r   r   )r   setattrr   r   r   r%  )r   r&  r;  r<  r5  r6  r8  r9  s           rJ   prune_intermediate_layersz RegNet.prune_intermediate_layers  st      #7q'"Bi.!)*- 	,AD!R[[]+	,q= kkmDO!!!R(rI   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S )zForward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r   r/  r0  r1  r2  r   r   r   s     rJ   forward_featureszRegNet.forward_features  sX     IIaLGGAJGGAJGGAJGGAJOOArI   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )zForward pass through classifier head.

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

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

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )rB  rE  rA  s     rJ   r   zRegNet.forward/  s)     !!!$a rI   )r     r4   r   r1   r1   T)r   r4   r1   F)T)N)NFFr,  F)r   FT)!r?   r@   rA   rB   r#   rC   rF   rE   rG   r   r   r	   r   r   r   re   r   ignorer  r  r   Moduler"  r
   r%  r   r   r:  r?  rB  rE  r   r   r   s   @rJ   r"   r"     s    #!#$!$&#'QQQQ QQ 	QQ
 QQ QQ QQ "QQ !QQl #$!#$&:+:+  :+ 	:+
 ":+ 
tDcN#T#s(^3	4:+x YY
D 
T#s(^ 
 
 YY*T *T * *
 YY		  <C <hsm <W[ < 8<$$',. ||.  eCcN34.  	. 
 .  .  !%.  
tELL!5tELL7I)I#JJ	K. d ./$#	3S	>*  	
 
c6%,, 5<< "
Sell 
S 
S 
S %,, rI   r   r   r   r   c                    t        | t        j                        r| j                  d   | j                  d   z  | j                  z  }|| j
                  z  }| j                  j                  j                  dt        j                  d|z               | j                  %| j                  j                  j                          yyt        | t        j                        rct        j                  j                  | j                  dd       | j                  *t        j                  j                  | j                         yy|rt!        | d      r| j#                          yyy)	zInitialize module weights.

    Args:
        module: PyTorch module to initialize.
        name: Module name.
        zero_init_last: Zero-initialize last layer weights.
    r   r          @Nr1   g{Gz?)meanstdr   )
isinstancer   Conv2dr{   out_channelsrS   r   datanormal_ri   sqrtbiaszero_Linearr   r   hasattrr   )r   r   r   fan_outs       rJ   r   r   =  s    &"))$$$Q'&*<*<Q*??&BUBUUFMM!""1diig&>?;;"KK""$ #	FBII	&
CT:;;"GGNN6;;' #	GF,<= >rI   
state_dictc                    | j                  d|       } g d}d| v rddl}| d   d   d   } i }| d   j                         D ]q  \  }}|j                  dd	      }|j                  d
d      }|j	                  dd |      }|j	                  dd|      }|D ]  \  }}|j                  ||      } |||<   s | d   j                         D ]%  \  }}d|v sd|v r|j                  dd      }|||<   ' |S d| v rddl}i }| j                         D ]p  \  }}|j                  dd	      }|j                  dd      }|j	                  dd |      }|D ]  \  }}|j                  ||      } |j                  dd      }|||<   r |S | S )zFilter and remap state dict keys for compatibility.

    Args:
        state_dict: Raw state dictionary.

    Returns:
        Filtered state dictionary.
    model))zf.a.0z
conv1.conv)zf.a.1zconv1.bn)zf.b.0z
conv2.conv)zf.b.1zconv2.bn)z
f.final_bnconv3.bn)zf.se.excitation.0zse.fc1)zf.se.excitation.2zse.fc2)zf.ser   )zf.c.0
conv3.conv)zf.c.1r]  )zf.cr^  )zproj.0downsample.conv)zproj.1zdownsample.bn)projr_  classy_state_dictr   N
base_modeltrunkz_feature_blocks.conv1.stem.0	stem.convz_feature_blocks.conv1.stem.1zstem.bnz&^_feature_blocks.res\d.block(\d)-(\d+)c                 x    dt        | j                  d             dt        | j                  d            dz    S )Nr  r   .br   rC   groupr   s    rJ   <lambda>z_filter_fn.<locals>.<lambda>w  2    Ac!''!*o.bQWWQZ11D0EF rI   zs(\d)\.b(\d+)\.bnzs\1.b\2.downsample.bnheadsprojection_head
prototypesz0.clf.0head.fczstem.0.weightzstem.0zstem.1z)trunk_output.block(\d)\.block(\d+)\-(\d+)c                 x    dt        | j                  d             dt        | j                  d            dz    S )Nr  r   rf  r   rg  ri  s    rJ   rj  z_filter_fn.<locals>.<lambda>  rk  rI   zfc.zhead.fc.)getreitemsr   sub)rZ  replacesrr  outkvr  rs           rJ   
_filter_fnrz  S  s    4JH  j( 34\B7K
w'--/ 		DAq		8+FA		8)DA9FKA +-EqIA  $1IIaO$CF		 w'--/ 	DAq A%):		)Y/ACF		
 
*$$$& 		DAq		(K0A		(I.A<FKA ! $1IIaO$		%,ACF		 
rI   regnetx_002r-   gQ8B@gQ@   )r(   r*   r,   r.   r&   regnetx_004g{Gz8@gRQ@r      regnetx_004_tvg?)r(   r*   r,   r.   r&   r3   regnetx_0060   g\(|B@gQ@regnetx_0088   g=
ףpA@g=
ףp=@regnetx_016r'   gzGA@g      @   regnetx_032X   g(\O:@   regnetx_040`   g33333SC@gq=
ףp@(      regnetx_064   g
ףp=jN@g(\ @   regnetx_080gHzH@g
ףp=
@x   regnetx_120   gףp=
WR@g(\@p      regnetx_160   gQK@g @   regnetx_320@  gףp=
wQ@rL  regnety_002r   )r(   r*   r,   r.   r&   r2   regnety_004gp=
;@gQ @regnety_006gQE@@g(\@   regnety_008gQkC@g333333@   regnety_008_tv)r(   r*   r,   r.   r&   r2   r3   regnety_016g(\µ4@g333333@   regnety_032r)   r+   r%   regnety_040g)\h?@@   regnety_064g\(@@g)\(@H   regnety_080   gGz4S@gQ@regnety_080_tvregnety_120regnety_160   gQZ@gףp=
@regnety_320   g)\\@g=
ףp=@   regnety_640i`  g(\ob@iH  regnety_1280i  g(\d@g)\(@i  regnety_2560i  g(\l@iu  regnety_040_sgnsilu)r.   )r(   r*   r,   r.   r&   r2   r<   r>   regnetv_040T)r&   r(   r*   r,   r.   r2   r9   r<   regnetv_064r   )	r&   r(   r*   r,   r.   r2   r9   r<   r7   regnetz_005gffffff%@gGz@r   g      @i   )r&   r(   r*   r,   r.   r0   r2   r7   r8   r:   r<   regnetz_040   g      -@g+@regnetz_040_hi   variant
pretrainedc                 B    t        t        | |ft        |    t        d|S )zCreate a RegNet model.

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

    Returns:
        RegNet model instance.
    )	model_cfgpretrained_filter_fn)r   r"   
model_cfgsrz  )r  r  r   s      rJ   _create_regnetr    s2      W%' 	 rI   urlc                 4    | dddddddt         t        dd	d
|S )zCreate default configuration dictionary.

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

    Returns:
        Configuration dictionary.
    rG  r      r     r  )r      r  gffffff?r/   bicubicrd  ro  )r  r   
input_size	pool_sizetest_input_sizecrop_pcttest_crop_pctinterpolationrM  rN  
first_conv
classifierr   r  r   s     rJ   _cfgr    s7     4}SY(dS",AJ^!	
  rI   c                 4    | dddddt         t        dddd	d
|S )zCreate pycls configuration dictionary.

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

    Returns:
        Configuration dictionary.
    rG  r  r  g      ?r  rd  ro  mitz)https://github.com/facebookresearch/pyclsr  r   r  r  r  r  rM  rN  r  r  license
origin_urlr   r  s     rJ   _cfgpycr    s:     4}SYI%.B!(S
 X^ rI   c                 4    | dddddt         t        dddd	d
|S )zCreate torchvision v2 configuration dictionary.

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

    Returns:
        Configuration dictionary.
    rG  r  r  gzG?r  rd  ro  zbsd-3-clausez!https://github.com/pytorch/visionr  r   r  s     rJ   _cfgtv2r    s:     4}SYI%.B!!1T
 Y_ rI   zregnety_032.ra_in1kztimm/znhttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/regnety_032_ra-7f2439f9.pth)	hf_hub_idr  zregnety_040.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_040_ra3-670e1166.pthzregnety_064.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_064_ra3-aa26dc7d.pthzregnety_080.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_080_ra3-1fdc4344.pthzregnety_120.sw_in12k_ft_in1k)r  zregnety_160.sw_in12k_ft_in1kzregnety_160.lion_in12k_ft_in1kzregnety_120.sw_in12ki-.  )r  r   zregnety_160.sw_in12kzregnety_040_sgn.untrained)r  zregnetv_040.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetv_040_ra3-c248f51f.pthr   )r  r  r  zregnetv_064.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetv_064_ra3-530616c2.pthzregnetz_005.untrainedzregnetz_040.ra3_in1kzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_040_ra3-9007edf5.pth)r      r  )r^   r^   r/   )r   r  r  )r  r  r  r  r  r  zregnetz_040_h.ra3_in1kzthttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_040h_ra3-f594343b.pthzregnety_160.deit_in1kz<https://dl.fbaipublicfiles.com/deit/regnety_160-a5fe301d.pthzregnetx_004_tv.tv2_in1kz?https://download.pytorch.org/models/regnet_x_400mf-62229a5f.pthzregnetx_008.tv2_in1kz?https://download.pytorch.org/models/regnet_x_800mf-94a99ebd.pthzregnetx_016.tv2_in1kz?https://download.pytorch.org/models/regnet_x_1_6gf-a12f2b72.pthzregnetx_032.tv2_in1kz?https://download.pytorch.org/models/regnet_x_3_2gf-7071aa85.pthzregnetx_080.tv2_in1kz=https://download.pytorch.org/models/regnet_x_8gf-2b70d774.pthzregnetx_160.tv2_in1kz>https://download.pytorch.org/models/regnet_x_16gf-ba3796d7.pthzregnetx_320.tv2_in1kz>https://download.pytorch.org/models/regnet_x_32gf-6eb8fdc6.pthzregnety_004.tv2_in1kz?https://download.pytorch.org/models/regnet_y_400mf-e6988f5f.pthzregnety_008_tv.tv2_in1kz?https://download.pytorch.org/models/regnet_y_800mf-58fc7688.pthzregnety_016.tv2_in1kz?https://download.pytorch.org/models/regnet_y_1_6gf-0d7bc02a.pthzregnety_032.tv2_in1kz?https://download.pytorch.org/models/regnet_y_3_2gf-9180c971.pthzregnety_080_tv.tv2_in1kz=https://download.pytorch.org/models/regnet_y_8gf-dc2b1b54.pthzregnety_160.tv2_in1kz>https://download.pytorch.org/models/regnet_y_16gf-3e4a00f9.pthzregnety_320.tv2_in1kz>https://download.pytorch.org/models/regnet_y_32gf-8db6d4b5.pthzregnety_160.swag_ft_in1kzChttps://download.pytorch.org/models/regnet_y_16gf_swag-43afe44d.pthzcc-by-nc-4.0)r     r  )   r  )r  r  r  r  r  r  zregnety_320.swag_ft_in1kzChttps://download.pytorch.org/models/regnet_y_32gf_swag-04fdfa75.pthzregnety_1280.swag_ft_in1kzDhttps://download.pytorch.org/models/regnet_y_128gf_swag-c8ce3e52.pthzregnety_160.swag_lc_in1kzFhttps://download.pytorch.org/models/regnet_y_16gf_lc_swag-f3ec0043.pth)r  r  r  zregnety_320.swag_lc_in1kzFhttps://download.pytorch.org/models/regnet_y_32gf_lc_swag-e1583746.pthzregnety_1280.swag_lc_in1kzGhttps://download.pytorch.org/models/regnet_y_128gf_lc_swag-cbe8ce12.pthzregnety_320.seer_ft_in1kotherz)https://github.com/facebookresearch/visslzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet32_finetuned_in1k_model_final_checkpoint_phase78.torch)r  r  r  r  r  r  r  zregnety_640.seer_ft_in1kzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet64_finetuned_in1k_model_final_checkpoint_phase78.torchzregnety_1280.seer_ft_in1kzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet128_finetuned_in1k_model_final_checkpoint_phase78.torchzregnety_2560.seer_ft_in1kzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet256_finetuned_in1k_model_final_checkpoint_phase38.torchzregnety_320.seerzihttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_regnet32d/seer_regnet32gf_model_iteration244000.torch)r  r  r   r  r  zregnety_640.seerzphttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_regnet64/seer_regnet64gf_model_final_checkpoint_phase0.torchzregnety_1280.seerzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/swav_ig1b_regnet128Gf_cnstant_bs32_node16_sinkhorn10_proto16k_syncBN64_warmup8k/model_final_checkpoint_phase0.torchzregnetx_002.pycls_in1kzregnetx_004.pycls_in1kzregnetx_006.pycls_in1kzregnetx_008.pycls_in1kzregnetx_016.pycls_in1kzregnetx_032.pycls_in1kzregnetx_040.pycls_in1kzregnetx_064.pycls_in1kzregnetx_080.pycls_in1kzregnetx_120.pycls_in1kzregnetx_160.pycls_in1kzregnetx_320.pycls_in1kzregnety_002.pycls_in1kzregnety_004.pycls_in1kzregnety_006.pycls_in1kzregnety_008.pycls_in1kzregnety_016.pycls_in1kzregnety_032.pycls_in1kzregnety_040.pycls_in1kzregnety_064.pycls_in1kzregnety_080.pycls_in1kzregnety_120.pycls_in1kzregnety_160.pycls_in1kzregnety_320.pycls_in1kc                     t        d| fi |S )zRegNetX-200MFr{  r  r  r   s     rJ   r{  r{         ->v>>rI   c                     t        d| fi |S )zRegNetX-400MFr}  r  r  s     rJ   r}  r}    r  rI   c                     t        d| fi |S )z+RegNetX-400MF w/ torchvision group roundingr  r  r  s     rJ   r  r         *JA&AArI   c                     t        d| fi |S )zRegNetX-600MFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-800MFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-1.6GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-3.2GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-4.0GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-6.4GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-8.0GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-12GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-16GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetX-32GFr  r  r  s     rJ   r  r     r  rI   c                     t        d| fi |S )zRegNetY-200MFr  r  r  s     rJ   r  r  &  r  rI   c                     t        d| fi |S )zRegNetY-400MFr  r  r  s     rJ   r  r  ,  r  rI   c                     t        d| fi |S )zRegNetY-600MFr  r  r  s     rJ   r  r  2  r  rI   c                     t        d| fi |S )zRegNetY-800MFr  r  r  s     rJ   r  r  8  r  rI   c                     t        d| fi |S )z+RegNetY-800MF w/ torchvision group roundingr  r  r  s     rJ   r  r  >  r  rI   c                     t        d| fi |S )zRegNetY-1.6GFr  r  r  s     rJ   r  r  D  r  rI   c                     t        d| fi |S )zRegNetY-3.2GFr  r  r  s     rJ   r  r  J  r  rI   c                     t        d| fi |S )zRegNetY-4.0GFr  r  r  s     rJ   r  r  P  r  rI   c                     t        d| fi |S )zRegNetY-6.4GFr  r  r  s     rJ   r  r  V  r  rI   c                     t        d| fi |S )zRegNetY-8.0GFr  r  r  s     rJ   r  r  \  r  rI   c                     t        d| fi |S )z+RegNetY-8.0GF w/ torchvision group roundingr  r  r  s     rJ   r  r  b  r  rI   c                     t        d| fi |S )zRegNetY-12GFr  r  r  s     rJ   r  r  h  r  rI   c                     t        d| fi |S )zRegNetY-16GFr  r  r  s     rJ   r  r  n  r  rI   c                     t        d| fi |S )zRegNetY-32GFr  r  r  s     rJ   r  r  t  r  rI   c                     t        d| fi |S )zRegNetY-64GFr  r  r  s     rJ   r  r  z  r  rI   c                     t        d| fi |S )zRegNetY-128GFr  r  r  s     rJ   r  r         .*???rI   c                     t        d| fi |S )zRegNetY-256GFr  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetY-4.0GF w/ GroupNorm r  r  r  s     rJ   r  r    s     +ZB6BBrI   c                     t        d| fi |S )zRegNetV-4.0GF (pre-activation)r  r  r  s     rJ   r  r    r  rI   c                     t        d| fi |S )zRegNetV-6.4GF (pre-activation)r  r  r  s     rJ   r  r    r  rI   c                      t        d| fddi|S )zRegNetZ-500MF
    NOTE: config found in https://github.com/facebookresearch/ClassyVision/blob/main/classy_vision/models/regnet.py
    but it's not clear it is equivalent to paper model as not detailed in the paper.
    r  r   Fr  r  s     rJ   r  r         -TETVTTrI   c                      t        d| fddi|S )RegNetZ-4.0GF
    NOTE: config found in https://github.com/facebookresearch/ClassyVision/blob/main/classy_vision/models/regnet.py
    but it's not clear it is equivalent to paper model as not detailed in the paper.
    r  r   Fr  r  s     rJ   r  r    r
  rI   c                      t        d| fddi|S )r  r  r   Fr  r  s     rJ   r  r    s     /:VeVvVVrI   regnetz_040h)r1   )r^   )r   r   r   NF)r   NF)r   FrH   )r   rH  )krB   ri   dataclassesr   r   	functoolsr   typingr   r   r   r	   r
   r   r   re   torch.nnr   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r    r!   __all__r#   rE   rC   rP   r]   rx   rG   rJ  r   r   r   rF   r   r   r   r   r"   r   rz  r   r  r  r  r  r  default_cfgsr{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?   rH   rI   rJ   <module>r     sr  2  *  D D D   A d d X X * + 4 Y Y[
! 3 3 3&
!e 
! 
! 
!" 	S	E{ S	 	
 49d3i D >>> > 	>
 > > 49c49$%>H )-+
+
+
 +
 	+

 +
 X&+
 +
 YY+
b )-#(#(#( #( 	#(
 #( X&#( #( ]]#(X %+)-#!### # 	#
 # S/# X&# # bii#Lb bJbBII bJBryy BJfRYY fR	 "))  3  T  VZ  ,>4S> >d38n >D  =REdqK= REdrL= u"B`cd	=
 REdrL= REdrL= REdrL= REdrL= REdrL= SUt"M= REds"M= SUt2N= SUss"M= SUss"M=" REdqUYZ#=$ REdqUYZ%=& REdrVZ['=( REcbUYZ)=* u2X\nqr+=, REdrVZ[-=. REdrVZ[/=0 REdrVZ[1=2 SUt"W[\3=4 SUt"W[\5=6 $2RZ^pst7=8 SUt2X\]9=: SVBY]^;=< SVBY]^==> SV2X\]?=@ cf#RZ^_A=B cf#RZ^_C=J %DRrDW\b%IKK=T REdrDQUagiU=X SUtTRVbhY=b RDTacTXDtvc=j RDUqsUYDqFk=r RDUqsUYDtvs=
@C T  $c T#s(^ & S#X & S#X & % u&4|~u&
 D BCu& D BCu& D BCu& #D7$;u& #D7$;u&  %dW&=!u&& D'u&, D-u&6  "7u&8 D B9u&@ D BAu&J Tb\Ku&L D B FSR_aMu&T d C FSR_aUu&` T]_au&f wM Ogu&l GMOmu&r GMOsu&x GMOyu&~ GKMu&D GLNEu&J GLNKu&R GMOSu&X wM OYu&^ GMO_u&d GMOeu&j wK Mku&p GLNqu&v GLNwu&~ Q[i Hs!Du&F Q[i Hs!DGu&N  R\j Hs"DOu&X T^l!nYu&^ T^l!n_u&d  U_m"oeu&l $O N Hs	!Dmu&v $O N Hs	!Dwu&@  $O O Hs	"DAu&J  $O O Hs	"DKu&V ww3^`Wu&^ ~w3^`_u&f  qw3^`gu&x g8yu&z g8{u&| g8}u&~ g8u&@ g8Au&B g8Cu&D g8Eu&F g8Gu&H g8Iu&J g8Ku&L g8Mu&N g8Ou&R g8Su&T g8Uu&V g8Wu&X g8Yu&Z g8[u&\ g8]u&^ g8_u&` g8au&b g8cu&d g8eu&f g8gu&h g8iu& up ?D ?v ? ?
 ?D ?v ? ?
 Bt B& B B
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 Bt B& B B
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 Bt B& B B
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 ?D ?v ? ?
 @T @ @ @
 @T @ @ @
 C C6 C C
 ?D ?v ? ?
 ?D ?v ? ?
 UD Uv U U UD Uv U U Wd W W W HO' rI   