Ë
    éÓ^jáŠ ã                   ó^  — d Z ddlZddlm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 ddlZddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZ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.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z? g d¢Z@e G d„ d«      «       ZAe G d„ d«      «       ZBe G d„ d«      «       ZC G d„ dejˆ                  «      ZE G d„ dejˆ                  «      ZF G d„ dejˆ                  «      ZG�dƒdejˆ                  d eHd!eHd"dfd#„ZI G d$„ d%ejˆ                  «      ZJ�dƒdejˆ                  d eHd!eHd"dfd&„ZKd'eeL   d(eLd"eLfd)„ZM G d*„ d+ejˆ                  «      ZN G d,„ d-ejˆ                  «      ZOd.ej                   d/eeL   d"ej                   fd0„ZQe9d1ej                   d/eeL   d2eeL   d"ej                   fd3„«       ZRd.ej                   d4eeL   d"ej                   fd5„ZSe9d1ej                   d4eeL   d2eeL   d"ej                   fd6„«       ZTd7eAd/eeLeLf   d"ee   fd8„ZU G d9„ d:ejˆ                  «      ZV G d;„ d<ejˆ                  «      ZWd.ej                   d/eeL   d"ej                   fd=„ZXe9d1ej                   d/eeL   d2eeL   d"ej                   fd>„«       ZYd.ej                   d4eeL   d"ej                   fd?„ZZe9d1ej                   d4eeL   d2eeL   d"ej                   fd@„«       Z[ G dA„ dBejˆ                  «      Z\ G dC„ dDejˆ                  «      Z] G dE„ dFejˆ                  «      Z^ G dG„ dHejˆ                  «      Z_ G dI„ dJejˆ                  «      Z`d7eAd2eeLeLf   d"eAfdK„Zad7eCdLed"eCfdM„Zb G dN„ dOejˆ                  «      Zc	 	 	 	 	 	 	 	 	 	 	 	 �d„dUeHdVeHdWeddXeddYeHdZeHd[edd\eHd]eHd^eee   d_eHd`eLd"eeHef   fda„Zf	 	 	 	 	 	 	 	 	 	 	 	 �d…dUeHdVeHdWeddceedZeHd\eHd]eHd/eeeLeLf      ddeLd^eee   d_eHd`eLd"eeHef   fde„Zg	 	 	 	 	 	 	 	 	 	 	 �d†dUeHdVeHdZeHdheHd\eHd]eHd/eeeLeLf      diedd^eeeeeeeef   f   d_eHd`eLd"eeHef   fdj„Zhd"eeHef   fdk„Zi ej�d‡i dl eC�d‡dmdndodpœ egdRdq¬r«      ¤Ž“ds eC�d‡dmdtdodpœ egdPdRdq¬u«      ¤Ž“dv eC�d‡dwdxdodpœ efdRdQ¬y«      ¤Ž“dz eC�d‡dwd{dodpœ efdbdRdQ¬|«      ¤Ž“d} eC�d‡d~d{ddpœ efdbd€¬�«      ¤Ž“d‚ eC�d‡dƒd{d„dpœ efdbd€df¬…«      ¤Ž“d† eC�d‡dwdxdodpœ efdbdRdQd‡¬ˆ«      ¤Ž“d‰ eC�d‡dmdtdodpœ egdRdqdgdŠ¬‹«      ¤Ž“dŒ eC�d‡dwdxdodpœ efdbdg¬�«      ¤Ž“dŽ eC�d‡dwd{dodpœ efd�dRdQdgdŠ¬�«      ¤Ž“d‘ eC�d‡dwd{dodpœ efdbdgdT¬’«      ¤Ž“d“ eC�d‡d~d{ddpœ efdbd€dfdg¬”«      ¤Ž“d• eC�d‡dƒd{d„dpœ efdbd€dfdg¬”«      ¤Ž“d– eC�d‡dmdtdod—d˜œ ef«       ¤Ž“d™ eC�d‡dmdtdodšd›œ ehdSdœ¬�«      ¤Ž“dž eCdwdndŸd ¬¡«      “d¢ eCdwd{dŸd ¬¡«      “d£ eCd~d{d¤d¥¬¡«      “d¦ eCdƒd{d§d¨¬¡«      “d© eCdƒdªd§d¨¬¡«      “d« eCd¬dªd§d­¬¡«      “d® eC�d‡d¯d°d±d²d³œ eg«       ¤Ž“d´ eC�d‡dmdµd±dod³œ eg«       ¤Ž“d¶ eC�d‡dmd°d±dod³œ eg«       ¤Ž“d· eC�d‡dmd°d¸dod³œ eg«       ¤Ž“d¹ eC�d‡d¯d°d±d²d³œ egdg¬º«      ¤Ž“d» eC�d‡dmdµd±dod³œ egdg¬º«      ¤Ž“d¼ eC�d‡dmd°d±dod³œ egdg¬º«      ¤Ž“d½ eC�d‡dwd°d±dod³œ egdgdf¬�«      ¤Ž“d¾ eC�d‡dwd{d±dod d¿œ egdg¬º«      ¤Ž“dÀ eC�d‡dmdµd±dodšdÁœ eh«       ¤Ž“dÂ eC�d‡dmd°d±dod³œ eh«       ¤Ž“dÃ eC�d‡dwd°d±dÄd³œ eh«       ¤Ž“dÅ eC�d‡dwdµd±dÄdšdÁœ ehdRdS¬Æ«      ¤Ž“dÇ eC�d‡d~dÈd±dd³œ ehdR¬É«      ¤Ž“dÊ eC�d‡dËdÌd±dÍdÎd¿œ ehdR¬É«      ¤Ž“dÏ eC�d‡dmd°d±dŸdRdTdÐœ ei«       ¤Ž“dÑ eC�d‡dwd°d±dŸdRd dÐœ ei«       ¤Ž“dÒ eC�d‡dwd{d±dŸdRd dÐœ ei«       ¤Ž“dÓ eC�d‡d~d{d±d¤dRd¥dÐœ ei«       ¤Ž“dÔ eC�d‡dƒd{d±d§dRd¨dÐœ ei«       ¤Ž“ŽZkdÕeeHej                   f   dÖejˆ                  d"eeHej                   f   fd×„Zl�dˆdØeHdÙeeH   dÚeddLed"ecf
dÛ„Zm�dƒdÜeHdLed"eeHef   fdÝ„Zn e>i dÞ end¬ß«      “dà endádâdã¬ä«      “då endádæ¬ç«      “dè endádé¬ç«      “dê endá¬ë«      “dì endá¬ë«      “dí endá¬ë«      “dî endádïdðdñdò¬ó«      “dô endádõeedö¬÷«      “dø endádùdã¬ä«      “dú end¬ß«      “dû endádü¬ç«      “dý endádþ¬ç«      “dÿ end¬ß«      “�d  end¬ß«      “�d endá�ddã¬ä«      “�d endá�d�¬«      “i �d endá�d�¬«      “�d endá�d�¬«      “�d endá�d�¬«      “�d	 end¬ß«      “�d
 end¬ß«      “�d end¬ß«      “�d end¬ß«      “�d end¬ß«      “�d end¬ß«      “�d end�d�d�¬«      “�d endá�d�d�d�¬«      “�d endá�d¬ç«      “�d end�d�d�¬«      “�d end�d�d�¬«      “�d endá�d�d�d�¬«      “�d endá�d�d�d�¬«      “�d endá�d�d�d�¬«      “¥i �d  endá�d!dã¬ä«      “�d" end�d�d�¬«      “�d# endá¬ë«      “�d$ endádïdðdñdò¬ó«      “�d% endá�d�¬«      “�d& endá�d'�d�d�¬«      “�d( end�d�d�¬«      “�d) endá�d*�d�d�¬«      “�d+ endá�d�d�¬,«      “�d- endá¬ë«      “�d. endádïdðdñdò¬ó«      “�d/ end¬ß«      “�d0 endá�d�¬«      “�d1 endáee�¬2«      “�d3 endádïdðdñdò¬ó«      “�d4 endá�d5�d6dñdò¬ó«      “�d7 endáee�¬2«      “¥i �d8 endádïdðdñdò¬ó«      “�d9 endá�d5�d6dñdò¬ó«      “�d: endáee�¬2«      “�d; endádïdðdñdò¬ó«      “�d< endá�d5�d6dñdò¬ó«      “�d= endáee�¬2«      “�d> endádïdðdñdò¬ó«      “�d? endá�d5�d6dñdò¬ó«      “�d@ endá�dA�¬«      “�dB endádïdðdñdò¬ó«      “�dC endá�d5�d6dñdò¬ó«      “�dD endá�dA�¬«      “�dE endádïdðdñdò¬ó«      “�dF endá�d5dñdò�¬G«      “�dH endá�dA�¬«      “�dI endádïdðdñdò¬ó«      “�dJ endá�d5�d6dñdò¬ó«      “¥«      Zoe?�d‰dÚeddLed"ecf�dK„«       Zpe?�d‰dÚeddLed"ecf�dL„«       Zqe?�d‰dÚeddLed"ecf�dM„«       Zre?�d‰dÚeddLed"ecf�dN„«       Zse?�d‰dÚeddLed"ecf�dO„«       Zte?�d‰dÚeddLed"ecf�dP„«       Zue?�d‰dÚeddLed"ecf�dQ„«       Zve?�d‰dÚeddLed"ecf�dR„«       Zwe?�d‰dÚeddLed"ecf�dS„«       Zxe?�d‰dÚeddLed"ecf�dT„«       Zye?�d‰dÚeddLed"ecf�dU„«       Zze?�d‰dÚeddLed"ecf�dV„«       Z{e?�d‰dÚeddLed"ecf�dW„«       Z|e?�d‰dÚeddLed"ecf�dX„«       Z}e?�d‰dÚeddLed"ecf�dY„«       Z~e?�d‰dÚeddLed"ecf�dZ„«       Ze?�d‰dÚeddLed"ecf�d[„«       Z€e?�d‰dÚeddLed"ecf�d\„«       Z�e?�d‰dÚeddLed"ecf�d]„«       Z‚e?�d‰dÚeddLed"ecf�d^„«       Zƒe?�d‰dÚeddLed"ecf�d_„«       Z„e?�d‰dÚeddLed"ecf�d`„«       Z…e?�d‰dÚeddLed"ecf�da„«       Z†e?�d‰dÚeddLed"ecf�db„«       Z‡e?�d‰dÚeddLed"ecf�dc„«       Zˆe?�d‰dÚeddLed"ecf�dd„«       Z‰e?�d‰dÚeddLed"ecf�de„«       ZŠe?�d‰dÚeddLed"ecf�df„«       Z‹e?�d‰dÚeddLed"ecf�dg„«       ZŒe?�d‰dÚeddLed"ecf�dh„«       Z�e?�d‰dÚeddLed"ecf�di„«       ZŽe?�d‰dÚeddLed"ecf�dj„«       Z�e?�d‰dÚeddLed"ecf�dk„«       Z�e?�d‰dÚeddLed"ecf�dl„«       Z‘e?�d‰dÚeddLed"ecf�dm„«       Z’e?�d‰dÚeddLed"ecf�dn„«       Z“e?�d‰dÚeddLed"ecf�do„«       Z”e?�d‰dÚeddLed"ecf�dp„«       Z•e?�d‰dÚeddLed"ecf�dq„«       Z–e?�d‰dÚeddLed"ecf�dr„«       Z—e?�d‰dÚeddLed"ecf�ds„«       Z˜e?�d‰dÚeddLed"ecf�dt„«       Z™e?�d‰dÚeddLed"ecf�du„«       Zše?�d‰dÚeddLed"ecf�dv„«       Z›e?�d‰dÚeddLed"ecf�dw„«       Zœe?�d‰dÚeddLed"ecf�dx„«       Z�e?�d‰dÚeddLed"ecf�dy„«       Zže?�d‰dÚeddLed"ecf�dz„«       ZŸe?�d‰dÚeddLed"ecf�d{„«       Z e?�d‰dÚeddLed"ecf�d|„«       Z¡e?�d‰dÚeddLed"ecf�d}„«       Z¢e?�d‰dÚeddLed"ecf�d~„«       Z£e?�d‰dÚeddLed"ecf�d„«       Z¤e?�d‰dÚeddLed"ecf�d€„«       Z¥e?�d‰dÚeddLed"ecf�d�„«       Z¦e?�d‰dÚeddLed"ecf�d‚„«       Z§y(Š  a   MaxVit and CoAtNet Vision Transformer - CNN Hybrids in PyTorch

This is a from-scratch implementation of both CoAtNet and MaxVit in PyTorch.

99% of the implementation was done from papers, however last minute some adjustments were made
based on the (as yet unfinished?) public code release https://github.com/google-research/maxvit

There are multiple sets of models defined for both architectures. Typically, names with a
 `_rw` suffix are my own original configs prior to referencing https://github.com/google-research/maxvit.
These configs work well and appear to be a bit faster / lower resource than the paper.

The models without extra prefix / suffix' (coatnet_0_224, maxvit_tiny_224, etc), are intended to
match paper, BUT, without any official pretrained weights it's difficult to confirm a 100% match.

Papers:

MaxViT: Multi-Axis Vision Transformer - https://arxiv.org/abs/2204.01697
@article{tu2022maxvit,
  title={MaxViT: Multi-Axis Vision Transformer},
  author={Tu, Zhengzhong and Talebi, Hossein and Zhang, Han and Yang, Feng and Milanfar, Peyman and Bovik, Alan and Li, Yinxiao},
  journal={ECCV},
  year={2022},
}

CoAtNet: Marrying Convolution and Attention for All Data Sizes - https://arxiv.org/abs/2106.04803
@article{DBLP:journals/corr/abs-2106-04803,
  author    = {Zihang Dai and Hanxiao Liu and Quoc V. Le and Mingxing Tan},
  title     = {CoAtNet: Marrying Convolution and Attention for All Data Sizes},
  journal   = {CoRR},
  volume    = {abs/2106.04803},
  year      = {2021}
}

Hacked together by / Copyright 2022, Ross Wightman
é    N)ÚOrderedDict)Ú	dataclassÚreplaceÚfield)Úpartial)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚUnion)Únn)ÚFinal)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚMlpÚConvMlpÚDropPathÚcalculate_drop_path_ratesÚ	LayerNormÚ
LayerScaleÚLayerScale2dÚClassifierHeadÚNormMlpClassifierHeadÚcreate_attnÚget_act_layerÚget_norm_layerÚget_norm_act_layerÚcreate_conv2dÚcreate_pool2dÚtrunc_normal_tf_Ú	to_2tupleÚextend_tupleÚmake_divisibleÚ_assertÚ	RelPosMlpÚ
RelPosBiasÚRelPosBiasTfÚuse_fused_attnÚresize_rel_pos_bias_tableé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_function)Únamed_applyÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_model)Ú
MaxxVitCfgÚMaxxVitConvCfgÚMaxxVitTransformerCfgÚMaxxVitc                   ód  — e Zd ZU dZdZeed<   dZeed<   dZ	e
ed<   dZeed<   dZeed	<   dZeed
<   dZe
ed<   dZe
ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeeeef      ed<   dZeeeef      ed<   dZeed<   dZeed<   dZee
   ed<   dZeed<   dZeed<   d Zeed!<   d"Ze
ed#<   d$„ Z y)%r7   z-Configuration for MaxxVit transformer blocks.é    Údim_headTÚ
head_firstç      @Úexpand_ratioÚexpand_firstÚshortcut_biasÚ	attn_biasç        Ú	attn_dropÚ	proj_dropÚavg2Ú	pool_typeÚbiasÚrel_pos_typeé   Úrel_pos_dimÚpartition_ratioNÚwindow_sizeÚ	grid_sizeFÚno_block_attnÚuse_nchw_attnÚinit_valuesÚgeluÚ	act_layerÚlayernorm2dÚ
norm_layerÚ	layernormÚnorm_layer_clç�íµ ÷Æ°>Únorm_epsc                 óÚ   — | j                   �t        | j                   «      | _         | j                  �9t        | j                  «      | _        | j                   €| j                  | _         y y y ©N)rM   r$   rL   ©Úselfs    ú^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/maxxvit.pyÚ__post_init__z#MaxxVitTransformerCfg.__post_init__m   s\   € Ø�>‰>Ð%Ü& t§~¡~Ó6ˆDŒNØ×ÑÐ'Ü(¨×)9Ñ)9Ó:ˆDÔØ�~‰~Ð%Ø!%×!1Ñ!1�•ð &ð (ó    )!Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   ÚintÚ__annotations__r<   Úboolr>   Úfloatr?   r@   rA   rC   rD   rF   ÚstrrH   rJ   rK   rL   r   r   rM   rN   rO   rP   rR   rT   rV   rX   r^   © r_   r]   r7   r7   T   sú   … á7Ø€HˆcÓØ€J�ÓØ€L�%ÓØ€L�$ÓØ€M�4ÓØ€IˆtÓØ€IˆuÓØ€IˆuÓØ€IˆsÓØ€L�#ÓØ€K�ÓØ€O�SÓØ-1€K�˜%  S ™/Ñ*Ó1Ø+/€Iˆx˜˜c 3˜h™Ñ(Ó/Ø€M�4ÓØ€M�4ÓØ#'€K�˜%‘Ó'Ø€IˆsÓØ#€J�Ó#Ø$€M�3Ó$Ø€HˆeÓó2r_   r7   c                   ó<  — e Zd ZU dZdZeed<   dZeed<   dZ	e
ed<   dZeed	<   d
Zeed<   dZe
ed<   dZe
ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZe
ed<   dZeed<   dZeed<   dZeed<   dZee   ed<   dZeed <   dZeed!<   dZeed"<   d#Zee   ed$<   d%„ Zy#)&r6   z-Configuration for MaxxVit convolution blocks.ÚmbconvÚ
block_typer=   r>   TÚexpand_outputé   Úkernel_sizer-   Ú
group_sizeFÚpre_norm_actÚoutput_biasÚdwÚstride_moderE   rF   Údownsample_pool_typeÚ ÚpaddingÚ
attn_earlyÚseÚ
attn_layerÚsiluÚattn_act_layerç      Ð?Ú
attn_ratiorW   rP   rQ   rR   rT   rV   NrX   c                 ó  — | j                   dv sJ ‚| j                   dk(  }| j                  s|rdnd| _        | j                  s	|sd| _        | j                  €|rdnd| _        | j                  xs | j
                  | _        y )N)rk   Úconvnextrk   Úbatchnorm2drS   rU   çñhãˆµøä>rW   )rl   rT   rV   rX   ru   rF   )r\   Ú
use_mbconvs     r]   r^   zMaxxVitConvCfg.__post_init__Ž   st   € à�‰Ð"8Ñ8Ð8Ð8Ø—_‘_¨Ñ0ˆ
Ø�ŠÙ/9™m¸}ˆDŒOØ×!Ò!©*Ø!,ˆDÔØ�=‰=Ð Ù$.™D°DˆDŒMØ$(×$=Ñ$=Ò$OÀÇÁˆÕ!r_   )r`   ra   rb   rc   rl   rh   re   r>   rg   rm   rf   ro   rd   rp   rq   rr   rt   rF   ru   rw   rx   rz   r|   r~   rP   r   rR   rT   rV   rX   r^   ri   r_   r]   r6   r6   v   sÜ   … á7Ø€J�ÓØ€L�%ÓØ€M�4ÓØ€K�ÓØ€J�ÓØ€L�$ÓØ€K�ÓØ€K�ÓØ€IˆsÓØ &Ð˜#Ó&Ø€GˆSÓØ€J�ÓØ€J�ÓØ €N�CÓ Ø€J�ÓØ#'€K�˜%‘Ó'Ø€IˆsÓØ€J�ÓØ€M�3ÓØ $€Hˆh�u‰oÓ$ó
Pr_   r6   c                   óø   — e Zd ZU dZdZeedf   ed<   dZeedf   ed<   dZ	ee
eeedf   f   df   ed<   d	Ze
eeeef   f   ed
<   dZeed<    ee¬«      Zeed<    ee¬«      Zeed<   dZee   ed<   dZeed<   y)r5   z!Configuration for MaxxVit models.©é`   éÀ   é€  é   .Ú	embed_dim©é   rn   é   rŒ   Údepths)ÚCr�   ÚTr�   rl   é@   Ú
stem_widthFÚ	stem_bias)Údefault_factoryÚconv_cfgÚtransformer_cfgNÚhead_hidden_sizeÚvit_effÚweight_init)r`   ra   rb   rc   rŠ   r   rd   re   rŽ   rl   r   rh   r’   r“   rf   r   r6   r•   r7   r–   r—   r   r™   ri   r_   r]   r5   r5   ›   s®   … á+Ø!4€Iˆu�S˜#�X‰Ó4Ø*€FˆE�#�s�(‰OÓ*Ø:N€J��e˜C  s¨C x¡Ð0Ñ1°3Ð6Ñ7ÓNØ.0€J��c˜5  c ™?Ð*Ñ+Ó0Ø€IˆtÓÙ$°^ÔD€HˆnÓDÙ-2ÐCXÔ-Y€OÐ*ÓYØ&*Ð�h˜s‘mÓ*Ø €K�Ô r_   r5   c                   óÔ   ‡ — e Zd ZU dZee   ed<   	 	 	 	 	 	 	 	 	 	 ddedee   dedededed	ee	   d
e
de
fˆ fd„Zddej                  deej                     dej                  fd„Zˆ xZS )ÚAttention2dz)Multi-head attention for 2D NCHW tensors.Ú
fused_attnÚdimÚdim_outr;   rG   r?   r<   Úrel_pos_clsrC   rD   c                 óÊ  •— |
|dœ}t         ‰| �  «        |xs |}|r|n|}||z  | _        || _        || _        |dz  | _        t        «       | _        t        j                  ||dz  dfd|i|¤Ž| _
        |r |dd| j                  i|¤Žnd| _        t        j                  |«      | _        t        j                  ||dfd|i|¤Ž| _        t        j                  |	«      | _        y)	á  
        Args:
            dim: Input dimension.
            dim_out: Output dimension (defaults to input dimension).
            dim_head: Dimension per attention head.
            bias: Whether to use bias in qkv and projection.
            expand_first: Whether to expand channels before or after qkv.
            head_first: Whether heads are first in tensor layout.
            rel_pos_cls: Relative position class to use.
            attn_drop: Attention dropout rate.
            proj_drop: Projection dropout rate.
        ©ÚdeviceÚdtypeç      à¿rn   r-   rG   Ú	num_headsNri   )ÚsuperÚ__init__r¦   r;   r<   Úscaler+   rœ   r   ÚConv2dÚqkvÚrel_posÚDropoutrC   ÚprojrD   ©r\   r�   rž   r;   rG   r?   r<   rŸ   rC   rD   r£   r¤   ÚddÚdim_attnÚ	__class__s                 €r]   r¨   zAttention2d.__init__­   sÙ   ø€ ð4 ¨Ñ/ˆÜ‰ÑÔØ’.˜SˆÙ*‘7°ˆØ! XÑ-ˆŒØ ˆŒØ$ˆŒØ Ñ%ˆŒ
Ü(Ó*ˆŒä—9‘9˜S (¨Q¡,°ÑC¸ÐCÀÑCˆŒÙFQ‘{ÑB¨T¯^©^ÐB¸rÒBÐW[ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜h¨°ÑD¸ÐDÀÑDˆŒ	ÜŸ™ IÓ.ˆ�r_   ÚxÚshared_rel_posÚreturnc                 óì  — |j                   \  }}}}| j                  rP| j                  |«      j                  || j                  | j
                  dz  d«      j                  dd¬«      \  }}}	nK| j                  |«      j                  |d| j                  | j
                  d«      j                  d«      \  }}}	| j                  rúd }
| j                  �| j                  j                  «       }
n|�|}
t        j                  j                  j                  |j!                  dd«      j#                  «       |j!                  dd«      j#                  «       |	j!                  dd«      j#                  «       |
| j$                  r| j&                  j(                  nd¬«      j!                  dd«      j                  |d||«      }n“|| j*                  z  }|j!                  dd«      |z  }| j                  �| j                  |«      }n|�||z   }|j-                  d¬«      }| j'                  |«      }|	|j!                  dd«      z  j                  |d||«      }| j/                  |«      }| j1                  |«      }|S )	Nrn   éÿÿÿÿrŒ   ©r�   r-   éþÿÿÿrB   ©Ú	attn_maskÚ	dropout_p)Úshaper<   r«   Úviewr¦   r;   ÚchunkÚreshapeÚunbindrœ   r¬   Úget_biasÚtorchr   Ú
functionalÚscaled_dot_product_attentionÚ	transposeÚ
contiguousÚtrainingrC   Úpr©   Úsoftmaxr®   rD   )r\   r³   r´   ÚBr�   ÚHÚWÚqÚkÚvrA   Úattns               r]   ÚforwardzAttention2d.forward×   s  € Ø—W‘W‰
ˆˆ1ˆa�à�?Š?Ø—h‘h˜q“k×&Ñ& q¨$¯.©.¸$¿-¹-È!Ñ:KÈRÓP×VÑVÐWXÐ^_ÐVÓ`‰GˆAˆq‘!à—h‘h˜q“k×)Ñ)¨!¨Q°·±ÀÇÁÈrÓR×YÑYÐZ[Ó\‰GˆAˆq�!à�?Š?ØˆIØ�|‰|Ð'Ø ŸL™L×1Ñ1Ó3‘	ØÐ+Ø*�	ä—‘×#Ñ#×@Ñ@Ø—‘˜B Ó#×.Ñ.Ó0Ø—‘˜B Ó#×.Ñ.Ó0Ø—‘˜B Ó#×.Ñ.Ó0Ø#Ø.2¯mªm˜$Ÿ.™.×*Ò*Àð Aó ÷ ‰i˜˜BÓ§¡¨¨2¨q°!Ó 4ñ ð �D—J‘J‘ˆAØ—;‘;˜r 2Ó&¨Ñ*ˆDØ�|‰|Ð'Ø—|‘| DÓ)‘ØÐ+Ø˜nÑ,�Ø—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�T—^‘^ B¨Ó+Ñ+×1Ñ1°!°R¸¸AÓ>ˆAà�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr_   ©
Nr:   TTTNrB   rB   NNrZ   ©r`   ra   rb   rc   r   rf   re   rd   r   r	   rg   r¨   rÃ   ÚTensorrÒ   Ú__classcell__©r²   s   @r]   r›   r›   ©   sÅ   ø… Ù3Ø�d‘Óð
 &*ØØØ!%Ø#Ø.2Ø!Ø!ØØñ(/àð(/ð ˜c‘]ð(/ð ð	(/ð
 ð(/ð ð(/ð ð(/ð " (Ñ+ð(/ð ð(/ð õ(/ñT#˜Ÿ™ð #°xÀÇÁÑ7Mð #ÐY^×YeÑYe÷ #r_   r›   c                   óÔ   ‡ — e Zd ZU dZee   ed<   	 	 	 	 	 	 	 	 	 	 ddedee   dedededed	ee	   d
e
de
fˆ fd„Zddej                  deej                     dej                  fd„Zˆ xZS )ÚAttentionClz/Channels-last multi-head attention (B, ..., C).rœ   r�   rž   r;   rG   r?   r<   rŸ   rC   rD   c                 óî  •— |
|dœ}t         ‰| �  «        |xs |}|r||kD  r|n|}||z  dk(  sJ d«       ‚||z  | _        || _        || _        |dz  | _        t        «       | _        t        j                  ||dz  fd|i|¤Ž| _
        |r |d	d| j                  i|¤Žnd| _        t        j                  |«      | _        t        j                  ||fd|i|¤Ž| _        t        j                  |	«      | _        y)
r¡   r¢   r   z(attn dim should be divisible by head_dimr¥   rn   rG   r¦   Nri   )r§   r¨   r¦   r;   r<   r©   r+   rœ   r   ÚLinearr«   r¬   r­   rC   r®   rD   r¯   s                 €r]   r¨   zAttentionCl.__init__  sô   ø€ ð4 ¨Ñ/ˆÜ‰ÑÔØ’.˜SˆÙ*¨w¸ª}‘7À#ˆØ˜(Ñ" aÒ'ÐSÐ)SÓSÐ'Ø! XÑ-ˆŒØ ˆŒØ$ˆŒØ Ñ%ˆŒ
Ü(Ó*ˆŒä—9‘9˜S (¨Q¡,Ñ@°TÐ@¸RÑ@ˆŒÙFQ‘{ÑB¨T¯^©^ÐB¸rÒBÐW[ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜h¨ÑA°dÐA¸bÑAˆŒ	ÜŸ™ IÓ.ˆ�r_   r³   r´   rµ   c                 óV  — |j                   d   }|j                   d d }| j                  r`| j                  |«      j                  |d| j                  | j
                  dz  «      j                  dd«      j                  dd¬«      \  }}}n[| j                  |«      j                  |dd| j                  | j
                  «      j                  dd«      j                  d«      \  }}}| j                  r~d }| j                  �| j                  j                  «       }n|�|}t        j                  j                  j!                  ||||| j"                  r| j$                  j&                  nd¬«      }ns|| j(                  z  }||j                  d	d«      z  }	| j                  �| j                  |	|¬
«      }	n|�|	|z   }	|	j+                  d¬«      }	| j%                  |	«      }	|	|z  }|j                  dd«      j                  |dz   «      }| j-                  |«      }| j/                  |«      }|S )Nr   r·   rn   r-   rŒ   r¸   rB   rº   r¹   ©r´   )r·   )r½   r<   r«   r¾   r¦   r;   rÆ   r¿   rÀ   rÁ   rœ   r¬   rÂ   rÃ   r   rÄ   rÅ   rÈ   rC   rÉ   r©   rÊ   r®   rD   )
r\   r³   r´   rË   Úrestore_shaperÎ   rÏ   rÐ   rA   rÑ   s
             r]   rÒ   zAttentionCl.forward,  sé  € Ø�G‰G�A‰JˆØŸ™  ˜ˆà�?Š?Ø—h‘h˜q“k×&Ñ& q¨"¨d¯n©n¸d¿m¹mÈaÑ>OÓP×ZÑZÐ[\Ð^_Ó`×fÑfÐghÐnoÐfÓp‰GˆAˆq‘!à—h‘h˜q“k×)Ñ)¨!¨R°°D·N±NÀDÇMÁMÓR×\Ñ\Ð]^Ð`aÓb×iÑiÐjkÓl‰GˆAˆq�!à�?Š?ØˆIØ�|‰|Ð'Ø ŸL™L×1Ñ1Ó3‘	ØÐ+Ø*�	ä—‘×#Ñ#×@Ñ@Ø�1�aØ#Ø.2¯mªm˜$Ÿ.™.×*Ò*Àð Aó ‰Að �D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØ�|‰|Ð'Ø—|‘| D¸�|ÓH‘ØÐ+Ø˜nÑ,�Ø—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�K‰K˜˜1Ó×%Ñ% m°eÑ&;Ó<ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr_   rÓ   rZ   rÔ   r×   s   @r]   rÙ   rÙ   ý   sÅ   ø… Ù9Ø�d‘Óð
 &*ØØØ!%Ø#Ø.2Ø!Ø!ØØñ)/àð)/ð ˜c‘]ð)/ð ð	)/ð
 ð)/ð ð)/ð ð)/ð " (Ñ+ð)/ð ð)/ð õ)/ñV#˜Ÿ™ð #°xÀÇÁÑ7Mð #ÐY^×YeÑYe÷ #r_   rÙ   c                   ó|   ‡ — e Zd ZdZ	 	 	 	 	 ddededededef
ˆ fd„Zdej                  d	ej                  fd
„Z
ˆ xZS )ÚDownsample2da5  A downsample pooling module supporting several maxpool and avgpool modes.

    * 'max' - MaxPool2d w/ kernel_size 3, stride 2, padding 1
    * 'max2' - MaxPool2d w/ kernel_size = stride = 2
    * 'avg' - AvgPool2d w/ kernel_size 3, stride 2, padding 1
    * 'avg2' - AvgPool2d w/ kernel_size = stride = 2
    r�   rž   rF   rw   rG   c                 óŽ  •— t         ‰| �  «        |dv sJ ‚|dk(  rt        ddd|xs d¬«      | _        nS|dk(  rt        dd|xs d¬	«      | _        n6|d
k(  rt        d
ddd|xs d¬«      | _        nt        d
d|xs d¬	«      | _        ||k7  r!t	        j
                  ||d|||¬«      | _        yt	        j                  «       | _        y)zî
        Args:
            dim: Input dimension.
            dim_out: Output dimension.
            pool_type: Type of pooling operation.
            padding: Padding mode.
            bias: Whether to use bias in expansion conv.
        )ÚmaxÚmax2ÚavgrE   râ   rn   rŒ   r-   )ro   Ústriderw   rã   r   )rw   rä   F)ro   rå   Úcount_include_padrw   )rG   r£   r¤   N)r§   r¨   r"   Úpoolr   rª   ÚexpandÚIdentity)	r\   r�   rž   rF   rw   rG   r£   r¤   r²   s	           €r]   r¨   zDownsample2d.__init__[  sÆ   ø€ ô$ 	‰ÑÔØÐ:Ñ:Ð:Ð:Ø˜ÒÜ% e¸À1ÈgÊlÐYZÔ[ˆD�IØ˜&Ò Ü% e¨Q¸ºÀ1ÔEˆD�IØ˜%ÒÜ%Ø 1¨QÀ%ÐQXÒQ]Ð\]ô_ˆD�Iô & e¨Q¸ºÀ1ÔEˆDŒIà�'Š>ÜŸ)™) C¨°!¸$ÀvÐUZÔ[ˆD�KäŸ+™+›-ˆD�Kr_   r³   rµ   c                 óJ   — | j                  |«      }| j                  |«      }|S rZ   )rç   rè   ©r\   r³   s     r]   rÒ   zDownsample2d.forward~  s!   € Ø�I‰I�a‹LˆØ�K‰K˜‹NˆØˆr_   )rE   rv   TNN)r`   ra   rb   rc   rd   rh   rf   r¨   rÃ   rÕ   rÒ   rÖ   r×   s   @r]   rà   rà   R  sj   ø„ ñð $ØØØØñ!(àð!(ð ð!(ð ð	!(ð
 ð!(ð õ!(ðF˜Ÿ™ð ¨%¯,©,÷ r_   rà   rv   ÚmoduleÚnameÚschemerµ   c                 ó¸  — t        | t        j                  t        j                  f«      �r¯|dk(  rbt        j                  j                  | j                  d¬«       | j                  �*t        j                  j                  | j                  «       yy|dk(  rNt        | j                  d¬«       | j                  �*t        j                  j                  | j                  «       yy|dk(  r`t        j                  j                  | j                  «       | j                  �*t        j                  j                  | j                  «       yyt        j                  j                  | j                  «       | j                  �Zd|v r,t        j                  j                  | j                  d¬«       yt        j                  j                  | j                  «       yyy)	z&Initialize transformer module weights.Únormalç{®Gáz”?©ÚstdNÚtrunc_normalÚxavier_normalÚmlprW   )Ú
isinstancer   rª   rÛ   ÚinitÚnormal_ÚweightrG   Úzeros_r#   Úxavier_normal_Úxavier_uniform_)rì   rí   rî   s      r]   Ú_init_transformerrþ   „  s5  € ä�&œ2Ÿ9™9¤b§i¡iÐ0Õ1Ø�XÒÜ�G‰G�O‰O˜FŸM™M¨sˆOÔ3Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'à�~Ò%Ü˜VŸ]™]°Õ4Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'à�Ò&Ü�G‰G×"Ñ" 6§=¡=Ô1Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'ô �G‰G×#Ñ# F§M¡MÔ2Ø�{‰{Ð&Ø˜D‘=Ü—G‘G—O‘O F§K¡K°T�OÕ:ä—G‘G—N‘N 6§;¡;Õ/ð	 'ð! 2r_   c                   óÄ   ‡ — e Zd ZdZdd e«       dddfdedededee   d	ed
efˆ fd„Z	dde
ddfd„Zddej                  deej                     dej                  fd„Zˆ xZS )ÚTransformerBlock2daY  Transformer block with 2D downsampling.

    '2D' NCHW tensor layout

    Some gains can be seen on GPU using a 1D / CL block, BUT w/ the need to switch back/forth to NCHW
    for spatial pooling, the benefit is minimal so ended up using just this variant for CoAt configs.

    This impl was faster on TPU w/ PT XLA than the 1D experiment.
    r-   NrB   r�   rž   rå   rŸ   ÚcfgÚ	drop_pathc	                 ó²  •— ||dœ}	t         ‰| �  «        t        t        |j                  «      |j
                  ¬«      }
t        |j                  «      }|dk(  rqt        ||f|j                  |j                  dœ|	¤Ž| _        t        j                  t        d |
|fi |	¤Žfdt        ||fd|j                  i|	¤Žfg«      «      | _        n.||k(  sJ ‚t        j                   «       | _         |
|fi |	¤Ž| _        t#        ||f|j$                  |j&                  |j(                  ||j*                  |j,                  dœ|	¤Ž| _        |j0                  rt3        |fd	|j0                  i|	¤Žnt        j                   «       | _        |d
kD  rt7        |«      nt        j                   «       | _         |
|fi |	¤Ž| _        t=        d|t?        ||j@                  z  «      ||j,                  dœ|	¤Ž| _!        |j0                  rt3        |fd	|j0                  i|	¤Žnt        j                   «       | _"        |d
kD  rt7        |«      | _#        yt        j                   «       | _#        y)a  
        Args:
            dim: Input dimension.
            dim_out: Output dimension.
            stride: Stride for downsampling.
            rel_pos_cls: Relative position class.
            cfg: Transformer block configuration.
            drop_path: Drop path rate.
        r¢   ©ÚepsrŒ   )rF   rG   ÚnormÚdownrF   )r;   r?   rG   rŸ   rC   rD   rP   rB   ©Úin_featuresÚhidden_featuresrR   ÚdropNri   )$r§   r¨   r   r   rT   rX   r   rR   rà   rF   r@   Úshortcutr   Ú
Sequentialr   Únorm1ré   r›   r;   r?   rA   rC   rD   rÑ   rP   r   Úls1r   Ú
drop_path1Únorm2r   rd   r>   rö   Úls2Ú
drop_path2)r\   r�   rž   rå   rŸ   r  r  r£   r¤   r°   rT   rR   r²   s               €r]   r¨   zTransformerBlock2d.__init__¨  s  ø€ ð( ¨Ñ/ˆÜ‰ÑÔÜœ^¨C¯N©NÓ;ÀÇÁÔNˆ
Ü! #§-¡-Ó0ˆ	à�QŠ;Ü(¨¨gÐmÀÇÁÐUX×UfÑUfÑmÐjlÑmˆDŒMÜŸ™¤{Ø™ CÑ.¨2Ñ.Ð/Øœ c¨3ÑN¸#¿-¹-ÐNÈ2ÑNÐOð4ó (ó ˆD�Jð
 ˜'’>Ð!�>ÜŸK™K›MˆDŒMÙ# CÑ.¨2Ñ.ˆDŒJäØØð

ð —\‘\Ø×)Ñ)Ø—‘Ø#Ø—m‘mØ—m‘mñ

ð ñ

ˆŒ	ð PSÏÊ”< ÑK°S·_±_ÐKÈÒKÔdf×doÑdoÓdqˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ.¨2Ñ.ˆŒ
Üð 
ØÜ ¨#×*:Ñ*:Ñ :Ó;ØØ—‘ñ	
ð
 ñ
ˆŒð PSÏÊ”< ÑK°S·_±_ÐKÈÒKÔdf×doÑdoÓdqˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r_   rî   rµ   c                 ó:   — t        t        t        |¬«      | «       y ©N©rî   )r1   r   rþ   ©r\   rî   s     r]   Úinit_weightszTransformerBlock2d.init_weightså  s   € Ü”GÔ-°fÔ=¸tÕDr_   r³   r´   c           
      ó,  — | j                  |«      | j                  | j                  | j                  | j	                  |«      |¬«      «      «      z   }|| j                  | j                  | j                  | j                  |«      «      «      «      z   }|S )NrÝ   )	r  r  r  rÑ   r  r  r  rö   r  )r\   r³   r´   s      r]   rÒ   zTransformerBlock2d.forwardè  so   € Ø�M‰M˜!Ó˜tŸ™¨t¯x©x¸¿	¹	À$Ç*Á*ÈQÃ-Ð`n¸	Ó8oÓ/pÓqÑqˆØ�—‘ §¡¨¯©°$·*±*¸Q³-Ó)@Ó AÓBÑBˆØˆr_   ©rv   rZ   )r`   ra   rb   rc   r7   rd   r   r	   rg   r¨   rh   r  rÃ   rÕ   rÒ   rÖ   r×   s   @r]   r   r   �  s¯   ø„ ñð Ø.2Ù)>Ó)@Ø!ØØñ;Sàð;Sð ð;Sð ð	;Sð
 " (Ñ+ð;Sð 'ð;Sð õ;SñzE 3ð E°ó Eñ˜Ÿ™ð °xÀÇÁÑ7Mð ÐY^×YeÑYe÷ r_   r   c                 óÞ  — t        | t        j                  «      �rÒ|dk(  rbt        j                  j	                  | j
                  d¬«       | j                  �*t        j                  j                  | j                  «       yy|dk(  rNt        | j
                  d¬«       | j                  �*t        j                  j                  | j                  «       yy|dk(  r`t        j                  j                  | j
                  «       | j                  �*t        j                  j                  | j                  «       yy| j                  d   | j                  d   z  | j                  z  }|| j                  z  }t        j                  j	                  | j
                  dt        j                  d	|z  «      «       | j                  �*t        j                  j                  | j                  «       yyy)
z&Initialize convolution module weights.rð   rñ   rò   Nrô   rõ   r   r-   g       @)r÷   r   rª   rø   rù   rú   rG   rû   r#   rü   ro   Úout_channelsÚgroupsÚmathÚsqrt)rì   rí   rî   Úfan_outs       r]   Ú
_init_convr!  î  sU  € ä�&œ"Ÿ)™)Õ$Ø�XÒÜ�G‰G�O‰O˜FŸM™M¨sˆOÔ3Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'à�~Ò%Ü˜VŸ]™]°Õ4Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'à�Ò&Ü�G‰G×"Ñ" 6§=¡=Ô1Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'ð ×(Ñ(¨Ñ+¨f×.@Ñ.@ÀÑ.CÑCÀf×FYÑFYÑYˆGØ˜Ÿ™Ñ%ˆGÜ�G‰G�O‰O˜FŸM™M¨1¬d¯i©i¸¸g¹Ó.FÔGØ�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'ð% %r_   rp   Úchannelsc                 ó&   — | sy|| z  dk(  sJ ‚|| z  S )z3Calculate number of groups for grouped convolution.r-   r   ri   )rp   r"  s     r]   Ú
num_groupsr$    s(   € áØð ˜*Ñ$¨Ò)Ð)Ð)Ø˜:Ñ%Ð%r_   c                   ó¨   ‡ — e Zd ZdZdd e«       dddfdededed	eeef   d
edefˆ fd„Zdde	ddfd„Z
dej                  dej                  fd„Zˆ xZS )ÚMbConvBlockzGPre-Norm Conv Block - 1x1 - kxk - 1x1, w/ inverted bottleneck (expand).r-   ©r-   r-   rB   NÚin_chsÚout_chsrå   Údilationr  r  c	                 ó  •— ||dœ}	t         ‰| �  «        t        t        |j                  |j
                  «      |j                  ¬«      }
t        |j                  r|n||j                  z  «      }t        |j                  |«      }|dk(  r5t        ||f|j                  |j                  |j                  dœ|	¤Ž| _        nt#        j$                  «       | _        |j&                  dv sJ ‚d\  }}}|j&                  dk(  r||d   }}n|j&                  d	k(  r||d   }}n||d
   }} |
|fd|j(                  i|	¤Ž| _        |dkD  r*t        ||f|j,                  |j                  dœ|	¤Ž| _        nt#        j$                  «       | _        t1        ||dfd|i|	¤Ž| _         |
|fi |	¤Ž| _        t1        |||j6                  f||||j                  dœ|	¤Ž| _        i }t;        |j<                  t>        «      rV|j<                  dk(  s|j<                  dk(  r8|j@                  |d<   tC        |jD                  |j                  r|n|z  «      |d<   |jF                  r4tI        |j<                  |fi |¤|	¤Ž| _%         |
|fi |	¤Ž| _&        d| _'        n3d| _%         |
|fi |	¤Ž| _&        tI        |j<                  |fi |¤|	¤Ž| _'        t1        ||dfd|j                  i|	¤Ž| _(        |dkD  rtS        |«      | _*        yt#        j$                  «       | _*        y)a  
        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            stride: Stride for conv.
            dilation: Dilation for conv.
            cfg: Convolution block configuration.
            drop_path: Drop path rate.
        r¢   r  rŒ   )rF   rG   rw   )rç   Ú1x1rs   )r-   r-   r-   rç   r-   r,  r   Ú	apply_act)rF   rw   rå   )rå   r*  r  rw   ry   ÚecarR   Úrd_channelsNrG   rB   )+r§   r¨   r   r    rT   rR   rX   r&   rm   r>   r$  rp   rà   rF   rr   rw   r  r   ré   rt   rq   Úpre_normru   r  r!   Ú	conv1_1x1r  ro   Ú	conv2_kxkr÷   rz   rh   r|   rd   r~   rx   r   Úse_earlyr  ry   Ú	conv3_1x1r   r  )r\   r(  r)  rå   r*  r  r  r£   r¤   r°   Únorm_act_layerÚmid_chsr  Ústride_poolÚstride_1Ústride_2Ú
dilation_2Úattn_kwargsr²   s                     €r]   r¨   zMbConvBlock.__init__  sâ  ø€ ð( ¨Ñ/ˆÜ‰ÑÔÜ Ô!3°C·N±NÀCÇMÁMÓ!RÐX[×XdÑXdÔeˆÜ ¨S×->Ò->¡'ÀFÈc×N^ÑN^Ñ!^Ó_ˆÜ˜CŸN™N¨GÓ4ˆà�QŠ;Ü(Ø˜ðkØ+.¯=©=¸s¿¹ÐX[×XcÑXcñkØgiñkˆD�Mô ŸK™K›MˆDŒMà�‰Ð"7Ñ7Ð7Ð7Ø*1Ñ'ˆ�X˜xØ�?‰?˜fÒ$à&,¨h°q©k˜‰Kà�_‰_ Ò%à#)¨8°A©;�j‰Hà#)¨8°A©;�jˆHá& vÑP¸×9IÑ9IÐPÈRÑPˆŒØ˜Š?Ü$ V¨VÐs¸s×?WÑ?WÐad×alÑalÑsÐprÑsˆD�IäŸ™›ˆDŒIÜ& v¨w¸ÑQÀ(ÐQÈbÑQˆŒÙ# GÑ2¨rÑ2ˆŒ
ä&ØØØ�O‰Oð	
ð ØØØ—K‘Kñ	
ð ñ	
ˆŒð ˆÜ�c—n‘n¤cÔ*Ø�~‰~ Ò%¨¯©¸5Ò)@Ø+.×+=Ñ+=�˜KÑ(Ü-0°·±Èc×N_ÒN_Á7ÐelÑ1mÓ-n�˜MÑ*ð �>Š>Ü'¨¯©¸ÑUÀ;ÐUÐRTÑUˆDŒMÙ'¨Ñ6°2Ñ6ˆDŒJØˆD�Gà ˆDŒMÙ'¨Ñ6°2Ñ6ˆDŒJÜ! #§.¡.°'ÑO¸[ÐOÈBÑOˆDŒGä& w°¸ÑWÀÇÁÐWÐTVÑWˆŒØ09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�r_   rî   rµ   c                 ó:   — t        t        t        |¬«      | «       y r  ©r1   r   r!  r  s     r]   r  zMbConvBlock.init_weightse  ó   € Ü”GœJ¨vÔ6¸Õ=r_   r³   c                 ó²  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  |«      }| j                  |«      |z   }|S rZ   )r  r0  r  r1  r  r2  r3  r  ry   r4  r  ©r\   r³   r  s      r]   rÒ   zMbConvBlock.forwardh  s¼   € Ø—=‘= Ó#ˆØ�M‰M˜!ÓˆØ�I‰I�a‹Lˆð �N‰N˜1ÓˆØ�J‰J�q‹Mˆð �N‰N˜1ÓˆØ�=‰=Ð$Ø—‘˜aÓ ˆAØ�J‰J�q‹MˆØ�7‰7ÐØ—‘˜“
ˆAð �N‰N˜1ÓˆØ�N‰N˜1Ó Ñ(ˆØˆr_   r  )r`   ra   rb   rc   r6   rd   r   rg   r¨   rh   r  rÃ   rÕ   rÒ   rÖ   r×   s   @r]   r&  r&    s¡   ø„ ÙQð Ø(.Ù"0Ó"2Ø!ØØñPRàðPRð ðPRð ð	PRð
 ˜C ˜H‘oðPRð  ðPRð õPRñd> 3ð >°ó >ð˜Ÿ™ð ¨%¯,©,÷ r_   r&  c                   óª   ‡ — e Zd ZdZdddd e«       ddddf	ded	ee   d
ededeeef   dedede	fˆ fd„Z
dej                  dej                  fd„Zˆ xZS )ÚConvNeXtBlockzConvNeXt Block.Né   r-   r'  TrB   r(  r)  ro   rå   r*  r  Úconv_mlpr  c           	      ó¸  •— |	|
dœ}t         ‰| �  «        |xs |}t        |j                  «      }|r1t	        t        |j                  «      |j                  ¬«      }t        }nd|j                  v sJ ‚t        }t        }|| _        |dk(  rt        ||fi |¤Ž| _        nH||k7  r*t        j                  ||fd|j                   dœ|¤Ž| _        nt        j"                  «       | _        |j$                  dv sJ ‚d\  }}|j$                  d	k(  r|}n|}|dk(  rt        ||fd
|j&                  i|¤Ž| _        nt        j"                  «       | _        t+        ||f|||d   d|j                   dœ|¤Ž| _         ||fi |¤Ž| _         ||t1        |j2                  |z  «      f|j                   |dœ|¤Ž| _        |r=|j6                  rt9        ||j6                  fi |¤Žnt        j"                  «       | _        n<|j6                  rt=        ||j6                  fi |¤Žnt        j"                  «       | _        |dkD  rt?        |«      | _         yt        j"                  «       | _         y)ay  
        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            kernel_size: Kernel size for depthwise conv.
            stride: Stride for conv.
            dilation: Dilation for conv.
            cfg: Convolution block configuration.
            conv_mlp: Whether to use convolutional MLP.
            drop_path: Drop path rate.
        r¢   r  rU   rŒ   r-   )ro   rG   )rç   rs   r'  rç   rF   T)ro   rå   r*  Ú	depthwiserG   )rG   rR   rB   N)!r§   r¨   r   rR   r   r   rT   rX   r   r   r   Úuse_conv_mlprà   r  r   rª   rr   ré   rt   ru   r  r!   Úconv_dwr  rd   r>   rö   rP   r   Úlsr   r   r  )r\   r(  r)  ro   rå   r*  r  rD  r  r£   r¤   r°   rR   rT   Ú	mlp_layerr7  Ú	stride_dwr²   s                    €r]   r¨   zConvNeXtBlock.__init__‚  s.  ø€ ð0 ¨Ñ/ˆÜ‰ÑÔØÒ#˜VˆÜ! #§-¡-Ó0ˆ	ÙÜ ¤°·±Ó!?ÀSÇ\Á\ÔRˆJÜ‰Ià #§.¡.Ñ0Ð0Ð0Ü"ˆJÜˆIØ$ˆÔà�QŠ;Ü(¨°Ñ?¸BÑ?ˆD�MØ�wÒÜŸI™I f¨gÐaÀ1È3Ï?É?ÑaÐ^`ÑaˆD�MäŸK™K›MˆDŒMà�‰ .Ñ0Ð0Ð0Ø!%Ñˆ�Yà�?‰?˜fÒ$Ø ‰KàˆIà˜!ÒÜ$ V¨VÑ^¸s×?WÑ?WÐ^Ð[]Ñ^ˆD�IäŸ™›ˆDŒIä$ØØð	
ð $ØØ˜a‘[ØØ—‘ñ	
ð ñ	
ˆŒñ ˜wÑ-¨"Ñ-ˆŒ	ÙØÜ�× Ñ  7Ñ*Ó+ð
ð —‘Øñ	
ð
 ñ
ˆŒñ ØFIÇoÂo”l 7¨C¯O©OÑB¸rÒBÔ[]×[fÑ[fÓ[hˆD�GàDGÇOÂO”j ¨#¯/©/Ñ@¸RÒ@ÔY[×YdÑYdÓYfˆDŒGØ09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�r_   r³   rµ   c                 óÊ  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  r4| j	                  |«      }| j                  |«      }| j                  |«      }n[|j                  dddd«      }| j	                  |«      }| j                  |«      }| j                  |«      }|j                  dddd«      }| j                  |«      |z   }|S ©Nr   rŒ   rn   r-   )	r  r  rH  rG  r  rö   rI  Úpermuter  r@  s      r]   rÒ   zConvNeXtBlock.forwardÓ  sÁ   € Ø—=‘= Ó#ˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ×ÒØ—	‘	˜!“ˆAØ—‘˜“ˆAØ—‘˜“
‰Aà—	‘	˜!˜Q  1Ó%ˆAØ—	‘	˜!“ˆAØ—‘˜“ˆAØ—‘˜“
ˆAØ—	‘	˜!˜Q  1Ó%ˆAà�N‰N˜1Ó Ñ(ˆØˆr_   )r`   ra   rb   rc   r6   rd   r   r   rf   rg   r¨   rÃ   rÕ   rÒ   rÖ   r×   s   @r]   rB  rB    s³   ø„ Ùð
 &*Ø ØØ(.Ù"0Ó"2Ø!Ø!ØØñORàðORð ˜c‘]ðORð ð	ORð
 ðORð ˜C ˜H‘oðORð  ðORð ðORð õORðb˜Ÿ™ð ¨%¯,©,÷ r_   rB  r³   rL   c                 ól  — | j                   \  }}}}t        ||d   z  dk(  d|› d|d   › d�«       t        ||d   z  dk(  d|› d|d   › d�«       | j                  |||d   z  |d   ||d   z  |d   |«      } | j                  ddddd	d
«      j	                  «       j                  d|d   |d   |«      }|S )z'Partition into non-overlapping windows.r   úheight (ú) must be divisible by window (ú)r-   úwidth (rn   rŒ   é   r�   r·   ©r½   r'   r¾   rN  rÇ   )r³   rL   rË   rÌ   rÍ   r�   Úwindowss          r]   Úwindow_partitionrW  æ  sì   € à—‘�J€A€qˆ!ˆQÜˆA�˜A‘Ñ !Ñ# x°¨sÐ2QÐR]Ð^_ÑR`ÐQaÐabÐ%cÔdÜˆA�˜A‘Ñ !Ñ# w¨q¨cÐ1PÐQ\Ð]^ÑQ_ÐP`Ð`aÐ%bÔcØ	�‰ˆq�!�{ 1‘~Ñ% {°1¡~°q¸KÈ¹NÑ7JÈKÐXYÉNÐ\]Ó^€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀÈAÁÐP[Ð\]ÑP^Ð`aÓb€GØ€Nr_   rV  Úimg_sizec                 óê   — |\  }}| j                   d   }| j                  d||d   z  ||d   z  |d   |d   |«      }|j                  dddddd«      j                  «       j                  d|||«      }|S )zReverse window partition.r·   r   r-   rn   rŒ   rT  r�   ©r½   r¾   rN  rÇ   ©rV  rL   rX  rÌ   rÍ   r�   r³   s          r]   Úwindow_reverser\  ð  sˆ   € ð �D€A€qØ�‰�bÑ€AØ�‰�R˜˜k¨!™nÑ,¨a°;¸q±>Ñ.AÀ;ÈqÁ>ÐS^Ð_`ÑSaÐcdÓe€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°b¸!¸QÀÓB€AØ€Hr_   rM   c           	      óh  — | j                   \  }}}}t        ||d   z  dk(  d|› d|d   › �«       t        ||d   z  dk(  d|› d|d   › �«       | j                  ||d   ||d   z  |d   ||d   z  |«      } | j                  dddddd	«      j	                  «       j                  d
|d   |d   |«      }|S )z6Partition into overlapping windows with grid striding.r   úheight ú must be divisible by grid r-   úwidth rŒ   rT  rn   r�   r·   rU  )r³   rM   rË   rÌ   rÍ   r�   rV  s          r]   Úgrid_partitionra  ú  sÞ   € à—‘�J€A€qˆ!ˆQÜˆA�	˜!‘Ñ Ñ! W¨Q¨CÐ/JÈ9ÐUVÉ<È.Ð#YÔZÜˆA�	˜!‘Ñ Ñ! V¨A¨3Ð.IÈ)ÐTUÉ,ÈÐ#XÔYØ	�‰ˆq�)˜A‘,  Y¨q¡\Ñ 1°9¸Q±<ÀÀiÐPQÁlÑARÐTUÓV€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀ	È!ÁÈiÐXYÉlÐ\]Ó^€GØ€Nr_   c                 óê   — |\  }}| j                   d   }| j                  d||d   z  ||d   z  |d   |d   |«      }|j                  dddddd«      j                  «       j                  d|||«      }|S )zReverse grid partition.r·   r   r-   rn   rT  rŒ   r�   rZ  ©rV  rM   rX  rÌ   rÍ   r�   r³   s          r]   Úgrid_reverserd    s†   € ð �D€A€qØ�‰�bÑ€AØ�‰�R˜˜i¨™lÑ*¨A°¸1±Ñ,=¸yÈ¹|ÈYÐWXÉ\Ð[\Ó]€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°b¸!¸QÀÓB€AØ€Hr_   r  c                 óè   — d}| j                   dk(  rt        t        || j                  ¬«      }|S | j                   dk(  rt        t        |¬«      }|S | j                   dk(  rt        t
        |¬«      }|S )z,Get relative position class based on config.Nrö   )rL   Ú
hidden_dimrG   )rL   Úbias_tf)rH   r   r(   rJ   r)   r*   )r  rL   rŸ   s      r]   Úget_rel_pos_clsrh    su   € à€KØ
×Ñ˜5Ò Üœi°[ÈSÏ_É_Ô]ˆð
 Ðð	 
×	Ñ	˜VÒ	#Üœj°kÔBˆð Ðð 
×	Ñ	˜YÒ	&Üœl¸ÔDˆØÐr_   c            	       óV   ‡ — e Zd ZdZd e«       dddfdedededefˆ fd	„Zd
„ Z	d„ Z
ˆ xZS )ÚPartitionAttentionClzRGrid or Block partition + Attn + FFN.

    NxC 'channels last' tensor layout.
    ÚblockrB   Nr�   Úpartition_typer  r  c           
      ó*  •— ||dœ}t         ‰| �  «        t        t        |j                  «      |j
                  ¬«      }t        |j                  «      }	|dk(  | _        t        | j                  r|j                  n|j                  «      | _        t        || j                  «      }
 ||fi |¤Ž| _        t        ||f|j                   |j"                  |j$                  |
|j&                  |j(                  dœ|¤Ž| _        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _        |dkD  rt7        |«      nt1        j2                  «       | _         ||fi |¤Ž| _        t=        d|t?        ||j@                  z  «      |	|j(                  dœ|¤Ž| _!        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _"        |dkD  rt7        |«      | _#        y t1        j2                  «       | _#        y )	Nr¢   r  rk  ©r;   rG   r<   rŸ   rC   rD   rP   rB   r  ri   )$r§   r¨   r   r   rV   rX   r   rR   Úpartition_blockr$   rL   rM   Úpartition_sizerh  r  rÙ   r;   rA   r<   rC   rD   rÑ   rP   r   r   ré   r  r   r  r  r   rd   r>   rö   r  r  ©r\   r�   rl  r  r  r£   r¤   r°   rT   rR   rŸ   r²   s              €r]   r¨   zPartitionAttentionCl.__init__   sÂ  ø€ ð ¨Ñ/ˆÜ‰ÑÔÜœ^¨C×,=Ñ,=Ó>ÀCÇLÁLÔQˆ
Ü! #§-¡-Ó0ˆ	à-°Ñ8ˆÔÜ'¸4×;OÒ;O¨¯ªÐUX×UbÑUbÓcˆÔÜ% c¨4×+>Ñ+>Ó?ˆá Ñ* rÑ*ˆŒ
ÜØØð

ð —\‘\Ø—‘Ø—~‘~Ø#Ø—m‘mØ—m‘mñ

ð ñ

ˆŒ	ð JMÏÊ”:˜cÑE¨s¯©ÐEÀ"ÒEÔ^`×^iÑ^iÓ^kˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  c×&6Ñ&6Ñ 6Ó7ØØ—‘ñ	
ð
 ñ
ˆŒð JMÏÊ”:˜cÑE¨s¯©ÐEÀ"ÒEÔ^`×^iÑ^iÓ^kˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r_   c                 ó0  — |j                   dd }| j                  rt        || j                  «      }nt	        || j                  «      }| j                  |«      }| j                  rt        || j                  |«      }|S t        || j                  |«      }|S )Nr-   rn   )r½   ro  rW  rp  ra  rÑ   r\  rd  ©r\   r³   rX  Úpartitioneds       r]   Ú_partition_attnz$PartitionAttentionCl._partition_attnL  s‹   € Ø—7‘7˜1˜Q�<ˆØ×ÒÜ*¨1¨d×.AÑ.AÓB‰Kä(¨¨D×,?Ñ,?Ó@ˆKà—i‘i Ó,ˆà×ÒÜ˜{¨D×,?Ñ,?ÀÓJˆAð ˆô ˜[¨$×*=Ñ*=¸xÓHˆAØˆr_   c           
      ó
  — || j                  | j                  | j                  | j                  |«      «      «      «      z   }|| j	                  | j                  | j                  | j                  |«      «      «      «      z   }|S rZ   ©r  r  ru  r  r  r  rö   r  rë   s     r]   rÒ   zPartitionAttentionCl.forward[  óc   € Ø�—‘ §¡¨×)=Ñ)=¸d¿j¹jÈ»mÓ)LÓ MÓNÑNˆØ�—‘ §¡¨¯©°$·*±*¸Q³-Ó)@Ó AÓBÑBˆØˆr_   )r`   ra   rb   rc   r7   rd   rh   rg   r¨   ru  rÒ   rÖ   r×   s   @r]   rj  rj    sW   ø„ ñð #*Ù)>Ó)@Ø!ØØñ*Sàð*Sð  ð*Sð 'ð	*Sð
 õ*SòXör_   rj  c                   ó´   ‡ — e Zd ZdZ e«       dddfdededefˆ fd„Zdej                  d	ej                  fd
„Z
dej                  d	ej                  fd„Zˆ xZS )ÚParallelPartitionAttentionzQExperimental. Grid and Block partition + single FFN.

    NxC tensor layout.
    rB   Nr�   r  r  c           
      óÔ  •— ||dœ}t         ‰
| �  «        |dz  dk(  sJ ‚t        t        |j                  «      |j
                  ¬«      }t        |j                  «      }|j                  |j                  k(  sJ ‚t        |j                  «      | _        t        || j                  «      }	 ||fi |¤Ž| _        t        ||dz  f|j                  |j                   |j"                  |	|j$                  |j&                  dœ|¤Ž| _        t        ||dz  f|j                  |j                   |j"                  |	|j$                  |j&                  dœ|¤Ž| _        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _        |dkD  rt7        |«      nt1        j2                  «       | _         ||fi |¤Ž| _        t=        d
|t?        ||j@                  z  «      |||j&                  dœ|¤Ž| _!        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _"        |dkD  rt7        |«      | _#        y	t1        j2                  «       | _#        y	)z’
        Args:
            dim: Input dimension.
            cfg: Transformer block configuration.
            drop_path: Drop path rate.
        r¢   rŒ   r   r  rn  rP   rB   )r	  r
  Úout_featuresrR   r  Nri   )$r§   r¨   r   r   rV   rX   r   rR   rL   rM   r$   rp  rh  r  rÙ   r;   rA   r<   rC   rD   Ú
attn_blockÚ	attn_gridrP   r   r   ré   r  r   r  r  r   rd   r>   rö   r  r  )r\   r�   r  r  r£   r¤   r°   rT   rR   rŸ   r²   s             €r]   r¨   z#ParallelPartitionAttention.__init__g  s   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ�Q‰w˜!Š|Ðˆ|Üœ^¨C×,=Ñ,=Ó>ÀCÇLÁLÔQˆ
Ü! #§-¡-Ó0ˆ	à�‰ #§-¡-Ò/Ð/Ð/Ü'¨¯©Ó8ˆÔÜ% c¨4×+>Ñ+>Ó?ˆá Ñ* rÑ*ˆŒ
Ü%ØØ�1‰Hð

ð —\‘\Ø—‘Ø—~‘~Ø#Ø—m‘mØ—m‘mñ

ð ñ

ˆŒô %ØØ�1‰Hð

ð —\‘\Ø—‘Ø—~‘~Ø#Ø—m‘mØ—m‘mñ

ð ñ

ˆŒð JMÏÊ”:˜cÑE¨s¯©ÐEÀ"ÒEÔ^`×^iÑ^iÓ^kˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  c×&6Ñ&6Ñ 6Ó7ØØØ—‘ñ
ð ñ
ˆŒð JMÏÊ”:˜cÑE¨s¯©ÐEÀ"ÒEÔ^`×^iÑ^iÓ^kˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r_   r³   rµ   c                 óJ  — |j                   dd }t        || j                  «      }| j                  |«      }t	        || j                  |«      }t        || j                  «      }| j                  |«      }t        || j                  |«      }t        j                  ||gd¬«      S )Nr-   rn   r·   r¸   )
r½   rW  rp  r}  r\  ra  r~  rd  rÃ   Úcat)r\   r³   rX  Úpartitioned_blockÚx_windowÚpartitioned_gridÚx_grids          r]   ru  z*ParallelPartitionAttention._partition_attn¥  s—   € Ø—7‘7˜1˜Q�<ˆä,¨Q°×0CÑ0CÓDÐØ ŸO™OÐ,=Ó>ÐÜ!Ð"3°T×5HÑ5HÈ(ÓSˆä)¨!¨T×-@Ñ-@ÓAÐØŸ>™>Ð*:Ó;ÐÜÐ.°×0CÑ0CÀXÓNˆä�y‰y˜( FÐ+°Ô4Ð4r_   c           
      ó
  — || j                  | j                  | j                  | j                  |«      «      «      «      z   }|| j	                  | j                  | j                  | j                  |«      «      «      «      z   }|S rZ   rw  rë   s     r]   rÒ   z"ParallelPartitionAttention.forward²  rx  r_   )r`   ra   rb   rc   r7   rd   rg   r¨   rÃ   rÕ   ru  rÒ   rÖ   r×   s   @r]   rz  rz  a  su   ø„ ññ *?Ó)@Ø!ØØñ<Sàð<Sð 'ð<Sð õ	<Sð|5 §¡ð 5°%·,±,ó 5ð˜Ÿ™ð ¨%¯,©,÷ r_   rz  c           	      ól  — | j                   \  }}}}t        ||d   z  dk(  d|› d|d   › d�«       t        ||d   z  dk(  d|› d|d   › d�«       | j                  ||||d   z  |d   ||d   z  |d   «      } | j                  ddddd	d
«      j	                  «       j                  d||d   |d   «      }|S )z#Partition windows for NCHW tensors.r   rP  rQ  rR  r-   rS  rŒ   rT  rn   r�   r·   rU  )r³   rL   rË   r�   rÌ   rÍ   rV  s          r]   Úwindow_partition_nchwr‡  ¸  sê   € à—‘�J€A€qˆ!ˆQÜˆA�˜A‘Ñ !Ñ# x°¨sÐ2QÐR]Ð^_ÑR`ÐQaÐabÐ%cÔdÜˆA�˜A‘Ñ !Ñ# w¨q¨cÐ1PÐQ\Ð]^ÑQ_ÐP`Ð`aÐ%bÔcØ	�‰ˆq�!�Q˜+ a™.Ñ(¨+°a©.¸!¸{È1¹~Ñ:MÈ{Ð[\É~Ó^€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀÀ;ÈqÁ>ÐS^Ð_`ÑSaÓb€GØ€Nr_   c           	      óê   — |\  }}| j                   d   }| j                  d||d   z  ||d   z  ||d   |d   «      }|j                  dddddd«      j                  «       j                  d|||«      }|S )z*Reverse window partition for NCHW tensors.r-   r·   r   rn   rT  rŒ   r�   rZ  r[  s          r]   Úwindow_reverse_nchwr‰  Â  sˆ   € ð �D€A€qØ�‰�aÑ€AØ�‰�R˜˜k¨!™nÑ,¨a°;¸q±>Ñ.AÀ1ÀkÐRSÁnÐVaÐbcÑVdÓe€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°b¸!¸QÀÓB€AØ€Hr_   c           
      óh  — | j                   \  }}}}t        ||d   z  dk(  d|› d|d   › �«       t        ||d   z  dk(  d|› d|d   › �«       | j                  |||d   ||d   z  |d   ||d   z  «      } | j                  dddddd	«      j	                  «       j                  d
||d   |d   «      }|S )z Grid partition for NCHW tensors.r   r^  r_  r-   r`  rn   r�   rŒ   rT  r·   rU  )r³   rM   rË   r�   rÌ   rÍ   rV  s          r]   Úgrid_partition_nchwr‹  Ì  sÞ   € à—‘�J€A€qˆ!ˆQÜˆA�	˜!‘Ñ Ñ! W¨Q¨CÐ/JÈ9ÐUVÉ<È.Ð#YÔZÜˆA�	˜!‘Ñ Ñ! V¨A¨3Ð.IÈ)ÐTUÉ,ÈÐ#XÔYØ	�‰ˆq�!�Y˜q‘\ 1¨	°!©Ñ#4°iÀ±lÀAÈÐSTÉÑDUÓV€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀÀ9ÈQÁ<ÐQZÐ[\ÑQ]Ó^€GØ€Nr_   c           	      óê   — |\  }}| j                   d   }| j                  d||d   z  ||d   z  ||d   |d   «      }|j                  dddddd«      j                  «       j                  d|||«      }|S )z(Reverse grid partition for NCHW tensors.r-   r·   r   rn   rT  r�   rŒ   rZ  rc  s          r]   Úgrid_reverse_nchwr�  Ö  s‡   € ð �D€A€qØ�‰�aÑ€AØ�‰�R˜˜i¨™lÑ*¨A°¸1±Ñ,=¸qÀ)ÈAÁ,ÐPYÐZ[ÑP\Ó]€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°b¸!¸QÀÓB€AØ€Hr_   c            	       óº   ‡ — e Zd ZdZd e«       dddfdedededefˆ fd	„Zd
e	j                  de	j                  fd„Zd
e	j                  de	j                  fd„Zˆ xZS )ÚPartitionAttention2dzHGrid or Block partition + Attn + FFN.

    '2D' NCHW tensor layout.
    rk  rB   Nr�   rl  r  r  c           
      ó*  •— ||dœ}t         ‰| �  «        t        t        |j                  «      |j
                  ¬«      }t        |j                  «      }	|dk(  | _        t        | j                  r|j                  n|j                  «      | _        t        || j                  «      }
 ||fi |¤Ž| _        t        ||f|j                   |j"                  |j$                  |
|j&                  |j(                  dœ|¤Ž| _        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _        |dkD  rt7        |«      nt1        j2                  «       | _         ||fi |¤Ž| _        t=        d	|t?        ||j@                  z  «      |	|j(                  dœ|¤Ž| _!        |j,                  rt/        |fd|j,                  i|¤Žnt1        j2                  «       | _"        |dkD  rt7        |«      | _#        yt1        j2                  «       | _#        y)
zÒ
        Args:
            dim: Input dimension.
            partition_type: Partition type ('block' or 'grid').
            cfg: Transformer block configuration.
            drop_path: Drop path rate.
        r¢   r  rk  rn  rP   rB   r  Nri   )$r§   r¨   r   r   rT   rX   r   rR   ro  r$   rL   rM   rp  rh  r  r›   r;   rA   r<   rC   rD   rÑ   rP   r   r   ré   r  r   r  r  r   rd   r>   rö   r  r  rq  s              €r]   r¨   zPartitionAttention2d.__init__æ  sÀ  ø€ ð  ¨Ñ/ˆÜ‰ÑÔÜœ^¨C¯N©NÓ;ÀÇÁÔNˆ
Ü! #§-¡-Ó0ˆ	à-°Ñ8ˆÔÜ'¸4×;OÒ;O¨¯ªÐUX×UbÑUbÓcˆÔÜ% c¨4×+>Ñ+>Ó?ˆá Ñ* rÑ*ˆŒ
ÜØØð

ð —\‘\Ø—‘Ø—~‘~Ø#Ø—m‘mØ—m‘mñ

ð ñ

ˆŒ	ð LOÏ?Ê?”< ÑG°·±ÐGÀBÒGÔ`b×`kÑ`kÓ`mˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  c×&6Ñ&6Ñ 6Ó7ØØ—‘ñ	
ð
 ñ
ˆŒð LOÏ?Ê?”< ÑG°·±ÐGÀBÒGÔ`b×`kÑ`kÓ`mˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r_   r³   rµ   c                 ó0  — |j                   dd  }| j                  rt        || j                  «      }nt	        || j                  «      }| j                  |«      }| j                  rt        || j                  |«      }|S t        || j                  |«      }|S )Nr¹   )r½   ro  r‡  rp  r‹  rÑ   r‰  r�  rs  s       r]   ru  z$PartitionAttention2d._partition_attn  s‹   € Ø—7‘7˜2˜3�<ˆØ×ÒÜ/°°4×3FÑ3FÓG‰Kä-¨a°×1DÑ1DÓEˆKà—i‘i Ó,ˆà×ÒÜ# K°×1DÑ1DÀhÓOˆAð ˆô " +¨t×/BÑ/BÀHÓMˆAØˆr_   c           
      ó
  — || j                  | j                  | j                  | j                  |«      «      «      «      z   }|| j	                  | j                  | j                  | j                  |«      «      «      «      z   }|S rZ   rw  rë   s     r]   rÒ   zPartitionAttention2d.forward(  rx  r_   )r`   ra   rb   rc   r7   rd   rh   rg   r¨   rÃ   rÕ   ru  rÒ   rÖ   r×   s   @r]   r�  r�  à  sƒ   ø„ ñð #*Ù)>Ó)@Ø!ØØñ1Sàð1Sð  ð1Sð 'ð	1Sð
 õ1Sðf §¡ð °%·,±,ó ð˜Ÿ™ð ¨%¯,©,÷ r_   r�  c                   ól   ‡ — e Zd ZdZd e«        e«       dddfdedededed	ed
efˆ fd„Zdd„Z	d„ Z
ˆ xZS )ÚMaxxVitBlockz;MaxVit conv, window partition + FFN , grid partition + FFN.r-   rB   Nr�   rž   rå   r•   r–   r  c	                 óL  •— ||dœ}	t         ‰| �  «        |j                  | _        |j                  dk(  rt
        nt        }
 |
||f|||dœ|	¤Ž| _        t        d|||dœ|	¤Ž}| j                  rt        nt        }|j                  rdn |di |¤Ž| _         |dddi|¤Ž| _        y)	a^  Initialize MaxxVitBlock.

        Args:
            dim: Input channel dimension.
            dim_out: Output channel dimension.
            stride: Stride for downsampling.
            conv_cfg: Configuration for convolutional blocks.
            transformer_cfg: Configuration for transformer blocks.
            drop_path: Drop path rate.
        r¢   r€   ©rå   r  r  ©r�   r  r  Nrl  Úgridri   )r§   r¨   rO   Ú	nchw_attnrl   rB  r&  ÚconvÚdictr�  rj  rN   r}  r~  )r\   r�   rž   rå   r•   r–   r  r£   r¤   r°   Úconv_clsr;  Úpartition_layerr²   s                €r]   r¨   zMaxxVitBlock.__init__1  s­   ø€ ð* ¨Ñ/ˆÜ‰ÑÔØ(×6Ñ6ˆŒà$,×$7Ñ$7¸:Ò$E•=Ì;ˆÙ˜S 'Ðb°&¸hÐR[ÑbÐ_aÑbˆŒ	äÐW˜w¨OÀyÑWÐTVÑWˆØ26·.².Õ.ÔFZˆØ"1×"?Ò"?™$Á_ÑEcÐWbÑEcˆŒÙ(ÑN¸ÐNÀ+ÑNˆ�r_   c                 óú   — | j                   �%t        t        t        |¬«      | j                   «       t        t        t        |¬«      | j                  «       t        t        t
        |¬«      | j                  «       y r  )r}  r1   r   rþ   r~  r!  rš  r  s     r]   r  zMaxxVitBlock.init_weightsR  sM   € Ø�?‰?Ð&ÜœÔ 1¸&ÔAÀ4Ç?Á?ÔSÜ”GÔ-°fÔ=¸t¿~¹~ÔNÜ”GœJ¨vÔ6¸¿	¹	ÕBr_   c                 ó  — | j                  |«      }| j                  s|j                  dddd«      }| j                  �| j                  |«      }| j	                  |«      }| j                  s|j                  dddd«      }|S rM  )rš  r™  rN  r}  r~  rë   s     r]   rÒ   zMaxxVitBlock.forwardX  sp   € à�I‰I�a‹Lˆà�~Š~Ø—	‘	˜!˜Q  1Ó%ˆAØ�?‰?Ð&Ø—‘ Ó"ˆAØ�N‰N˜1ÓˆØ�~Š~Ø—	‘	˜!˜Q  1Ó%ˆAØˆr_   r  )r`   ra   rb   rc   r6   r7   rd   rg   r¨   r  rÒ   rÖ   r×   s   @r]   r”  r”  .  sr   ø„ ÙEð Ù'5Ó'7Ù5JÓ5LØ!ØØñOàðOð ðOð ð	Oð
 %ðOð 3ðOð õOóBCör_   r”  c                   ó®   ‡ — e Zd ZdZdd e«        e«       dddfdededed	ed
ededefˆ fd„Zdde	ddfd„Z
dej                  dej                  fd„Zˆ xZS )ÚParallelMaxxVitBlockzYMaxVit block with parallel cat(window + grid), one FF.

    Experimental timm block.
    r-   rŒ   rB   Nr�   rž   rå   Únum_convr•   r–   r  c
                 ó6  •— ||	dœ}
t         ‰| �  «        |j                  dk(  rt        nt        }|dkD  r> |||f|||dœ|
¤Žg}| |||f||dœ|
¤Žg|dz
  z  z  }t        j                  |Ž | _        n |||f|||dœ|
¤Ž| _        t        d|||dœ|
¤Ž| _	        y)	aa  
        Args:
            dim: Input dimension.
            dim_out: Output dimension.
            stride: Stride for first conv block.
            num_conv: Number of convolution blocks.
            conv_cfg: Convolution block configuration.
            transformer_cfg: Transformer block configuration.
            drop_path: Drop path rate.
        r¢   r€   r-   r–  )r  r  r—  Nri   )
r§   r¨   rl   rB  r&  r   r  rš  rz  rÑ   )r\   r�   rž   rå   r¢  r•   r–   r  r£   r¤   r°   rœ  Úconvsr²   s                €r]   r¨   zParallelMaxxVitBlock.__init__l  sÉ   ø€ ð, ¨Ñ/ˆÜ‰ÑÔà$,×$7Ñ$7¸:Ò$E•=Ì;ˆØ�aŠ<Ù˜c 7Ðc°6¸xÐS\ÑcÐ`bÑcÐdˆEØ‘h˜w¨ÐY°XÈÑYÐVXÑYÐZÐ^fÐijÑ^jÑkÑkˆEÜŸ™ uÐ-ˆD�Iá   gÐf°fÀ(ÐV_ÑfÐceÑfˆDŒIÜ.Ðk°7ÀÐ[dÑkÐhjÑkˆ�	r_   rî   rµ   c                 ó˜   — t        t        t        |¬«      | j                  «       t        t        t        |¬«      | j
                  «       y r  )r1   r   rþ   rÑ   r!  rš  r  s     r]   r  z!ParallelMaxxVitBlock.init_weightsŽ  s-   € Ü”GÔ-°fÔ=¸t¿y¹yÔIÜ”GœJ¨vÔ6¸¿	¹	ÕBr_   r³   c                 óš   — | j                  |«      }|j                  dddd«      }| j                  |«      }|j                  dddd«      }|S rM  )rš  rN  rÑ   rë   s     r]   rÒ   zParallelMaxxVitBlock.forward’  sI   € Ø�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr_   r  )r`   ra   rb   rc   r6   r7   rd   rg   r¨   rh   r  rÃ   rÕ   rÒ   rÖ   r×   s   @r]   r¡  r¡  f  s¨   ø„ ñð ØÙ'5Ó'7Ù5JÓ5LØ!ØØñ làð lð ð lð ð	 lð
 ð lð %ð lð 3ð lð õ lñDC 3ð C°ó Cð˜Ÿ™ð ¨%¯,©,÷ r_   r¡  c                   óÒ   ‡ — e Zd ZdZdddd e«        e«       dddf	ded	ed
ededeeef   dee	ee	   f   dededee
ee
   f   fˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚMaxxVitStagezEMaxxVit stage consisting of mixed convolution and transformer blocks.rŒ   rT  )é   r©  r�   rB   Nr(  r)  rå   ÚdepthÚ	feat_sizeÚblock_typesr–   r•   r  c           
      ó  •— |
|dœ}t         ‰| �  «        d| _        t        ||«      }g }t	        |«      D ]´  \  }}|dk(  r|nd}|dv sJ ‚|dk(  r1|j
                  dk(  rt        nt        }| |||f|||	|   dœ|¤Žgz  }nh|d	k(  r&t        ||«      }|t        ||f||||	|   d
œ|¤Žgz  }n=|dk(  r|t        ||f||||	|   dœ|¤Žgz  }n|dk(  r|t        ||f||||	|   dœ|¤Žgz  }|}Œ¶ t        j                  |Ž | _        y)aÒ  
        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            stride: Stride for first block.
            depth: Number of blocks in stage.
            feat_size: Feature map size.
            block_types: Block types ('C' for conv, 'T' for transformer, etc).
            transformer_cfg: Transformer block configuration.
            conv_cfg: Convolution block configuration.
            drop_path: Drop path rate(s).
        r¢   Fr   r-   )r�   r�   ÚMÚPMr�   r€   r–  r�   )rå   rŸ   r  r  r®  )rå   r•   r–   r  r¯  N)r§   r¨   Úgrad_checkpointingr%   Ú	enumeraterl   rB  r&  rh  r   r”  r¡  r   r  Úblocks)r\   r(  r)  rå   rª  r«  r¬  r–   r•   r  r£   r¤   r°   r²  ÚiÚtÚblock_striderœ  rŸ   r²   s                      €r]   r¨   zMaxxVitStage.__init__�  s¸  ø€ ð4 ¨Ñ/ˆÜ‰ÑÔØ"'ˆÔä" ;°Ó6ˆØˆÜ˜kÓ*ò ,	‰DˆAˆqØ%&¨!¢V™6°ˆLØÐ-Ñ-Ð-Ð-Ø�CŠxØ,4×,?Ñ,?À:Ò,M�=ÔS^�Ø™8ØØðð (Ø Ø'¨™lñð ñð ñ ‘ð �c’Ü-¨o¸yÓI�ØÔ-ØØðð (Ø +Ø'Ø'¨™lñð ñð ñ ‘ð �c’Øœ<ØØðð (Ø%Ø$3Ø'¨™lñð ñð ñ ‘ð �d’ØÔ/ØØðð (Ø%Ø$3Ø'¨™lñð ñð ñ �ð ‰FðY,	ôZ —m‘m VÐ,ˆ�r_   r³   rµ   c                 ó¬   — | j                   r6t        j                  j                  «       st	        | j
                  |«      }|S | j                  |«      }|S rZ   )r°  rÃ   ÚjitÚis_scriptingr2   r²  rë   s     r]   rÒ   zMaxxVitStage.forwardì  sE   € Ø×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr_   )r`   ra   rb   rc   r7   r6   rd   r   r   rh   rg   r   r¨   rÃ   rÕ   rÒ   rÖ   r×   s   @r]   r¨  r¨  š  sÏ   ø„ ÙOð ØØ)1Ø25Ù5JÓ5LÙ'5Ó'7Ø35ØØñM-àðM-ð ðM-ð ð	M-ð
 ðM-ð ˜S #˜X‘ðM-ð ˜s E¨#¡J˜Ñ/ðM-ð 3ðM-ð %ðM-ð ˜U D¨¡KÐ/Ñ0õM-ð^˜Ÿ™ð ¨%¯,©,÷ r_   r¨  c                   ó    ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddedededededed	ed
efˆ fd„Zddeddfd„Z	de
j                  de
j                  fd„Zˆ xZS )ÚStemz"Stem layer for feature extraction.Nr(  r)  ro   rw   rG   rR   rT   rX   c                 óN  •— |	|
dœ}t         ‰| �  «        t        |t        t        f«      st        |«      }t        t        ||«      |¬«      }|d   | _        d| _	        t        ||d   |fd||dœ|¤Ž| _         ||d   fi |¤Ž| _        t        |d   |d   |fd||dœ|¤Ž| _        y)	ae  
        Args:
            in_chs: Input channels.
            out_chs: Output channels.
            kernel_size: Kernel size for convolutions.
            padding: Padding mode.
            bias: Whether to use bias.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            norm_eps: Normalization epsilon.
        r¢   r  r·   rŒ   r   )rå   rw   rG   r-   N)r§   r¨   r÷   ÚlistÚtupler$   r   r    r)  rå   r!   Úconv1r  Úconv2)r\   r(  r)  ro   rw   rG   rR   rT   rX   r£   r¤   r°   r5  r²   s                €r]   r¨   zStem.__init__÷  s¼   ø€ ð0 ¨Ñ/ˆÜ‰ÑÔÜ˜'¤D¬% =Ô1Ü Ó(ˆGä Ô!3°JÀ	Ó!JÐPXÔYˆØ˜r‘{ˆŒØˆŒä" 6¨7°1©:°{ÐoÈ1ÐV]ÐdhÑoÐlnÑoˆŒ
Ù# G¨A¡JÑ5°"Ñ5ˆŒ
Ü" 7¨1¡:¨w°q©z¸;ÐsÈqÐZaÐhlÑsÐprÑsˆ�
r_   rî   rµ   c                 ó:   — t        t        t        |¬«      | «       y r  r=  r  s     r]   r  zStem.init_weights  r>  r_   r³   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S rZ   )r¾  r  r¿  rë   s     r]   rÒ   zStem.forward  s.   € Ø�J‰J�q‹MˆØ�J‰J�q‹MˆØ�J‰J�q‹MˆØˆr_   )rn   rv   FrQ   r�   r‚   NNr  )r`   ra   rb   rc   rd   rh   rf   rg   r¨   r  rÃ   rÕ   rÒ   rÖ   r×   s   @r]   rº  rº  ô  s«   ø„ Ù,ð  !ØØØ#Ø+Ø"ØØñ#tàð#tð ð#tð ð	#tð
 ð#tð ð#tð ð#tð ð#tð õ#tñJ> 3ð >°ó >ð˜Ÿ™ð ¨%¯,©,÷ r_   rº  c                 ó¢   — | j                   �| j                  sJ ‚| S |d   | j                  z  |d   | j                  z  f}t        | ||¬«      } | S )z>Configure window size based on image size and partition ratio.r   r-   )rL   rM   )rL   rM   rK   r   )r  rX  rp  s      r]   Úcfg_window_sizerÃ  &  sX   € à
‡�Ð"Ø�}Š}Ðˆ}Øˆ
Ø˜a‘[ C×$7Ñ$7Ñ7¸À!¹È×H[ÑH[Ñ9[Ð[€NÜ
�# >¸^Ô
L€CØ€Jr_   Úkwargsc           	      óV  — i }i }i }|j                  «       D ]X  \  }}|j                  d«      r|||j                  dd«      <   Œ-|j                  d«      r|||j                  dd«      <   ŒT|||<   ŒZ t        | ft        | j                  fi |¤Žt        | j                  fi |¤Ždœ|¤Ž} | S )z-Overlay keyword arguments onto configuration.Útransformer_rv   Úconv_)r–   r•   )ÚitemsÚ
startswithr   r–   r•   )r  rÄ  Útransformer_kwargsÚconv_kwargsÚbase_kwargsrÏ   rÐ   s          r]   Ú_overlay_kwargsrÍ  0  sÁ   € àÐØ€KØ€KØ—‘“ò ‰ˆˆ1Ø�<‰<˜Ô'Ø@AÐ˜qŸy™y¨¸Ó<Ò=Ø�\‰\˜'Ô"Ø23ˆK˜Ÿ	™	 '¨2Ó.Ò/àˆK˜ŠNðô Øðä × 3Ñ 3ÑJÐ7IÑJÜ˜Ÿ™Ñ5¨Ñ5ñð ñ	€Cð €Jr_   c                   óz  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 d'dedeeeeef   f   dededede	d	e	d
e
fˆ fd„Zd(dej                  dededdfd„Zej                   j"                  dee   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j6                  deeeee   f      dededededeeej6                     eej6                  eej6                     f   f   fd„Z	 	 	 d-deeee   f   ded edeed!f   fd"„Zdej6                  dej6                  fd#„Zd)dej6                  d$edej6                  fd%„Z dej6                  dej6                  fd&„Z!ˆ xZ"S ).r8   z{CoaTNet + MaxVit base model.

    Highly configurable for different block compositions, tensor layouts, pooling types.
    Nr  rX  Úin_chansÚnum_classesÚglobal_poolÚ	drop_rateÚdrop_path_raterÄ  c
                 óÊ  •— t         ‰| �  «        ||	dœ}t        |«      }|
rt        |fi |
¤Ž}t	        |j
                  |«      }|| _        || _        || _        |j                  d   x| _
        | _	        || _        d| _        g | _        t        d||j                  |j                   j"                  |j$                  |j                   j&                  |j                   j(                  |j                   j*                  dœ|¤Ž| _        | j,                  j.                  }| xj                  t1        | j,                  j2                  dd¬«      gz  c_        t5        t7        |t        |«      «      D ��cg c]
  \  }}||z  ‘Œ c}}«      }t9        |j                  «      }t9        |j:                  «      |k(  sJ ‚t=        ||j:                  d¬	«      }| j,                  j2                  }g }t?        |«      D ]   }d}|j                  |   }t5        |D �cg c]  }|d
z
  |z  d
z   ‘Œ c}«      }|tA        ||f|j:                  |   |jB                  |   |j                   ||||   dœ|¤Žgz  }||z  }|}| xj                  t1        ||d|› �¬«      gz  c_        Œ¢ tE        jF                  |Ž | _$        tK        tM        |j
                  j(                  «      |j
                  j*                  ¬«      }|jN                  rVtE        jP                  «       | _)        |jN                  | _'        tU        | j                  |f| jN                  |||dœ|¤Ž| _+        nH| j                  | _'         || j                  fi |¤Ž| _)        tY        | j                  |f||dœ|¤Ž| _+        |jZ                  dv sJ ‚|jZ                  r,t]        tK        | j^                  |jZ                  ¬«      | «       yyc c}}w c c}w )a˜  
        Args:
            cfg: Model configuration.
            img_size: Input image size.
            in_chans: Number of input channels.
            num_classes: Number of classification classes.
            global_pool: Global pooling type.
            drop_rate: Dropout rate.
            drop_path_rate: Drop path rate.
            **kwargs: Additional keyword arguments to overlay on config.
        r¢   r·   F)r(  r)  rw   rG   rR   rT   rX   rŒ   Ústem)Únum_chsÚ	reductionrì   T)Ú	stagewiser-   )rª  r¬  r•   r–   r«  r  zstages.r  )Úhidden_sizerF   rÒ  rT   )rF   rÒ  )rv   rð   rô   rõ   r˜   r  Nri   )0r§   r¨   r$   rÍ  rÃ  r–   rÐ  rÏ  rÑ  rŠ   Únum_featuresrÒ  r°  Úfeature_inforº  r’   r•   rw   r“   rR   rT   rX   rÕ  rå   r›  r)  r½  ÚzipÚlenrŽ   r   Úranger¨  rl   r   r  Ústagesr   r   r—   ré   r  r   Úheadr   r™   r1   Ú_init_weights)r\   r  rX  rÏ  rÐ  rÑ  rÒ  rÓ  r£   r¤   rÄ  r°   r–   rå   r³  Úsr«  Ú
num_stagesÚdprr(  rß  Ústage_strider)  ÚrÚfinal_norm_layerr²   s                            €r]   r¨   zMaxxVit.__init__K  s±  ø€ ô0 	‰ÑÔØ¨Ñ/ˆÜ˜XÓ&ˆÙÜ! #Ñ0¨Ñ0ˆCÜ)¨#×*=Ñ*=¸xÓHˆØ&ˆÔØ ˆŒØ&ˆÔØ-0¯]©]¸2Ñ->Ð>ˆÔ˜DœNØ"ˆŒØ"'ˆÔØˆÔäð 	
ØØ—N‘NØ—L‘L×(Ñ(Ø—‘Ø—l‘l×,Ñ,Ø—|‘|×.Ñ.Ø—\‘\×*Ñ*ñ	
ð ñ	
ˆŒ	ð —‘×!Ñ!ˆØ×Òœd¨4¯9©9×+<Ñ+<ÈÐRXÔYÐZÑZÕÜ¬c°(¼IÀfÓ<MÓ.N×O¡d a¨˜1 ›6ÓOÓPˆ	ä˜Ÿ™Ó'ˆ
Ü�3—:‘:‹ *Ò,Ð,Ð,Ü'¨¸¿
¹
ÈdÔSˆØ—‘×"Ñ"ˆØˆÜ�zÓ"ò 	aˆAØˆLØ—m‘m AÑ&ˆGÜÀIÖN¸q  A¡¨,Ñ6¸Ó:ÒNÓOˆIØ”|ØØð
ð —j‘j ‘mØŸN™N¨1Ñ-ØŸ™Ø /Ø#Ø˜a™&ñ
ð ñ
ð 
ñ 
ˆFð �lÑ"ˆFØˆFØ×Ò¤$¨wÀ&ÐSZÐ[\ÐZ]ÐQ^Ô"_Ð!`Ñ`Öð#	aô$ —m‘m VÐ,ˆŒä"¤>°#×2EÑ2E×2PÑ2PÓ#QÐWZ×WjÑWj×WsÑWsÔtÐØ×ÒÜŸ™›ˆDŒIØ$'×$8Ñ$8ˆDÔ!Ü-Ø×!Ñ!Øðð !×1Ñ1Ø%Ø#Ø+ñð ñˆD�Ið %)×$5Ñ$5ˆDÔ!Ù(¨×):Ñ):ÑA¸bÑAˆDŒIÜ&Ø×!Ñ!Øðð &Ø#ñ	ð
 ñˆDŒIð �‰Ð"\Ñ\Ð\Ð\Ø�?Š?Üœ × 2Ñ 2¸3¿?¹?ÔKÈTÕRð ùóm Pùò Os   Å.O
ÈO 
rì   rí   rî   rµ   c                 ó‚   — t        |d«      r	 |j                  |¬«       y y # t        $ r |j                  «        Y y w xY w)Nr  r  )Úhasattrr  Ú	TypeError)r\   rì   rí   rî   s       r]   rá  zMaxxVit._init_weights¶  sD   € Ü�6˜>Ô*ð&Ø×#Ñ#¨6Ð#Õ2ð +øô ò &Ø×#Ñ#Ö%ð&ús   Ž" ¢>½>c                 ó€   ‡— | j                  «       D �‡�ch c]  \  Š}t        ˆfd„dD «       «      r‰’Œ c}}S c c}}w )Nc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrZ   ri   )Ú.0ÚnrÏ   s     €r]   ú	<genexpr>z*MaxxVit.no_weight_decay.<locals>.<genexpr>Á  s   øè ø€ ÒS˜a�1˜”6ÑSùs   ƒ)Úrelative_position_bias_tablezrel_pos.mlp)Únamed_parametersÚany)r\   rÏ   Ú_s    ` r]   Úno_weight_decayzMaxxVit.no_weight_decay½  sK   ø€ ð ×/Ñ/Ó1÷Uð UÙ�!�QÜÓSÐ#RÔSÔSò óUð 	Uùó Us   – :Úcoarsec                 ó$   — t        dddg¬«      }|S )Nz^stem)z^stages\.(\d+)N)z^norm)iŸ† )rÕ  r²  )r›  )r\   rõ  Úmatchers      r]   Úgroup_matcherzMaxxVit.group_matcherÃ  s   € äØØ-Ð/CÐDô
ˆð ˆr_   Úenablec                 ó4   — | j                   D ]	  }||_        Œ y rZ   )rß  r°  )r\   rù  râ  s      r]   Úset_grad_checkpointingzMaxxVit.set_grad_checkpointingË  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r_   c                 ó.   — | j                   j                  S rZ   )rà  Úfcr[   s    r]   Úget_classifierzMaxxVit.get_classifierÐ  s   € à�y‰y�|‰|Ðr_   c                 óJ   — || _         | j                  j                  ||«       y rZ   )rÐ  rà  Úreset)r\   rÐ  rÑ  s      r]   Úreset_classifierzMaxxVit.reset_classifierÔ  s   € Ø&ˆÔØ�	‰	�‰˜ [Õ1r_   r³   Úindicesr  Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc                 ó  — |dv sJ d«       ‚g }t        t        | j                  «      dz   |«      \  }}	d}
| j                  |«      }|
|v r|j	                  |«       t        | j                  «      }t
        j                  j                  «       s|s| j                  }n| j                  d|	 }|D ]@  }|
dz  }
 ||«      }|
|v sŒ|r|
|k(  r| j                  |«      }n|}|j	                  |«       ŒB |r|S |
|k(  r| j                  |«      }||fS )aï   Forward features that returns intermediates.

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

        )ÚNCHWzOutput shape must be NCHW.r-   r   N)	r/   rÝ  rß  rÕ  ÚappendrÃ   r·  r¸  r  )r\   r³   r  r  r  r  r  ÚintermediatesÚtake_indicesÚ	max_indexÚfeat_idxÚlast_idxrß  ÚstageÚx_inters                  r]   Úforward_intermediateszMaxxVit.forward_intermediatesØ  s  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈ!Ñ7KÈWÓ"UÑˆ�ið ˆØ�I‰I�a‹LˆØ�|Ñ#Ø× Ñ  Ô#ä�t—{‘{Ó#ˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )Ð,ˆFØò 	.ˆEØ˜‰MˆHÙ�a“ˆAØ˜<Ò'Ù˜H¨Ò0Ø"Ÿi™i¨›l‘Gà�GØ×$Ñ$ WÕ-ð	.ñ Ø Ð à�xÒØ—	‘	˜!“ˆAà�-ÐÐr_   Ú
prune_normÚ
prune_head.c                 óà   — t        t        | j                  «      dz   |«      \  }}| j                  d| | _        |rt        j                  «       | _        |r| j                  dd«      | _        |S )z6Prune layers not required for specified intermediates.r-   Nr   rv   )r/   rÝ  rß  r   ré   r  r  rà  )r\   r  r  r  r
  r  s         r]   Úprune_intermediate_layersz!MaxxVit.prune_intermediate_layers  sb   € ô #7´s¸4¿;¹;Ó7GÈ!Ñ7KÈWÓ"UÑˆ�iØ—k‘k * 9Ð-ˆŒÙÜŸ™›ˆDŒIÙØ×-Ñ-¨a°Ó4ˆDŒIØÐr_   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S rZ   )rÕ  rß  r  rë   s     r]   Úforward_featureszMaxxVit.forward_features  s.   € Ø�I‰I�a‹LˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØˆr_   Ú
pre_logitsc                 óN   — |r| j                  ||¬«      S | j                  |«      S )N)r  )rà  )r\   r³   r  s      r]   Úforward_headzMaxxVit.forward_head#  s%   € Ù6@ˆt�y‰y˜ zˆyÓ2ÐRÀdÇiÁiÐPQÃlÐRr_   c                 óJ   — | j                  |«      }| j                  |«      }|S rZ   )r  r  rë   s     r]   rÒ   zMaxxVit.forward&  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr_   )éà   rn   éè  rä   rB   rB   NNr  ©F)TrZ   )NFFr  F)r-   FT)#r`   ra   rb   rc   r5   r   rd   r   rh   rg   r   r¨   r   ÚModulerá  rÃ   r·  Úignorer   rô  rf   r
   rø  rû  rþ  r   r  rÕ   r   r  r  r  r  rÒ   rÖ   r×   s   @r]   r8   r8   E  sÕ  ø„ ñð 58ØØ#Ø$Ø!Ø$&ØØñiSàðiSð ˜C  s¨C x¡Ð0Ñ1ðiSð ð	iSð
 ðiSð ðiSð ðiSð "ðiSð õiSñV& B§I¡Ið &°Sð &À#ð &Ètó &ð ‡Y�Y×ÑðU  S¡ò Uó ðUð
 ‡Y�Y×Ññ Dð °T¸#¸s¸(±^ò ó ðð ‡Y�Y×Ññ*¨Tð *¸Tò *ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mð 2ÐW[ó 2ð 8<ØØ$Ø$Ø',ñ4 à�|‰|ð4 ð ˜e C¨¨c© NÑ3Ñ4ð4 ð ð	4 ð
 ð4 ð ð4 ð !%ð4 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó4 ðp ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆs�Cˆx‰óð %§,¡,ð °5·<±<ó ñS˜eŸl™lð S¸ð SÈÏÉó Sð˜Ÿ™ð ¨%¯,©,÷ r_   r8   rç   FTrG   rI   rt   rF   Úconv_output_biasÚconv_attn_earlyÚconv_attn_act_layerÚconv_norm_layerÚtransformer_shortcut_biasÚtransformer_norm_layerÚtransformer_norm_layer_clrP   rH   rJ   c                 ób   — t        t        | |dd|||d|¬«	      t        d|||	|||
|¬«      ¬«      S )as  RW variant configuration for CoAtNet models.

    These models were created and trained before seeing https://github.com/google-research/maxvit

    Common differences for initial timm models:
      - pre-norm layer in MZBConv included an activation after norm
      - mbconv expansion calculated from input instead of output chs
      - mbconv shortcut and final 1x1 conv did not have a bias
      - SE act layer was relu, not silu
      - mbconv uses silu in timm, not gelu
      - expansion in attention block done via output proj, not input proj

    Variable differences (evolved over training initial models):
      - avg pool with kernel_size=2 favoured downsampling (instead of maxpool for coat)
      - SE attention was between conv2 and norm/act
      - default to avg pool for mbconv downsample instead of 1x1 or dw conv
      - transformer block shortcut has no bias
    TFr{   )	rt   rF   rq   rm   rr   rx   r|   rR   rT   )r?   r@   rF   rP   rT   rV   rH   rJ   ©r•   r–   ©r›  r6   r7   )rt   rF   r   r!  r"  r#  r$  r%  r&  rP   rH   rJ   s               r]   Ú_rw_coat_cfgr*  ,  sW   € ô@ ÜØ#ØØØØ(Ø&Ø.ØØ&ô

ô .ØØ3ØØ#Ø-Ø3Ø%Ø#ô	
ôð r_   rs   Úconv_attn_ratior;   c                 ó`   — t        t        | |d||d|¬«      t        d||||	|||
|¬«	      ¬«      S )aµ  RW variant configuration for MaxViT models.

    These models were created and trained before seeing https://github.com/google-research/maxvit

    Differences of initial timm models:
      - mbconv expansion calculated from input instead of output chs
      - mbconv shortcut and final 1x1 conv did not have a bias
      - mbconv uses silu in timm, not gelu
      - expansion in attention block done via output proj, not input proj
    Fr{   )rt   rF   rm   rr   r~   rR   rT   )	r?   rF   r;   rL   rP   rT   rV   rH   rJ   r(  r)  )rt   rF   r   r+  r#  r%  r&  rL   r;   rP   rH   rJ   s               r]   Ú_rw_max_cfgr-  e  sS   € ô0 ÜØ#ØØØ(Ø&ØØ&ô
ô .ØØØØ#Ø#Ø-Ø3Ø%Ø#ô

ôð r_   rW   rö   Úconv_norm_layer_clrN   c                 ó‚   — t        |«      }t        t        d| |d|d   ||¬«      t        d||||d   |||	|
¬«	      ¬«      S )z=Configuration for experimental ConvNeXt-based MaxxViT models.r€   Fr   )rl   rt   rF   rm   rP   rT   rV   r-   )	r?   rF   rL   rN   rP   rT   rV   rH   rJ   r(  )r$   r›  r6   r7   )rt   rF   r#  r.  r%  r&  rL   rN   rP   rH   rJ   s              r]   Ú	_next_cfgr0  •  se   € ô ˜KÓ(€KÜÜØ!Ø#ØØØ# A™Ø&Ø,ô
ô .ØØØ#Ø'Ø# A™Ø-Ø3Ø%Ø#ô

ôð r_   c            	      óN   — t        t        ddd¬«      t        dddd¬«      ¬	«      S )
z0Configuration matching TensorFlow MaxViT models.gü©ñÒMbP?Ú	gelu_tanhÚsame)rX   rR   rw   r‚   Frg  )rX   rR   r<   rH   r(  r)  ri   r_   r]   Ú_tf_cfgr4  ¼  s6   € äÜØØ!Øô
ô
 .ØØ!ØØ"ô	
ôð r_   Úcoatnet_pico_rw)r‘   é€   é   rI   r‹   )r:   r‘   )rŠ   rŽ   r’   r}   )r   r+  Úcoatnet_nano_rw)rn   rT  é   rn   )rt   r   r+  Úcoatnet_0_rwr…   )rŒ   rn   rC  rŒ   )r!  r$  Úcoatnet_1_rw)rŒ   r9  r©  rŒ   )rt   r!  r$  Úcoatnet_2_rw)r6  r7  rI   é   )r‘   r6  r{   )rt   r"  Úcoatnet_3_rw)r‡   rˆ   r‰   é   )r†   r‡   )rt   r"  rP   Úcoatnet_bn_0_rwr�   )rt   r!  r$  r%  Úcoatnet_rmlp_nano_rwrˆ   )r   r+  rH   rJ   Úcoatnet_rmlp_0_rw)rt   rH   Úcoatnet_rmlp_1_rwrâ   )rF   r!  r$  rH   rJ   Úcoatnet_rmlp_1_rw2)rt   rH   rJ   Úcoatnet_rmlp_2_rw)rt   r"  rP   rH   Úcoatnet_rmlp_3_rwÚcoatnet_nano_cc)r�   r�   ©r�   r�   rH  )rŠ   rŽ   r’   rl   Úcoatnext_nano_rwrð   )rŠ   rŽ   r’   r™   )r‚   N)rH   rP   Ú	coatnet_0r‘   r‰   )rŠ   rŽ   r’   r—   Ú	coatnet_1Ú	coatnet_2r6  r=  Ú	coatnet_3r‡   r?  Ú	coatnet_4)rŒ   é   é   rŒ   Ú	coatnet_5)r7  rI   é   é   rS  Úmaxvit_pico_rw)r:   r‘   r6  r7  )rŒ   rŒ   r�   rŒ   )r®  r®  r®  r®  )é   r:   )rŠ   rŽ   rl   r’   Úmaxvit_nano_rw)r-   rŒ   rn   r-   Úmaxvit_tiny_rwÚmaxvit_tiny_pm)r¯  r¯  r¯  r¯  Úmaxvit_rmlp_pico_rw)rH   Úmaxvit_rmlp_nano_rwÚmaxvit_rmlp_tiny_rwÚmaxvit_rmlp_small_rwÚmaxvit_rmlp_base_rw)rŠ   rŽ   rl   r’   r—   Úmaxxvit_rmlp_nano_rw)rŠ   rŽ   rl   r’   r™   Úmaxxvit_rmlp_tiny_rwÚmaxxvit_rmlp_small_rw)é0   r†   Úmaxxvitv2_nano_rw)rN   rH   Úmaxxvitv2_rmlp_base_rw)rŒ   r9  rO  rŒ   )rN   Úmaxxvitv2_rmlp_large_rw)é    i@  i€  rR  )rŒ   r9  é   rŒ   )éP   re  rR  Úmaxvit_tiny_tf)rŠ   rŽ   rl   r’   r“   r—   Úmaxvit_small_tfÚmaxvit_base_tfÚmaxvit_large_tfÚmaxvit_xlarge_tfÚ
state_dictÚmodelc                 ór  — |j                  «       }i }| j                  «       D �]  \  }}|j                  d«      r‚|j                  |dd «      }|j                  |j
                  j                  k7  s|j                  d   |j                  d   k7  r,t        ||j                  |j
                  j                  ¬«      }||v rn|j                  ||   j                  k7  rR|j                  «       ||   j                  «       k(  r.|j                  dv sJ ‚|j                  ||   j                  «      }|||<   �Œ |S )z/Filter checkpoint state dict for compatibility.rð  Niãÿÿÿr   r-   )Únew_window_sizeÚnew_bias_shape)rŒ   rT  )rm  rÈ  ÚendswithÚget_submoduler½   rð  rL   r,   ÚndimÚnumelrÀ   )rm  rn  Úmodel_state_dictÚout_dictrÏ   rÐ   Úms          r]   Úcheckpoint_filter_fnry  >  s)  € à×'Ñ'Ó)ÐØ€HØ× Ñ Ó"ó ‰ˆˆ1Ø�:‰:Ð4Ô5Ø×#Ñ# A d s GÓ,ˆAØ�w‰w˜!×8Ñ8×>Ñ>Ò>À!Ç-Á-ÐPQÑBRÐVW×VcÑVcÐdeÑVfÒBfÜ-ØØ$%§M¡MØ#$×#AÑ#A×#GÑ#Gô�ð Ð Ñ  Q§V¡VÐ/?ÀÑ/B×/GÑ/GÒ%GÈAÏGÉGËIÐYiÐjkÑYl×YrÑYrÓYtÒLtà—6‘6˜VÑ#Ð#Ð#Ø—	‘	Ð*¨1Ñ-×3Ñ3Ó4ˆAØˆ�‹ðð €Or_   ÚvariantÚcfg_variantÚ
pretrainedc                 ó¸   — |€.| t         v r| }n#dj                  | j                  d«      dd «      }t        t        | |ft         |   t        d¬«      t        dœ|¤ŽS )zCreate a MaxxVit model variant.Nró  r·   T)Úflatten_sequential)Ú	model_cfgÚfeature_cfgÚpretrained_filter_fn)Ú
model_cfgsÚjoinÚsplitr.   r8   r›  ry  )rz  r{  r|  rÄ  s       r]   Ú_create_maxxvitr…  T  si   € àÐØ”jÑ Ø!‰KàŸ(™( 7§=¡=°Ó#5°c°rÐ#:Ó;ˆKÜÜ�˜*ðä˜[Ñ)Ü¨DÔ1Ü1ñ	ð
 ñð r_   Úurlc                 ó$   — | dddddddddd	d
dœ|¥S )z$Create a default configuration dict.r  )rn   r  r  )rC  rC  çffffffî?Úbicubic)ç      à?rŠ  rŠ  z
stem.conv1zhead.fcTz
apache-2.0)r†  rÐ  Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanró   Ú
first_convÚ
classifierÚfixed_input_sizeÚlicenseri   )r†  rÄ  s     r]   Ú_cfgr”  c  s7   € ð  4°}ÐSYØ¨9Ø¨Ø"°)Ø Øñð $*ðð r_   zcoatnet_pico_rw_224.untrained)r†  zcoatnet_nano_rw_224.sw_in1kztimm/zyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_nano_rw_224_sw-f53093b4.pthgÍÌÌÌÌÌì?)Ú	hf_hub_idr†  r�  zcoatnet_0_rw_224.sw_in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_0_rw_224_sw-a6439706.pth)r•  r†  zcoatnet_1_rw_224.sw_in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_1_rw_224_sw-5cae1ea8.pthz!coatnet_2_rw_224.sw_in12k_ft_in1k)r•  z'coatnet_rmlp_1_rw2_224.sw_in12k_ft_in1kz&coatnet_rmlp_2_rw_224.sw_in12k_ft_in1kz&coatnet_rmlp_2_rw_384.sw_in12k_ft_in1k)rn   rˆ   rˆ   )rO  rO  g      ð?Úsquash)r•  r‹  rŒ  r�  Ú	crop_modezcoatnet_bn_0_rw_224.sw_in1kzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_bn_0_rw_224_sw-c228e218.pthrˆ  )r•  r†  r�  ró   r�  z coatnet_rmlp_nano_rw_224.sw_in1kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_rmlp_nano_rw_224_sw-bd1d51b3.pthzcoatnet_rmlp_0_rw_224.untrainedzcoatnet_rmlp_1_rw_224.sw_in1kz{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_rmlp_1_rw_224_sw-9051e6c3.pthzcoatnet_rmlp_2_rw_224.sw_in1kz{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnet_rmlp_2_rw_224_sw-5ccfac55.pthzcoatnet_rmlp_3_rw_224.untrainedzcoatnet_nano_cc_224.untrainedzcoatnext_nano_rw_224.sw_in1kzzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/coatnext_nano_rw_224_ad-22cb71c2.pthzcoatnet_2_rw_224.sw_in12ki-.  )r•  rÐ  zcoatnet_3_rw_224.sw_in12kzcoatnet_rmlp_1_rw2_224.sw_in12kzcoatnet_rmlp_2_rw_224.sw_in12kzcoatnet_0_224.untrainedzcoatnet_1_224.untrainedzcoatnet_2_224.untrainedzcoatnet_3_224.untrainedzcoatnet_4_224.untrainedzcoatnet_5_224.untrainedzmaxvit_pico_rw_256.untrained)rn   r7  r7  )é   r˜  )r†  r‹  rŒ  zmaxvit_nano_rw_256.sw_in1kzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_nano_rw_256_sw-fb127241.pth)r•  r†  r‹  rŒ  zmaxvit_tiny_rw_224.sw_in1kzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_tiny_rw_224_sw-7d0dffeb.pthzmaxvit_tiny_rw_256.untrainedzmaxvit_tiny_pm_256.untrainedzmaxvit_rmlp_pico_rw_256.sw_in1kz}https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_rmlp_pico_rw_256_sw-8d82f2c6.pthzmaxvit_rmlp_nano_rw_256.sw_in1kz}https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_rmlp_nano_rw_256_sw-c17bb0d6.pthzmaxvit_rmlp_tiny_rw_256.sw_in1kz}https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_rmlp_tiny_rw_256_sw-bbef0ff5.pthz maxvit_rmlp_small_rw_224.sw_in1kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxvit_rmlp_small_rw_224_sw-6ef0ae4f.pthz"maxvit_rmlp_small_rw_256.untrainedz(maxvit_rmlp_base_rw_224.sw_in12k_ft_in1kz(maxvit_rmlp_base_rw_384.sw_in12k_ft_in1kz maxvit_rmlp_base_rw_224.sw_in12kz maxxvit_rmlp_nano_rw_256.sw_in1kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxxvit_rmlp_nano_rw_256_sw-0325d459.pthz"maxxvit_rmlp_tiny_rw_256.untrainedz!maxxvit_rmlp_small_rw_256.sw_in1kzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights-maxx/maxxvit_rmlp_small_rw_256_sw-37e217ff.pthzmaxxvitv2_nano_rw_256.sw_in1k)r•  r‹  rŒ  z+maxxvitv2_rmlp_base_rw_224.sw_in12k_ft_in1kz+maxxvitv2_rmlp_base_rw_384.sw_in12k_ft_in1kz%maxxvitv2_rmlp_large_rw_224.untrainedz#maxxvitv2_rmlp_base_rw_224.sw_in12kzmaxvit_tiny_tf_224.in1k)r•  r�  ró   zmaxvit_tiny_tf_384.in1kzmaxvit_tiny_tf_512.in1k)rn   rI   rI   )rf  rf  zmaxvit_small_tf_224.in1kzmaxvit_small_tf_384.in1kzmaxvit_small_tf_512.in1kzmaxvit_base_tf_224.in1kzmaxvit_base_tf_384.in1kzmaxvit_base_tf_512.in1kzmaxvit_large_tf_224.in1kzmaxvit_large_tf_384.in1kzmaxvit_large_tf_512.in1kzmaxvit_base_tf_224.in21kiSU  z maxvit_base_tf_384.in21k_ft_in1kz maxvit_base_tf_512.in21k_ft_in1kzmaxvit_large_tf_224.in21kz!maxvit_large_tf_384.in21k_ft_in1kz!maxvit_large_tf_512.in21k_ft_in1k)r•  r‹  r�  r—  zmaxvit_xlarge_tf_224.in21kz"maxvit_xlarge_tf_384.in21k_ft_in1kz"maxvit_xlarge_tf_512.in21k_ft_in1kc                 ó   — t        dd| i|¤ŽS )z)CoatNet Pico model with RW configuration.r|  )Úcoatnet_pico_rw_224©r…  ©r|  rÄ  s     r]   rš  rš  J	  ó   € ô ÑR¸ZÐRÈ6ÑRÐRr_   c                 ó   — t        dd| i|¤ŽS )z)CoatNet Nano model with RW configuration.r|  )Úcoatnet_nano_rw_224r›  rœ  s     r]   rŸ  rŸ  P	  r�  r_   c                 ó   — t        dd| i|¤ŽS )z&CoatNet-0 model with RW configuration.r|  )Úcoatnet_0_rw_224r›  rœ  s     r]   r¡  r¡  V	  ó   € ô ÑO¸*ÐOÈÑOÐOr_   c                 ó   — t        dd| i|¤ŽS )z&CoatNet-1 model with RW configuration.r|  )Úcoatnet_1_rw_224r›  rœ  s     r]   r¤  r¤  \	  r¢  r_   c                 ó   — t        dd| i|¤ŽS )z&CoatNet-2 model with RW configuration.r|  )Úcoatnet_2_rw_224r›  rœ  s     r]   r¦  r¦  b	  r¢  r_   c                 ó   — t        dd| i|¤ŽS )z&CoatNet-3 model with RW configuration.r|  )Úcoatnet_3_rw_224r›  rœ  s     r]   r¨  r¨  h	  r¢  r_   c                 ó   — t        dd| i|¤ŽS )z4CoatNet-0 model with BatchNorm and RW configuration.r|  )Úcoatnet_bn_0_rw_224r›  rœ  s     r]   rª  rª  n	  r�  r_   c                 ó   — t        dd| i|¤ŽS )z.CoatNet Nano model with Relative Position MLP.r|  )Úcoatnet_rmlp_nano_rw_224r›  rœ  s     r]   r¬  r¬  t	  ó   € ô ÑWÀ*ÐWÐPVÑWÐWr_   c                 ó   — t        dd| i|¤ŽS )z+CoatNet-0 model with Relative Position MLP.r|  )Úcoatnet_rmlp_0_rw_224r›  rœ  s     r]   r¯  r¯  z	  ó   € ô ÑT¸zÐTÈVÑTÐTr_   c                 ó   — t        dd| i|¤ŽS )z+CoatNet-1 model with Relative Position MLP.r|  )Úcoatnet_rmlp_1_rw_224r›  rœ  s     r]   r²  r²  €	  r°  r_   c                 ó   — t        dd| i|¤ŽS )z.CoatNet-1 model with Relative Position MLP v2.r|  )Úcoatnet_rmlp_1_rw2_224r›  rœ  s     r]   r´  r´  †	  s   € ô ÑUÀ
ÐUÈfÑUÐUr_   c                 ó   — t        dd| i|¤ŽS )z+CoatNet-2 model with Relative Position MLP.r|  )Úcoatnet_rmlp_2_rw_224r›  rœ  s     r]   r¶  r¶  Œ	  r°  r_   c                 ó   — t        dd| i|¤ŽS )z6CoatNet-2 model with Relative Position MLP at 384x384.r|  )Úcoatnet_rmlp_2_rw_384r›  rœ  s     r]   r¸  r¸  ’	  r°  r_   c                 ó   — t        dd| i|¤ŽS )z+CoatNet-3 model with Relative Position MLP.r|  )Úcoatnet_rmlp_3_rw_224r›  rœ  s     r]   rº  rº  ˜	  r°  r_   c                 ó   — t        dd| i|¤ŽS )z(CoatNet Nano model with ConvNeXt blocks.r|  )Úcoatnet_nano_cc_224r›  rœ  s     r]   r¼  r¼  ž	  r�  r_   c                 ó   — t        dd| i|¤ŽS )z*CoAtNeXt Nano model with RW configuration.r|  )Úcoatnext_nano_rw_224r›  rœ  s     r]   r¾  r¾  ¤	  s   € ô ÑS¸jÐSÈFÑSÐSr_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-0 model.r|  )Úcoatnet_0_224r›  rœ  s     r]   rÀ  rÀ  ª	  ó   € ô ÑL°zÐLÀVÑLÐLr_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-1 model.r|  )Úcoatnet_1_224r›  rœ  s     r]   rÃ  rÃ  °	  rÁ  r_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-2 model.r|  )Úcoatnet_2_224r›  rœ  s     r]   rÅ  rÅ  ¶	  rÁ  r_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-3 model.r|  )Úcoatnet_3_224r›  rœ  s     r]   rÇ  rÇ  ¼	  rÁ  r_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-4 model.r|  )Úcoatnet_4_224r›  rœ  s     r]   rÉ  rÉ  Â	  rÁ  r_   c                 ó   — t        dd| i|¤ŽS )zCoatNet-5 model.r|  )Úcoatnet_5_224r›  rœ  s     r]   rË  rË  È	  rÁ  r_   c                 ó   — t        dd| i|¤ŽS )z(MaxViT Pico model with RW configuration.r|  )Úmaxvit_pico_rw_256r›  rœ  s     r]   rÍ  rÍ  Î	  ó   € ô ÑQ¸JÐQÈ&ÑQÐQr_   c                 ó   — t        dd| i|¤ŽS )z(MaxViT Nano model with RW configuration.r|  )Úmaxvit_nano_rw_256r›  rœ  s     r]   rÐ  rÐ  Ô	  rÎ  r_   c                 ó   — t        dd| i|¤ŽS )z(MaxViT Tiny model with RW configuration.r|  )Úmaxvit_tiny_rw_224r›  rœ  s     r]   rÒ  rÒ  Ú	  rÎ  r_   c                 ó   — t        dd| i|¤ŽS )z3MaxViT Tiny model with RW configuration at 256x256.r|  )Úmaxvit_tiny_rw_256r›  rœ  s     r]   rÔ  rÔ  à	  rÎ  r_   c                 ó   — t        dd| i|¤ŽS )z3MaxViT Relative Position MLP Pico RW 256x256 model.r|  )Úmaxvit_rmlp_pico_rw_256r›  rœ  s     r]   rÖ  rÖ  æ	  ó   € ô ÑVÀÐVÈvÑVÐVr_   c                 ó   — t        dd| i|¤ŽS )z3MaxViT Relative Position MLP Nano RW 256x256 model.r|  )Úmaxvit_rmlp_nano_rw_256r›  rœ  s     r]   rÙ  rÙ  ì	  r×  r_   c                 ó   — t        dd| i|¤ŽS )z3MaxViT Relative Position MLP Tiny RW 256x256 model.r|  )Úmaxvit_rmlp_tiny_rw_256r›  rœ  s     r]   rÛ  rÛ  ò	  r×  r_   c                 ó   — t        dd| i|¤ŽS )z4MaxViT Relative Position MLP Small RW 224x224 model.r|  )Úmaxvit_rmlp_small_rw_224r›  rœ  s     r]   rÝ  rÝ  ø	  r­  r_   c                 ó   — t        dd| i|¤ŽS )z9MaxViT Small model with Relative Position MLP at 256x256.r|  )Úmaxvit_rmlp_small_rw_256r›  rœ  s     r]   rß  rß  þ	  r­  r_   c                 ó   — t        dd| i|¤ŽS )z-MaxViT Base model with Relative Position MLP.r|  )Úmaxvit_rmlp_base_rw_224r›  rœ  s     r]   rá  rá  
  r×  r_   c                 ó   — t        dd| i|¤ŽS )z8MaxViT Base model with Relative Position MLP at 384x384.r|  )Úmaxvit_rmlp_base_rw_384r›  rœ  s     r]   rã  rã  

  r×  r_   c                 ó   — t        dd| i|¤ŽS )z'MaxViT Tiny model with parallel blocks.r|  )Úmaxvit_tiny_pm_256r›  rœ  s     r]   rå  rå  
  rÎ  r_   c                 ó   — t        dd| i|¤ŽS )z4MaxxViT Relative Position MLP Nano RW 256x256 model.r|  )Úmaxxvit_rmlp_nano_rw_256r›  rœ  s     r]   rç  rç  
  r­  r_   c                 ó   — t        dd| i|¤ŽS )z.MaxxViT Tiny model with Relative Position MLP.r|  )Úmaxxvit_rmlp_tiny_rw_256r›  rœ  s     r]   ré  ré  
  r­  r_   c                 ó   — t        dd| i|¤ŽS )z/MaxxViT Small model with Relative Position MLP.r|  )Úmaxxvit_rmlp_small_rw_256r›  rœ  s     r]   rë  rë  "
  s   € ô ÑXÀ:ÐXÐQWÑXÐXr_   c                 ó   — t        dd| i|¤ŽS )zMaxxViT-V2 Nano model.r|  )Úmaxxvitv2_nano_rw_256r›  rœ  s     r]   rí  rí  (
  r°  r_   c                 ó   — t        dd| i|¤ŽS )z1MaxxViT-V2 Base model with Relative Position MLP.r|  )Úmaxxvitv2_rmlp_base_rw_224r›  rœ  s     r]   rï  rï  .
  ó   € ô ÑYÀJÐYÐRXÑYÐYr_   c                 ó   — t        dd| i|¤ŽS )z<MaxxViT-V2 Base model with Relative Position MLP at 384x384.r|  )Úmaxxvitv2_rmlp_base_rw_384r›  rœ  s     r]   rò  rò  4
  rð  r_   c                 ó   — t        dd| i|¤ŽS )z2MaxxViT-V2 Large model with Relative Position MLP.r|  )Úmaxxvitv2_rmlp_large_rw_224r›  rœ  s     r]   rô  rô  :
  s   € ô ÑZÀZÐZÐSYÑZÐZr_   c                 ó   — t        dd| i|¤ŽS )z"MaxViT Tiny model from TensorFlow.r|  )Úmaxvit_tiny_tf_224rh  r›  rœ  s     r]   rö  rö  @
  ó   € ô ÑcÈjÐcÐ\bÑcÐcr_   c                 ó   — t        dd| i|¤ŽS )z-MaxViT Tiny model from TensorFlow at 384x384.r|  )Úmaxvit_tiny_tf_384rh  r›  rœ  s     r]   rù  rù  F
  r÷  r_   c                 ó   — t        dd| i|¤ŽS )z-MaxViT Tiny model from TensorFlow at 512x512.r|  )Úmaxvit_tiny_tf_512rh  r›  rœ  s     r]   rû  rû  L
  r÷  r_   c                 ó   — t        dd| i|¤ŽS )z#MaxViT Small model from TensorFlow.r|  )Úmaxvit_small_tf_224ri  r›  rœ  s     r]   rý  rý  R
  ó   € ô ÑeÐPZÐeÐ^dÑeÐer_   c                 ó   — t        dd| i|¤ŽS )z.MaxViT Small model from TensorFlow at 384x384.r|  )Úmaxvit_small_tf_384ri  r›  rœ  s     r]   r   r   X
  rþ  r_   c                 ó   — t        dd| i|¤ŽS )z.MaxViT Small model from TensorFlow at 512x512.r|  )Úmaxvit_small_tf_512ri  r›  rœ  s     r]   r  r  ^
  rþ  r_   c                 ó   — t        dd| i|¤ŽS )z"MaxViT Base model from TensorFlow.r|  )Úmaxvit_base_tf_224rj  r›  rœ  s     r]   r  r  d
  r÷  r_   c                 ó   — t        dd| i|¤ŽS )z-MaxViT Base model from TensorFlow at 384x384.r|  )Úmaxvit_base_tf_384rj  r›  rœ  s     r]   r  r  j
  r÷  r_   c                 ó   — t        dd| i|¤ŽS )z-MaxViT Base model from TensorFlow at 512x512.r|  )Úmaxvit_base_tf_512rj  r›  rœ  s     r]   r  r  p
  r÷  r_   c                 ó   — t        dd| i|¤ŽS )z#MaxViT Large model from TensorFlow.r|  )Úmaxvit_large_tf_224rk  r›  rœ  s     r]   r
  r
  v
  rþ  r_   c                 ó   — t        dd| i|¤ŽS )z.MaxViT Large model from TensorFlow at 384x384.r|  )Úmaxvit_large_tf_384rk  r›  rœ  s     r]   r  r  |
  rþ  r_   c                 ó   — t        dd| i|¤ŽS )z.MaxViT Large model from TensorFlow at 512x512.r|  )Úmaxvit_large_tf_512rk  r›  rœ  s     r]   r  r  ‚
  rþ  r_   c                 ó   — t        dd| i|¤ŽS )z$MaxViT XLarge model from TensorFlow.r|  )Úmaxvit_xlarge_tf_224rl  r›  rœ  s     r]   r  r  ˆ
  ó   € ô ÑgÐR\ÐgÐ`fÑgÐgr_   c                 ó   — t        dd| i|¤ŽS )z/MaxViT XLarge model from TensorFlow at 384x384.r|  )Úmaxvit_xlarge_tf_384rl  r›  rœ  s     r]   r  r  Ž
  r  r_   c                 ó   — t        dd| i|¤ŽS )z/MaxViT XLarge model from TensorFlow at 512x512.r|  )Úmaxvit_xlarge_tf_512rl  r›  rœ  s     r]   r  r  ”
  r  r_   r  )rç   rE   FFÚrelurv   TrS   rU   NrG   rI   )rs   rE   Fg      °?rv   rS   rU   Nr:   NrG   rI   )rs   rE   rS   rU   rS   rU   NFrW   rö   rI   ri   )NFr  )¨rc   r  Úcollectionsr   Údataclassesr   r   r   Ú	functoolsr   Útypingr   r	   r
   r   r   r   r   r   rÃ   r   Ú	torch.jitr   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Ú_builderr.   Ú	_featuresr/   Ú_features_fxr0   Ú_manipulater1   r2   Ú	_registryr3   r4   Ú__all__r7   r6   r5   r  r›   rÙ   rà   rh   rþ   r   r!  rd   r$  r&  rB  rÕ   rW  r\  ra  rd  rh  rj  rz  r‡  r‰  r‹  r�  r�  r”  r¡  r¨  rº  rÃ  rÍ  r8   rf   rg   r*  r-  r0  r4  r›  r‚  ry  r…  r”  Údefault_cfgsrš  rŸ  r¡  r¤  r¦  r¨  rª  r¬  r¯  r²  r´  r¶  r¸  rº  r¼  r¾  rÀ  rÃ  rÅ  rÇ  rÉ  rË  rÍ  rÐ  rÒ  rÔ  rÖ  rÙ  rÛ  rÝ  rß  rá  rã  rå  rç  ré  rë  rí  rï  rò  rô  rö  rù  rû  rý  r   r  r  r  r  r
  r  r  r  r  r  ri   r_   r]   ú<module>r%     sž   ðñ"óH Ý #ß 1Ñ 1Ý ß I× IÓ Iã Ý Ý ç A÷÷ ÷ ÷ ÷ ÷ õ õ6 +Ý +Ý 3ß 4ß <â
N€ð ÷2ð 2ó ð2ðB ÷!Pð !Pó ð!PðH ÷
!ð 
!ó ð
!ôQ�"—)‘)ô QôhR�"—)‘)ô Rôj/�2—9‘9ô /òd0˜bŸi™ið 0¨sð 0¸Cð 0Èó 0ô2N˜Ÿ™ô Nòb,�r—y‘yð ,¨ð ,°Sð ,À$ó ,ð0&˜8 C™=ð &°Cð &¸Có &ôl�"—)‘)ô lô^d�B—I‘Iô dðN˜Ÿ™ð °4¸±9ð ÀÇÁó ð ð˜EŸL™Lð °t¸C±yð ÈDÐQTÉIð ÐZ_×ZfÑZfò ó ðð�e—l‘lð ¨t°C©yð ¸U¿\¹\ó ð ð˜%Ÿ,™,ð °4¸±9ð ÈÈSÉ	ð ÐV[×VbÑVbò ó ðð	Ð.ð 	¸UÀ3ÈÀ8¹_ð 	ÐQYÐZbÑQcó 	ôD˜2Ÿ9™9ô DôNT §¡ô Tðn˜UŸ\™\ð ¸¸S¹	ð ÀeÇlÁló ð ð §¡ð ¸DÀ¹Ið ÐQUÐVYÑQZð Ð_d×_kÑ_kò ó ðð˜5Ÿ<™<ð °D¸±Ið À%Ç,Á,ó ð ð˜uŸ|™|ð ¸¸S¹	ð ÈTÐRUÉYð Ð[`×[gÑ[gò ó ðôK˜2Ÿ9™9ô Kô\5�2—9‘9ô 5ôp1˜2Ÿ9™9ô 1ôhW�2—9‘9ô Wôt/ˆ2�9‰9ô /ðdÐ.ð ¸%ÀÀSÀ¹/ð ÐNcó ð˜ð ¨sð °zó ô*dˆb�i‰iô dðP "ØØ!&Ø %Ø#)Ø!Ø*.Ø&3Ø)4Ø'+Ø"Øò6Øð6àð6ð ð6ð ð	6ð
 !ð6ð ð6ð $(ð6ð !$ð6ð $'ð6ð ˜e‘_ð6ð ð6ð ð6ð 
ˆ#ˆsˆ(�^ó6ðt  ØØ!&Ø!'Ø!Ø&3Ø)4Ø15ØØ'+Ø"Øò-Øð-àð-ð ð-ð ð	-ð
 ð-ð !$ð-ð $'ð-ð ˜e C¨ H™oÑ.ð-ð ð-ð ˜e‘_ð-ð ð-ð ð-ð 
ˆ#ˆsˆ(�^ó-ðb  ØØ,Ø"-Ø&3Ø)4Ø15Ø#Ø9=Ø!Øò$Øð$àð$ð ð$ð  ð	$ð
 !$ð$ð $'ð$ð ˜e C¨ H™oÑ.ð$ð ð$ð ˜5 %¨¨u¨Ñ"5Ð5Ñ6ð$ð ð$ð ð$ð 
ˆ#ˆsˆ(�^ó$ðN��c˜3�h‘ó ñ" ó náñ Ø%ØØññ Ø!Ø ô
ò	ðnñ ñ 	Ø%ØØñ	ñ ØØ!Ø ô
ò		ðnñ* ñ Ø%ØØññ Ø Ø&+ô
ò	ð+nñ< ñ 	Ø%ØØñ	ñ ØØ Ø&+ô
ò		ð=nñP ñ 	Ø'ØØñ	ñ ØØ &ô
ò		ðQnñd ñ 	Ø'ØØñ	ñ ØØ &Øô
ò		ðenñ| ñ 
Ø%ØØñ
ñ ØØ Ø&+Ø#0ô	
ò	
ð}nñR $ñ 
Ø%ØØñ
ñ Ø!Ø ØØô	
ò	
ðSnñh !ñ Ø%ØØññ ØØô
ò	ðinñz !ñ Ø%ØØññ ØØ Ø&+ØØô
ò	ð{nñR "ñ 	Ø%ØØñ	ñ ØØØô
ò		ðSnñf !ñ 
Ø'ØØñ
ñ ØØ &ØØô	
ò	
ðgnñ| !ñ 
Ø'ØØñ
ñ ØØ &ØØô	
ò	
ð}nñT ñ Ø%ØØØ5ñ	ñ
 ‹.òðUnñb  ñ 	Ø%ØØØñ		ñ
 ØØ$ô
ò	ðcnñz Ø%ØØØõ	ð{nñF Ø%ØØØõ	ðGnñR Ø'ØØØõ	ðSnñ^ Ø'ØØØõ	ð_nñj Ø'ØØØõ	ðknñv Ø(ØØØõ	ðwnñF ñ Ø$ØØØñ	ñ
 ‹-òðGnñT ñ Ø%ØØØñ	ñ
 ‹-òðUnñb ñ Ø%ØØØñ	ñ
 ‹-òðcnñp ñ Ø%ØØØñ	ñ
 ‹-òðqnñ@ #ñ Ø$ØØØñ	ñ
  5Ô
)òðAnñN #ñ Ø%ØØØñ	ñ
  5Ô
)òðOnñ\ #ñ Ø%ØØØñ	ñ
  5Ô
)òð]nñj $ñ 	Ø%ØØØñ		ñ
 ØØô
ò	ðknñ~ #ñ 	Ø%ØØØØñ	ñ Øô
ò	ðnñT $ñ Ø%ØØØØññ ‹+òðUnñd $ñ Ø%ØØØñ	ñ
 ‹+òðenñr %ñ Ø%ØØØñ	ñ
 ‹+òðsnñB	 !ñ 
Ø%ØØØØñ
ñ ØØô
ò
ðC	nñX	 &ñ Ø'ØØØñ	ñ
 Øô
òðY	nñj	 'ñ 	Ø'ØØØØñ	ñ Øô
ò	ðk	nñB
 ñ Ø%ØØØØØññ ‹)òðC
nñT
 ñ Ø%ØØØØØññ ‹)òðU
nñf
 ñ Ø%ØØØØØññ ‹)òðg
nñx
 ñ Ø'ØØØØØññ ‹)òðy
nñJ  ñ Ø'ØØØØØññ ‹)òðKn€
ðb T¨#¨u¯|©|Ð*;Ñ%<ð ÀRÇYÁYð ÐSWÐX[Ð]b×]iÑ]iÐXiÑSjó ò,˜Sð ¨x¸©}ð ÐQUð Ðilð Ðqxó ò	ˆcð 	 #ð 	¨$¨s°C¨x©.ó 	ñ %ð X&à#¡T¨b¤\ðX&ð "¡4Øð HØô$ðX&ð ¡Øð Eô!FðX&ð ¡Øð Eô!ðX&ð  (©Øô*ð!X&ð* .©tØô0ð+X&ð. -©dØô/ð/X&ð2 -©dØØ ¨H¸sÈhô/Xð3X&ð< "¡4Øð HØ"Ð(<Øô	$ð=X&ðF '©Øð MØô)ðGX&ðN &¡t°¤|ðOX&ðP $¡TØð Jô&KðQX&ðV $¡TØð Jô&KðWX&ð\ &¡t°¤|ð]X&ñ^ $¡T¨b¤\ð_X&ñ` #¡DØñ IØô%ðaX&ñl  ¡ØÙõ"ñmX&ñr  ¡ØÙõ"ðsX&ñx &¡tØÙõ(ðyX&ñ~ %¡dØÙõ'ðX&ñH ™t¨œ|ðIX&ñJ ™t¨œ|ðKX&ñL ™t¨œ|ðMX&ñN ™t¨œ|ðOX&ñP ™t¨œ|ðQX&ñR ™t¨œ|ðSX&ñX #¡D¨R¹MÑU[Õ$\ðYX&ñZ !¡$Øñ GÙ ©Fõ#4ð[X&ñb !¡$Øñ Gô#HðcX&ñh #¡DØÙ ©Fõ%4ðiX&ñn #¡D¨R¹MÑU[Õ$\ðoX&ñt &¡tØñ LÙ ©Fõ(4ðuX&ñ| &¡tØñ LÙ ©Fõ(4ð}X&ñD &¡tØñ LÙ ©Fõ(4òEX&ñL '©Øñ MØô)ðMX&ñV )©$ØÙ ©Fõ+4ðWX&ñ` /±Øô1ðaX&ñf /±ØØ ¨H¸sÈhô1XðgX&ñp '©ØÙõ)ðqX&ñ| '©Øñ MÙ ©Fõ)4ð}X&ñD )©$°2Á-Ñ[aÕ*bðEX&ñF (©Øñ NÙ ©Fõ*4ðGX&ñR $¡TØÙ ©Fõ&4ðSX&ñX 2±4Øô4ðYX&ñ\ 2±4ØØ ¨H¸sÈhô4Xð]X&ñb ,©T°b¬\ðcX&ñf *©4ØÙõ,ðgX&ñp ™tØØ"Ð(<õ >ðqX&ñv ™tØØ ¨H¸sÈhô XðwX&ñ| ™tØÙ ©H¸sÈhô Xð}X&ñB ¡ØØ"Ð(<õ!>òCX&ñH ¡ØØ ¨H¸sÈhô!XðIX&ñN ¡ØÙ ©H¸sÈhô!XðOX&ñT ™tØØ"Ð(<õ >ðUX&ñZ ™tØØ ¨H¸sÈhô Xð[X&ñ` ™tØÙ ©H¸sÈhô XðaX&ñf ¡ØØ"Ð(<õ!>ðgX&ñl ¡ØØ ¨H¸sÈhô!XðmX&ñr ¡ØÙ ©H¸sÈhô!XðsX&ñz ¡ØÙõ!ð{X&ñ@ '©ØØ ¨H¸sÈhô)XðAX&ñF '©ØÙ ©H¸sÈhô)XðGX&ñL  ¡ØÙõ"ðMX&ñR (©ØØ ¨H¸sÈhô*XðSX&ñX (©ØÙ ¨3¸(õ*DðYX&ñ^ !¡$ØÙõ#ð_X&ñd )©$ØØ ¨H¸sÈhô+XðeX&ñj )©$ØÙ ©H¸sÈhô+XñkX&ó X€ðv òS Dð S¸Cð SÀGó Só ðSð
 òS Dð S¸Cð SÀGó Só ðSð
 òP ð P¸ð PÀó Pó ðPð
 òP ð P¸ð PÀó Pó ðPð
 òP ð P¸ð PÀó Pó ðPð
 òP ð P¸ð PÀó Pó ðPð
 òS Dð S¸Cð SÀGó Só ðSð
 òX¨ð XÀð XÈó Xó ðXð
 òU dð U¸cð UÀgó Uó ðUð
 òU dð U¸cð UÀgó Uó ðUð
 òV tð V¸sð VÀwó Vó ðVð
 òU dð U¸cð UÀgó Uó ðUð
 òU dð U¸cð UÀgó Uó ðUð
 òU dð U¸cð UÀgó Uó ðUð
 òS Dð S¸Cð SÀGó Só ðSð
 òT Tð T¸Sð TÀWó Tó ðTð
 òM˜dð M°cð M¸gó Mó ðMð
 òM˜dð M°cð M¸gó Mó ðMð
 òM˜dð M°cð M¸gó Mó ðMð
 òM˜dð M°cð M¸gó Mó ðMð
 òM˜dð M°cð M¸gó Mó ðMð
 òM˜dð M°cð M¸gó Mó ðMð
 òR 4ð R¸3ð RÀ7ó Ró ðRð
 òR 4ð R¸3ð RÀ7ó Ró ðRð
 òR 4ð R¸3ð RÀ7ó Ró ðRð
 òR 4ð R¸3ð RÀ7ó Ró ðRð
 òW¨ð WÀð WÈó Wó ðWð
 òW¨ð WÀð WÈó Wó ðWð
 òW¨ð WÀð WÈó Wó ðWð
 òX¨ð XÀð XÈó Xó ðXð
 òX¨ð XÀð XÈó Xó ðXð
 òW¨ð WÀð WÈó Wó ðWð
 òW¨ð WÀð WÈó Wó ðWð
 òR 4ð R¸3ð RÀ7ó Ró ðRð
 òX¨ð XÀð XÈó Xó ðXð
 òX¨ð XÀð XÈó Xó ðXð
 òY¨$ð YÀ#ð YÈ'ó Yó ðYð
 òU dð U¸cð UÀgó Uó ðUð
 òZ¨4ð ZÀ3ð ZÈ7ó Zó ðZð
 òZ¨4ð ZÀ3ð ZÈ7ó Zó ðZð
 ò[¨Dð [ÀCð [ÈGó [ó ð[ð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òf Dð f¸Cð fÀGó fó ðfð
 òf Dð f¸Cð fÀGó fó ðfð
 òf Dð f¸Cð fÀGó fó ðfð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òd 4ð d¸3ð dÀ7ó dó ðdð
 òf Dð f¸Cð fÀGó fó ðfð
 òf Dð f¸Cð fÀGó fó ðfð
 òf Dð f¸Cð fÀGó fó ðfð
 òh Tð h¸Sð hÀWó hó ðhð
 òh Tð h¸Sð hÀWó hó ðhð
 òh Tð h¸Sð hÀWó hó ñhr_   