Ë
    éÓ^jÚd  ã            
       ór  — d Z ddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZ ddlZddlmc 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! dd	l"m#Z# dd
l$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z-m.Z. dgZ/ ej`                  e1«      Z2 G d„ dejf                  «      Z4 G d„ dejf                  «      Z5 G d„ dejf                  «      Z6de7fd„Z8e'de7fd„«       Z9 G d„ dejf                  «      Z: G d„ dejf                  «      Z;d1dejf                  de<de=fd„Z>d„ Z?d „ Z@d2d!„ZAd3d"„ZB e- eB«        eB«        eB«        eBd#¬$«       eBd#¬$«       eBd#¬$«      d%œ«      ZCe,d2d&e;fd'„«       ZDe,d2d&e;fd(„«       ZEe,d2d&e;fd)„«       ZFe,d2d&e;fd*„«       ZGe,d2d&e;fd+„«       ZHe,d2d&e;fd,„«       ZI e.e1d-d.d/d0œ«       y)4a   Nested Transformer (NesT) in PyTorch

A PyTorch implement of Aggregating Nested Transformers as described in:

'Aggregating Nested Transformers'
    - https://arxiv.org/abs/2105.12723

The official Jax code is released and available at https://github.com/google-research/nested-transformer. The weights
have been converted with convert/convert_nest_flax.py

Acknowledgments:
* The paper authors for sharing their research, code, and model weights
* Ross Wightman's existing code off which I based this

Copyright 2021 Alexander Soare
é    N)Úpartial)ÚListÚOptionalÚTupleÚTypeÚUnion)Únn©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚcalculate_drop_path_ratesÚcreate_classifierÚtrunc_normal_Ú_assertÚcreate_conv2dÚcreate_pool2dÚ	to_ntupleÚuse_fused_attnÚ	LayerNormé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_function)Úcheckpoint_seqÚnamed_apply)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecationsÚNestc                   ó†   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 d
de	de	dede
de
f
ˆ fd„Zd	„ Zˆ xZS )Ú	Attentionzš
    This is much like `.vision_transformer.Attention` but uses *localised* self attention by accepting an input with
     an extra "image block" dim
    Ú
fused_attnÚdimÚ	num_headsÚqkv_biasÚ	attn_dropÚ	proj_dropc                 óX  •— ||dœ}t         ‰
| �  «        || _        ||z  }	|	dz  | _        t	        «       | _        t        j                  |d|z  fd|i|¤Ž| _        t        j                  |«      | _
        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        y )N©ÚdeviceÚdtypeg      à¿é   Úbias)ÚsuperÚ__init__r'   Úscaler   r%   r	   ÚLinearÚqkvÚDropoutr)   Úprojr*   )Úselfr&   r'   r(   r)   r*   r-   r.   ÚddÚhead_dimÚ	__class__s             €ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/nest.pyr2   zAttention.__init__=   s˜   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ"ˆŒØ˜)Ñ#ˆØ Ñ%ˆŒ
Ü(Ó*ˆŒä—9‘9˜S ! C¡%Ñ=¨hÐ=¸"Ñ=ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆ�ó    c           	      ó¬  — |j                   \  }}}}| j                  |«      j                  |||d| j                  || j                  z  «      j	                  dddddd«      }|j                  d«      \  }}}	| j                  r<t        j                  |||	| j                  r| j                  j                  nd¬«      }nL|| j                  z  }||j                  d	d
«      z  }
|
j                  d
¬«      }
| j                  |
«      }
|
|	z  }|j	                  ddddd«      j                  ||||«      }| j                  |«      }| j!                  |«      }|S )zm
        x is shape: B (batch_size), T (image blocks), N (seq length per image block), C (embed dim)
        r/   r   é   r   é   é   ç        )Ú	dropout_péþÿÿÿéÿÿÿÿ)r&   )Úshaper5   Úreshaper'   ÚpermuteÚunbindr%   ÚFÚscaled_dot_product_attentionÚtrainingr)   Úpr3   Ú	transposeÚsoftmaxr7   r*   )r8   ÚxÚBÚTÚNÚCr5   ÚqÚkÚvÚattns              r<   ÚforwardzAttention.forwardS   s7  € ð —W‘W‰
ˆˆ1ˆa�à�h‰h�q‹k×!Ñ! ! Q¨¨1¨d¯n©n¸aÀ4Ç>Á>Ñ>QÓR×ZÑZÐ[\Ð^_ÐabÐdeÐghÐjkÓlˆØ—*‘*˜Q“-‰ˆˆ1ˆaà�?Š?Ü×.Ñ.¨q°!°QÐVZ×VcÒVcÀ$Ç.Á.×BRÒBRÐikÔl‰Aà�D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØ—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAð �I‰I�a˜˜A˜q !Ó$×,Ñ,¨Q°°1°aÓ8ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr=   )é   FrB   rB   NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtorchÚjitÚFinalÚboolÚ__annotations__ÚintÚfloatr2   rY   Ú__classcell__©r;   s   @r<   r$   r$   6   sk   ø… ñð —	‘	—‘ Ñ%Ó%ð
 Ø"Ø!Ø!ØØñ/àð/ð ð/ð ð	/ð
 ð/ð õ/ö,r=   r$   c                   ó¾   ‡ — e Zd ZdZdddddej
                  ej                  ddf	dededed	e	d
ededede
ej                     de
ej                     fˆ fd„Zd„ Zˆ xZS )ÚTransformerLayerzü
    This is much like `.vision_transformer.Block` but:
        - Called TransformerLayer here to allow for "block" as defined in the paper ("non-overlapping image blocks")
        - Uses modified Attention layer that handles the "block" dimension
    ç      @FrB   Nr&   r'   Ú	mlp_ratior(   r*   r)   Ú	drop_pathÚ	act_layerÚ
norm_layerc                 ó†  •— |
|dœ}t         ‰| �  «         |	|fi |¤Ž| _        t        |f||||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _         |	|fi |¤Ž| _	        t        ||z  «      }t        d||||dœ|¤Ž| _        |dkD  rt        |«      | _        y t        j                  «       | _        y )Nr,   )r'   r(   r)   r*   rB   )Úin_featuresÚhidden_featuresrm   Údrop© )r1   r2   Únorm1r$   rX   r   r	   ÚIdentityÚ
drop_path1Únorm2rd   r   ÚmlpÚ
drop_path2)r8   r&   r'   rk   r(   r*   r)   rl   rm   rn   r-   r.   r9   Úmlp_hidden_dimr;   s                 €r<   r2   zTransformerLayer.__init__r   s×   ø€ ð ¨Ñ/ˆÜ‰ÑÔÙ Ñ* rÑ*ˆŒ
ÜØð
àØØØñ
ð ñ
ˆŒ	ð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒÙ Ñ* rÑ*ˆŒ
Ü˜S 9™_Ó-ˆÜð 
ØØ*ØØñ	
ð
 ñ
ˆŒð 2;¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�r=   c                 óÒ   — | j                  |«      }|| j                  | j                  |«      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }|S ©N)rt   rv   rX   ry   rx   rw   )r8   rP   Úys      r<   rY   zTransformerLayer.forward—   sS   € Ø�J‰J�q‹MˆØ�—‘ §	¡	¨!£Ó-Ñ-ˆØ�—‘ §¡¨¯©°A«Ó 7Ó8Ñ8ˆØˆr=   )r[   r\   r]   r^   r	   ÚGELUr   rd   re   rb   r   ÚModuler2   rY   rf   rg   s   @r<   ri   ri   l   sª   ø„ ñð  "Ø"Ø!Ø!Ø!Ø)+¯©Ø*,¯,©,ØØñ#Sàð#Sð ð#Sð ð	#Sð
 ð#Sð ð#Sð ð#Sð ð#Sð ˜BŸI™I‘ð#Sð ˜RŸY™Y™õ#SöJr=   ri   c            	       óX   ‡ — e Zd Z	 	 	 ddededeej                     defˆ fd„Zd„ Z	ˆ xZ
S )ÚConvPoolÚin_channelsÚout_channelsrn   Úpad_typec                 óœ   •— ||dœ}t         ‰| �  «        t        ||fd|ddœ|¤Ž| _         ||fi |¤Ž| _        t        ddd|¬«      | _        y )Nr,   r/   T)Úkernel_sizeÚpaddingr0   Úmaxr@   )r†   Ústrider‡   )r1   r2   r   ÚconvÚnormr   Úpool)	r8   r‚   rƒ   rn   r„   r-   r.   r9   r;   s	           €r<   r2   zConvPool.__init__Ÿ   s\   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ! +¨|ÐnÈÐT\ÐcgÑnÐkmÑnˆŒ	Ù˜|Ñ2¨rÑ2ˆŒ	Ü! %°Q¸qÈ(ÔSˆ�	r=   c                 ó0  — t        |j                  d   dz  dk(  d«       t        |j                  d   dz  dk(  d«       | j                  |«      }| j                  |j	                  dddd«      «      j	                  dddd«      }| j                  |«      }|S )z:
        x is expected to have shape (B, C, H, W)
        rD   r@   r   z1BlockAggregation requires even input spatial dimsrE   r/   r   )r   rF   rŠ   r‹   rH   rŒ   ©r8   rP   s     r<   rY   zConvPool.forward®   s‰   € ô 	�—‘˜‘˜a‘ 1Ñ$Ð&YÔZÜ�—‘˜‘˜a‘ 1Ñ$Ð&YÔZØ�I‰I�a‹Lˆà�I‰I�a—i‘i  1 a¨Ó+Ó,×4Ñ4°Q¸¸1¸aÓ@ˆØ�I‰I�a‹LˆØˆr=   )Ú NN)r[   r\   r]   rd   r   r	   r   Ústrr2   rY   rf   rg   s   @r<   r�   r�   ž   sK   ø„ ð ØØñTàðTð ðTð ˜RŸY™Y™ð	Tð
 õTö
r=   r�   Ú
block_sizec                 óþ   — | j                   \  }}}}t        ||z  dk(  d«       t        ||z  dk(  d«       ||z  }||z  }| j                  ||||||«      } | j                  dd«      j                  |||z  d|«      } | S )zšimage to blocks
    Args:
        x (Tensor): with shape (B, H, W, C)
        block_size (int): edge length of a single square block in units of H, W
    r   z,`block_size` must divide input height evenlyz+`block_size` must divide input width evenlyr@   r/   rE   )rF   r   rG   rN   )rP   r‘   rQ   ÚHÚWrT   Úgrid_heightÚ
grid_widths           r<   Úblockifyr—   »   s’   € ð —'‘'�J€A€qˆ!ˆQÜˆA�
‰N˜aÑÐ!OÔPÜˆA�
‰N˜aÑÐ!NÔOØ�z‘/€KØ�j‘€JØ	�	‰	�!�[ *¨j¸*ÀaÓH€AØ	�‰�A�qÓ×!Ñ! ! [°:Ñ%=¸rÀ1ÓE€AØ€Hr=   c                 óæ   — | j                   \  }}}}t        t        j                  |«      «      }||z  x}}| j	                  ||||||«      } | j                  dd«      j	                  ||||«      } | S )zßblocks to image
    Args:
        x (Tensor): with shape (B, T, N, C) where T is number of blocks and N is sequence size per block
        block_size (int): edge length of a single square block in units of desired H, W
    r@   r/   )rF   rd   ÚmathÚsqrtrG   rN   )	rP   r‘   rQ   rR   Ú_rT   Ú	grid_sizeÚheightÚwidths	            r<   Ú
deblockifyrŸ   Ë   st   € ð —‘�J€A€qˆ!ˆQÜ”D—I‘I˜a“LÓ!€IØ Ñ+Ð+€FˆUØ	�	‰	�!�Y 	¨:°zÀ1ÓE€AØ	�‰�A�qÓ×!Ñ! ! V¨U°AÓ6€AØ€Hr=   c                   óÐ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 ddededededededee   d	ed
edededeee      dee	e
j                        dee	e
j                        defˆ fd„Zd„ Zˆ xZS )Ú	NestLevelz7 Single hierarchical level of a Nested Transformer
    Ú
num_blocksr‘   Ú
seq_lengthr'   ÚdepthÚ	embed_dimÚprev_embed_dimrk   r(   r*   r)   rl   rn   rm   r„   c                 óæ  •— ||dœ}t         ‰| �  «        || _        d| _        t	        j
                  t        j                  d|||fi |¤Ž«      | _        |�t        ||f||dœ|¤Ž| _
        nt	        j                  «       | _
        t        |«      rt        |«      |k(  sJ d«       ‚t	        j                  t        |«      D �cg c]  }t        d||||	|
||r||   nd ||dœ	|¤Ž‘Œ  c}Ž | _        y c c}w )Nr,   Fr   )rn   r„   zDMust provide as many drop path rates as there are transformer layers)	r&   r'   rk   r(   r*   r)   rl   rn   rm   rs   )r1   r2   r‘   Úgrad_checkpointingr	   Ú	Parameterr_   ÚzerosÚ	pos_embedr�   rŒ   ru   ÚlenÚ
SequentialÚrangeri   Útransformer_encoder)r8   r¢   r‘   r£   r'   r¤   r¥   r¦   rk   r(   r*   r)   rl   rn   rm   r„   r-   r.   r9   Úir;   s                       €r<   r2   zNestLevel.__init__Ý   s	  ø€ ð( ¨Ñ/ˆÜ‰ÑÔØ$ˆŒØ"'ˆÔäŸ™¤e§k¡k°!°ZÀÈYÑ&]ÐZ\Ñ&]Ó^ˆŒàÐ%Ü  °ÐkÀzÐ\dÑkÐhjÑkˆD�IäŸ™›ˆDŒIô ˆyŒ>Ü�y“> UÒ*ÐrÐ,rÓrÐ*Ü#%§=¡=ô ˜5“\ö3#ð ô ð ØØ#Ø#Ø!Ø#Ø#Ù*3˜) Aš,¸Ø%Ø#ñð óò3#ð $$ˆÕ ùò 3#s   Ã#C.c                 óŽ  — | j                  |«      }|j                  dddd«      }t        || j                  «      }|| j                  z   }| j
                  r5t        j                  j                  «       st        | j                  |«      }n| j                  |«      }t        || j                  «      }|j                  dddd«      S )z+
        expects x as (B, C, H, W)
        r   r@   r/   r   )rŒ   rH   r—   r‘   r«   r¨   r_   r`   Úis_scriptingr   r¯   rŸ   rŽ   s     r<   rY   zNestLevel.forward  s¢   € ð �I‰I�a‹LˆØ�I‰I�a˜˜A˜qÓ!ˆÜ�Q˜Ÿ™Ó(ˆØ�—‘ÑˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜t×7Ñ7¸Ó;‰Aà×(Ñ(¨Ó+ˆAÜ�q˜$Ÿ/™/Ó*ˆà�y‰y˜˜A˜q !Ó$Ð$r=   )Nrj   TrB   rB   NNNr�   NN)r[   r\   r]   r^   rd   r   re   rb   r   r   r	   r   r�   r2   rY   rf   rg   s   @r<   r¡   r¡   Ú   sñ   ø„ ñð -1Ø!Ø!Ø!Ø!Ø/3Ø48Ø37ØØØñ%0$àð0$ð ð0$ð ð	0$ð
 ð0$ð ð0$ð ð0$ð % S™Mð0$ð ð0$ð ð0$ð ð0$ð ð0$ð    U¡Ñ,ð0$ð !  b§i¡i¡Ñ1ð0$ð    R§Y¡Y¡Ñ0ð0$ð  õ!0$öd%r=   r¡   c            '       ó@  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d,dededededeedf   deedf   d	eedf   d
edededededededee	e
j                        dee	e
j                        dededef&ˆ fd„Zej                  j                   d-d„«       Zej                  j                   d„ «       Zej                  j                   d.d„«       Zej                  j                   d/d„«       Zej                  j                   de
j                  fd„«       Zd0d
edefd„Z	 	 	 	 	 d1dej.                  deeeee   f      d ed!ed"ed#edeeej.                     eej.                  eej.                     f   f   fd$„Z	 	 	 d2deeee   f   d%ed&efd'„Zd(„ Zd.d)efd*„Zd+„ Zˆ xZS )3r"   z… Nested Transformer (NesT)

    A PyTorch impl of : `Aggregating Nested Transformers`
        - https://arxiv.org/abs/2105.12723
    Úimg_sizeÚin_chansÚ
patch_sizeÚ
num_levelsÚ
embed_dims.r'   ÚdepthsÚnum_classesrk   r(   Ú	drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_ratern   rm   r„   Úweight_initÚglobal_poolc                 ó  •— t         ‰ | �  «        ||dœ}dD ]M  }t        «       |   }t        |t        j
                  j                  «      sŒ5t        |«      |k(  rŒDJ d|› d�«       ‚  t        |«      |«      } t        |«      |«      } t        |«      |«      }|| _	        || _
        |d   x| _        | _        g | _        |xs t        }|xs t        j                   }|| _        || _        t        |t        j
                  j                  «      r|d   |d   k(  sJ d«       ‚|d   }||z  dk(  sJ d	«       ‚|| _        d
t)        j*                  |dt(        j,                  ¬«      z  j/                  d«      j1                  «       | _        ||z  t5        j6                  | j2                  d   «      z  dk(  sJ d«       ‚t9        ||z  t5        j6                  | j2                  d   «      z  «      | _        t=        d||||d   ddœ|¤Ž| _        | j>                  j@                  | _         | j@                  | j2                  d   z  | _!        g }tE        ||d¬«      }d}d
}tG        t        | j2                  «      «      D ]‡  }||   }|jI                  tK        | j2                  |   | j:                  | jB                  ||   ||   ||f|	|
||||   |||dœ|¤Ž«       | xj                  tM        ||d|› �¬«      gz  c_        |}|dz  }Œ‰ t        jN                  |Ž | _(         ||d   fi |¤Ž| _)        tU        | j                  | j                  fd|i|¤Ž\  }}|| _+        t        jX                  |«      | _-        || _.        | j_                  |«       y)a‰  
        Args:
            img_size (int, tuple): input image size
            in_chans (int): number of input channels
            patch_size (int): patch size
            num_levels (int): number of block hierarchies (T_d in the paper)
            embed_dims (int, tuple): embedding dimensions of each level
            num_heads (int, tuple): number of attention heads for each level
            depths (int, tuple): number of transformer layers for each level
            num_classes (int): number of classes for classification head
            mlp_ratio (int): ratio of mlp hidden dim to embedding dim for MLP of transformer layers
            qkv_bias (bool): enable bias for qkv if True
            drop_rate (float): dropout rate for MLP of transformer layers, MSA final projection layer, and classifier
            attn_drop_rate (float): attention dropout rate
            drop_path_rate (float): stochastic depth rate
            norm_layer: (nn.Module): normalization layer for transformer layers
            act_layer: (nn.Module): activation layer in MLP of transformer layers
            pad_type: str: Type of padding to use '' for PyTorch symmetric, 'same' for TF SAME
            weight_init: (str): weight init scheme
            global_pool: (str): type of pooling operation to apply to final feature map

        Notes:
            - Default values follow NesT-B from the original Jax code.
            - `embed_dims`, `num_heads`, `depths` should be ints or tuples with length `num_levels`.
            - For those following the paper, Table A1 may have errors!
                - https://github.com/google-research/nested-transformer/issues/2
        r,   ©r¸   r'   r¹   zRequire `len(z) == num_levels`rE   r   r   z Model only handles square inputsz*`patch_size` must divide `img_size` evenlyr?   ÚcpuzUFirst level blocks don't fit evenly. Check `img_size`, `patch_size`, and `num_levels`F)r´   r¶   rµ   r¥   ÚflattenT)Ú	stagewiseN)rk   r(   r*   r)   rl   rn   rm   r„   zlevels.)Únum_chsÚ	reductionÚmoduler@   Ú	pool_typers   )0r1   r2   ÚlocalsÚ
isinstanceÚcollectionsÚabcÚSequencer¬   r   rº   rµ   Únum_featuresÚhead_hidden_sizeÚfeature_infor   r	   r~   r»   r·   r¶   r_   ÚarangeÚlongÚflipÚtolistr¢   r™   rš   rd   r‘   r   Úpatch_embedÚnum_patchesr£   r   r®   Úappendr¡   Údictr­   Úlevelsr‹   r   rÀ   r6   Ú	head_dropÚheadÚinit_weights)!r8   r´   rµ   r¶   r·   r¸   r'   r¹   rº   rk   r(   r»   r¼   r½   r¾   rn   rm   r„   r¿   rÀ   r-   r.   r9   Ú
param_nameÚparam_valuerÚ   Údp_ratesÚprev_dimÚcurr_strider°   r&   rÜ   r;   s!                                   €r<   r2   zNest.__init__'  s°  ø€ ôf 	‰ÑÔØ¨Ñ/ˆØ?ò 	dˆJÜ ›( :Ñ.ˆKÜ˜+¤{§¡×'?Ñ'?Õ@Ü˜;Ó'¨:Ó5Ðc¸ÀzÀlÐRbÐ7cÓcÐ5ð	dð
 +”Y˜zÓ*¨:Ó6ˆ
Ø)”I˜jÓ)¨)Ó4ˆ	Ø&”˜:Ó& vÓ.ˆØ&ˆÔØ ˆŒØ4>¸r±NÐBˆÔ˜DÔ1ØˆÔØÒ,¤9ˆ
ØÒ(¤§¡ˆ	Ø"ˆŒØ$ˆŒÜ�h¤§¡× 8Ñ 8Ô9Ø˜A‘; (¨1¡+Ò-ÐQÐ/QÓQÐ-Ø ‘{ˆHØ˜*Ñ$¨Ò)ÐWÐ+WÓWÐ)Ø$ˆŒð ¤§¡¨ZÀÌUÏZÉZÔ XÑX×^Ñ^Ð_`Óa×hÑhÓjˆŒØ˜JÑ&¬$¯)©)°D·O±OÀAÑ4FÓ*GÑGÈ1ÒLð 	eØdó	eÐLô ˜x¨:Ñ5¼$¿)¹)ÀDÇOÁOÐTUÑDVÓ:WÑWÓXˆŒô &ð 
ØØ!ØØ  ‘mØñ
ð ñ
ˆÔð  ×+Ñ+×7Ñ7ˆÔØ×*Ñ*¨d¯o©o¸aÑ.@Ñ@ˆŒð ˆÜ,¨^¸VÈtÔTˆØˆØˆÜ”s˜4Ÿ?™?Ó+Ó,ò 	ˆAØ˜Q‘-ˆCØ�M‰Mœ)Ø—‘ Ñ"Ø—‘Ø—‘Ø˜!‘Ø�q‘	ØØðð $Ø!Ø(Ø(Ø" 1™+Ø%Ø#Ø!ñð  ñ!ô ð$ ×Ò¤$¨s¸kÐT[Ð\]Ð[^ÐR_Ô"`Ð!aÑaÕØˆHØ˜1Ñ‰Kð-	ô. —m‘m VÐ,ˆŒñ ˜z¨"™~Ñ4°Ñ4ˆŒ	ô .¨d×.?Ñ.?À×AQÑAQÑoÐ]hÐoÐlnÑoÑˆ�TØ&ˆÔÜŸ™ IÓ.ˆŒØˆŒ	à×Ñ˜+Õ&r=   c                 óæ   — |dv sJ ‚d|v r t        j                  | j                  «       nd}| j                  D ]  }t	        |j
                  ddd¬«       Œ t        t        t        |¬«      | «       y )	N)Únlhbr�   rä   rB   ç{®Gáz”?rD   r@   ©ÚstdÚaÚb)Ú	head_bias)	r™   Úlogrº   rÚ   r   r«   r   r   Ú_init_nest_weights)r8   Úmoderê   Úlevels       r<   rÝ   zNest.init_weights±  sf   € à�|Ñ#Ð#Ð#Ø39¸T±>”T—X‘X˜d×.Ñ.Ó/Ñ/Àrˆ	Ø—[‘[ò 	?ˆEÜ˜%Ÿ/™/¨s°b¸AÖ>ð	?ä”GÔ.¸)ÔDÀdÕKr=   c                 ól   — t        t        | j                  «      «      D �ch c]  }d|› d�’Œ
 c}S c c}w )Nzlevel.z
.pos_embed)r®   r¬   rÚ   )r8   r°   s     r<   Úno_weight_decayzNest.no_weight_decay¹  s-   € ä05´c¸$¿+¹+Ó6FÓ0GÖH¨1�&˜˜˜:Ò&ÒHÐHùÒHs   ¡1c                 ó2   — t        d|rdndd fddg¬«      }|S )Nz^patch_embedz^levels\.(\d+)z*^levels\.(\d+)\.transformer_encoder\.(\d+))z"^levels\.(\d+)\.(?:pool|pos_embed))r   )z^norm)iŸ† )ÚstemÚblocks)rÙ   )r8   ÚcoarseÚmatchers      r<   Úgroup_matcherzNest.group_matcher½  s0   € äØ á&,Ñ"Ð2_ÐaeÐfØ=Ø$ðô
ˆð ˆr=   c                 ó4   — | j                   D ]	  }||_        Œ y r|   )rÚ   r¨   )r8   ÚenableÚls      r<   Úset_grad_checkpointingzNest.set_grad_checkpointingÉ  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r=   Úreturnc                 ó   — | j                   S r|   )rÜ   )r8   s    r<   Úget_classifierzNest.get_classifierÎ  s   € à�y‰yÐr=   c                 óp   — || _         t        | j                  | j                   |¬«      \  | _        | _        y )N)rÉ   )rº   r   rÏ   rÀ   rÜ   )r8   rº   rÀ   s      r<   Úreset_classifierzNest.reset_classifierÒ  s2   € Ø&ˆÔÜ&7Ø×Ñ˜t×/Ñ/¸;ô'HÑ#ˆÔ˜$�)r=   rP   Úindicesr‹   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc           	      ó²  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        | j                  «      dz
  }
t
        j                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]q  \  }} ||«      }||v sŒ|rL||
k(  rG| j                  |j                  dddd«      «      j                  dddd«      }|j                  |«       Œa|j                  |«       Œs |r|S |
k(  r5| j                  |j                  dddd«      «      j                  dddd«      }||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   Nr   r@   r/   )r   r¬   rÚ   rÖ   r¢   r_   r`   r²   Ú	enumerater‹   rH   rØ   )r8   rP   r   r‹   r  r  r  ÚintermediatesÚtake_indicesÚ	max_indexÚlast_idxÚstagesÚfeat_idxÚstageÚx_inters                  r<   Úforward_intermediateszNest.forward_intermediates×  sU  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið ×Ñ˜QÓˆÜ�t—‘Ó'¨!Ñ+ˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	,‰OˆH�eÙ�a“ˆAØ˜<Ò'Ù˜H¨Ò0Ø"Ÿi™i¨¯	©	°!°Q¸¸1Ó(=Ó>×FÑFÀqÈ!ÈQÐPQÓR�GØ!×(Ñ(¨Õ1à!×(Ñ(¨Õ+ð	,ñ Ø Ð à�xÒà—	‘	˜!Ÿ)™) A q¨!¨QÓ/Ó0×8Ñ8¸¸A¸qÀ!ÓDˆAà�-ÐÐr=   Ú
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r�   )r   r¬   rÚ   r	   ru   r‹   rÿ   )r8   r   r  r  r  r	  s         r<   Úprune_intermediate_layerszNest.prune_intermediate_layers
  s]   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐr=   c                 ó´   — | j                  |«      }| j                  |«      }| j                  |j                  dddd«      «      j                  dddd«      }|S )Nr   r@   r/   r   )rÖ   rÚ   r‹   rH   rŽ   s     r<   Úforward_featureszNest.forward_features  sR   € Ø×Ñ˜QÓˆØ�K‰K˜‹Nˆà�I‰I�a—i‘i  1 a¨Ó+Ó,×4Ñ4°Q¸¸1¸aÓ@ˆØˆr=   Ú
pre_logitsc                 óp   — | j                  |«      }| j                  |«      }|r|S | j                  |«      S r|   )rÀ   rÛ   rÜ   )r8   rP   r  s      r<   Úforward_headzNest.forward_head!  s5   € Ø×Ñ˜QÓˆØ�N‰N˜1ÓˆÙˆqÐ0 D§I¡I¨a£LÐ0r=   c                 óJ   — | j                  |«      }| j                  |«      }|S r|   )r  r  rŽ   s     r<   rY   zNest.forward&  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr=   )éà   r/   r?   r/   ©é€   é   i   ©r?   rZ   é   ©r@   r@   é   éè  rj   TrB   rB   rB   g      à?NNr�   r�   ÚavgNN©r�   ©F)T)r#  )NFFr  F)r   FT) r[   r\   r]   r^   rd   r   re   rb   r   r   r	   r   r�   r2   r_   r`   ÚignorerÝ   rð   rö   rú   rý   rÿ   ÚTensorr   r   r  r  r  r  rY   rf   rg   s   @r<   r"   r"      sö  ø„ ñð  ØØØØ*9Ø)3Ø&0Ø#Ø!Ø!Ø!Ø$&Ø$&Ø$'Ø48Ø37ØØ!Ø$ØØñ-H'àðH'ð ðH'ð ð	H'ð
 ðH'ð ˜c 3˜h™ðH'ð ˜S #˜X‘ðH'ð ˜#˜s˜(‘OðH'ð ðH'ð ðH'ð ðH'ð ðH'ð "ðH'ð "ðH'ð "ðH'ð  !  b§i¡i¡Ñ1ð!H'ð"    R§Y¡Y¡Ñ0ð#H'ð$ ð%H'ð& ð'H'ð( õ)H'ðT ‡Y�Y×ÑòLó ðLð ‡Y�Y×ÑñIó ðIð ‡Y�Y×Ñò	ó ð	ð ‡Y�Y×Ñò*ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñH¨Cð H¸có Hð 8<ØØ$Ø$Ø',ñ1 à�|‰|ð1 ð ˜e C¨¨c© NÑ3Ñ4ð1 ð ð	1 ð
 ð1 ð ð1 ð !%ð1 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó1 ðj ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ò ñ1¨$ó 1ö
r=   rÈ   Únamerê   c                 óV  — t        | t        j                  «      r¥|j                  d«      rDt	        | j
                  ddd¬«       t        j                  j                  | j                  |«       yt	        | j
                  ddd¬«       | j                  �*t        j                  j                  | j                  «       yyt        | t        j                  «      rPt	        | j
                  ddd¬«       | j                  �*t        j                  j                  | j                  «       yyy)zn NesT weight initialization
    Can replicate Jax implementation. Otherwise follows vision_transformer.py
    rÜ   rå   rD   r@   ræ   N)rË   r	   r4   Ú
startswithr   ÚweightÚinitÚ	constant_r0   Úzeros_ÚConv2d)rÈ   r(  rê   s      r<   rì   rì   ,  sÅ   € ô �&œ"Ÿ)™)Ô$Ø�?‰?˜6Ô"Ü˜&Ÿ-™-¨S°B¸!Õ<Ü�G‰G×Ñ˜fŸk™k¨9Õ5ä˜&Ÿ-™-¨S°B¸!Õ<Ø�{‰{Ð&Ü—‘—‘˜vŸ{™{Õ+ð 'ä	�FœBŸI™IÔ	&Ü�f—m‘m¨°°aÕ8Ø�;‰;Ð"Ü�G‰G�N‰N˜6Ÿ;™;Õ'ð #ð 
'r=   c                 óþ  — t         j                  d| j                  |j                  «       | j                  d   }|j                  dd \  }}t        t	        j
                  ||z  «      «      }t        | t        t	        j
                  |«      «      «      j                  dddd«      } t        j                  | ||gdd¬«      } t        | j                  dddd«      t        t	        j
                  |«      «      «      } | S )	zª
    Rescale the grid of position embeddings when loading from state_dict
    Expected shape of position embeddings is (1, T, N, C), and considers only square images
    z$Resized position embedding: %s to %sr@   r   r/   r   ÚbicubicF)Úsizerí   Úalign_corners)Ú_loggerÚinforF   rd   r™   rš   rŸ   rH   rJ   Úinterpolater—   )ÚposembÚ
posemb_newÚseq_length_oldÚnum_blocks_newÚseq_length_newÚsize_news         r<   Úresize_pos_embedr=  >  sÏ   € ô
 ‡L�LÐ7¸¿¹Àz×GWÑGWÔXØ—\‘\ !‘_€NØ%/×%5Ñ%5°a¸Ð%:Ñ"€N�NÜ”4—9‘9˜^¨NÑ:Ó;Ó<€Hä˜¤¤D§I¡I¨nÓ$=Ó >Ó?×GÑGÈÈ1ÈaÐQRÓS€FÜ�]‰]˜6¨°8Ð(<À9Ð\aÔb€Fä�f—n‘n Q¨¨1¨aÓ0´#´d·i±iÀÓ6OÓ2PÓQ€FØ€Mr=   c                 ó  — | j                  «       D �cg c]  }|j                  d«      sŒ|‘Œ }}|D ]E  }| |   j                  t        ||«      j                  k7  sŒ*t	        | |   t        ||«      «      | |<   ŒG | S c c}w )z4 resize positional embeddings of pretrained weights Ú
pos_embed_)Úkeysr*  rF   Úgetattrr=  )Ú
state_dictÚmodelrV   Úpos_embed_keyss       r<   Úcheckpoint_filter_fnrE  O  s€   € à!+§¡Ó!2ÖQ˜A°a·l±lÀ<Õ6P’aÐQ€NÐQØò OˆØ�a‰=×Ñ¤'¨%°Ó"3×"9Ñ"9Ó9Ü,¨Z¸©]¼GÀEÈ1Ó<MÓNˆJ�qŠMðOð Ðùò	 Rs
   “A<ªA<c                 óN   — t        t        | |ft        dd¬«      t        dœ|¤Ž}|S )N)r   r   r@   T)Úout_indicesÚflatten_sequential)Úfeature_cfgÚpretrained_filter_fn)r   r"   rÙ   rE  )ÚvariantÚ
pretrainedÚkwargsrC  s       r<   Ú_create_nestrN  X  s:   € Ü ÜØØðô  YÀ4ÔHÜ1ñð ñ€Eð €Lr=   c                 ó8   — | ddddgdddt         t        ddd	d
œ|¥S )Nr"  )r/   r  r  é   g      ì?r1  Tzpatch_embed.projrÜ   z
apache-2.0)Úurlrº   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚfixed_input_sizeÚmeanrç   Ú
first_convÚ
classifierÚlicenser
   )rQ  rM  s     r<   Ú_cfgr[  e  s9   € àØ¨=ÈÈBÀxØ¨9È$Ü%Ô.BØ(¸Øñð ðð r=   ztimm/)Ú	hf_hub_id)znest_base.untrainedznest_small.untrainedznest_tiny.untrainedznest_base_jx.goog_in1kznest_small_jx.goog_in1kznest_tiny_jx.goog_in1krû   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )ú Nest-B @ 224x224
    r  r  r   rÂ   rL  rs   )Ú	nest_base©rÙ   rN  ©rL  rM  Úmodel_kwargsrC  s       r<   r_  r_  |  s<   € ô ð WØ"¨jÀñWØOUñW€LäÑL°ÐL¸|ÑL€EØ€Lr=   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )ú Nest-S @ 224x224
    ©é`   éÀ   i€  ©r/   é   é   r   rÂ   rL  rs   )Ú
nest_smallr`  ra  s       r<   rk  rk  †  s3   € ô Ðe >¸ZÐPZÑeÐ^dÑe€LÜÑM°*ÐMÀÑM€EØ€Lr=   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )ú Nest-T @ 224x224
    re  rh  ©r@   r@   rZ   rÂ   rL  rs   )Ú	nest_tinyr`  ra  s       r<   ro  ro  �  s3   € ô Ðd >¸ZÐPYÑdÐ]cÑd€LÜÑL°ÐL¸|ÑL€EØ€Lr=   c                 ób   — |j                  dd«       t        dddddœ|¤Ž}t        d	d| i|¤Ž}|S )
r^  r„   Úsamer  r  r   rÂ   rL  rs   )Únest_base_jx©Ú
setdefaultrÙ   rN  ra  s       r<   rr  rr  ˜  sL   € ð ×Ñ�j &Ô)Üð WØ"¨jÀñWØOUñW€LäÑO°JÐOÀ,ÑO€EØ€Lr=   c                 ób   — |j                  dd«       t        dddddœ|¤Ž}t        d	d| i|¤Ž}|S )
rd  r„   rq  re  rh  r   rÂ   rL  rs   )Únest_small_jxrs  ra  s       r<   rv  rv  £  sC   € ð ×Ñ�j &Ô)ÜÐe >¸ZÐPZÑeÐ^dÑe€LÜÑP°ZÐPÀ<ÑP€EØ€Lr=   c                 ób   — |j                  dd«       t        dddddœ|¤Ž}t        d	d| i|¤Ž}|S )
rm  r„   rq  re  rh  rn  rÂ   rL  rs   )Únest_tiny_jxrs  ra  s       r<   rx  rx  ­  sC   € ð ×Ñ�j &Ô)ÜÐd >¸ZÐPYÑdÐ]cÑd€LÜÑO°JÐOÀ,ÑO€EØ€Lr=   rr  rv  rx  )Újx_nest_baseÚjx_nest_smallÚjx_nest_tiny)r�   rB   r%  r$  )Jr^   Úcollections.abcrÌ   Úloggingr™   Ú	functoolsr   Útypingr   r   r   r   r   r_   Útorch.nn.functionalr	   Ú
functionalrJ   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_features_fxr   Ú_manipulater   r   Ú	_registryr   r    r!   Ú__all__Ú	getLoggerr[   r4  r   r$   ri   r�   rd   r—   rŸ   r¡   r"   r�   re   rì   r=  rE  rN  r[  Údefault_cfgsr_  rk  ro  rr  rv  rx  rs   r=   r<   ú<module>rŒ     s  ðñó" Û Û Ý ß 5Õ 5ã ß Ð Ý ç A÷÷ ÷ ó õ +Ý +Ý 3ß 4ß YÑ Yàˆ(€à
ˆ'×
Ñ
˜HÓ
%€ô3�—	‘	ô 3ôl/�r—y‘yô /ôdˆr�y‰yô ð:˜Có ð  ð˜cò ó ðôC%�—	‘	ô C%ôLIˆ2�9‰9ô IñX(˜rŸy™yð (°ð (ÀUó (ò$ò"ó
ó	ñ %Ù›6Ù ›FÙ›6á"¨WÔ5Ù#¨gÔ6Ù"¨WÔ5ñ&ó €ð ñ¨Tò ó ðð ñ¨dò ó ðð ñ¨Tò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðñ ˜HØ"Ø$Ø"ñ'õ r=   