Ë
    éÓ^jÝÆ ã                   ór+  — d Z ddlZddlmZ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mZmZ ddlZddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dd	l,m-Z- dd
l.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5 g d¢Z6e G d„ d«      «       Z7e G d„ d«      «       Z8�dÃde	e9df   de	e:df   de9de	e7df   fd„Z;	 	 	 	 �dÄde	e9df   de	e:df   de	e9df   de9de
e
e7      f
d„Z<	 	 �dÅde	e=e=f   de9dee9e
e9   f   de>de	e7df   f
d„Z?d ee7ee7   f   de
e7   fd!„Z@d"ee9   d#e9de9fd$„ZAe G d%„ d&«      «       ZB G d'„ d(ej†                  «      ZDd)e=d*e9d+e9d,e9d-e	e9e9f   d.eBdeej†                     fd/„ZE G d0„ d1ej†                  «      ZF G d2„ d3ej†                  «      ZG G d4„ d5ej†                  «      ZH G d6„ d7ej†                  «      ZI G d8„ d9ej†                  «      ZJ G d:„ d;ej†                  «      ZK G d<„ d=ej†                  «      ZL eMeFeGeHeIeJeKeL¬>«      ZNd?e=d@ej†                  fdA„ZOdBee=ej†                  f   fdC„ZP G dD„ dEej¢                  «      ZR	 	 	 	 	 	 �dÆd*e9d+e9dGe=dHe=dIe=d.eBfdJ„ZS�dÇdL„ZTdM„ ZUdNee=ef   dOe7dPe8fdQ„ZV	 	 	 �dÈdUe:dVe9dWe9de
ee      fdX„ZWdRdSddeVddfdYe8dZe:d[e9d\ee=ef   d]e:d^e9d_ee9   d.eeB   d`ee   fda„ZX�dÉdYe8dce>fdd„ZY G de„ dfej†                  «      ZZ�dÊdgej†                  dhe=die>ddfdj„Z[ eMdi dk e8 e7dlddmdKddn¬o«       e7dldKdpdKddn¬o«       e7dqdrdsdKddt¬o«       e7dqdudsdKddv¬o«       e7dqdTdsdddv¬o«      fdwddx¬y«      “dz e8 e7dlddmdKddn¬o«       e7dldKdpdKddn¬o«       e7dqdrdsdKddt¬o«       e7dqdTdsdKddv¬o«       e7dqddsdddv¬o«      fdwddx¬y«      “d{ e8 e7dldd|dKddn¬o«       e7dldSd|dKddn¬o«       e7dqd}d~dKddt¬o«       e7dqdKddKddv¬o«       e7dqdd€dddv¬o«      fd�dd‚¬y«      “dƒ e8 e;d„d…¬†«      d‡d|¬ˆ«      “d‰ e8 e;d„dŠ¬†«      d‡d‹¬ˆ«      “dŒ e8 e;d„d�¬†«      d‡d‹¬ˆ«      “dŽ e8 e;d�¬�«      d‡d‹¬ˆ«      “d‘ e8 e;d’¬�«      d‡d‹¬ˆ«      “d“ e8 e;d’dT¬”«      d‡d‹¬ˆ«      “d• e8 e;d–¬�«      d‡d‹¬ˆ«      “d— e8 e;d–dT¬”«      d‡d‹¬ˆ«      “d˜ e8 e;d™¬�«      d‡d‹¬ˆ«      “dš e8 e;d™dT¬”«      d‡d‹¬ˆ«      “d› e8 e;dœd–¬†«      d‡d‹d� eMdžd¬Ÿ«      ¬ «      “d¡ e8 e7dqdKd€ddwdt¬o«       e7dqdTd¢dKdwdt¬o«       e7dqdrd£dKdwdt¬o«       e7dqdTd£dKddn¬o«      fdmd¤dd¥d¦¬§«      “d¨ e8 e7d©dd€dddn eM«       ¬ª«       e7dqdTd¢dKdwdt¬o«       e7dqdrd£dKdwdt¬o«       e7dqdTd£dKddn¬o«      fdmd«dd¥d¦ eMdb¬¬«      ¬­«      “d® e8 e7dqdKd€ddwdt¬o«       e7dqdKd¢dKdwdt¬o«       e7dqdKd¯dKdwdt¬o«       e7dqdKd¥dKdwdt¬o«      fd‹d°d±d¦¬²«      “d³ e8 e7dqdKd€ddwdt¬o«       e7dqdKd¢dKdwdt¬o«       e7dqdKd¯dKdwdt¬o«       e7dqdKd¥dKdwdt¬o«      fd‹d°d±d¦d´¬µ«      “d¶ e8 e7dqdKd€ddwdt¬o«       e7dqdKd¢dKdwdt¬o«       e7dqdKd¯dKdwdt¬o«       e7dqdKd¥dKdwdt¬o«      fd‹d°d±d¦d�¬µ«      “d· e8 e7dqdKd€ddwdt¬o«       e7dqdKd¢dKdwdt¬o«       e7dqdKd¯dKdwdt¬o«       e7dqdKd¥dKdwdt¬o«      fd‹d°d±d¦d¸¬µ«      “d¹ e8 e7dqdKd€ddwdt¬o«       e7dqdKd¢dKdwdt¬o«       e7dqdKd¯dKdwdt¬o«       e7dqdKd¥dKdwdt¬o«      fd‹d°d±d¦dº eMd»¬¼«      ¬½«      “d¾ e8 e7dqdKd€dddt¬o«       e7dqdSd¢dKddt¬o«       e7dqdSd£dKddt¬o«       e7dqdKd£dKddt¬o«      fd‹d°dFdd¦¬§«      “d¿ e8 e7dqdKd€dddt¬o«       e7dqdSd¢dKddt¬o«       e7dqdSd£dKddt¬o«       e7dqdKd£dKddt¬o«      fd‹d°dFdÀd¦¬§«      “dÁ e8 e7dqdKd€dddt¬o«       e7dqdSd¢dKddt¬o«       e7dqdSd£dKddt¬o«       e7dqdKd£dKddt¬o«      fd‹d°dFdÀd¦d´¬Â«      “dÃ e8 e7dqdKd€dddt¬o«       e7dqdSd¢dKddt¬o«       e7dqdSd£dKddt¬o«       e7dqdKd£dKddt¬o«      fd‹d°dFdÀd¦d�¬Â«      “dÄ e8 e7dqdKd€dddt¬o«       e7dqdSd¢dKddt¬o«       e7dqdSd£dKddt¬o«       e7dqdKd£dKddt¬o«      fd‹d°dFdÀd¦d¸¬Â«      “dÅ e8 e7dqdSd€ddt¬Æ«       e7dqdTd¢dKdt¬Æ«       e7dqdrd¯dKdt¬Æ«       e7dqdSd¥dKdt¬Æ«      fd‹d°dFd´¬Ç«      “dÈ e8 e7dqdSd€ddwdt¬o«       e7dqdTd¢dKdwdt¬o«       e7dqdrd¯dKdwdt¬o«       e7dqdSd¥dKdwdt¬o«      fd‹d°d±d¦d´¬µ«      “dÉ e8 e7dqdKd|dKdÊdS¬o«       e7dqdrdËdKdÊdS¬o«       e7dqdÌdpdKdÊdS¬o«       e7dqdKdÍdKdÊdS¬o«      fdwdFdFd£d¦d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ð«	      “dÑ e8 e7dqdKd|dKdÊdT¬o«       e7dqdrdËdKdÊdT¬o«       e7dqdÌdpdKdÊdT¬o«       e7dqdKdÍdKdÊdT¬o«      fdwdFdFd£d¦d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ð«	      “dÒ e8 e7dqdSd‹ddwdT¬o«       e7dqdrdmdKdwdT¬o«       e7dqdÌd€dKdwdT¬o«       e7dqdSd~dKdwdT¬o«      fd‹d°dFdFdÓd¦d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ô«
      “dÕ e8 e7dqdSd‹dd»dT¬o«       e7dqdrdmdKd»dT¬o«       e7dqdÌd€dKd»dT¬o«       e7dqdSd~dKd»dT¬o«      fd‹d°dFdFdÓd¦d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ô«
      “dÖ e8 e7dqdSdËdd»dT¬o«       e7dqd»dpdKd»dT¬o«       e7dqdÊd~dKd»dT¬o«       e7dqdSd¢dKd»dT¬o«      fd‹d°dFdFd¥d¦d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ô«
      “d× e8 e7dqdKd|dKdÊdS¬o«       e7dqdrdËdKdÊdS¬o«       e7dqdÌdpdKdÊdS¬o«       e7dqdKdÍdKdÊdS¬o«      fdwdFdFd£d¦ ee dÊ¬Ø«      d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ù«
      “dÚ e8 e7dqdKd|dKdÊdT¬o«       e7dqdrdËdKdÊdT¬o«       e7dqdÌdpdKdÊdT¬o«       e7dqdKdÍdKdÊdT¬o«      fdwdFdFd£d¦ ee dÊ¬Ø«      d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ù«
      “dÛ e8 e7dqdSd‹dd»dT¬o«       e7dqdrdmdKd»dT¬o«       e7dqdÌd€dKd»dT¬o«       e7dqdSd~dKd»dT¬o«      fd‹dÜdFdFdÓd¦ ee dÊ¬Ø«      d� eMdt¬Î«       eMdbdb¬Ï«      ¬Ý«      “dÞ e8 e<dßdT¬à«      dád|¬ˆ«      “dâ e8 e<dã¬�«      dád‹¬ˆ«      “dä e8 e<då¬�«      dád‹¬ˆ«      “dæ e8 e<dç¬�«      dád‹¬ˆ«      “dè e8 e<dédê¬ë«      dád‹¬ˆ«      “dì e8 e7dqdSd€ddt¬Æ«       e7dqdTd¢dKdt¬Æ«       e7dqdrd¯dKdt¬Æ«       e7dqdSd¥dKdt¬Æ«      fdídFdîdïdïdð¬ñ«      “dò e8 e7dqdSd€ddt¬Æ«       e7dqdTd¢dKdt¬Æ«       e7dqdód¯dKdt¬Æ«       e7dqdSd¥dKdt¬Æ«      fdídFdîdïdïdð¬ñ«      “dô e8 e7dqdTd€ddt¬Æ«       e7dqdrd¢dKdt¬Æ«       e7dqdõd¯dKdt¬Æ«       e7dqdrd¥dKdt¬Æ«      fdödídFdîdïdïdð¬÷«      “dø e8 e7dqdrd€ddt¬Æ«       e7dqd»d¢dKdt¬Æ«       e7dqdùd¯dKdt¬Æ«       e7dqd»d¥dKdt¬Æ«      fdúdídFdîdïdïdð¬÷«      “dû e8 e7dqdSd€ddt¬Æ«       e7dqdüd¢dKdt¬Æ«       e7dqdýd¯dKdt¬Æ«       e7dqdõd¥dKdt¬Æ«      fdþdídFdîdïdïdð¬÷«      “dÿ e8 e7dqdSd€ddt¬Æ«       e7dqdTd¢dKdt¬Æ«       e7dqdrd¯dKdt¬Æ«       e7dqdSd¥dKdt¬Æ«      fdídFdîdïdïd¯�d �¬«      “�d e8 e7d©ddwdKd�d¬o«       e7�ddd‹dKd�d¬o«       e7dlddmdKdwdt¬o«       e7dqdd€dKd‹dt¬o«      f�ddïdF�dd� eMdt¬Î«      �¬«      “ŽZ\�dD ]  Z] ee\e]   �d	�¬
«      e\e]�dz   <   Œ 	 �dË�dee=ej¼                  f   �deZ�de=dee=ej¼                  f   f�d„Z_�dee=ej¼                  f   �deZf�d„Z`�dÌ�de=�de>deZf�d„Za�dÍ�de=dee=ef   f�d„Zb�dÍ�de=dee=ef   f�d„Zc e4i �d eb�d�¬«      “�d eb�d�¬«      “�d eb�d�d�d�¬«      “�d eb�d�d �d!�¬"«      “�d# eb�d�d �d!�¬"«      “�d$ eb�d�d �d!�¬"«      “�d% eb�d�d �d!�¬"«      “�d& eb�d�d �d!�¬"«      “�d' eb�d�d �d!�¬"«      “�d( eb�d�d �d!�¬"«      “�d) eb�d�d �d!�¬"«      “�d* eb�d�d �d!�¬"«      “�d+ eb�d�d �d!�¬"«      “�d, eb�d�d �d!�d-�d.dn�¬/«      “�d0 eb�d�d1�d2�d�d�d3dn�¬4«      “�d5 ec�d�d6�d3dn�¬7«      “�d8 ec�d�d9�d3dn�¬7«      “i �d: ec�d�d;�d3dn�¬7«      “�d< ec�d�d=�d3dn�¬7«      “�d> ec�d�d?�d3dn�¬7«      “�d@ ec�d�dA�d�¬B«      “�dC ec�d�dD�d3dn�¬7«      “�dE ec�d�dF�d3dn�¬7«      “�dG ec�d�dH�d3dn�¬7«      “�dI ec�d�dJ�d3dn�¬7«      “�dK ec�d�dL�d3dn�¬7«      “�dM ec�d�dN�d3dn�¬7«      “�dO ec�d�dP�d3dn�¬7«      “�dQ ec�d�dR�dS�dT�dT�dU�dV�dW�d3dn�¬X«
      “�dY ec�d�dZ�dS�dT�dT�dW�d-dn�¬[«      “�d\ ec�d�d]�dT�dT�d^�d-�¬_«      “�d` ec�d�da�dT�dT�dW�d-dn�¬b«      “�dc ec�d�dd�dT�dT�dW�d-dn�¬b«      “�de ec�dS�dT�dT�dU�dV�d^�d3�¬f«      “¥i �dg ec�d�dh�dS�dT�dT�d^�d-�¬i«      “�dj ec�d�dk�dT�dT�d^�d-dn�¬b«      “�dl eb�d�dm�dn�do�¬p«      “�dq eb�d�dr�dn�do�¬p«      “�ds eb�d�dr�dn�do�¬p«      “�dt eb�d�dr�dn�do�¬p«      “�du eb�d�dr�dn�do�¬p«      “�dv ec�dd¯eedb�dU�dV�dw�d!�¬x«	      “�dy ec�dd¢eedb�dU�dV�dw�d!�¬x«	      “�dz ec�ddseedb�d3�d{�dw�d!�¬x«	      “�d| ec�d�d}eedb�d~�d�dw�d!�¬x«	      “�d€ ec�dd¯eedb�d��d‚�dw�d!�¬x«	      “�dƒ ec�dd¯eedb�dU�dV�dw�d!�¬x«	      “�d„ ec�dd¯eedb�dU�dV�dw�d!�¬x«	      “�d… ec�dd¢eedb�dU�dV�dw�d!�¬x«	      “�d† ec�ddee�dU�dV�d!�¬‡«      “�dˆ ec�ddee�dU�dV�d!�¬‡«      “¥ ec�ddee�d3�d{�d!�¬‡«       ec�ddee�d~�d�d!�¬‡«       ec�ddee�d��d‚�d!�¬‡«       ec�ddee�dU�dV�d!�¬‡«       ec�ddee�dU�dV�d!�¬‡«       ec�ddee�dU�dV�d!�¬‡«       ec�d�d�¬‰«       ec�d�dS�dŠ�d^�d‹�¬Œ«      �d�œ¥«      Zde5�dÌdeZf�dŽ„«       Zee5�dÌdeZf�d�„«       Zfe5�dÌdeZf�d�„«       Zge5�dÌdeZf�d‘„«       Zhe5�dÌdeZf�d’„«       Zie5�dÌdeZf�d“„«       Zje5�dÌdeZf�d”„«       Zke5�dÌdeZf�d•„«       Zle5�dÌdeZf�d–„«       Zme5�dÌdeZf�d—„«       Zne5�dÌdeZf�d˜„«       Zoe5�dÌdeZf�d™„«       Zpe5�dÌdeZf�dš„«       Zqe5�dÌdeZf�d›„«       Zre5�dÌdeZf�dœ„«       Zse5�dÌdeZf�d�„«       Zte5�dÌdeZf�dž„«       Zue5�dÌdeZf�dŸ„«       Zve5�dÌdeZf�d „«       Zwe5�dÌdeZf�d¡„«       Zxe5�dÌdeZf�d¢„«       Zye5�dÌdeZf�d£„«       Zze5�dÌdeZf�d¤„«       Z{e5�dÌdeZf�d¥„«       Z|e5�dÌdeZf�d¦„«       Z}e5�dÌdeZf�d§„«       Z~e5�dÌdeZf�d¨„«       Ze5�dÌdeZf�d©„«       Z€e5�dÌdeZf�dª„«       Z�e5�dÌdeZf�d«„«       Z‚e5�dÌdeZf�d¬„«       Zƒe5�dÌdeZf�d­„«       Z„e5�dÌdeZf�d®„«       Z…e5�dÌdeZf�d¯„«       Z†e5�dÌdeZf�d°„«       Z‡e5�dÌdeZf�d±„«       Zˆe5�dÌdeZf�d²„«       Z‰e5�dÌdeZf�d³„«       ZŠe5�dÌdeZf�d´„«       Z‹e5�dÌdeZf�dµ„«       ZŒe5�dÌdeZf�d¶„«       Z�e5�dÌdeZf�d·„«       ZŽe5�dÌdeZf�d¸„«       Z�e5�dÌdeZf�d¹„«       Z�e5�dÌdeZf�dº„«       Z‘e5�dÌdeZf�d»„«       Z’e5�dÌdeZf�d¼„«       Z“e5�dÌdeZf�d½„«       Z”e5�dÌdeZf�d¾„«       Z•e5�dÌdeZf�d¿„«       Z–e5�dÌdeZf�dÀ„«       Z—e5�dÌdeZf�dÁ„«       Z˜e5�dÌdeZf�dÂ„«       Z™y(Î  a¾   Bring-Your-Own-Blocks Network

A flexible network w/ dataclass based config for stacking those NN blocks.

This model is currently used to implement the following networks:

GPU Efficient (ResNets) - gernet_l/m/s (original versions called genet, but this was already used (by SENet author)).
Paper: `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
Code and weights: https://github.com/idstcv/GPU-Efficient-Networks, licensed Apache 2.0

RepVGG - repvgg_*
Paper: `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
Code and weights: https://github.com/DingXiaoH/RepVGG, licensed MIT

MobileOne - mobileone_*
Paper: `MobileOne: An Improved One millisecond Mobile Backbone` - https://arxiv.org/abs/2206.04040
Code and weights: https://github.com/apple/ml-mobileone, licensed MIT

In all cases the models have been modified to fit within the design of ByobNet. I've remapped
the original weights and verified accuracies.

For GPU Efficient nets, I used the original names for the blocks since they were for the most part
the same as original residual blocks in ResNe(X)t, DarkNet, and other existing models. Note also some
changes introduced in RegNet were also present in the stem and bottleneck blocks for this model.

A significant number of different network archs can be implemented here, including variants of the
above nets that include attention.

Hacked together by / copyright Ross Wightman, 2021.
é    N)Ú	dataclassÚfieldÚreplace)Úpartial)	ÚTupleÚListÚDictÚOptionalÚUnionÚAnyÚCallableÚSequenceÚType)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚOPENAI_CLIP_MEANÚOPENAI_CLIP_STD)ÚClassifierHeadÚNormMlpClassifierHeadÚConvNormActÚBatchNormAct2dÚDropBlock2dÚEvoNorm2dS0aÚAttentionPool2dÚRotAttentionPool2dÚDropPathÚcalculate_drop_path_ratesÚAvgPool2dSameÚcreate_conv2dÚget_act_layerÚget_norm_act_layerÚget_attnÚmake_divisibleÚ	to_2tupleé   )Úbuild_model_with_cfg)Úfeature_take_indices)Únamed_applyÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_model)ÚByobNetÚByoModelCfgÚByoBlockCfgÚcreate_byob_stemÚcreate_blockc                   ó
  — e Zd ZU dZeeej                  f   ed<   e	ed<   e	ed<   dZ
e	ed<   dZeee	ef      ed<   d	Zeed
<   dZee   ed<   dZeeeef      ed<   dZee   ed<   dZeeeef      ed<   dZeeeef      ed<   y)r.   zuBlock configuration for Bring-Your-Own-Blocks.

    Defines configuration for a single block or stage of blocks.
    ÚtypeÚdÚcé   ÚsNÚgsç      ð?ÚbrÚ
attn_layerÚattn_kwargsÚself_attn_layerÚself_attn_kwargsÚblock_kwargs)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚnnÚModuleÚ__annotations__Úintr6   r7   r
   r   r9   Úfloatr:   r;   r	   r   r<   r=   r>   © ó    ú^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/byobnet.pyr.   r.   C   s´   … ñð ��R—Y‘Y�Ñ
ÓØ
ƒFØ
ƒFØ€A€sƒJØ)-€Bˆ��s˜H�}Ñ%Ñ&Ó-Ø€BˆƒNð !%€J�˜‘Ó$Ø,0€K�˜$˜s C˜x™.Ñ)Ó0Ø%)€O�X˜c‘]Ó)Ø15Ð�h˜t C¨ H™~Ñ.Ó5Ø-1€L�(˜4  S ™>Ñ*Ô1rJ   r.   c                   ó¤  — e Zd ZU dZeeeeedf   f   df   ed<   dZe	ed<   dZ
e	ed<   dZee	   ed	<   d
Zeeee   eedf   f   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	   ed<    ed„ ¬ «      Zeed!<   dZee	   ed"<    ed#„ ¬ «      Z eed$<    ed%„ ¬ «      Z!e"e	e#f   ed&<   y)'r-   zlModel configuration for Bring-Your-Own-Blocks network.

    Defines overall architecture configuration.
    .ÚblocksÚconv1x1Ú
downsampleÚ3x3Ú	stem_typeÚmaxpoolÚ	stem_poolé    Ústem_chsr8   Úwidth_factorr   Únum_featuresTÚzero_init_lastFÚfixed_input_sizeÚreluÚ	act_layerÚ	batchnormÚ
norm_layerÚ Úaa_layerNÚhead_hidden_sizeÚ
classifierÚ	head_typer:   c                  ó   — t        «       S ©N©ÚdictrI   rJ   rK   ú<lambda>zByoModelCfg.<lambda>t   s   € ´d³f€ rJ   )Údefault_factoryr;   r<   c                  ó   — t        «       S rd   re   rI   rJ   rK   rg   zByoModelCfg.<lambda>v   s   € ¼4»6€ rJ   r=   c                  ó   — t        «       S rd   re   rI   rJ   rK   rg   zByoModelCfg.<lambda>w   s   € ÄÃ€ rJ   r>   )$r?   r@   rA   rB   r   r   r.   rF   rO   rC   rQ   rS   r
   rU   rG   r   rV   rH   rW   rX   ÚboolrY   r[   r]   r_   r`   rb   r:   r   r;   rf   r<   r=   r>   r	   r   rI   rJ   rK   r-   r-   X   s)  … ñð �%˜ U¨;¸Ð+;Ñ%<Ð<Ñ=¸sÐBÑCÓCØ€J�ÓØ€IˆsÓØ(€Iˆx˜‰}Ó(Ø79€Hˆe�C˜˜c™ E¨#¨s¨(¡OÐ3Ñ4Ó9Ø€L�%ÓØ€L�#ÓØ€N�DÓØ"Ð�dÓ"ð €IˆsÓØ!€J�Ó!Ø€HˆcÓð '+Ð�h˜s‘mÓ*Ø!€IˆsÓ!ð !%€J�˜‘Ó$Ù©nÔ=€K�Ó=Ø%)€O�X˜c‘]Ó)Ù"±>ÔBÐ�dÓBÙ#(¹Ô#H€L�$�s˜C�x‘.ÔHrJ   r-   r3   .ÚwfÚgroupsÚreturnc                 óª   ‡— d}d}‰dkD  rˆfd„}t        t        | ||«      D � ��cg c]  \  } }}t        d| ||z  |¬«      ‘Œ c}}} «      }|S c c}}} w )zôCreate RepVGG block configuration.

    Args:
        d: Depth (number of blocks) per stage.
        wf: Width factor per stage.
        groups: Number of groups for grouped convolution.

    Returns:
        Tuple of block configurations.
    ©é@   é€   é   é   r   c                 ó(   •— |dz   dz  dk(  r| ‰z  S dS )Nr%   r5   r   rI   )ÚchsÚidxrm   s     €rK   rg   z_rep_vgg_bcfg.<locals>.<lambda>‰   s   ø€ ¸¸a¹À1±}ÈÒ7I c¨V¡m€ Èq€ rJ   Úrep)r2   r3   r4   r7   )ÚtupleÚzipr.   )r3   rl   rm   r4   Ú
group_sizeÚbcfgs     `   rK   Ú_rep_vgg_bcfgr}   z   sa   ø€ ð 	€AØ€JØ�‚zÛPˆ
ÜÔX[Ð\]Ð_`ÐbdÓXe×fÐfÉHÈAÈqÐRT”+ 5¨A°°R±¸JÖGÔfÓg€DØ€Kùô gs   ¦ArI   Ú	se_blocksÚnum_conv_branchesc                 ój  — d}t        d|d   |d   z  «      }|xs dt        | «      z  }g }t        | |||«      D ]v  \  } }}}g }	t        | «      D ]Y  }
||z  }t	        |¬«      }i }|
| |z
  k\  rd|d<   |	t        ddd	|d	|d
œ|¤Žgz  }	|	t        ddd	|dt	        ddd	i|¤Žd
œ|¤Žgz  }	|}Œ[ ||	gz  }Œx |S )a,  Create MobileOne block configuration.

    Args:
        d: Depth (number of blocks) per stage.
        wf: Width factor per stage.
        se_blocks: Number of SE blocks per stage.
        num_conv_branches: Number of conv branches.

    Returns:
        List of block configurations per stage.
    rp   rq   r   )r   )r   Úser:   Úoner%   )r2   r3   r4   r7   r>   Úkernel_sizerI   )ÚminÚlenrz   Úrangerf   r.   )r3   rl   r~   r   r4   Úprev_cr|   Úwr�   ÚscfgÚiÚout_cÚbkÚaks                 rK   Ú_mobileone_bcfgrŽ   Ž   s  € ð" 	€AÜ��Q�q‘T˜B˜q™E‘\Ó"€FØÒ*˜T¤C¨£F™]€IØ€DÜ˜1˜a  YÓ/ò ‰ˆˆ1ˆa�ØˆÜ�q“ò 		ˆAØ˜‘EˆEÜÐ(9Ô:ˆBØˆBØ�A˜‘FŠ{Ø#'��<Ñ Ø”[ÐX e¨q°F¸qÈrÑXÐUWÑXÐYÑYˆDØ”[ð ^Ø˜a 5¨Q¼TÑ=VÈaÐ=VÐSUÑ=Vñ^ØZ\ñ^ð _ñ _ˆDà‰Fð		ð 	��‰‰ðð €KrJ   ÚtypesÚeveryÚfirstc                 ó  — t        | «      dk(  sJ ‚t        |t        «      r%t        t	        |rdn|||dz   «      «      }|s|dz
  g}t        |«       g }t	        |«      D ]"  }||v r| d   n| d   }|t        d|ddœ|¤Žgz  }Œ$ t        |«      S )a\  Interleave 2 block types in stack.

    Args:
        types: Two block type names to interleave.
        d: Total depth of blocks.
        every: Interval for alternating blocks.
        first: Whether to start with alternate block.
        **kwargs: Additional block arguments.

    Returns:
        Tuple of interleaved block configurations.
    r5   r   r%   )r2   r3   rI   )r…   Ú
isinstancerG   Úlistr†   Úsetr.   ry   )r�   r3   r�   r‘   ÚkwargsrM   rŠ   Ú
block_types           rK   Úinterleave_blocksr˜   ³   s¥   € ô& ˆu‹:˜Š?Ðˆ?Ü�%œÔÜ”U¡™1¨5°!°U¸Q±YÓ?Ó@ˆÙØ˜‘U�GˆEÜˆ„JØ€FÜ�1‹Xò @ˆØ!" e¡�U˜1’X°°q±ˆ
Ø”;Ð> J°!Ñ>°vÑ>Ð?Ñ?‰ð@ô �‹=ÐrJ   Ústage_blocks_cfgc           	      óÂ   — t        | t        «      s| f} g }t        | «      D ]6  \  }}|t        |j                  «      D �cg c]  }t        |d¬«      ‘Œ c}z  }Œ8 |S c c}w )zÁExpand block config into individual block instances.

    Args:
        stage_blocks_cfg: Block configuration(s) for a stage.

    Returns:
        List of individual block configurations.
    r%   )r3   )r“   r   Ú	enumerater†   r3   r   )r™   Ú
block_cfgsrŠ   ÚcfgÚ_s        rK   Úexpand_blocks_cfgrŸ   Ó   sh   € ô Ð&¬Ô1Ø,Ð.ÐØ€JÜÐ,Ó-ò @‰ˆˆ3Ø´%¸¿¹³,Ö?¨Q”w˜s aÖ(Ò?Ñ?‰
ð@àÐùò @s   ¿Ar{   Úchannelsc                 ó&   — | sy|| z  dk(  sJ ‚|| z  S )zËCalculate number of groups for grouped convolution.

    Args:
        group_size: Size of each group (1 for depthwise).
        channels: Number of channels.

    Returns:
        Number of groups.
    r%   r   rI   )r{   r    s     rK   Ú
num_groupsr¢   ä   s*   € ñ Øð ˜*Ñ$¨Ò)Ð)Ð)Ø˜:Ñ%Ð%rJ   c                   óú   — e Zd ZU dZeZeej                     e	d<   e
Zeej                     e	d<   ej                  Zeej                     e	d<   dZeeej                        e	d<   dZeeej                        e	d<   y)ÚLayerFnz&Container for layer factory functions.Úconv_norm_actÚnorm_actÚactNÚattnÚ	self_attn)r?   r@   rA   rB   r   r¥   r   rD   rE   rF   r   r¦   ÚReLUr§   r¨   r
   r©   rI   rJ   rK   r¤   r¤   ö   sm   … á0Ø%0€M�4˜Ÿ	™	‘?Ó0Ø .€Hˆd�2—9‘9‰oÓ.ØŸ7™7€Cˆˆb�i‰i‰Ó"Ø&*€Dˆ(�4˜Ÿ	™	‘?Ñ
#Ó*Ø+/€Iˆx˜˜RŸY™Y™Ñ(Ô/rJ   r¤   c                   óˆ   ‡ — e Zd ZdZ	 	 	 	 	 	 ddedededededee   fˆ fd„Zd	e	j                  d
e	j                  fd„Zˆ xZS )ÚDownsampleAvgz[Average pool downsampling module.

    AvgPool Downsampling as in 'D' ResNet variants.
    Úin_chsÚout_chsÚstrideÚdilationÚ	apply_actÚlayersc	                 ó<  •— ||dœ}	t         ‰| �  «        |xs
 t        «       }|dk(  r|nd}
|dkD  s|dkD  r2|
dk(  r|dkD  rt        nt        j
                  } |d|
dd¬«      | _        nt	        j                  «       | _         |j                  ||dfd|i|	¤Ž| _	        y)	aB  Initialize DownsampleAvg.

        Args:
            in_chs: Number of input channels.
            out_chs: Number of output channels.
            stride: Stride for downsampling.
            dilation: Dilation rate.
            apply_act: Whether to apply activation.
            layers: Layer factory functions.
        ©ÚdeviceÚdtyper%   r5   TF)Ú	ceil_modeÚcount_include_padr±   N)
ÚsuperÚ__init__r¤   r   rD   Ú	AvgPool2dÚpoolÚIdentityr¥   Úconv)Úselfr­   r®   r¯   r°   r±   r²   rµ   r¶   ÚddÚ
avg_strideÚavg_pool_fnÚ	__class__s               €rK   rº   zDownsampleAvg.__init__  s�   ø€ ð* ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆØ'¨1š}‘V°!ˆ
Ø�AŠ:˜ AšØ+5¸ª?¸xÈ!º|�-ÔQS×Q]ÑQ]ˆKÙ# A z¸TÐUZÔ[ˆD�IäŸ™›ˆDŒIØ(�F×(Ñ(¨°¸!ÑWÀyÐWÐTVÑWˆ�	rJ   Úxrn   c                 óB   — | j                  | j                  |«      «      S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r¾   r¼   ©r¿   rÄ   s     rK   ÚforwardzDownsampleAvg.forward&  s   € ð �y‰y˜Ÿ™ 1›Ó&Ð&rJ   )r%   r%   FNNN)r?   r@   rA   rB   rG   rk   r
   r¤   rº   ÚtorchÚTensorrÇ   Ú__classcell__©rÃ   s   @rK   r¬   r¬      sƒ   ø„ ñð ØØ#Ø(,ØØñXàðXð ðXð ð	Xð
 ðXð ðXð ˜WÑ%õXð@	'˜Ÿ™ð 	'¨%¯,©,÷ 	'rJ   r¬   Údownsample_typer­   r®   r¯   r°   r²   c                 óÌ   — | dv sJ ‚||k7  s|dk7  s|d   |d   k7  r6| sy| dk(  rt        ||f||d   dœ|¤ŽS  |j                  ||fd||d   dœ|¤ŽS t        j                  «       S )a•  Create shortcut connection for residual blocks.

    Args:
        downsample_type: Type of downsampling ('avg', 'conv1x1', or '').
        in_chs: Input channels.
        out_chs: Output channels.
        stride: Stride for downsampling.
        dilation: Dilation rates.
        layers: Layer factory functions.
        **kwargs: Additional arguments.

    Returns:
        Shortcut module or None.
    )ÚavgrN   r^   r%   r   NrÎ   ©r¯   r°   )rƒ   r¯   r°   )r¬   r¥   rD   r½   )rÌ   r­   r®   r¯   r°   r²   r–   s          rK   Úcreate_shortcutrÐ   2  s”   € ð. Ð4Ñ4Ð4Ð4Ø�Ò˜F ašK¨8°A©;¸(À1¹+Ò+EÙØØ Ò%Ü  ¨Ð`¸È(ÐSTÉ+Ñ`ÐY_Ñ`Ð`à'�6×'Ñ'¨°ÐvÀQÈvÐ`hÐijÑ`kÑvÐouÑvÐvä�{‰{‹}ÐrJ   c                   ó˜   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dee   ded	ed
e	de	de
dedefˆ fd„Zdde	fd„Zd„ Zˆ xZS )Ú
BasicBlockz$ ResNet Basic Block - kxk + kxk
    r­   r®   rƒ   r¯   r°   r{   Úbottle_ratiorO   Ú	attn_lastÚ
linear_outr²   Ú
drop_blockÚdrop_path_ratec                 óÌ  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        ||z  «      }t	        ||«      }t        |||f||d|dœ|¤Ž| _         |j                  |||f||d   dœ|¤Ž| _        |	s|j                  €t        j                  «       n|j                  |«      | _	         |j                  |||f|d   ||ddœ|¤Ž| _        |	r|j                  €t        j                  «       n |j                  |fi |¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |
rt        j                  «       | _        y |j!                  d	¬
«      | _        y )Nr´   F©r¯   r°   r±   r²   r   rÏ   r%   )r°   rm   Ú
drop_layerr±   ç        T©Úinplace)r¹   rº   r¤   r#   r¢   rÐ   Úshortcutr¥   Ú	conv1_kxkr¨   rD   r½   Ú	conv2_kxkrÔ   r   Ú	drop_pathr§   )r¿   r­   r®   rƒ   r¯   r°   r{   rÓ   rO   rÔ   rÕ   r²   rÖ   r×   rµ   r¶   rÀ   Úmid_chsrm   rÃ   s                      €rK   rº   zBasicBlock.__init__Y  sq  ø€ ð$ ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ  ¨<Ñ!7Ó8ˆÜ˜J¨Ó0ˆä'ØØØð	
ð ØØØñ	
ð ñ	
ˆŒð .˜×-Ñ-¨f°g¸{ÐvÐSYÐdlÐmnÑdoÑvÐsuÑvˆŒÙ%.°&·+±+Ð2E”B—K‘K”MÈ6Ï;É;ÐW^ÓK_ˆŒ	Ø-˜×-Ñ-ØØØð	
ð ˜a‘[ØØ!Øñ	
ð ñ	
ˆŒñ /8¸6¿;¹;Ð;NœŸ™œÐT_ÐTZ×T_ÑT_Ð`gÑTnÐkmÑTnˆŒØ5CÀbÒ5Hœ .Ô1ÌbÏkÉkËmˆŒÙ$.”2—;‘;“=ˆ�°F·J±JÀt°JÓ4Lˆ�rJ   rX   c                 óP  — |rj| j                   �^t        | j                  j                  dd «      �=t        j
                  j                  | j                  j                  j                  «       | j                  | j                  fD ]  }t        |d«      sŒ|j                  «        Œ! y ©NÚweightÚreset_parameters©rÞ   Úgetattrrà   ÚbnrD   ÚinitÚzeros_rå   r¨   rÔ   Úhasattrræ   ©r¿   rX   r¨   s      rK   Úinit_weightszBasicBlock.init_weightsŒ  ó{   € Ù˜dŸm™mÐ7¼GÀDÇNÁN×DUÑDUÐW_ÐaeÓ<fÐ<rÜ�G‰G�N‰N˜4Ÿ>™>×,Ñ,×3Ñ3Ô4Ø—Y‘Y §¡Ð/ò 	(ˆDÜ�tÐ/Õ0Ø×%Ñ%Õ'ñ	(rJ   c                 ó  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j
                  �|| j                  |«      z   }| j                  |«      S rd   )rß   r¨   rà   rÔ   rá   rÞ   r§   ©r¿   rÄ   rÞ   s      rK   rÇ   zBasicBlock.forward“  ów   € ØˆØ�N‰N˜1ÓˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�=‰=Ð$Ø�D—M‘M (Ó+Ñ+ˆAØ�x‰x˜‹{ÐrJ   )é   r%   ©r%   r%   Nr8   rÎ   TFNNrÛ   NN©F)r?   r@   rA   rB   rG   r   r
   rH   rC   rk   r¤   r   rº   rî   rÇ   rÊ   rË   s   @rK   rÒ   rÒ   U  sâ   ø„ ñð  !ØØ(.Ø(,Ø"%Ø#Ø"Ø$Ø"Ø#'Ø$&ØØñ!1Màð1Mð ð1Mð ð	1Mð
 ð1Mð ˜C ˜H‘oð1Mð ! ™ð1Mð  ð1Mð ð1Mð ð1Mð ð1Mð ð1Mð !ð1Mð "õ1Mñf(¨4ó (ö	rJ   rÒ   c                   ó¤   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dedee   d	ed
e	de	de	de	de
dedefˆ fd„Zdde	fd„Zd„ Zˆ xZS )ÚBottleneckBlockz4 ResNet-like Bottleneck Block - 1x1 - kxk - 1x1
    r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rÔ   rÕ   Ú
extra_convÚ	bottle_inr²   rÖ   r×   c                 ó|  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        |r|n||z  «      }t	        ||«      }t        |||f||d|dœ|¤Ž| _         |j                  ||dfi |¤Ž| _         |j                  |||f||d   ||dœ|¤Ž| _	        |r! |j                  |||f|d   |dœ|¤Ž| _
        nt        j                  «       | _
        |	s|j                  €t        j                  «       n |j                  |fi |¤Ž| _         |j                  ||dfddi|¤Ž| _        |	r|j                  €t        j                  «       n |j                  |fi |¤Ž| _        |d	kD  rt!        |«      nt        j                  «       | _        |
rt        j                  «       | _        y |j%                  d
¬«      | _        y )Nr´   FrÙ   r%   r   ©r¯   r°   rm   rÚ   )r°   rm   r±   rÛ   TrÜ   )r¹   rº   r¤   r#   r¢   rÐ   rÞ   r¥   Ú	conv1_1x1rà   Ú
conv2b_kxkrD   r½   r¨   Ú	conv3_1x1rÔ   r   rá   r§   )r¿   r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rÔ   rÕ   rø   rù   r²   rÖ   r×   rµ   r¶   rÀ   râ   rm   rÃ   s                        €rK   rº   zBottleneckBlock.__init__£  sÚ  ø€ ð( ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ ©I¡&¸7ÀlÑ!RÓSˆÜ˜J¨Ó0ˆä'ØØØð	
ð ØØØñ	
ð ñ	
ˆŒð .˜×-Ñ-¨f°g¸qÑGÀBÑGˆŒØ-˜×-Ñ-ØØØð	
ð Ø˜a‘[ØØ!ñ	
ð ñ	
ˆŒñ Ø2˜f×2Ñ2ØØØðð " !™Øñð ñˆD�Oô !Ÿk™k›mˆDŒOÙ%.°&·+±+Ð2E”B—K‘K”MÈ;È6Ï;É;ÐW^ÑKeÐbdÑKeˆŒ	Ø-˜×-Ñ-¨g°wÀÑYÈUÐYÐVXÑYˆŒÙ.7¸6¿;¹;Ð;NœŸ™œÐT_ÐTZ×T_ÑT_Ð`gÑTnÐkmÑTnˆŒØ5CÀbÒ5Hœ .Ô1ÌbÏkÉkËmˆŒÙ$.”2—;‘;“=ˆ�°F·J±JÀt°JÓ4Lˆ�rJ   rX   c                 óP  — |rj| j                   �^t        | j                  j                  dd «      �=t        j
                  j                  | j                  j                  j                  «       | j                  | j                  fD ]  }t        |d«      sŒ|j                  «        Œ! y rä   )rÞ   rè   rþ   ré   rD   rê   rë   rå   r¨   rÔ   rì   ræ   rí   s      rK   rî   zBottleneckBlock.init_weightsä  rï   rJ   c                 óV  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  �|| j                  |«      z   }| j                  |«      S rd   )	rü   rà   rý   r¨   rþ   rÔ   rá   rÞ   r§   rñ   s      rK   rÇ   zBottleneckBlock.forwardë  s“   € ØˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�O‰O˜AÓˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�=‰=Ð$Ø�D—M‘M (Ó+Ñ+ˆAØ�x‰x˜‹{ÐrJ   )ró   r%   rô   r8   NrÎ   FFFFNNrÛ   NNrõ   ©r?   r@   rA   rB   rG   r   rH   r
   rC   rk   r¤   r   rº   rî   rÇ   rÊ   rË   s   @rK   r÷   r÷   Ÿ  sþ   ø„ ñð  !ØØ(.Ø"$Ø(,Ø#Ø#Ø$Ø$Ø#Ø"Ø#'Ø$&ØØñ%?Màð?Mð ð?Mð ð	?Mð
 ð?Mð ˜C ˜H‘oð?Mð  ð?Mð ! ™ð?Mð ð?Mð ð?Mð ð?Mð ð?Mð ð?Mð ð?Mð !ð?Mð  "õ!?MñB(¨4ó (örJ   r÷   c                   ó˜   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dedee   d	ed
e	de	de
dedefˆ fd„Zdde	fd„Zd„ Zˆ xZS )Ú	DarkBlocka
   DarkNet-like (1x1 + 3x3 w/ stride) block

    The GE-Net impl included a 1x1 + 3x3 block in their search space. It was not used in the feature models.
    This block is pretty much a DarkNet block (also DenseNet) hence the name. Neither DarkNet or DenseNet
    uses strides within the block (external 3x3 or maxpool downsampling is done in front of the block repeats).

    If one does want to use a lot of these blocks w/ stride, I'd recommend using the EdgeBlock (3x3 /w stride + 1x1)
    for more optimal compute.
    r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rÔ   rÕ   r²   rÖ   r×   c           	      óÆ  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        ||z  «      }t	        ||«      }t        |||f||d|dœ|¤Ž| _         |j                  ||dfi |¤Ž| _        |	s|j                  €t        j                  «       n |j                  |fi |¤Ž| _	         |j                  |||f||d   ||ddœ|¤Ž| _        |	r|j                  €t        j                  «       n |j                  |fi |¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |
rt        j                  «       | _        y |j!                  d¬	«      | _        y )
Nr´   FrÙ   r%   r   ©r¯   r°   rm   rÚ   r±   rÛ   TrÜ   )r¹   rº   r¤   r#   r¢   rÐ   rÞ   r¥   rü   r¨   rD   r½   rà   rÔ   r   rá   r§   ©r¿   r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rÔ   rÕ   r²   rÖ   r×   rµ   r¶   rÀ   râ   rm   rÃ   s                      €rK   rº   zDarkBlock.__init__  sl  ø€ ð$ ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ  ¨<Ñ!7Ó8ˆÜ˜J¨Ó0ˆä'ØØØð	
ð ØØØñ	
ð ñ	
ˆŒð .˜×-Ñ-¨f°g¸qÑGÀBÑGˆŒÙ%.°&·+±+Ð2E”B—K‘K”MÈ;È6Ï;É;ÐW^ÑKeÐbdÑKeˆŒ	Ø-˜×-Ñ-ØØØð

ð Ø˜a‘[ØØ!Øñ

ð ñ

ˆŒñ /8¸6¿;¹;Ð;NœŸ™œÐT_ÐTZ×T_ÑT_Ð`gÑTnÐkmÑTnˆŒØ5CÀbÒ5Hœ .Ô1ÌbÏkÉkËmˆŒÙ$.”2—;‘;“=ˆ�°F·J±JÀt°JÓ4Lˆ�rJ   rX   c                 óP  — |rj| j                   �^t        | j                  j                  dd «      �=t        j
                  j                  | j                  j                  j                  «       | j                  | j                  fD ]  }t        |d«      sŒ|j                  «        Œ! y rä   rç   rí   s      rK   rî   zDarkBlock.init_weights8  rï   rJ   c                 ó  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j
                  �|| j                  |«      z   }| j                  |«      S rd   )rü   r¨   rà   rÔ   rá   rÞ   r§   rñ   s      rK   rÇ   zDarkBlock.forward?  rò   rJ   )ró   r%   rô   r8   NrÎ   TFNNrÛ   NNrõ   r  rË   s   @rK   r  r  ù  sâ   ø„ ñð  !ØØ(.Ø"%Ø(,Ø#Ø"Ø$Ø"Ø#'Ø$&ØØñ!2Màð2Mð ð2Mð ð	2Mð
 ð2Mð ˜C ˜H‘oð2Mð  ð2Mð ! ™ð2Mð ð2Mð ð2Mð ð2Mð ð2Mð !ð2Mð "õ2Mñh(¨4ó (ö	rJ   r  c                   ó˜   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dedee   d	ed
e	de	de
dedefˆ fd„Zdde	fd„Zd„ Zˆ xZS )Ú	EdgeBlocka§   EdgeResidual-like (3x3 + 1x1) block

    A two layer block like DarkBlock, but with the order of the 3x3 and 1x1 convs reversed.
    Very similar to the EfficientNet Edge-Residual block but this block it ends with activations, is
    intended to be used with either expansion or bottleneck contraction, and can use DW/group/non-grouped convs.

    FIXME is there a more common 3x3 + 1x1 conv block to name this after?
    r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rÔ   rÕ   r²   rÖ   r×   c                 óÈ  •— ||dœ}t         ‰| �  «        |xs
 t        «       }t        ||z  «      }t	        ||«      }t        |||f||d|dœ|¤Ž| _         |j                  |||f||d   ||dœ|¤Ž| _        |	s|j                  €t        j                  «       n |j                  |fi |¤Ž| _	         |j                  ||dfddi|¤Ž| _        |	r|j                  €t        j                  «       n |j                  |fi |¤Ž| _        |dkD  rt        |«      nt        j                  «       | _        |
rt        j                  «       | _        y |j!                  d	¬
«      | _        y )Nr´   FrÙ   r   rû   r%   r±   rÛ   TrÜ   )r¹   rº   r¤   r#   r¢   rÐ   rÞ   r¥   rß   r¨   rD   r½   Ú	conv2_1x1rÔ   r   rá   r§   r  s                      €rK   rº   zEdgeBlock.__init__U  so  ø€ ð$ ¨Ñ/ˆÜ‰ÑÔØÒ$œ7›9ˆÜ  ¨<Ñ!7Ó8ˆÜ˜J¨Ó0ˆä'ØØØð	
ð ØØØñ	
ð ñ	
ˆŒð .˜×-Ñ-ØØØð	
ð Ø˜a‘[ØØ!ñ	
ð ñ	
ˆŒñ &/°&·+±+Ð2E”B—K‘K”MÈ;È6Ï;É;ÐW^ÑKeÐbdÑKeˆŒ	Ø-˜×-Ñ-¨g°wÀÑYÈUÐYÐVXÑYˆŒÙ.7¸6¿;¹;Ð;NœŸ™œÐT_ÐTZ×T_ÑT_Ð`gÑTnÐkmÑTnˆŒØ5CÀbÒ5Hœ .Ô1ÌbÏkÉkËmˆŒÙ$.”2—;‘;“=ˆ�°F·J±JÀt°JÓ4Lˆ�rJ   rX   c                 óP  — |rj| j                   �^t        | j                  j                  dd «      �=t        j
                  j                  | j                  j                  j                  «       | j                  | j                  fD ]  }t        |d«      sŒ|j                  «        Œ! y rä   )rÞ   rè   r  ré   rD   rê   rë   rå   r¨   rÔ   rì   ræ   rí   s      rK   rî   zEdgeBlock.init_weights‡  rï   rJ   c                 ó  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j
                  �|| j                  |«      z   }| j                  |«      S rd   )rß   r¨   r  rÔ   rá   rÞ   r§   rñ   s      rK   rÇ   zEdgeBlock.forwardŽ  rò   rJ   )ró   r%   rô   r8   NrÎ   FFNNrÛ   NNrõ   r  rË   s   @rK   r
  r
  K  sâ   ø„ ñð  !ØØ(.Ø"%Ø(,Ø#Ø#Ø$Ø"Ø#'Ø$&ØØñ!0Màð0Mð ð0Mð ð	0Mð
 ð0Mð ˜C ˜H‘oð0Mð  ð0Mð ! ™ð0Mð ð0Mð ð0Mð ð0Mð ð0Mð !ð0Mð "õ0Mñd(¨4ó (ö	rJ   r
  c                   ó  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dedee   d	ed
e	de
dedefˆ fd„Zddefd„Zd„ Zd„ Zdeej"                  ej"                  f   fd„Zdeej"                  ej"                  f   fd„Zˆ xZS )ÚRepVggBlockzQ RepVGG Block.

    Adapted from impl at https://github.com/DingXiaoH/RepVGG
    r­   r®   rƒ   r¯   r°   rÓ   r{   rO   r²   rÖ   r×   Úinference_modec                 óª  •— ||dœ}t         ‰| �  «        t        ||«      x| _        }|	xs
 t	        «       }	|r#t        j                  d||||||ddœ|¤Ž| _        nªd | _        ||k(  xr |dk(  xr |d   |d   k(  }|r |	j                  |fddi|¤Žnd | _	         |	j                  |||f||d   ||
ddœ|¤Ž| _         |	j                  ||df||dd	œ|¤Ž| _        |d
kD  r|rt        |«      nt        j                  «       | _        |	j                   €t        j                  «       n |	j                   |fi |¤Ž| _        |	j#                  d¬«      | _        y )Nr´   T©Úin_channelsÚout_channelsrƒ   r¯   r°   rm   Úbiasr%   r   r±   Fr  )r¯   rm   r±   rÛ   rÜ   rI   )r¹   rº   r¢   rm   r¤   rD   ÚConv2dÚreparam_convr¦   Úidentityr¥   Úconv_kxkÚconv_1x1r   r½   rá   r¨   r§   )r¿   r­   r®   rƒ   r¯   r°   rÓ   r{   rO   r²   rÖ   r×   r  rµ   r¶   rÀ   rm   Ú	use_identrÃ   s                     €rK   rº   zRepVggBlock.__init__   sœ  ø€ ð" ¨Ñ/ˆÜ‰ÑÔÜ)¨*°fÓ=Ð=ˆŒ�fØÒ$œ7›9ˆáÜ "§	¡	ð 	!Ø"Ø$Ø'ØØ!ØØñ	!ð ñ	!ˆDÕð !%ˆDÔØ 'Ñ)ÒX¨f¸©kÒX¸hÀq¹kÈXÐVWÉ[Ñ>XˆIÙOX˜O˜FŸO™O¨GÑK¸uÐKÈÒKÐ^bˆDŒMØ0˜F×0Ñ0ØØØð
ð Ø! !™ØØ%Øñ
ð ñ
ˆDŒMð 1˜F×0Ñ0ØØØðð ØØñð ñˆDŒMð :HÈ"Ò9LÑQZœX nÔ5Ô`b×`kÑ`kÓ`mˆDŒNà%+§[¡[Ð%8”B—K‘K”M¸k¸f¿k¹kÈ'Ñ>XÐUWÑ>XˆŒ	Ø—:‘: d�:Ó+ˆ�rJ   rX   c                 ór  — | j                  «       D ]s  }t        |t        j                  «      sŒt        j                  j                  |j                  dd«       t        j                  j                  |j                  dd«       Œu t        | j                  d«      r| j                  j                  «        y y )Ngš™™™™™¹?r   ræ   )Úmodulesr“   rD   ÚBatchNorm2drê   Únormal_rå   r  rì   r¨   ræ   )r¿   rX   Úms      rK   rî   zRepVggBlock.init_weightsÞ  s{   € à—‘“ò 	/ˆAÜ˜!œRŸ^™^Õ,Ü—‘—‘ §¡¨"¨bÔ1Ü—‘—‘ §¡¨¨2Õ.ð	/ô �4—9‘9Ð0Ô1Ø�I‰I×&Ñ&Õ(ð 2rJ   c                 ó°  — | j                   �/| j                  | j                  | j                  |«      «      «      S | j                  €$| j	                  |«      | j                  |«      z   }nJ| j                  |«      }| j	                  |«      | j                  |«      z   }| j                  |«      }||z  }| j                  |«      }| j                  |«      S rd   )r  r§   r¨   r  r  r  rá   )r¿   rÄ   r  s      rK   rÇ   zRepVggBlock.forwardç  s³   € Ø×ÑÐ(Ø—8‘8˜DŸI™I d×&7Ñ&7¸Ó&:Ó;Ó<Ð<à�=‰=Ð Ø—‘˜aÓ  4§=¡=°Ó#3Ñ3‰Aà—}‘} QÓ'ˆHØ—‘˜aÓ  4§=¡=°Ó#3Ñ3ˆAØ—‘˜qÓ!ˆAØ�‰MˆAØ�I‰I�a‹LˆØ�x‰x˜‹{ÐrJ   c           
      óz  — | j                   �y| j                  «       \  }}t        j                  | j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  d¬«      | _         || j                   j                  _        || j                   j                  _        | j!                  «       D ]  \  }}d|v rŒ|j#                  «        Œ | j%                  d«       | j%                  d«       | j%                  d«       | j%                  d«       y)	á   Following works like `RepVGG: Making VGG-style ConvNets Great Again` -
        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched
        architecture used at training time to obtain a plain CNN-like structure
        for inference.
        NT©r  r  rƒ   r¯   Úpaddingr°   rm   r  r  r  r  r  rá   ©r  Ú_get_kernel_biasrD   r  r  r¾   r  r  rƒ   r¯   r&  r°   rm   rå   Údatar  Únamed_parametersÚdetach_Ú__delattr__©r¿   Úkernelr  ÚnameÚparas        rK   ÚreparameterizezRepVggBlock.reparameterizeõ  sT  € ð ×ÑÐ(Øà×,Ñ,Ó.‰ˆ�ÜŸI™IØŸ™×*Ñ*×6Ñ6ØŸ™×+Ñ+×8Ñ8ØŸ™×*Ñ*×6Ñ6Ø—=‘=×%Ñ%×,Ñ,Ø—M‘M×&Ñ&×.Ñ.Ø—]‘]×'Ñ'×0Ñ0Ø—=‘=×%Ñ%×,Ñ,Øô	
ˆÔð )/ˆ×Ñ× Ñ Ô%Ø&*ˆ×Ñ×ÑÔ#ð ×/Ñ/Ó1ò 	‰JˆD�$Ø Ñ%ØØ�L‰L�Nð	ð 	×Ñ˜Ô$Ø×Ñ˜Ô$Ø×Ñ˜Ô$Ø×Ñ˜Õ%rJ   rn   c                 óÆ  — d}d}| j                   �r| j                  | j                   «      \  }}| j                  j                  j                  d   dz  }t
        j                  j                  j                  |||||g«      }d}d}| j                  �| j                  | j                  «      \  }}| j                  | j                  «      \  }}||z   |z   }||z   |z   }	||	fS ©z‹ Method to obtain re-parameterized kernel and bias.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L83
        r   r5   )
r  Ú_fuse_bn_tensorr  r¾   rƒ   rÈ   rD   Ú
functionalÚpadr  )
r¿   Ú
kernel_1x1Úbias_1x1r6  Úkernel_identityÚbias_identityÚkernel_convÚ	bias_convÚkernel_finalÚ
bias_finals
             rK   r(  zRepVggBlock._get_kernel_bias  sè   € ð
 ˆ
ØˆØ�=‰=Ð$Ø#'×#7Ñ#7¸¿¹Ó#FÑ ˆJ˜à—-‘-×$Ñ$×0Ñ0°Ñ3°qÑ8ˆCÜŸ™×,Ñ,×0Ñ0°¸cÀ3ÈÈSÐ=QÓRˆJð ˆØˆØ�=‰=Ð$Ø-1×-AÑ-AÀ$Ç-Á-Ó-PÑ*ˆO˜]ð "&×!5Ñ!5°d·m±mÓ!DÑˆ�Yà" ZÑ/°/ÑAˆØ Ñ)¨MÑ9ˆ
Ø˜ZÐ'Ð'rJ   c                 óä  — t        |t        «      r†|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }�n!t        |t        j                  «      sJ ‚t        | d«      s±| j                  j                  j                  }|| j                  z  }	| j                  j                  j                  }
t!        j"                  | j                  j                  j                  «      }t%        |«      D ]  }d||||	z  |
d   dz  |
d   dz  f<   Œ || _        | j&                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j)                  «       }||z  j+                  dddd«      }||z  |||z  |z  z
  fS )ú’ Method to fuse batchnorm layer with preceding conv layer.
        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L95
        Ú	id_tensorr%   r   r5   éÿÿÿÿ©r“   r   r¾   rå   ré   Úrunning_meanÚrunning_varr  ÚepsrD   r  rì   r  r  rm   rƒ   rÈ   Ú
zeros_liker†   rA  ÚsqrtÚreshape©r¿   Úbranchr.  rD  rE  ÚgammaÚbetarF  r­   Ú	input_dimrƒ   Úkernel_valuerŠ   ÚstdÚts                  rK   r4  zRepVggBlock._fuse_bn_tensor0  s¦  € ô �fœkÔ*Ø—[‘[×'Ñ'ˆFØ!Ÿ9™9×1Ñ1ˆLØ Ÿ)™)×/Ñ/ˆKØ—I‘I×$Ñ$ˆEØ—9‘9—>‘>ˆDØ—)‘)—-‘-ŠCä˜f¤b§n¡nÔ5Ð5Ð5Ü˜4 Ô-ØŸ™×+Ñ+×7Ñ7�Ø" d§k¡kÑ1�	Ø"Ÿm™m×0Ñ0×<Ñ<�Ü$×/Ñ/°·±×0BÑ0B×0IÑ0IÓJ�Ü˜v›ò a�AØ_`�L  A¨	¡M°;¸q±>ÀQÑ3FÈÐTUÉÐZ[ÑH[Ð![Ò\ðaà!-�”Ø—^‘^ˆFØ!×.Ñ.ˆLØ ×,Ñ,ˆKØ—M‘MˆEØ—;‘;ˆDØ—*‘*ˆCØ˜SÑ ×&Ñ&Ó(ˆØ�S‰[×!Ñ! " a¨¨AÓ.ˆØ˜‰z˜4 ,°Ñ"6¸Ñ"<Ñ<Ð<Ð<rJ   )ró   r%   rô   r8   Nr^   NNrÛ   FNNrõ   )r?   r@   rA   rB   rG   r   rH   r
   rC   r¤   r   rk   rº   rî   rÇ   r1  rÈ   rÉ   r(  r4  rÊ   rË   s   @rK   r  r  š  s	  ø„ ñð  !ØØ(.Ø"%Ø(,Ø Ø"Ø#'Ø$&Ø#(ØØñ<,àð<,ð ð<,ð ð	<,ð
 ð<,ð ˜C ˜H‘oð<,ð  ð<,ð ! ™ð<,ð ð<,ð ð<,ð !ð<,ð "ð<,ð !õ<,ñ|)¨4ó )òò&ðB( %¨¯©°e·l±lÐ(BÑ"Có (ð4=¨¨u¯|©|¸U¿\¹\Ð/IÑ)J÷ =rJ   r  c                   óB  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   ded	ee   d
ede	dede
dededdfˆ fd„Zdej                  dej                  fd„Zd„ Zdeej                  ej                  f   fd„Zdeej                  ej                  f   fd„Zˆ xZS )ÚMobileOneBlocka8   MobileOne building block.

        This block has a multi-branched architecture at train-time
        and plain-CNN style architecture at inference time
        For more details, please refer to our paper:
        `An Improved One millisecond Mobile Backbone` -
        https://arxiv.org/pdf/2206.04040.pdf
    Nr­   r®   rƒ   r¯   r°   rÓ   r{   rO   r  r   r²   rÖ   r×   rn   c                 óF  •— ||dœ}t         ‰| �  «        |
| _        t        ||«      x| _        }|xs
 t        «       }|	r#t        j                  d||||||ddœ|¤Ž| _        nñd| _        ||k(  xr |dk(  xr |d   |d   k(  }|r |j                  |fddi|¤Žnd| _
        g }t        | j                  «      D ]*  }|j                   |j                  ||f|||dd	œ|¤Ž«       Œ, t        j                  |«      | _        d| _        |dkD  r |j                  ||fd||dd	œ|¤Ž| _        |d
kD  r|rt#        |«      nt        j$                  «       | _        |j(                  €t        j$                  «       n |j(                  |fi |¤Ž| _        |j+                  d¬«      | _        y)z, Construct a MobileOneBlock module.
        r´   Tr  Nr%   r   r±   F)rƒ   r¯   rm   r±   rÛ   rÜ   rI   )r¹   rº   r   r¢   rm   r¤   rD   r  r  r¦   r  r†   Úappendr¥   Ú
ModuleListr  Ú
conv_scaler   r½   rá   r¨   r§   )r¿   r­   r®   rƒ   r¯   r°   rÓ   r{   rO   r  r   r²   rÖ   r×   rµ   r¶   rÀ   rm   r  Úconvsrž   rÃ   s                        €rK   rº   zMobileOneBlock.__init__Z  så  ø€ ð( ¨Ñ/ˆÜ‰ÑÔØ!2ˆÔÜ)¨*°fÓ=Ð=ˆŒ�fØÒ$œ7›9ˆáÜ "§	¡	ð 	!Ø"Ø$Ø'ØØ!ØØñ	!ð ñ	!ˆDÕð !%ˆDÔð  'Ñ)ÒX¨f¸©kÒX¸hÀq¹kÈXÐVWÉ[Ñ>XˆIÙOX˜O˜FŸO™O¨GÑK¸uÐKÈÒKÐ^bˆDŒMð ˆEÜ˜4×1Ñ1Ó2ò 	�Ø—‘Ð1˜V×1Ñ1ØØðð !,Ø!Ø!Ø#ñð ñõ ð	ô ŸM™M¨%Ó0ˆDŒMð #ˆDŒOØ˜QŠØ"6 &×"6Ñ"6ØØð#ð !"Ø!Ø!Ø#ñ#ð ñ#�”ð :HÈ"Ò9LÑQZœX nÔ5Ô`b×`kÑ`kÓ`mˆDŒNà%+§[¡[Ð%8”B—K‘K”M¸k¸f¿k¹kÈ'Ñ>XÐUWÑ>XˆŒ	Ø—:‘: d�:Ó+ˆ�rJ   rÄ   c                 óœ  — | j                   �/| j                  | j                  | j                  |«      «      «      S d}| j                  �| j                  |«      }d}| j                  �| j	                  |«      }|}| j
                  D ]  }| ||«      z  }Œ | j                  |«      }||z  }| j                  | j                  |«      «      S )z Apply forward pass. r   )r  r§   r¨   r  rW  r  rá   )r¿   rÄ   Úidentity_outÚ	scale_outÚoutÚcks         rK   rÇ   zMobileOneBlock.forward¥  sÇ   € ð ×ÑÐ(Ø—8‘8˜DŸI™I d×&7Ñ&7¸Ó&:Ó;Ó<Ð<ð ˆØ�=‰=Ð$ØŸ=™=¨Ó+ˆLð ˆ	Ø�?‰?Ð&ØŸ™¨Ó*ˆIð ˆØ—-‘-ò 	ˆBØ‘2�a“5‰L‰Cð	à�n‰n˜SÓ!ˆØˆ|Ñˆà�x‰x˜Ÿ	™	 #›Ó'Ð'rJ   c           
      ó¤  — | j                   �y| j                  «       \  }}t        j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  d¬«      | _         || j                   j                  _        || j                   j                  _        | j!                  «       D ]  \  }}d|v rŒ|j#                  «        Œ | j%                  d«       | j%                  d«       | j%                  d«       | j%                  d	«       y)
r$  Nr   Tr%  r  r  rW  r  rá   r'  r-  s        rK   r1  zMobileOneBlock.reparameterize¿  sw  € ð ×ÑÐ(Øà×,Ñ,Ó.‰ˆ�ÜŸI™IØŸ™ aÑ(×-Ñ-×9Ñ9ØŸ™ qÑ)×.Ñ.×;Ñ;ØŸ™ aÑ(×-Ñ-×9Ñ9Ø—=‘= Ñ#×(Ñ(×/Ñ/Ø—M‘M !Ñ$×)Ñ)×1Ñ1Ø—]‘] 1Ñ%×*Ñ*×3Ñ3Ø—=‘= Ñ#×(Ñ(×/Ñ/ØôˆÔð )/ˆ×Ñ× Ñ Ô%Ø&*ˆ×Ñ×ÑÔ#ð ×/Ñ/Ó1ò 	‰JˆD�$Ø Ñ%ØØ�L‰L�Nð	ð 	×Ñ˜Ô$Ø×Ñ˜Ô&Ø×Ñ˜Ô$Ø×Ñ˜Õ%rJ   c                 ó"  — d}d}| j                   �u| j                  | j                   «      \  }}| j                  d   j                  j                  d   dz  }t
        j                  j                  j                  |||||g«      }d}d}| j                  �| j                  | j                  «      \  }}d}d}t        | j                  «      D ]-  }| j                  | j                  |   «      \  }	}
||	z  }||
z  }Œ/ ||z   |z   }||z   |z   }||fS r3  )rW  r4  r  r¾   rƒ   rÈ   rD   r5  r6  r  r†   r   )r¿   Úkernel_scaleÚ
bias_scaler6  r9  r:  r;  r<  ÚixÚ_kernelÚ_biasr=  r>  s                rK   r(  zMobileOneBlock._get_kernel_biasß  s,  € ð
 ˆØˆ
Ø�?‰?Ð&Ø'+×';Ñ';¸D¿O¹OÓ'LÑ$ˆL˜*à—-‘- Ñ"×'Ñ'×3Ñ3°AÑ6¸!Ñ;ˆCÜ Ÿ8™8×.Ñ.×2Ñ2°<À#ÀsÈCÐQTÐAUÓVˆLð ˆØˆØ�=‰=Ð$Ø-1×-AÑ-AÀ$Ç-Á-Ó-PÑ*ˆO˜]ð ˆØˆ	Ü˜×.Ñ.Ó/ò 	ˆBØ!×1Ñ1°$·-±-ÀÑ2CÓD‰NˆG�UØ˜7Ñ"ˆKØ˜Ñ‰Ið	ð
 # \Ñ1°OÑCˆØ Ñ+¨mÑ;ˆ
Ø˜ZÐ'Ð'rJ   c                 óö  — t        |t        «      r†|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }�n*t        |t        j                  «      sJ ‚t        | d«      sº| j                  d   j                  j                  }|| j                  z  }	| j                  d   j                  j                  }
t!        j"                  | j                  d   j                  j                  «      }t%        |«      D ]  }d||||	z  |
d   dz  |
d   dz  f<   Œ || _        | j&                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j)                  «       }||z  j+                  dddd«      }||z  |||z  |z  z
  fS )r@  rA  r   r%   r5   rB  rC  rJ  s                  rK   r4  zMobileOneBlock._fuse_bn_tensorþ  sµ  € ô �fœkÔ*Ø—[‘[×'Ñ'ˆFØ!Ÿ9™9×1Ñ1ˆLØ Ÿ)™)×/Ñ/ˆKØ—I‘I×$Ñ$ˆEØ—9‘9—>‘>ˆDØ—)‘)—-‘-ŠCä˜f¤b§n¡nÔ5Ð5Ð5Ü˜4 Ô-ØŸ™ qÑ)×.Ñ.×:Ñ:�Ø" d§k¡kÑ1�	Ø"Ÿm™m¨AÑ.×3Ñ3×?Ñ?�Ü$×/Ñ/°·±¸aÑ0@×0EÑ0E×0LÑ0LÓM�Ü˜v›ò a�AØ_`�L  A¨	¡M°;¸q±>ÀQÑ3FÈÐTUÉÐZ[ÑH[Ð![Ò\ðaà!-�”Ø—^‘^ˆFØ!×.Ñ.ˆLØ ×,Ñ,ˆKØ—M‘MˆEØ—;‘;ˆDØ—*‘*ˆCØ˜SÑ ×&Ñ&Ó(ˆØ�S‰[×!Ñ! " a¨¨AÓ.ˆØ˜‰z˜4 ,°Ñ"6¸Ñ"<Ñ<Ð<Ð<rJ   )ró   r%   rô   r8   Nr^   Fr%   NNrÛ   NN)r?   r@   rA   rB   rG   r   rH   r
   rC   rk   r¤   r   rº   rÈ   rÉ   rÇ   r1  r(  r4  rÊ   rË   s   @rK   rS  rS  P  s9  ø„ ñð  !ØØ(.Ø"%Ø(,Ø Ø#(Ø%&Ø"Ø#'Ø$&ØØñ!I,àðI,ð ðI,ð ð	I,ð
 ðI,ð ˜C ˜H‘oðI,ð  ðI,ð ! ™ðI,ð ðI,ð !ðI,ð  #ðI,ð ðI,ð !ðI,ð "ðI,ð" 
õ#I,ðV(˜Ÿ™ð (¨%¯,©,ó (ò4&ð@( %¨¯©°e·l±lÐ(BÑ"Có (ð>=¨¨u¯|©|¸U¿\¹\Ð/IÑ)J÷ =rJ   rS  c            !       óº   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededeeef   dedee   d	ed
e	de	de	de	deeeef      de
dedef ˆ fd„Zdde	fd„Zd„ Zˆ xZS )ÚSelfAttnBlockzI ResNet-like Bottleneck Block - 1x1 - optional kxk - self attn - 1x1
    r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rø   rÕ   rù   Úpost_attn_naÚ	feat_sizer²   rÖ   r×   c                 óø  •— ||dœ}t         ‰| �  «        |€J ‚t        |r|n||z  «      }t        ||«      }t	        |||f||d|dœ|¤Ž| _         |j                  ||dfi |¤Ž| _        |	r% |j                  |||f||d   ||dœ|¤Ž| _        d}nt        j                  «       | _        |€i nt        |¬«      } |j                  |fd|i|¤|¤Ž| _        |r |j                  |fi |¤Žnt        j                  «       | _         |j                  ||dfd	di|¤Ž| _        |d
kD  rt!        |«      nt        j                  «       | _        |
rt        j                  «       | _        y |j%                  d¬«      | _        y )Nr´   FrÙ   r%   r   rû   )ri  r¯   r±   rÛ   TrÜ   )r¹   rº   r#   r¢   rÐ   rÞ   r¥   rü   rà   rD   r½   rf   r©   r¦   Ú	post_attnrþ   r   rá   r§   )r¿   r­   r®   rƒ   r¯   r°   rÓ   r{   rO   rø   rÕ   rù   rh  ri  r²   rÖ   r×   rµ   r¶   rÀ   râ   rm   Ú
opt_kwargsrÃ   s                          €rK   rº   zSelfAttnBlock.__init__"  sŸ  ø€ ð* ¨Ñ/ˆÜ‰ÑÔØÐ!Ð!Ð!Ü ©I¡&¸7ÀlÑ!RÓSˆÜ˜J¨Ó0ˆä'ØØØð	
ð ØØØñ	
ð ñ	
ˆŒð .˜×-Ñ-¨f°g¸qÑGÀBÑGˆŒÙØ1˜V×1Ñ1ØØØð	ð Ø! !™ØØ%ñ	ð ñ	ˆDŒNð ‰FäŸ[™[›]ˆDŒNØ$Ð,‘R´$ÀÔ2Kˆ
à)˜×)Ñ)¨'ÑU¸&ÐUÀJÐUÐRTÑUˆŒÙ;G˜˜Ÿ™¨Ñ7°BÒ7ÌRÏ[É[Ë]ˆŒØ-˜×-Ñ-¨g°wÀÑYÈUÐYÐVXÑYˆŒØ5CÀbÒ5Hœ .Ô1ÌbÏkÉkËmˆŒÙ$.”2—;‘;“=ˆ�°F·J±JÀt°JÓ4Lˆ�rJ   rX   c                 ó>  — |rj| j                   �^t        | j                  j                  dd «      �=t        j
                  j                  | j                  j                  j                  «       t        | j                  d«      r| j                  j                  «        y y rä   )rÞ   rè   rþ   ré   rD   rê   rë   rå   rì   r©   ræ   )r¿   rX   s     rK   rî   zSelfAttnBlock.init_weights_  sl   € Ù˜dŸm™mÐ7¼GÀDÇNÁN×DUÑDUÐW_ÐaeÓ<fÐ<rÜ�G‰G�N‰N˜4Ÿ>™>×,Ñ,×3Ñ3Ô4Ü�4—>‘>Ð#5Ô6Ø�N‰N×+Ñ+Õ-ð 7rJ   c                 ó4  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  �|| j                  |«      z   }| j                  |«      S rd   )rü   rà   r©   rk  rþ   rá   rÞ   r§   rñ   s      rK   rÇ   zSelfAttnBlock.forwarde  s†   € ØˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�=‰=Ð$Ø�D—M‘M (Ó+Ñ+ˆAØ�x‰x˜‹{ÐrJ   )ró   r%   rô   r8   NrÎ   FFFTNNNrÛ   NNrõ   r  rË   s   @rK   rg  rg    s  ø„ ñð  !ØØ(.Ø"$Ø(,Ø#Ø$Ø$Ø#Ø!%Ø37Ø"Ø#'Ø$&ØØñ';Màð;Mð ð;Mð ð	;Mð
 ð;Mð ˜C ˜H‘oð;Mð  ð;Mð ! ™ð;Mð ð;Mð ð;Mð ð;Mð ð;Mð ð;Mð    c¨3 h¡Ñ0ð;Mð ð;Mð  !ð!;Mð" "õ#;Mñz.¨4ó .ö
rJ   rg  )ÚbasicÚbottleÚdarkÚedgerx   r‚   r©   r—   Úblock_fnc                 ó   — |t         | <   y rd   )Ú_block_registry)r—   rs  s     rK   Úregister_blockrv  }  s   € Ø"*„O�JÒrJ   Úblockc                 ó’   — t        | t        j                  t        f«      r | di |¤ŽS | t        v s
J d| › �«       ‚t	        |    di |¤ŽS )NzUnknown block type (rI   )r“   rD   rE   r   ru  )rw  r–   s     rK   r0   r0   �  sO   € Ü�%œ"Ÿ)™)¤WÐ-Ô.Ù‰�v‰ÐØ”OÑ#ÐCÐ';¸E¸7Ð%CÓCÐ#Ü˜5Ñ!Ñ+ FÑ+Ð+rJ   c                   ó¾   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 ddedeeee   eedf   f   dededededee   d	e	d
e
fˆ fd„Zdeej                  eej                     f   fd„Zˆ xZS )ÚStemr­   r®   .rƒ   r¯   r¼   Únum_repÚnum_actÚ	chs_decayr²   c           
      ó.  •— |
|dœ}t         ‰| �  «        |dv sJ ‚|	xs
 t        «       }	t        |t        t
        f«      rt        |«      }|}n.t        |«      D �cg c]  }t        |||z  z  «      ‘Œ c}d d d…   }|| _	        g | _
        d}dgdg|dz
  z  z   }|dk(  r|sd|d<   |€|n|}dg||z
  z  d	g|z  z   }|}d}d}t        t        |||«      «      D ]‚  \  }\  }}}|r|	j                  nt        }d
|dz   › �}|dkD  r2|dkD  r-|dz
  }| j                  j                  t!        |||d¬«      «       | j#                  | |||f||dœ|¤Ž«       |}||z  }|}Œ„ |r÷|j%                  «       }|dv sJ ‚}| j                  j                  t!        |||d¬«      «       |dk(  r&| j#                  dt'        j(                  d«      «       n…|dk(  r&| j#                  dt'        j*                  d«      «       nZd|v r)| j#                  dt'        j(                  ddd¬«      «       n-d|v r)| j#                  dt'        j*                  dddd¬«      «       |dz  }d}|dk\  r|nd | _        | j                  j                  t!        |||d¬«      «       ||k(  sJ ‚y c c}w )Nr´   )r5   é   rB  r^   r5   r%   r  FTr¾   r   ©Únum_chsÚ	reductionÚmoduleÚstage)rƒ   r¯   )ÚmaxrR   rÎ   ÚavgpoolÚmax2Úavg2r‡  r¼   rˆ  r…  ró   )rƒ   r¯   r&  rÎ   )rƒ   r¯   r&  r¸   )r¹   rº   r¤   r“   r”   ry   r…   r†   Úroundr¯   Úfeature_infor›   rz   r¥   r   rU  rf   Ú
add_moduleÚlowerrD   Ú	MaxPool2dr»   Úlast_feat_idx)r¿   r­   r®   rƒ   r¯   r¼   r{  r|  r}  r²   rµ   r¶   rÀ   rU   rŠ   Ú	prev_featÚstem_stridesÚstem_norm_actsÚprev_chsÚcurr_striderŽ  Úchr6   ÚnaÚlayer_fnÚ	conv_namerÃ   s                             €rK   rº   zStem.__init__Š  sÄ  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ˜ÑÐÐØÒ$œ7›9ˆä�g¤¤e˜}Ô-Ü˜'“lˆGØ‰HäAFÀwÃÖP¸Aœ˜g¨	°Q©Ñ6Õ7ÒPÑQUÐSUÐQUÑVˆHàˆŒØˆÔØˆ	Ø�s˜a˜S G¨a¡KÑ0Ñ0ˆØ�QŠ;™tà ˆL˜Ñà$˜_‘'°'ˆà˜ G¨gÑ$5Ñ6¸$¸À'Ñ9IÑIˆØˆØˆØˆÜ'¬¨H°lÀNÓ(SÓTò 		"‰NˆA‰{��A�rÙ/1�v×+Ò+´}ˆHØ˜q 1™u˜g˜ˆIØ�1Šu˜˜QšØ ! A¡�Ø×!Ñ!×(Ñ(¬°hÈ+Ð^gÐopÔ)qÔrØ�O‰O˜I¡x°¸"Ð'fÈ+Ð^_Ñ'fÐceÑ'fÔgØˆHØ˜1ÑˆKØ!‰Ið		"ñ Ø—:‘:“<ˆDØÐOÑOÐOÐOØˆMØ×Ñ×$Ñ$¤T°(ÀkÐZcÐklÔ%mÔnØ�vŠ~Ø—‘ ¬¯©°Q«Õ8Ø˜’Ø—‘ ¬¯©°Q«Õ8Ø˜$‘Ø—‘ ¬¯©ÀÈ1ÐVWÔ(XÕYØ˜$‘Ø—‘ ¬¯©ÀÈ1ÐVWÐkpÔ(qÔrØ˜1ÑˆKØˆIà.;¸qÒ.@™]ÀdˆÔØ×Ñ× Ñ ¤¨hÀ+ÐV_ÐghÔ!iÔjØ˜fÒ$Ð$Ñ$ùò[ Qs   ÁJrn   c                 ó‚   — d }t        | «      D ],  \  }} ||«      }| j                  €Œ|| j                  k(  sŒ+|}Œ. ||fS rd   )r›   rŽ  )r¿   rÄ   ÚintermediaterŠ   r!  s        rK   Úforward_intermediateszStem.forward_intermediatesÐ  sQ   € Ø/3ˆÜ˜d“Oò 	!‰DˆAˆqÙ�!“ˆAØ×!Ñ!Ñ-°!°t×7IÑ7IÓ2IØ ‘ð	!ð �,ˆÐrJ   )	ró   r  rR   ró   Nç      à?NNN)r?   r@   rA   rG   r   r   r   rC   r
   rH   r¤   rº   rÈ   rÉ   rš  rÊ   rË   s   @rK   rz  rz  ˆ  sÇ   ø„ ð  !ØØ!ØØ%)Ø"Ø"ØØñD%àðD%ð ˜3  S¡	¨5°°c°©?Ð:Ñ;ðD%ð ð	D%ð
 ðD%ð ðD%ð ðD%ð ˜c‘]ðD%ð ðD%ð õD%ðL¨%°·±¸hÀuÇ|Á|Ñ>TÐ0TÑ*U÷ rJ   rz  r^   rQ   Ú	pool_typeÚfeat_prefixc                 ó  — ||dœ}|xs
 t        «       }|dv sJ ‚d|v rd|v rdnd }	t        | |fd|	||dœ|¤Ž}
nèd|v rt        | d	|z  d
z  |dz  |ff||dœ|¤Ž}
nÇd|v rt        | |fd	d||dœ|¤Ž}
n°d|v rt        | |fd|dœ|¤Ž}
n›d|v rt        | |fd	d|dœ|¤Ž}
n…d|v r-|rt        | |dfd||dœ|¤Ž}
nl |j                  | |dfddi|¤Ž}
nTt        |t        t        f«      rt        | |d	f||dœ|¤Ž}
n,|rt        | |d	fd||dœ|¤Ž}
n |j                  | |d	fddi|¤Ž}
t        |
t        «      r<|
j                  D �cg c]#  }t        |dj                  ||d   g«      ¬«      ‘Œ% }}|
|fS t        |d|d¬«      g}|
|fS c c}w )Nr´   )	r^   ÚquadÚquad2ÚtieredÚdeeprx   r‚   Ú7x7rP   rŸ  r   r5   r  )r{  r|  r¼   r²   r¡  ró   é   )r¼   r²   r¢  r8   )r{  r}  r¼   r²   rx   )r¯   r²   r‚   )rƒ   r¯   r²   r£  é   r%   )r{  r¼   r²   r¯   ú.rƒ  )rƒ  r   r€  )r¤   rz  r  rS  r¥   r“   ry   r”   rŠ  rf   Újoin)r­   r®   rQ   rœ  r�  r²   rµ   r¶   rÀ   r|  ÚstemÚfrŠ  s                rK   r/   r/   Ù  s   € ð  UÑ	+€BØÒ ”w“y€FØÐ[Ñ[Ð[Ð[Ø�Ñà )Ñ+‘!°ˆÜ�F˜GÐe¨Q¸ÀiÐX^ÑeÐbdÑe‰Ø	�YÑ	ä�F˜Q ™[¨AÑ-¨w¸!©|¸WÐEÐkÈIÐ^dÑkÐhjÑk‰Ø	�9Ñ	ä�F˜GÐc¨Q¸#ÀIÐV\ÑcÐ`bÑc‰Ø	�)Ñ	Ü˜6 7ÐJ°1¸VÑJÀrÑJ‰Ø	�)Ñ	Ü˜f gÐ\¸1ÀQÈvÑ\ÐY[Ñ\‰Ø	�)Ñ	áÜ˜ ¨Ð[°A¸IÈfÑ[ÐXZÑ[‰Dà'�6×'Ñ'¨°¸ÑKÀ1ÐKÈÑK‰Dä�g¤¤t˜}Ô-Ü˜ ¨ÐP°À6ÑPÈRÑP‰Dñ Ü˜F G¨QÐ_¸À	ÐRXÑ_Ð\^Ñ_‘à+�v×+Ñ+¨F°G¸QÑOÀqÐOÈBÑO�ä�$œÔØVZ×VgÑVgÖhÐQRœ˜Q s§x¡x°¸aÀ¹kÐ0JÓ'KÖLÐhˆÐhð �ÐÐô  W¸À+ÐUVÔWÐXˆØ�ÐÐùò is   Ä?(Fr5   c                 óL   — | €d S t        | D �cg c]  }||z  ‘Œ	 c}«      S c c}w rd   )ry   )ri  r¯   r6   s      rK   Úreduce_feat_sizer«    s)   € ØÐ$ˆ4ÐQ¬%ÀiÖ0PÀ°°f³Ò0PÓ*QÐQùÒ0Ps   Ž!c                 ó   — | �| n|}|xs i S )a2   Override model level attn/self-attn/block kwargs w/ block level

    NOTE: kwargs are NOT merged across levels, block_kwargs will fully replace model_kwargs
    for the block if set to anything that isn't None.

    i.e. an empty block_kwargs dict will remove kwargs set at model level for that block
    rI   )r>   Úmodel_kwargsÚ
out_kwargss      rK   Úoverride_kwargsr¯    s   € ð ".Ð!9‘¸|€JØÒ˜ÐrJ   r>   Ú	block_cfgÚ	model_cfgc                 óª  — | d   }|j                   d u}|s|j                  �q|r|j                   sd }nSt        |j                  |j                  «      }|j                   xs |j                   }|�t        t	        |«      fi |¤Žnd }t        ||¬«      }|j                  d u}|s|j                  �q|r|j                  sd }nSt        |j                  |j                  «      }	|j                  xs |j                  }|�t        t	        |«      fi |	¤Žnd }t        ||¬«      }|| d<   | j                  t        |j                  |j                  «      «       y )Nr²   )r¨   ©r©   )
r:   r;   r¯  r   r"   r   r<   r=   Úupdater>   )
r>   r°  r±  Ú	layer_fnsÚattn_setr:   r;   Úself_attn_setr<   r=   s
             rK   Úupdate_block_kwargsr¸    sM  € Ø˜XÑ&€Ið ×#Ñ#¨4Ð/€HÙ�9×(Ñ(Ð4á˜I×0Ò0à‰Jä)¨)×*?Ñ*?À×AVÑAVÓWˆKØ"×-Ñ-ÒE°×1EÑ1EˆJØISÐI_œ¤¨*Ó!5ÑE¸ÒEÐeiˆJÜ˜I¨JÔ7ˆ	ð ×-Ñ-°TÐ9€MÙ˜	×2Ñ2Ð>á ×!:Ò!:à"‰Oä.¨y×/IÑ/IÈ9×KeÑKeÓfÐØ'×7Ñ7ÒT¸9×;TÑ;TˆOà"Ð.ô &¤h¨Ó&?ÑTÐCSÒTØ48ð ä˜I°ÔAˆ	à&€L�Ñð ×Ñœ¨	×(>Ñ(>À	×@VÑ@VÓWÕXrJ   rÛ   ró   r  Ú	drop_probÚ
block_sizeÚ
num_stagesc                 óˆ   — |dk\  sJ ‚dg|z  }| r2t        t        | |dz  dz
  d¬«      |d<   t        t        | |d¬«      |d<   |S )	aw  Create DropBlock layer partials for each stage.

    DropBlock is applied to the last two stages only, following common practice.
    The block_size specifies the size for the final stage; the second-to-last
    stage uses a larger block size scaled to account for 2x larger feature maps.

    Args:
        drop_prob: Drop probability for DropBlock.
        block_size: Block size for the final stage. Second-to-last stage
            uses `block_size * 2 - 1` to scale with feature map size.
        num_stages: Number of stages in the model.

    Returns:
        List of DropBlock partial instances or None for each stage.
    r5   Nr%   ç      Ð?)r¹  rº  Úgamma_scaleéþÿÿÿr8   rB  )r   r   )r¹  rº  r»  Údbss       rK   Údrop_blocksrÁ  ?  sY   € ð( ˜Š?Ðˆ?Øˆ&�:Ñ
€CÙäœ+°ÀzÐTUÁ~ÐXYÑGYÐgkÔlˆˆB‰Üœ+°ÀzÐ_cÔdˆˆB‰Ø€JrJ   r�   r×   Úoutput_strideÚ	stem_featÚdrop_block_rateÚdrop_block_sizeri  Úblock_kwargs_fnc                 ó†  — |xs
 t        «       }g }| j                  D �cg c]  }t        |«      ‘Œ }}t        |«      }|D ��cg c]%  }t	        |D �cg c]  }|j
                  ‘Œ c}«      ‘Œ' }}}t        ||d¬«      }t        |||«      }d}|d   }|d   }|}g }t        |«      D �]c  \  }}|d   j                  }|dk7  r|r|j                  |«       ||k\  r|dkD  r||z  }d}||z  }|dv rdnd}g }t        |«      D ]Ý  \  }}t        |j                  | j                  z  «      } |j                  }!t        |!t         «      r	 |!| |«      }!t#        || |dk(  r|nd||f|!|j$                  | j&                  ||   ||   |   ||	|
¬	«      }"|j(                  d
v r||"d<    ||"|| ¬«       |t+        |j(                  fi |"¤Žgz  }|}| }|dkD  sŒÌ|dk(  sŒÒt-        ||«      }Œß |t/        j0                  |Ž gz  }t#        ||d|› �|dz   ¬«      }�Œf |j                  |«       t/        j0                  |Ž ||fS c c}w c c}w c c}}w )NT)Ú	stagewiser%   r‚  r�  r   )r%   r5   r5   )r­   r®   r¯   r°   r{   rÓ   rO   rÖ   r×   r²   rµ   r¶   r³  ri  )r°  r±  ústages.r€  )r¤   rM   rŸ   r…   Úsumr3   r   rÁ  r›   r6   rU  r#   r4   rV   r7   r“   r   rf   r9   rO   r2   r0   r«  rD   Ú
Sequential)#r�   r×   rÂ  rÃ  rÄ  rÅ  ri  r²   rÆ  rµ   r¶   rŠ  r6   rœ   r»  Ú	stage_bcsÚbcÚdepthsÚdprrÀ  r°   Ú
net_strider’  r�  ÚstagesÚ	stage_idxÚstage_block_cfgsr¯   Úfirst_dilationrM   Ú	block_idxr°  r®   r{   r>   s#                                      rK   Úcreate_byob_stagesrÖ  \  s�  € ð Ò ”w“y€FØ€LØ03·
±
Ö;¨1Ô# AÕ&Ð;€JÐ;Ü�Z“€JØ?I×J°)Œc )Ö,˜B�2—4“4Ò,Õ-ÐJ€FÑJÜ
# N°FÀdÔ
K€CÜ
�o ¸
Ó
C€CØ€HØ˜;Ñ'€JØ˜Ñ#€HØ€IØ€FÜ'0°Ó'<ó )tÑ#ˆ	Ð#Ø! !Ñ$×&Ñ&ˆØ�QŠ;™9Ø×Ñ 	Ô*Ø˜Ò&¨6°Aª:Ø˜ÑˆHØˆFØ�fÑˆ
Ø&¨&Ñ0™°aˆàˆÜ$-Ð.>Ó$?ò 	@Ñ ˆI�yÜ$ Y§[¡[°3×3CÑ3CÑ%CÓDˆGØ"Ÿ™ˆJÜ˜*¤hÔ/Ù'¨°Ó;�
ÜØØØ!*¨a¢‘v°QØ(¨(Ð3Ø%Ø&Ÿ\™\ØŸ>™>Ø˜y™>Ø" 9™~¨iÑ8ØØØôˆLð �~‰~ Ñ/à,5�˜[Ñ)Ù˜L°IÈÕMØ”| I§N¡NÑC°lÑCÐDÑDˆFØ%ˆNØˆHØ˜‹z˜i¨1›nÜ,¨Y¸Ó?‘	ð7	@ð: 	”2—=‘= &Ð)Ð*Ñ*ˆÜ °ZÈ'ÐR[ÐQ\ÐH]ÐenÐqrÑerÔsŠ	ðS)tðV ×Ñ˜	Ô"Ü�=‰=˜&Ð! <°Ð:Ð:ùòm <ùâ,ùÓJs   ŸH3ÁH=ÁH8Á$	H=È8H=TÚallow_aac                 óþ  — t        | j                  «      }t        | j                  |¬«      }| j                  r*|r(t        t        | j                  || j                  ¬«      }nt        t        | j                  |¬«      }| j                  r)t        t        | j                  «      fi | j                  ¤Žnd }| j                  r)t        t        | j                  «      fi | j                  ¤Žnd }t        |||||¬«      }|S )N)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–  s           rK   Úget_layer_fnsrÙ  ¤  sÁ   € Ü
˜Ÿ™Ó
&€CÜ!¨S¯^©^ÀsÔK€HØ
‡|‚|™Ü¤¸¿¹ÐRUÐ`c×`lÑ`lÔm‰ä¤¸¿¹ÐRUÔVˆØCFÇ>Â>Œ7”8˜CŸN™NÓ+Ñ?¨s¯©Ò?ÐW[€DØRU×ReÒRe”œ ×!4Ñ!4Ó5ÑN¸×9MÑ9MÒNÐko€IÜ ]¸XÈ3ÐUYÐenÔo€HØ€OrJ   c                   ó*  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 d%dedededee   dedeeee	eef   f      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j0                  deeeee   f      dedededededeeej0                     e	ej0                  eej0                     f   f   fd„Z	 	 	 d*deeee   f   dededee   fd „Zdej0                  dej0                  fd!„Zd&dej0                  d"edej0                  fd#„Zdej0                  dej0                  fd$„Zˆ xZS )+r,   a%  Bring-your-own-blocks Network.

    A flexible network backbone that allows building model stem + blocks via
    dataclass cfg definition w/ factory functions for module instantiation.

    Current assumption is that both stem and blocks are in conv-bn-act order (w/ block ending in act).
    Nr�   Únum_classesÚin_chansÚglobal_poolrÂ  Úimg_sizeÚ	drop_raterÄ  rÅ  r×   rX   c           
      ó	  •— t         ‰| �  «        ||dœ}|| _        || _        || _        d| _        t        |fi |¤Ž}t        |d¬«      }t        |«      }|j                  r	|€J d«       ‚|�t        |«      nd}g | _
        t        |j                  t        t        f«      r9|j                  D �cg c]#  }t        t!        ||j"                  z  «      «      ‘Œ% }}nFt        t!        |j                  xs |j$                  d   j&                  |j"                  z  «      «      }t)        d|||j*                  |j,                  |dœ|¤Ž\  | _        }| j                  j1                  |dd «       t3        ||d   d	   ¬
«      }t5        ||
||d   f||	||dœ|¤Ž\  | _        }}| j                  j1                  |dd «       |d   d	   }|d   d   }|j8                  rUt        t!        |j"                  |j8                  z  «      «      | _         |j:                  || j8                  dfi |¤Ž| _        n || _        t?        j@                  «       | _        | xj                  tC        | j8                  |dtE        | j6                  «      ¬«      gz  c_
        | j                  D �cg c]  }|d   ‘Œ	 c}| _#        | j8                  | _$        |jJ                  dv sJ ‚|jJ                  dk(  rk|€d}tM        | j8                  |f|jH                  ||jN                  |jP                  | j                  dœ|¤Ž| _)        | jR                  jT                  | _$        �n|jJ                  dk(  r\|€d}|dv sJ ‚tW        | j8                  f|jH                  |||| j                  ddœ|¤Ž| _)        | jR                  jX                  | _$        n¦|jJ                  dk(  r\|€d}|dv sJ ‚t[        | j8                  f|jH                  |||| j                  ddœ|¤Ž| _)        | jR                  jX                  | _$        n;|€d}|jH                  �J ‚t]        | j8                  |f|| j                  dœ|¤Ž| _)        || _/        ta        tc        td        |¬«      | «       yc c}w c c}w )aó  
        Args:
            cfg: Model architecture configuration.
            num_classes: Number of classifier classes.
            in_chans: Number of input channels.
            global_pool: Global pooling type.
            output_stride: Output stride of network, one of (8, 16, 32).
            img_size: Image size for fixed image size models (i.e. self-attn).
            drop_rate: Classifier dropout rate.
            drop_block_rate: DropBlock drop rate.
            drop_block_size: DropBlock block size for final stage (scales up for earlier stages).
            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´   F)r×  Nz8img_size argument is required for fixed input size modelr   )r­   r®   rQ   rœ  r²   rB  r‚  )r¯   )rÄ  rÅ  r²   ri  r�  r%   Ú
final_convr€  r„  )r^   ra   ÚmlpÚattn_absÚattn_rotrâ  rÎ   )Úhidden_sizerœ  r]   r[   rß  rã  Útoken)r^   ræ  T)Ú	embed_dimÚout_featuresri  rœ  rß  Úqkv_separaterä  )rç  rè  Úref_feat_sizerœ  rß  ré  )rœ  rß  ©rX   rI   )3r¹   rº   rÛ  rÜ  rß  Úgrad_checkpointingr   rÙ  rY   r$   rŠ  r“   rU   r”   ry   rG   r‰  rV   rM   r4   r/   rQ   rS   r¨  Úextendr«  rÖ  rÑ  rW   r¥   rá  rD   r½   rf   r…   Ú
stage_endsr`   rb   r   r]   r[   Úheadrå  r   rç  r   r   rÝ  r(   r   Ú_init_weights)r¿   r�   rÛ  rÜ  rÝ  rÂ  rÞ  rß  rÄ  rÅ  r×   rX   rµ   r¶   r–   rÀ   Ústem_layersÚstage_layersri  r4   rU   rÃ  Ú
stage_featr‚  r’  r©  rÃ   s                             €rK   rº   zByobNet.__init__º  s�  ø€ ô@ 	‰ÑÔØ¨Ñ/ˆØ&ˆÔØ ˆŒØ"ˆŒØ"'ˆÔä�cÑ$˜VÑ$ˆÜ# C°%Ô8ˆÜ$ SÓ)ˆØ×ÒØÐ'ÐcÐ)cÓcÐ'Ø+3Ð+?”I˜hÔ'ÀTˆ	àˆÔÜ�c—l‘l¤T¬5 MÔ2ØBEÇ,Á,ÖO¸QœœE ! c×&6Ñ&6Ñ"6Ó7Õ8ÐOˆHÑOäœ5 #§,¡,Ò"A°#·*±*¸Q±-·/±/ÀS×EUÑEUÑ!UÓVÓWˆHÜ/ð  
ØØØ—m‘mØ—m‘mØñ 
ð ñ 
ÑˆŒ	�9ð 	×Ñ× Ñ  ¨3¨B Ô0Ü$ Y°yÀ±}À[Ñ7QÔRˆ	ä-?ØØØØ�b‰Mð	
.
ð
 ,Ø+ØØñ
.
ð ñ
.
Ñ*ˆŒ�Z ð 	×Ñ× Ñ  ¨C¨R Ô1Ø˜r‘N ;Ñ/ˆ	à˜b‘> )Ñ,ˆØ×ÒÜ #¤E¨#×*:Ñ*:¸S×=MÑ=MÑ*MÓ$NÓ OˆDÔØ8˜l×8Ñ8¸À4×CTÑCTÐVWÑ^Ð[]Ñ^ˆD�Oà (ˆDÔÜ Ÿk™k›mˆDŒOØ×ÒÜ˜×*Ñ*°iÈÔ\_Ð`d×`kÑ`kÓ\lÔmðoñ 	oÕà/3×/@Ñ/@ÖA¨!˜1˜W›:ÒAˆŒà $× 1Ñ 1ˆÔØ�}‰}Ð QÑQÐQÐQØ�=‰=˜EÒ!ØÐ"Ø#�Ü-Ø×!Ñ!Øð	ð  ×0Ñ0Ø%ØŸ>™>ØŸ-™-ØŸ.™.ñ	ð ñ	ˆDŒIð %)§I¡I×$9Ñ$9ˆDÖ!Ø�]‰]˜jÒ(ØÐ"Ø%�Ø -Ñ/Ð/Ð/Ü'Ø×!Ñ!ð	à×.Ñ.Ø(Ø#Ø%ØŸ.™.Ø!ñ	ð ñ	ˆDŒIð %)§I¡I×$7Ñ$7ˆDÕ!Ø�]‰]˜jÒ(ØÐ"Ø%�Ø -Ñ/Ð/Ð/Ü*Ø×!Ñ!ð	à×.Ñ.Ø(Ø'Ø%ØŸ.™.Ø!ñ	ð ñ	ˆDŒIð %)§I¡I×$7Ñ$7ˆDÕ!àÐ"Ø#�Ø×'Ñ'Ð/Ð/Ð/Ü&Ø×!Ñ!Øðð &ØŸ.™.ñ	ð
 ñˆDŒIð 'ˆÔô 	”GœM¸.ÔIÈ4ÕPùòG PùòJ Bs   Â.(Q=ÊRÚcoarsern   c                 ó0   — t        d|rdnddfdg¬«      }|S )z¹Group matcher for parameter groups.

        Args:
            coarse: Whether to use coarse grouping.

        Returns:
            Dictionary mapping group names to patterns.
        z^stemz^stages\.(\d+)z^stages\.(\d+)\.(\d+)N)z^final_conv)iŸ† )r¨  rM   re   )r¿   rô  Úmatchers      rK   Úgroup_matcherzByobNet.group_matcherO  s.   € ô Øá&,Ñ"Ð2JÈDÐQØ*ðô
ˆð ˆrJ   Úenablec                 ó   — || _         y)zEnable or disable gradient checkpointing.

        Args:
            enable: Whether to enable gradient checkpointing.
        N)rì  )r¿   rø  s     rK   Úset_grad_checkpointingzByobNet.set_grad_checkpointingb  s   € ð #)ˆÕrJ   c                 ó.   — | j                   j                  S )zPGet classifier module.

        Returns:
            Classifier module.
        )rï  Úfc)r¿   s    rK   Úget_classifierzByobNet.get_classifierk  s   € ð �y‰y�|‰|ÐrJ   c                 óJ   — || _         | j                  j                  ||«       y)z–Reset classifier.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        N)rÛ  rï  Úreset)r¿   rÛ  rÝ  s      rK   Úreset_classifierzByobNet.reset_classifiert  s   € ð 'ˆÔØ�	‰	�‰˜ [Õ1rJ   rÄ   ÚindicesÚnormÚ
stop_earlyÚ
output_fmtÚintermediates_onlyÚexclude_final_convc                 óN  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }	}
|	D �cg c]  }| j                  |   ‘Œ }	}| j                  |
   }
d}t        | j                  d«      r| j                  j                  |«      \  }}n| j	                  |«      d}}||	v r|j                  |€|n|«       | j                  d   }t        j                  j                  «       s|s| j                  }n| j                  d|
 }|D ]t  }|dz  }| j                  r+t        j                  j                  «       st        ||«      }n ||«      }|s||k(  r| j                  |«      }||	v sŒd|j                  |«       Œv |r|S |r||k(  r| j                  |«      }||fS c c}w )a9   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
            exclude_final_conv: Exclude final_conv from last intermediate
        Returns:

        )ÚNCHWzOutput shape must be NCHW.r   rš  NrB  r%   )r'   r…   rî  rì   r¨  rš  rU  rÈ   ÚjitÚis_scriptingrÑ  rì  r)   rá  )r¿   rÄ   r  r  r  r  r  r  ÚintermediatesÚtake_indicesÚ	max_indexrŠ   Úfeat_idxÚx_interÚlast_idxrÑ  r„  s                    rK   rš  zByobNet.forward_intermediates~  s›  € ð. ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿?¹?Ó7KÈWÓ"UÑˆ�iØ4@ÖA¨q˜Ÿ™¨Ó*ÐAˆÐAØ—O‘O IÑ.ˆ	àˆÜ�4—9‘9Ð5Ô6àŸ™×8Ñ8¸Ó;‰JˆA‰wàŸ™ 1› tˆwˆAØ�|Ñ#Ø× Ñ  g o¡¸7ÔCØ—?‘? 2Ñ&ˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )Ð,ˆFØò 
	(ˆEØ˜‰MˆHØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ" 5¨!Ó,‘á˜!“H�Ù%¨(°hÒ*>à—O‘O AÓ&�Ø˜<Ò'Ø×$Ñ$ QÕ'ð
	(ñ Ø Ð á (¨hÒ"6Ø—‘ Ó"ˆAà�-ÐÐùòE Bs   ´F"Ú
prune_normÚ
prune_headc                 ó  — t        t        | j                  «      |«      \  }}| j                  |   }| j                  d| | _        || 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.
        NrB  r   r^   )r'   r…   rî  rÑ  rD   r½   rá  r   )r¿   r  r  r  r  r  s         rK   Úprune_intermediate_layersz!ByobNet.prune_intermediate_layers¼  su   € ô  #7´s¸4¿?¹?Ó7KÈWÓ"UÑˆ�iØ—O‘O IÑ.ˆ	Ø—k‘k * 9Ð-ˆŒØ�t—‘ rÑ*Ò*Ü Ÿk™k›mˆDŒOÙØ×!Ñ! ! RÔ(ØÐrJ   c                 óî   — | j                  |«      }| j                  r5t        j                  j	                  «       st        | j                  |«      }n| j                  |«      }| j                  |«      }|S )z‹Forward pass through feature extraction.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r¨  rì  rÈ   r	  r
  r)   rÑ  rá  rÆ   s     rK   Úforward_featureszByobNet.forward_featuresÕ  sY   € ð �I‰I�a‹LˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.‰Aà—‘˜A“ˆAØ�O‰O˜AÓˆØˆrJ   Ú
pre_logitsc                 óN   — |r| j                  ||¬«      S | j                  |«      S )zÕForward pass through head.

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

        Returns:
            Classification logits or features.
        )r  )rï  )r¿   rÄ   r  s      rK   Úforward_headzByobNet.forward_headæ  s(   € ñ 7Aˆt�y‰y˜ zˆyÓ2ÐRÀdÇiÁiÐPQÃlÐRrJ   c                 óJ   — | j                  |«      }| j                  |«      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r  r  rÆ   s     rK   rÇ   zByobNet.forwardò  s)   € ð ×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrJ   )éè  ró   NrT   NrÛ   rÛ   ró   rÛ   TNNrõ   ©Trd   )NFFr  FF)r%   FT) r?   r@   rA   rB   r-   rG   r
   rC   r   r   rH   rk   rº   rÈ   r	  Úignorer	   r   r÷  rú  rD   rE   rý  r   rÉ   r   rš  r  r  r  rÇ   rÊ   rË   s   @rK   r,   r,   ±  sÆ  ø„ ñð  $ØØ)-Ø!#Ø>BØ!Ø%'Ø#$Ø$&Ø#'ØØñSQàðSQð ðSQð ð	SQð
 " #™ðSQð ðSQð ˜u S¨%°°S°©/Ð%9Ñ:Ñ;ðSQð ðSQð #ðSQð !ðSQð "ðSQð !õSQðj ‡Y�Y×Ññ Dð °T¸#¸s¸(±^ò ó ðð$ ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mð 2ÐW[ó 2ð 8<ØØ$Ø$Ø',Ø',ñ< à�|‰|ð< ð ˜e C¨¨c© NÑ3Ñ4ð< ð ð	< ð
 ð< ð ð< ð !%ð< ð !%ð< ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó< ð@ ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óð2 %§,¡,ð °5·<±<ó ñ"
S˜eŸl™lð 
S¸ð 
SÈÏÉó 
Sð˜Ÿ™ð ¨%¯,©,÷ rJ   r,   rƒ  r/  rX   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t        | t        j                   «      rSt        j                  j#                  | j                  «       t        j                  j                  | j                  «       yt%        | d«      r| j'                  |¬	«       yy)
z˜Initialize weights.

    Args:
        module: Module to initialize.
        name: Module name.
        zero_init_last: Zero-initialize last layer.
    r   r%   ç       @NrÛ   g{®Gáz„?)ÚmeanrP  rî   rë  )r“   rD   r  rƒ   r  rm   rå   r)  r   ÚmathrH  r  Úzero_ÚLinearrê   rë   r  Úones_rì   rî   )rƒ  r/  rX   Úfan_outs       rK   rð  rð     s8  € ô �&œ"Ÿ)™)Ô$Ø×$Ñ$ QÑ'¨&×*<Ñ*<¸QÑ*?Ñ?À&×BUÑBUÑUˆØ�F—M‘MÑ!ˆØ�‰×Ñ×"Ñ" 1¤d§i¡i°°g±Ó&>Ô?Ø�;‰;Ð"Ø�K‰K×Ñ×"Ñ"Õ$ð #ä	�FœBŸI™IÔ	&Ü
�‰�‰˜Ÿ™¨C°TˆÔ:Ø�;‰;Ð"Ü�G‰G�N‰N˜6Ÿ;™;Õ'ð #ä	�FœBŸN™NÔ	+Ü
�‰�‰�f—m‘mÔ$Ü
�‰�‰�v—{‘{Õ#Ü	�˜Ô	(Ø×Ñ¨>ÐÕ:ð 
)rJ   Úgernet_lro  rr   r8   )r2   r3   r4   r6   r7   r9   éÀ   rp  é   i€  r½  é   ç      @rT   i 
  )rM   rU   rS   rW   Úgernet_mÚgernet_sé0   r¥  é€  i0  rs   é   i€  Ú	repvgg_a0)r5   r  é   r%   )ç      è?r2  r2  ç      @)r3   rl   rx   )rM   rQ   rU   Ú	repvgg_a1)r%   r%   r%   r3  rq   Ú	repvgg_a2)ç      ø?r6  r6  g      @Ú	repvgg_b0)r8   r8   r8   r3  )rl   Ú	repvgg_b1)r  r  r  ç      @Úrepvgg_b1g4)rl   rm   Ú	repvgg_b2)r3  r3  r3  ç      @Úrepvgg_b2g4Ú	repvgg_b3)r*  r*  r*  r<  Úrepvgg_b3g4Úrepvgg_d2se)r¤  r1  é   r%   r�   g      °?)Úrd_ratioÚ
rd_divisor)rM   rQ   rU   r:   r;   Ú	resnet51qrt   i   r   i   Úsilu)rM   rU   rQ   rS   rW   r[   Ú	resnet61qrr  )r2   r3   r4   r6   r7   r9   r>   rŸ  )rø   )rM   rU   rQ   rS   rW   r[   r>   Úresnext26tsi   r¡  rR   )rM   rU   rQ   rS   r[   Úgcresnext26tsÚgca)rM   rU   rQ   rS   r[   r:   Úseresnext26tsÚeca_resnext26tsÚecaÚbat_resnext26tsÚbatr¤  )rº  )rM   rU   rQ   rS   r[   r:   r;   Ú
resnet32tsÚ
resnet33tsi   Úgcresnet33ts)rM   rU   rQ   rS   rW   r[   r:   Úseresnet33tsÚeca_resnet33tsÚgcresnet50t)r2   r3   r4   r6   r9   )rM   rU   rQ   rS   r:   Úgcresnext50tsÚregnetz_b16é   é`   é   é   )rB  )rù   rÕ   )	rM   rU   rS   rO   rW   r[   r:   r;   r>   Úregnetz_c16Úregnetz_d32i   )
rM   rU   rQ   rS   rO   rW   r[   r:   r;   r>   Ú
regnetz_d8Ú
regnetz_e8Úregnetz_b16_evos)r{   )
rM   rU   rS   rO   rW   r[   r]   r:   r;   r>   Úregnetz_c16_evosÚregnetz_d8_evosr¢  )rM   rU   rQ   rS   rO   rW   r[   r]   r:   r;   r>   Úmobileone_s0)r2  r8   r8   r  )rl   r   r‚   Úmobileone_s1)r6  r6  r  r3  Úmobileone_s2)r6  r  r3  r9  Úmobileone_s3)r  r3  r*  r9  Úmobileone_s4)r*  ç      @rg  r9  )r   r   r)  r%   )rl   r~   Úresnet50_clip)rT   rT   rq   rˆ  rÎ   rã  )rM   rU   rQ   rS   rO   r_   rb   Úresnet101_clipé   Úresnet50x4_clipé
   g      ô?)rM   rV   rU   rQ   rS   rO   r_   rb   Úresnet50x16_clipé   r6  Úresnet50x64_clipé   é$   r  Úresnet50_mlprâ  )rM   rU   rQ   rS   rO   r_   r`   rb   Útest_byobnetr›  rq  rA  rZ   )rM   rU   rO   rS   r[   r:   r;   )rh  ri  rk  rm  ro  ra   )rb   Ú_gapÚ
state_dictÚmodelÚprefixc                 óx  — t        |j                  t        t        f«      }dd l}d„ }d„ }i }| j                  «       D ]ú  \  }}	|j                  |«      sŒ|j                  |› d�d|«      }|j                  |› d�d|«      }|j                  |› d�||«      }|j                  |› d	�||«      }|j                  |› d
�«      rr|sŒ‡|j                  |d
z   d«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|	||<   Œü |S )Nr   c                 óþ   — t        | j                  d«      «      dz
  }t        | j                  d«      «      | j                  d«      t        | j                  d«      «      }}}d|› d|› d�}ddd	d
œ}||   |z   }||z   S )Nr%   r5   ró   r  rÉ  r¦  z
conv1_1x1.z
conv2_kxk.z
conv3_1x1.)r%   r5   ró   ©rG   Úgroup)r!  rÒ  Ú	layer_idxÚ
layer_typeÚlayer_idÚ
prefix_strÚid_mapÚ
suffix_strs           rK   Ú
_stage_subz(_convert_openai_clip.<locals>._stage_sub^	  s€   € Ü˜Ÿ™ ›
“O aÑ'ˆ	Ü*-¨a¯g©g°a«j«/¸1¿7¹7À1»:ÄsÈ1Ï7É7ÐSTË:Ã˜x�:ˆ	Ø˜y˜k¨¨9¨+°QÐ7ˆ
Ø! l°|ÑDˆØ˜HÑ%¨
Ñ2ˆ
Ø˜JÑ&Ð&rJ   c                 óÎ   — t        | j                  d«      «      dz
  }t        | j                  d«      «      t        | j                  d«      «      }}d|› d|› d�|dk(  rdz   S d	z   S )
Nr%   r5   ró   rÉ  r¦  z
.shortcut.r   z	conv.convzconv.bnrz  )r!  rÒ  r|  r~  s       rK   Ú	_down_subz'_convert_openai_clip.<locals>._down_subf	  sc   € Ü˜Ÿ™ ›
“O aÑ'ˆ	Ü! !§'¡'¨!£*›o¬s°1·7±7¸1³:«�8ˆ	Ø˜˜ 1 Y K¨zÐ:ÈXÐYZÊ]¸kÑjÐjÐ`iÑjÐjrJ   zconv([0-9])zstem.conv\1.convz	bn([0-9])zstem.conv\1.bnz'layer([0-9])\.([0-9]+)\.([a-z]+)([0-9])z+layer([0-9])\.([0-9]+)\.downsample\.([0-9])Úattnpoolrï  Úpositional_embeddingÚ	pos_embedÚq_projÚqÚk_projÚkÚv_projÚvÚc_projÚproj)	r“   rï  r   r   ÚreÚitemsÚ
startswithÚsubr   )
ru  rv  rw  Úmodel_has_attn_poolr�  r‚  r„  Úout_dictr‹  r�  s
             rK   Ú_convert_openai_clipr–  V	  sT  € ô
 % U§Z¡ZÔ2DÄoÐ1VÓWÐÛò'òkð
 €HØ× Ñ Ó"ò ‰ˆˆ1Ø�|‰|˜FÔ#ØØ�F‰F�v�h˜kÐ*Ð,?ÀÓCˆØ�F‰F�v�h˜iÐ(Ð*;¸QÓ?ˆØ�F‰F�v�hÐEÐFÈ
ÐTUÓVˆØ�F‰F�v�hÐIÐJÈIÐWXÓYˆØ�<‰<˜6˜( (Ð+Ô,Ù&ØØ—	‘	˜& :Ñ-¨vÓ6ˆAØ—	‘	Ð0°+Ó>ˆAØ—	‘	˜( CÓ(ˆAØ—	‘	˜( CÓ(ˆAØ—	‘	˜( CÓ(ˆAØ—	‘	˜( FÓ+ˆAØˆ�Šð!ð$ €OrJ   c                 ó&   — d| v rt        | |«      } | S )Nzvisual.conv1.weight)r–  )ru  rv  s     rK   Úcheckpoint_filter_fnr˜  �	  s   € ð  
Ñ*Ü)¨*°eÓ<ˆ
ØÐrJ   ÚvariantÚ
pretrainedc                 óX   — t        t        | |ft        |    t        t	        d¬«      dœ|¤ŽS )zÕCreate a ByobNet model.

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

    Returns:
        ByobNet model instance.
    T)Úflatten_sequential)r±  Úpretrained_filter_fnÚfeature_cfg)r&   r,   Ú
model_cfgsr˜  rf   )r™  rš  r–   s      rK   Ú_create_byobnetr   Š	  s:   € ô  Ü�˜*ðä˜WÑ%Ü1Ü¨DÔ1ñ	ð
 ñð rJ   Úurlc                 ó2   — | dddddt         t        dddd	œ|¥S )
z»Create default configuration dictionary.

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

    Returns:
        Configuration dictionary.
    r  ©ró   éà   r¤  ©r¥  r¥  ç      ì?Úbilinearú	stem.convúhead.fcú
apache-2.0©r¡  rÛ  Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationr   rP  Ú
first_convra   Úlicense©r   r   ©r¡  r–   s     rK   Ú_cfgr´  ž	  s5   € ð  4°}ÐSYØ¨JÜ%Ô.BØ!°Øñð ðð rJ   c                 ó2   — | dddddt         t        dddd	œ|¥S )
zºCreate RepVGG configuration dictionary.

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

    Returns:
        Configuration dictionary.
    r  ©ró   rs   rs   ©r¤  r¤  çÍÌÌÌÌÌì?Úbicubiczstem.conv1.convr©  rª  r«  r²  r³  s     rK   Ú_cfgrrº  ²	  s5   € ð  4°}ÐSYØ¨)Ü%Ô.BØ'°yØñð ðð rJ   zgernet_s.idstcv_in1kztimm/)Ú	hf_hub_idzgernet_m.idstcv_in1kzgernet_l.idstcv_in1kr¶  r·  )r»  r¬  r­  zrepvgg_a0.rvgg_in1k)zstem.conv_kxk.convzstem.conv_1x1.convÚmit)r»  r°  r±  zrepvgg_a1.rvgg_in1kzrepvgg_a2.rvgg_in1kzrepvgg_b0.rvgg_in1kzrepvgg_b1.rvgg_in1kzrepvgg_b1g4.rvgg_in1kzrepvgg_b2.rvgg_in1kzrepvgg_b2g4.rvgg_in1kzrepvgg_b3.rvgg_in1kzrepvgg_b3g4.rvgg_in1kzrepvgg_d2se.rvgg_in1k)ró   é@  r½  )rl  rl  )r»  r°  r±  r¬  r­  r®  zresnet51q.ra2_in1kzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet51q_ra2-d47dcc76.pthz
stem.conv1)ró   rZ  rZ  )r»  r¡  r°  r¬  r­  Útest_input_sizeÚtest_crop_pctzresnet61q.ra2_in1kzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet61q_ra2-6afc536c.pth)r»  r¡  r¾  r¿  zresnext26ts.ra2_in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnext26ts_256_ra2-8bbd9106.pthzseresnext26ts.ch_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/seresnext26ts_256-6f0d74a3.pthzgcresnext26ts.ch_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnext26ts_256-e414378b.pthzeca_resnext26ts.ch_in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_resnext26ts_256-5a1d030f.pthzbat_resnext26ts.ch_in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/bat_resnext26ts_256-fa6fd595.pth)r»  r¡  Úmin_input_sizezresnet32ts.ra2_in1kzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnet32ts_256-aacf5250.pthzresnet33ts.ra2_in1kzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnet33ts_256-e91b09a4.pthzgcresnet33ts.ra2_in1kzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnet33ts_256-0e0cd345.pthzseresnet33ts.ra2_in1kzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/seresnet33ts_256-f8ad44d9.pthzeca_resnet33ts.ra2_in1kzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_resnet33ts_256-8f98face.pthzgcresnet50t.ra2_in1kzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnet50t_256-96374d1c.pthzgcresnext50ts.ch_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/gcresnext50ts_256-3e0f515e.pthzregnetz_b16.ra3_in1kzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_b_raa-677d9606.pthr¨  )r›  r›  r›  r£  r¥  g®Gázî?)
r»  r¡  r°  r   rP  r¬  r­  r®  r¾  r¿  zregnetz_c16.ra3_in1kzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_c_rab2_256-a54bf36a.pth)r»  r¡  r°  r   rP  r®  r¾  r¿  zregnetz_d32.ra3_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_d_rab_256-b8073a89.pthgffffffî?)r»  r¡  r   rP  r®  r¾  zregnetz_d8.ra3_in1kzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_d8_bh-afc03c55.pth)r»  r¡  r   rP  r®  r¾  r¿  zregnetz_e8.ra3_in1kzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/regnetz_e8_bh-aace8e6e.pthzregnetz_b16_evos.untrained)r°  r   rP  r¬  r­  r®  r¾  zregnetz_c16_evos.ch_in1kzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_c16_evos_ch-d8311942.pth)r»  r¡  r°  r   rP  r®  r¾  zregnetz_d8_evos.ch_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_d8_evos_ch-2bc12646.pthzmobileone_s0.apple_in1kr¦  )zstem.conv_kxk.0.convzstem.conv_scale.convzmobileone-license)r»  r®  r°  r±  zmobileone_s1.apple_in1kr¸  zmobileone_s2.apple_in1kzmobileone_s3.apple_in1kzmobileone_s4.apple_in1kzresnet50_clip.openaiz	head.proj)	r»  rÛ  r   rP  rY   r¬  r­  ra   r±  zresnet101_clip.openaizresnet50x4_clip.openai)é	   rÁ  zresnet50x16_clip.openaii   )ró   r.  r.  )rY  rY  zresnet50x64_clip.openai)ró   éÀ  rÂ  )r1  r1  zresnet50_clip.cc12mzresnet50_clip.yfcc15mzresnet101_clip.yfcc15mzresnet50_clip_gap.openai)r»  rÛ  r   rP  r¬  r­  r±  zresnet101_clip_gap.openai)r¬  r­  )ró   é    rÃ  )r)  r)  )r»  r°  r¬  r®  r­  )zresnet50x4_clip_gap.openaizresnet50x16_clip_gap.openaizresnet50x64_clip_gap.openaizresnet50_clip_gap.cc12mzresnet50_clip_gap.yfcc15mzresnet101_clip_gap.yfcc15mzresnet50_mlp.untrainedztest_byobnet.r160_in1kc                 ó   — t        dd| i|¤ŽS )z” GEResNet-Large (GENet-Large from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    rš  )r&  ©r   ©rš  r–   s     rK   r&  r&  î
  ó   € ô
 ÑG°*ÐGÀÑGÐGrJ   c                 ó   — t        dd| i|¤ŽS )z– GEResNet-Medium (GENet-Normal from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    rš  )r+  rÅ  rÆ  s     rK   r+  r+  ö
  rÇ  rJ   c                 ó   — t        dd| i|¤ŽS )z“ EResNet-Small (GENet-Small from official impl)
    `Neural Architecture Design for GPU-Efficient Networks` - https://arxiv.org/abs/2006.14090
    rš  )r,  rÅ  rÆ  s     rK   r,  r,  þ
  rÇ  rJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-A0
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r0  rÅ  rÆ  s     rK   r0  r0    ó   € ô
 ÑH°:ÐHÀÑHÐHrJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-A1
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r4  rÅ  rÆ  s     rK   r4  r4    rË  rJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-A2
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r5  rÅ  rÆ  s     rK   r5  r5    rË  rJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-B0
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r7  rÅ  rÆ  s     rK   r7  r7    rË  rJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-B1
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r8  rÅ  rÆ  s     rK   r8  r8  &  rË  rJ   c                 ó   — t        dd| i|¤ŽS )z` RepVGG-B1g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r:  rÅ  rÆ  s     rK   r:  r:  .  ó   € ô
 ÑJ°ZÐJÀ6ÑJÐJrJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-B2
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r;  rÅ  rÆ  s     rK   r;  r;  6  rË  rJ   c                 ó   — t        dd| i|¤ŽS )z` RepVGG-B2g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r=  rÅ  rÆ  s     rK   r=  r=  >  rÑ  rJ   c                 ó   — t        dd| i|¤ŽS )z^ RepVGG-B3
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r>  rÅ  rÆ  s     rK   r>  r>  F  rË  rJ   c                 ó   — t        dd| i|¤ŽS )z` RepVGG-B3g4
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r?  rÅ  rÆ  s     rK   r?  r?  N  rÑ  rJ   c                 ó   — t        dd| i|¤ŽS )z` RepVGG-D2se
    `Making VGG-style ConvNets Great Again` - https://arxiv.org/abs/2101.03697
    rš  )r@  rÅ  rÆ  s     rK   r@  r@  V  rÑ  rJ   c                 ó   — t        dd| i|¤ŽS )ú
    rš  )rD  rÅ  rÆ  s     rK   rD  rD  ^  ó   € ô ÑH°:ÐHÀÑHÐHrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rF  rÅ  rÆ  s     rK   rF  rF  e  rÙ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rG  rÅ  rÆ  s     rK   rG  rG  l  ó   € ô ÑJ°ZÐJÀ6ÑJÐJrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rH  rÅ  rÆ  s     rK   rH  rH  s  ó   € ô ÑL°zÐLÀVÑLÐLrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rJ  rÅ  rÆ  s     rK   rJ  rJ  z  rÞ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rK  rÅ  rÆ  s     rK   rK  rK  �  ó   € ô ÑN¸ÐNÀvÑNÐNrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rM  rÅ  rÆ  s     rK   rM  rM  ˆ  rá  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rO  rÅ  rÆ  s     rK   rO  rO  �  ó   € ô ÑI°JÐIÀ&ÑIÐIrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rP  rÅ  rÆ  s     rK   rP  rP  –  rä  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rQ  rÅ  rÆ  s     rK   rQ  rQ  �  ó   € ô ÑK°jÐKÀFÑKÐKrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rR  rÅ  rÆ  s     rK   rR  rR  ¤  rç  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rS  rÅ  rÆ  s     rK   rS  rS  «  ó   € ô ÑM¸
ÐMÀfÑMÐMrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rT  rÅ  rÆ  s     rK   rT  rT  ²  rÜ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rU  rÅ  rÆ  s     rK   rU  rU  ¹  rÞ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rV  rÅ  rÆ  s     rK   rV  rV  À  rÜ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r[  rÅ  rÆ  s     rK   r[  r[  Ç  rÜ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r\  rÅ  rÆ  s     rK   r\  r\  Î  rÜ  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r]  rÅ  rÆ  s     rK   r]  r]  Õ  rä  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r^  rÅ  rÆ  s     rK   r^  r^  Ü  rä  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r_  rÅ  rÆ  s     rK   r_  r_  ã  ó   € ô ÑO¸*ÐOÈÑOÐOrJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )r`  rÅ  rÆ  s     rK   r`  r`  ê  ró  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )ra  rÅ  rÆ  s     rK   ra  ra  ñ  rá  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rb  rÅ  rÆ  s     rK   rb  rb  ø  rç  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rc  rÅ  rÆ  s     rK   rc  rc  ÿ  rç  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rd  rÅ  rÆ  s     rK   rd  rd    rç  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )re  rÅ  rÆ  s     rK   re  re    rç  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rf  rÅ  rÆ  s     rK   rf  rf    rç  rJ   c                 ó   — t        dd| i|¤ŽS )z0 OpenAI Modified ResNet-50 CLIP image tower
    rš  )rh  rÅ  rÆ  s     rK   rh  rh    rÞ  rJ   c                 ó   — t        dd| i|¤ŽS )z1 OpenAI Modified ResNet-101 CLIP image tower
    rš  )ri  rÅ  rÆ  s     rK   ri  ri  "  rê  rJ   c                 ó   — t        dd| i|¤ŽS )z2 OpenAI Modified ResNet-50x4 CLIP image tower
    rš  )rk  rÅ  rÆ  s     rK   rk  rk  )  rá  rJ   c                 ó   — t        dd| i|¤ŽS )z3 OpenAI Modified ResNet-50x16 CLIP image tower
    rš  )rm  rÅ  rÆ  s     rK   rm  rm  0  ró  rJ   c                 ó   — t        dd| i|¤ŽS )z3 OpenAI Modified ResNet-50x64 CLIP image tower
    rš  )ro  rÅ  rÆ  s     rK   ro  ro  7  ró  rJ   c                 ó   — t        dd| i|¤ŽS )zP OpenAI Modified ResNet-50 CLIP image tower w/ avg pool (no attention pool)
    rš  )Úresnet50_clip_gaprÅ  rÆ  s     rK   r  r  >  s   € ô ÑP¸:ÐPÈÑPÐPrJ   c                 ó   — t        dd| i|¤ŽS )zQ OpenAI Modified ResNet-101 CLIP image tower w/ avg pool (no attention pool)
    rš  )Úresnet101_clip_gaprÅ  rÆ  s     rK   r  r  E  s   € ô ÑQ¸JÐQÈ&ÑQÐQrJ   c                 ó   — t        dd| i|¤ŽS )zR OpenAI Modified ResNet-50x4 CLIP image tower w/ avg pool (no attention pool)
    rš  )Úresnet50x4_clip_gaprÅ  rÆ  s     rK   r  r  L  s   € ô ÑR¸ZÐRÈ6ÑRÐRrJ   c                 ó   — t        dd| i|¤ŽS )zS OpenAI Modified ResNet-50x16 CLIP image tower w/ avg pool (no attention pool)
    rš  )Úresnet50x16_clip_gaprÅ  rÆ  s     rK   r  r  S  ó   € ô ÑS¸jÐSÈFÑSÐSrJ   c                 ó   — t        dd| i|¤ŽS )zS OpenAI Modified ResNet-50x64 CLIP image tower w/ avg pool (no attention pool)
    rš  )Úresnet50x64_clip_gaprÅ  rÆ  s     rK   r
  r
  Z  r  rJ   c                 ó   — t        dd| i|¤ŽS )rØ  rš  )rr  rÅ  rÆ  s     rK   rr  rr  a  rç  rJ   c                 ó   — t        dd| i|¤ŽS )z- Minimal test ResNet (BYOB based) model.
    rš  )rs  rÅ  rÆ  s     rK   rs  rs  h  rç  rJ   ))r  r(  rW  r%   ©r8   r8   r8   r8   r   ))r5   r¤  rl  r%   r  rI   r%   )r%   F)r^   r^   r¨  NNN)r5   )rÛ   ró   r  r  )r^   F)zvisual.rõ   )r^   )šrB   r!  Údataclassesr   r   r   Ú	functoolsr   Útypingr   r   r	   r
   r   r   r   r   r   rÈ   Útorch.nnrD   Ú	timm.datar   r   r   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Ú_builderr&   Ú	_featuresr'   Ú_manipulater(   r)   Ú	_registryr*   r+   Ú__all__r.   r-   rG   rH   r}   rŽ   rC   rk   r˜   rŸ   r¢   r¤   rE   r¬   rÐ   rÒ   r÷   r  r
  r  rS  rg  rf   ru  rv  r0   rË  rz  r/   r«  r¯  r¸  rÁ  rÖ  rÙ  r,   rð  rŸ  r‹  rÉ   r–  r˜  r   r´  rº  Údefault_cfgsr&  r+  r,  r0  r4  r5  r7  r8  r:  r;  r=  r>  r?  r@  rD  rF  rG  rH  rJ  rK  rM  rO  rP  rQ  rR  rS  rT  rU  rV  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rh  ri  rk  rm  ro  r  r  r  r  r
  rr  rs  rI   rJ   rK   ú<module>r     s%  ðñó< ß 1Ñ 1Ý ß T× TÕ Tã Ý ç dÓ d÷÷ ÷ ÷ õ õ& +Ý +ß 4ß <â
W€ð ÷2ð 2ó ð2ð( ÷Ið Ió ðIòB�U˜3 ˜8‘_ð ¸%ÀÀsÀ
Ñ:Kð Ðhkð Ø €k�3ÐÑ óð* +Ø 0Ø%'Ø!"ò	"Ø��c�‰?ð"à�%˜�*Ñð"ð ˜˜c˜‘?ð"ð ð	"ð
 
ˆ$ˆ{Ñ
Ñó"ðP ()Øò	Ø�S˜#�X‰ðàðð �S˜$˜s™)�^Ñ$ðð ð	ð ˆ;˜ÐÑóð@¨¨k¸8ÀKÑ;PÐ.PÑ(Qð ÐVZÐ[fÑVgó ð"&˜8 C™=ð &°Cð &¸Có &ð$ ÷0ð 0ó ð0ô/'�B—I‘Iô /'ðd Øð àð ð ð ð ð	 ð
 ˜˜S˜‘/ð ð ð ð ˆb�i‰iÑó ôFG�—‘ô GôTW�b—i‘iô WôtO�—	‘	ô OôdL�—	‘	ô Lô^s=�"—)‘)ô s=ôlK=�R—Y‘Yô K=ô\Q�B—I‘Iô Qñh Ø
ØØ	Ø	ØØØô€ð+˜sð +¨b¯i©ió +ð,˜˜c 2§9¡9˜nÑ-ó ,ôNˆ2�=‰=ô Nðh ØØ!ØØØò/Øð/àð/ð ð/ð ð	/ð
 ð/ð ó/ôdRò	ð!Y d¨3°¨8¡nð !YÀð !YÐYdó !YðJ ØØòØðàðð ðð 
ˆ(�7Ñ
Ñó	ðD "$Ø Ø#'Ø$(Ø.AØØñE;ØðE;àðE;ð ðE;ð ˜˜S˜‘>ð	E;ð
 ðE;ð ðE;ð ˜C‘=ðE;ð ˜Ñ!ðE;ð " (Ñ+óE;òP
�{ð 
¨dó 
ôLˆb�i‰iô Lò^
;˜"Ÿ)™)ð ;¨3ð ;ÀTð ;ÐVZó ;ñ2 ò xÙá˜W¨¨S°A¸!ÀÔCÙ˜W¨¨S°A¸!ÀÔCÙ˜X¨¨c°Q¸1ÀÔGÙ˜X¨¨c°Q¸1ÀÔDÙ˜X¨¨c°Q¸1ÀÔDð
ð ØØõðxñ á˜W¨¨S°A¸!ÀÔCÙ˜W¨¨S°A¸!ÀÔCÙ˜X¨¨c°Q¸1ÀÔGÙ˜X¨¨c°Q¸1ÀÔDÙ˜X¨¨c°Q¸1ÀÔDð
ð ØØõðxñ2 á˜W¨¨R°1¸¸rÔBÙ˜W¨¨R°1¸¸rÔBÙ˜X¨¨c°Q¸1ÀÔGÙ˜X¨¨c°Q¸1ÀÔDÙ˜X¨¨c°Q¸1ÀÔDð
ð ØØõð3xñL Ù˜}Ð1HÔIØØõðMxñV Ù˜}°Ô@ØØõðWxñ` Ù˜}Ð1FÔGØØõðaxñj ÙÐ 1Ô2ØØõðkxñt ÙÐ 0Ô1ØØõðuxñ~ ÙÐ 0¸Ô;ØØõðxñH ÙÐ 3Ô4ØØõðIxñR ÙÐ 3¸AÔ>ØØõðSxñ\ ÙÐ 0Ô1ØØõð]xñf ÙÐ 0¸Ô;ØØõðgxñp Ù˜~Ð2EÔFØØØÙ &°QÔ7õðqxñD á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸AÀ#ÔFð	
ð ØØØØõðExñd á˜V q¨C°1¸¸sÑQUÓQWÔXÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸AÀ#ÔFð	
ð ØØØØÙ TÔ*õðexñF á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØõðGxñ^ á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØØõð_xñx á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØØõðyxñR  á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØØõðSxñl  á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØØÙ AÔ&õðmxñL á˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨d°a¸AÀ$ÔGÙ˜X¨¨d°a¸AÀ$ÔGð	
ð ØØØØõðMxñj á˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨d°a¸AÀ$ÔGÙ˜X¨¨d°a¸AÀ$ÔGð	
ð ØØØØõðkxñJ á˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨d°a¸AÀ$ÔGÙ˜X¨¨d°a¸AÀ$ÔGð	
ð ØØØØØõðKxñf á˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨d°a¸AÀ$ÔGÙ˜X¨¨d°a¸AÀ$ÔGð	
ð ØØØØØõðgxñB á˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨c°Q¸1ÀÔFÙ˜X¨¨d°a¸AÀ$ÔGÙ˜X¨¨d°a¸AÀ$ÔGð	
ð ØØØØØõðCxñ` á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨d°a¸DÔAÙ˜X¨¨d°a¸DÔAð	
ð ØØØõðaxñz á˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨c°Q¸2À$ÔGÙ˜X¨¨d°a¸BÀ4ÔHÙ˜X¨¨d°a¸BÀ4ÔHð	
ð ØØØØõð{xñX	 á˜X¨¨b°A¸"ÀÔCÙ˜X¨¨b°A¸"ÀÔCÙ˜X¨¨s°a¸BÀ1ÔEÙ˜X¨¨c°Q¸2À!ÔDð	
ð ØØØØØÙ $Ô'Ù D°TÔ:õðY	xñx	 á˜X¨¨b°A¸"ÀÔCÙ˜X¨¨b°A¸"ÀÔCÙ˜X¨¨s°a¸BÀ1ÔEÙ˜X¨¨c°Q¸2À!ÔDð	
ð ØØØØØÙ $Ô'Ù D°TÔ:õðy	xñX
 á˜X¨¨b°A¸"ÀÔCÙ˜X¨¨c°Q¸2À!ÔDÙ˜X¨¨s°a¸BÀ1ÔEÙ˜X¨¨c°Q¸2À!ÔDð	
ð ØØØØØØÙ $Ô'Ù D°TÔ:õðY
xñz
 á˜X¨¨b°A¸!ÀÔBÙ˜X¨¨c°Q¸1ÀÔCÙ˜X¨¨s°a¸AÀ!ÔDÙ˜X¨¨c°Q¸1ÀÔCð	
ð ØØØØØØÙ $Ô'Ù D°TÔ:õð{
xñ\ á˜X¨¨b°A¸!ÀÔBÙ˜X¨¨c°Q¸1ÀÔCÙ˜X¨¨s°a¸AÀ!ÔDÙ˜X¨¨c°Q¸1ÀÔCð	
ð ØØØØØØÙ $Ô'Ù D°TÔ:õð]xñB !á˜X¨¨b°A¸"ÀÔCÙ˜X¨¨b°A¸"ÀÔCÙ˜X¨¨s°a¸BÀ1ÔEÙ˜X¨¨c°Q¸2À!ÔDð	
ð ØØØØÙ˜<°BÔ7ØÙ $Ô'Ù D°TÔ:õðCxñd !á˜X¨¨b°A¸"ÀÔCÙ˜X¨¨b°A¸"ÀÔCÙ˜X¨¨s°a¸BÀ1ÔEÙ˜X¨¨c°Q¸2À!ÔDð	
ð ØØØØÙ˜<°BÔ7ØÙ $Ô'Ù D°TÔ:õðexñF  á˜X¨¨b°A¸!ÀÔBÙ˜X¨¨c°Q¸1ÀÔCÙ˜X¨¨s°a¸AÀ!ÔDÙ˜X¨¨c°Q¸1ÀÔCð	
ð ØØØØØÙ˜<°BÔ7ØÙ $Ô'Ù D°TÔ:õ!ðGxñl ÙÐ"6È!ÔLØØõðmxñv ÙÐ"6Ô7ØØõðwxñ@ ÙÐ"6Ô7ØØõðAxñJ ÙÐ"6Ô7ØØõðKxñT ÙÐ"6À,ÔOØØõðUxñ` á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨d°a¸DÔAÙ˜X¨¨d°a¸DÔAð	
ð ØØØØØõðaxñ| á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨t°q¸TÔBÙ˜X¨¨d°a¸DÔAð	
ð ØØØØØõð}xñX  á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨t°q¸TÔBÙ˜X¨¨d°a¸DÔAð	
ð ØØØØØØõðYxñv !á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨t°q¸TÔBÙ˜X¨¨d°a¸DÔAð	
ð ØØØØØØõðwxñT !á˜X¨¨c°Q¸4Ô@Ù˜X¨¨s°a¸DÔAÙ˜X¨¨t°q¸TÔBÙ˜X¨¨t°q¸TÔBð	
ð ØØØØØØõðUxñt á˜X¨¨c°Q¸4Ô@Ù˜X¨¨c°Q¸4Ô@Ù˜X¨¨d°a¸DÔAÙ˜X¨¨d°a¸DÔAð	
ð ØØØØØÙöñuxñT á˜V q¨B°!¸¹cÔBÙ™V q¨B°!¸¹cÔBÙ˜W¨¨S°A¸"ÀÔFÙ˜X¨¨c°Q¸2À$ÔGð	
ñ ØØÙØÙ $Ô'öðUx€
ñr 
hò L€AÙ$ Z°¡]¹lÕK€Jˆq‘6‰zÒðLð  ó(Ø˜˜eŸl™lÐ*Ñ+ñ(àñ(ð ð(ð 
ˆ#ˆu�|‰|Ð
Ñô	(ñVØ˜˜eŸl™lÐ*Ñ+ñàôó˜Sñ ¨dð Èô ó(ˆcð  T¨#¨s¨(¡^ô ó(ˆsð  d¨3°¨8¡nô ñ( %ð e&á™D©7Õ3ðe&ñ ™D©7Õ3ðe&ñ ™D©7¹}ÑX^Õ_ð	e&ñ ™4ÙÙ?ÉõPðe&ñ ™4ÙÙ?ÉõPðe&ñ ™4ÙÙ?ÉõPðe&ñ  ™4ÙÙ?ÉõPð!e&ñ& ™4ÙÙ?ÉõPð'e&ñ, ™TÙÙ?ÉõPð-e&ñ2 ™4ÙÙ?ÉõPð3e&ñ8 ™TÙÙ?ÉõPð9e&ñ> ™4ÙÙ?ÉõPð?e&ñD ™TÙÙ?ÉõPðEe&ñJ ™TÙÙ?ÉÙ ©H¸sõðKe&ñX ™$ÙÙyÙ©MÁVÙ%°Sõ	:ðYe&ñb ™%ÙÙyÙ%°Sõ:ðce&ñn ™EÙñ EÙ%°Sõ:ñoe&ñv ™UÙñ CÙ%°Sõ:ðwe&ñ~ ™UÙñ CÙ%°Sõ:ðe&ñF ™uÙñ EÙ%°Sõ :ðGe&ñN ™uÙñ EÙ$õ &ðOe&ñZ ™5ÙÙÙ%°Sõ:ð[e&ñb ™5ÙÙÙ%°Sõ:ðce&ñj ™UÙñ BÙ%°Sõ:ðke&ñr ™UÙñ BÙ%°Sõ:ðse&ñz ™uÙñ DÙ%°Sõ :ð{e&ñD ™EÙñ AÙ%°Sõ:ðEe&ñN ™UÙñ CÙ%°Sõ:ðOe&ñZ ™EÙÙ~Ù¡_¹/Ù ©F¹TÑS`Ðpsõ	uð[e&ñd ™EÙñ DÙ¡_¹/Ù¡}ÀCõ	Iðee&ñn ™EÙñ CÙ¡/¹DÑR_õaðoe&ñv ™5ÙÙ~Ù¡/¹DÑR_Ðorõtðwe&ñ~ ™5ÙÙ~Ù¡/¹DÑR_Ðorõtðe&ñH !¡%Ù¡_¹/Ù ©F¹TÑS`õ#bòIe&ñN ¡Ùñ DÙ¡_¹/Ù¡}õ	!6ðOe&ñX ™uÙñ CÙ¡/¹DÑR_Ðorõ tðYe&ñb ™tÙÙÙCÙ#õ	 ðce&ñn ™tÙÙÙCÙ#õ	 ðoe&ñz ™tÙÙÙCÙ#õ	 ð{e&ñF ™tÙÙÙCÙ#õ	 ðGe&ñR ™tÙÙÙCÙ#õ	 ðSe&ñb ™EÙØÐ/°_Ø©-Á6ÙÙõðce&ñp ™UÙØÐ.°OØ©-Á6ÙÙõðqe&ñ~ ™eÙØÐ.°OØ©-Á6ÙÙõðe&ñL ™uÙÙÐ.°OØ©-Á8ÙÙõ ðMe&ñZ ™uÙØÐ/°_Ø©-Á8ÙÙõ ð[e&ñh ™5ÙØÐ/°_Ø©-Á6ÙÙõðie&ñv ™UÙØÐ/°_Ø©-Á6ÙÙõðwe&ñD ™eÙØÐ.°OØ©-Á6ÙÙõðEe&ñV ¡ÙØÐ,°/Ù ©FÙõ	!ðWe&ñb  ¡ÙØÐ,°/Ù ©FÙõ	"ñce&ñn #(ÙØÐ,°/Ù ©FÙõ	#ñ $)ÙØÐ,°/Ù ©HÙõ	$ñ $)ÙØÐ,°/Ù ©HÙõ	$ñ  %ÙØÐ,°/Ù ©FÙõ	 ñ "'ÙØÐ,°/Ù ©FÙõ	"ñ #(ÙØÐ,°/Ù ©FÙõ	#ñ $Ù ©Fõñ $ÙÙÙ ©4¹6õóA	e&ó e€ðP	 òH¨Gó Hó ðHð òH¨Gó Hó ðHð òH¨Gó Hó ðHð òI¨Wó Ió ðIð òI¨Wó Ió ðIð òI¨Wó Ió ðIð òI¨Wó Ió ðIð òI¨Wó Ió ðIð òK¨wó Kó ðKð òI¨Wó Ió ðIð òK¨wó Kó ðKð òI¨Wó Ió ðIð òK¨wó Kó ðKð òK¨wó Kó ðKð òI¨Wó Ió ðIð òI¨Wó Ió ðIð òK¨wó Kó ðKð òM°ó Mó ðMð òM°ó Mó ðMð òO°7ó Oó ðOð òO°7ó Oó ðOð òJ¨gó Jó ðJð òJ¨gó Jó ðJð òL°ó Ló ðLð òL°ó Ló ðLð òN°'ó Nó ðNð òK¨wó Kó ðKð òM°ó Mó ðMð òK¨wó Kó ðKð òK¨wó Kó ðKð òK¨wó Kó ðKð òJ¨gó Jó ðJð òJ¨gó Jó ðJð òP°Gó Pó ðPð òP°Gó Pó ðPð òO°7ó Oó ðOð òL°ó Ló ðLð òL°ó Ló ðLð òL°ó Ló ðLð òL°ó Ló ðLð òL°ó Ló ðLð òM°ó Mó ðMð òN°'ó Nó ðNð òO°7ó Oó ðOð òP°Gó Pó ðPð òP°Gó Pó ðPð òQ°Wó Qó ðQð òR°gó Ró ðRð òS°wó Só ðSð òT¸ó Tó ðTð òT¸ó Tó ðTð òL°ó Ló ðLð òL°ó Ló ñLrJ   