Ë
    éÓ^jI¨  ã                   ó>  — d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZ ddlZddlmZ ddlmc 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gZ-d5dee.e.f   dej^                  fd„Z0 G d„ dejb                  «      Z2 G d„ dejb                  «      Z3 G d„ dejb                  «      Z4 G d„ dejb                  «      Z5d6de6dee6ef   fd„Z7 e+ e7d¬«       e7ddd¬«       e7dd¬«       e7d¬«       e7ddd¬«       e7dd d¬«       e7dd¬«       e7dee¬!«       e7dee¬!«       e7ddee¬"«       e7dd#ee¬$«       e7dd#ee¬$«       e7ddee¬"«      d%œ«      Z8d7d&ee6ej^                  f   d'ejb                  d(e6d)e9dee6ej^                  f   f
d*„Z:d8d+e6d,e9de5fd-„Z;e,d8d,e9de5fd.„«       Z<e,d8d,e9de5fd/„«       Z=e,d8d,e9de5fd0„«       Z>e,d8d,e9de5fd1„«       Z?e,d8d,e9de5fd2„«       Z@e,d8d,e9de5fd3„«       ZAe,d8d,e9de5fd4„«       ZBy)9aé   BEiT: BERT Pre-Training of Image Transformers (https://arxiv.org/abs/2106.08254)

Model from official source: https://github.com/microsoft/unilm/tree/master/beit

@inproceedings{beit,
title={{BEiT}: {BERT} Pre-Training of Image Transformers},
author={Hangbo Bao and Li Dong and Songhao Piao and Furu Wei},
booktitle={International Conference on Learning Representations},
year={2022},
url={https://openreview.net/forum?id=p-BhZSz59o4}
}

BEiT-v2 from https://github.com/microsoft/unilm/tree/master/beit2

@article{beitv2,
title={{BEiT v2}: Masked Image Modeling with Vector-Quantized Visual Tokenizers},
author={Zhiliang Peng and Li Dong and Hangbo Bao and Qixiang Ye and Furu Wei},
year={2022},
eprint={2208.06366},
archivePrefix={arXiv},
primaryClass={cs.CV}
}

At this point only the 1k fine-tuned classification weights and model configs have been added,
see original source above for pre-training models and procedure.

Modifications by / Copyright 2021 Ross Wightman, original copyrights below
é    N)Úpartial)	ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnion)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚSwiGLUÚ	LayerNormÚDropPathÚcalculate_drop_path_ratesÚtrunc_normal_Úuse_fused_attnÚresample_patch_embedÚresample_abs_pos_embedÚresize_rel_pos_bias_tableÚndgridé   )Úbuild_model_with_cfg)Úfeature_take_indices)Ú
checkpoint)Úgenerate_default_cfgsÚregister_modelÚBeitÚwindow_sizeÚreturnc           
      ó2  — d| d   z  dz
  d| d   z  dz
  z  dz   }| d   | d   z  }t        j                  t        t        j                  | d   |t         j                  ¬«      t        j                  | d   |t         j                  ¬«      «      «      }t        j
                  |d«      }|dd…dd…df   |dd…ddd…f   z
  }|j                  ddd«      j                  «       }|dd…dd…dfxx   | d   dz
  z  cc<   |dd…dd…dfxx   | d   dz
  z  cc<   |dd…dd…dfxx   d| d   z  dz
  z  cc<   t        j                  |dz   fdz  ||j                  ¬«      }|j                  d«      |dd…dd…f<   |dz
  |ddd…f<   |dz
  |dd…df<   |dz
  |d	<   |S )
aº  Generate relative position index for window-based attention.

    Creates a lookup table for relative position indices between all pairs of positions
    within a window, including special handling for cls token interactions.

    Args:
        window_size: Height and width of the attention window.

    Returns:
        Relative position index tensor of shape (window_area+1, window_area+1)
        where +1 accounts for the cls token.
    é   r   r   é   ©ÚdeviceÚdtypeN)Úsizer(   r)   éÿÿÿÿ)r   r   )ÚtorchÚstackr   ÚarangeÚlongÚflattenÚpermuteÚ
contiguousÚzerosr)   Úsum)r"   r(   Únum_relative_distanceÚwindow_areaÚcoordsÚcoords_flattenÚrelative_coordsÚrelative_position_indexs           ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/beit.pyÚgen_relative_position_indexr<   I   sÁ  € ð  ¨Q¡Ñ/°!Ñ3¸¸KÈ¹NÑ8JÈQÑ8NÑOÐRSÑSÐð ˜a‘. ;¨q¡>Ñ1€KÜ�[‰[œÜ�‰�[ ‘^¨F¼%¿*¹*ÔEÜ�‰�[ ‘^¨F¼%¿*¹*ÔEóó €Fô —]‘] 6¨1Ó-€NØ$¢Qª¨4 ZÑ0°>Â!ÀTÊ1À*Ñ3MÑM€OØ%×-Ñ-¨a°°AÓ6×AÑAÓC€OØ’A’q˜!�GÓ ¨A¡°Ñ 2Ñ2ÓØ’A’q˜!�GÓ ¨A¡°Ñ 2Ñ2ÓØ’A’q˜!�GÓ  K°¡NÑ 2°QÑ 6Ñ6ÓÜ#Ÿk™k°¸a±Ð/AÀAÑ/EÈfÐ\k×\qÑ\qÔrÐØ&5×&9Ñ&9¸"Ó&=Ð˜A™B ¡˜FÑ#Ø%:¸QÑ%>Ð˜A˜q™r˜EÑ"Ø%:¸QÑ%>Ð˜A™B ˜EÑ"Ø$9¸AÑ$=Ð˜DÑ!Ø"Ð"ó    c                   ó8  ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 	 	 	 dde	de	dedede
de
d	eee	e	f      d
ee	   fˆ fd„Zdej                  fd„Zddej                  deej                     dej                  fd„Zdd„Zdd„Zdd„Zˆ xZS )Ú	AttentionzïMulti-head attention module with optional relative position bias.

    Implements multi-head self-attention with support for relative position bias
    and fused attention operations. Can use either standard or custom head dimensions.
    Ú
fused_attnÚdimÚ	num_headsÚqkv_biasÚqkv_bias_separateÚ	attn_dropÚ	proj_dropr"   Úattn_head_dimc                 óh  •— |	|
dœ}t         ‰| �  «        || _        ||z  }|�|}|| j                  z  }|dz  | _        t	        «       | _        || _        t        j                  ||dz  fddi|¤Ž| _	        |r…t        j                  t        j                  |fi |¤Ž«      | _        | j                  dt        j                  |fi |¤Žd¬«       t        j                  t        j                  |fi |¤Ž«      | _        nd| _        d| _        d| _        |r«|| _        d	|d
   z  dz
  d	|d   z  dz
  z  dz   | _        |d
   |d   z  }t        j                  t        j                  | j$                  |fi |¤Ž«      | _        | j                  dt        j                  |dz   |dz   f|	t        j(                  ¬«      d¬«       nd| _        d| _        d| _        t        j,                  |«      | _        t        j                  ||fi |¤Ž| _        t        j,                  |«      | _        | j5                  «        y)ak  Initialize attention module.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            qkv_bias: If True, add learnable bias to query, key, value projections.
            qkv_bias_separate: If True, use separate bias for q, k, v projections.
            attn_drop: Dropout rate for attention weights.
            proj_drop: Dropout rate for output projection.
            window_size: Window size for relative position bias. If None, no relative position bias.
            attn_head_dim: Dimension per attention head. If None, uses dim // num_heads.
        r'   Ng      à¿r&   ÚbiasFÚk_bias©Ú
persistentr%   r   r   r:   )ÚsuperÚ__init__rB   Úscaler   r@   rD   ÚnnÚLinearÚqkvÚ	Parameterr,   ÚemptyÚq_biasÚregister_bufferÚv_biasrJ   r"   r5   Úrelative_position_bias_tabler/   r:   ÚDropoutrE   ÚprojrF   Úreset_parameters)ÚselfrA   rB   rC   rD   rE   rF   r"   rG   r(   r)   ÚddÚhead_dimÚall_head_dimr6   Ú	__class__s                  €r;   rN   zAttention.__init__t   s  ø€ ð2 ¨Ñ/ˆÜ‰ÑÔØ"ˆŒØ˜)Ñ#ˆØÐ$Ø$ˆHØ $§.¡.Ñ0ˆØ Ñ%ˆŒ
Ü(Ó*ˆŒØ!2ˆÔä—9‘9˜S ,°Ñ"2ÑE¸ÐEÀ"ÑEˆŒÙÜŸ,™,¤u§{¡{°<Ñ'FÀ2Ñ'FÓGˆDŒKØ× Ñ  ¬5¯;©;°|Ñ+JÀrÑ+JÐW\Ð Ô]ÜŸ,™,¤u§{¡{°<Ñ'FÀ2Ñ'FÓGˆD�KàˆDŒKØˆDŒKØˆDŒKáØ*ˆDÔØ*+¨k¸!©nÑ*<¸qÑ*@ÀQÈÐUVÉÑEWÐZ[ÑE[Ñ)\Ð_`Ñ)`ˆDÔ&Ø% a™.¨;°q©>Ñ9ˆKÜ02·±Ü—‘˜D×6Ñ6¸	ÑHÀRÑHó1JˆDÔ-à× Ñ Ø)Ü—‘˜[¨1™_¨k¸A©oÐ>ÀvÔUZ×U_ÑU_Ô`Ø ð !õ ð  $ˆDÔØ04ˆDÔ-Ø+/ˆDÔ(äŸ™ IÓ.ˆŒÜ—I‘I˜l¨CÑ6°2Ñ6ˆŒ	ÜŸ™ IÓ.ˆŒð 	×ÑÕr=   r#   c                 óX  — | j                   | j                  j                  d«         j                  | j                  d   | j                  d   z  dz   | j                  d   | j                  d   z  dz   d«      }|j	                  ddd«      j                  «       }|j                  d«      S )z°Get relative position bias for the attention window.

        Returns:
            Relative position bias tensor of shape (1, num_heads, window_area+1, window_area+1).
        r+   r   r   r%   )rX   r:   Úviewr"   r1   r2   Ú	unsqueeze©r\   Úrelative_position_biass     r;   Ú_get_rel_pos_biaszAttention._get_rel_pos_bias¹   s®   € ð "&×!BÑ!BØ×(Ñ(×-Ñ-¨bÓ1ñ"3ß37±4Ø×Ñ˜QÑ $×"2Ñ"2°1Ñ"5Ñ5¸Ñ9Ø×Ñ˜QÑ $×"2Ñ"2°1Ñ"5Ñ5¸Ñ9¸2ó4?ð 	ð "8×!?Ñ!?ÀÀ1ÀaÓ!H×!SÑ!SÓ!UÐØ%×/Ñ/°Ó2Ð2r=   ÚxÚshared_rel_pos_biasc                 óN  — |j                   \  }}}| j                  €| j                  |«      }n…t        j                  | j                  | j
                  | j                  f«      }| j                  r| j                  |«      }||z  }n,t        j                  || j                  j                  |¬«      }|j                  ||d| j                  d«      j                  ddddd«      }|j                  d«      \  }}	}
| j                  rgd}| j                   �| j#                  «       }|�
||z   }n|�|}t        j$                  ||	|
|| j&                  r| j(                  j*                  nd	¬
«      }nr|| j,                  z  }||	j/                  dd«      z  }| j                   �|| j#                  «       z   }|�||z   }|j1                  d¬«      }| j)                  |«      }||
z  }|j/                  dd«      j                  |||«      }| j3                  |«      }| j5                  |«      }|S )a-  Forward pass of attention module.

        Args:
            x: Input tensor of shape (batch_size, num_tokens, dim).
            shared_rel_pos_bias: Optional shared relative position bias from parent module.

        Returns:
            Output tensor of shape (batch_size, num_tokens, dim).
        N)ÚweightrI   r&   r+   r%   r   r   é   ç        )Ú	attn_maskÚ	dropout_péþÿÿÿ©rA   )ÚshaperU   rR   r,   ÚcatrJ   rW   rD   ÚFÚlinearrj   ÚreshaperB   r1   Úunbindr@   rX   rf   Úscaled_dot_product_attentionÚtrainingrE   ÚprO   Ú	transposeÚsoftmaxrZ   rF   )r\   rg   rh   ÚBÚNÚCrR   rC   ÚqÚkÚvÚrel_pos_biasÚattns                r;   ÚforwardzAttention.forwardÆ   sï  € ð —'‘'‰ˆˆ1ˆaà�;‰;ÐØ—(‘(˜1“+‰Cä—y‘y $§+¡+¨t¯{©{¸D¿K¹KÐ!HÓIˆHØ×%Ò%Ø—h‘h˜q“k�Ø�x‘‘ä—h‘h˜q¨¯©¯©¸xÔH�Ø�k‰k˜!˜Q  4§>¡>°2Ó6×>Ñ>¸qÀ!ÀQÈÈ1ÓMˆØ—*‘*˜Q“-‰ˆˆ1ˆaà�?Š?ØˆLØ×0Ñ0Ð<Ø#×5Ñ5Ó7�Ø&Ð2Ø#/Ð2EÑ#E‘LØ$Ð0Ø2�ä×.Ñ.Ø�1�aØ&Ø.2¯mªm˜$Ÿ.™.×*Ò*Àô‰Að �D—J‘J‘ˆAØ˜Ÿ™ B¨Ó+Ñ+ˆDà×0Ñ0Ð<Ø˜d×4Ñ4Ó6Ñ6�Ø"Ð.ØÐ1Ñ1�à—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�K‰K˜˜1Ó×%Ñ% a¨¨AÓ.ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr=   c                 óJ  — | j                   �Rt        j                  j                  | j                   «       t        j                  j                  | j                  «       | j
                  �)t        j                  j                  | j
                  «       | j                  «        y©z"Initialize parameters and buffers.N)rU   rP   ÚinitÚzeros_rW   rX   Ú_init_buffers©r\   s    r;   r[   zAttention.reset_parametersþ   sb   € à�;‰;Ð"Ü�G‰G�N‰N˜4Ÿ;™;Ô'Ü�G‰G�N‰N˜4Ÿ;™;Ô'Ø×,Ñ,Ð8Ü�G‰G�N‰N˜4×<Ñ<Ô=Ø×ÑÕr=   c                 óò   — | j                   �| j                   j                  «        | j                  �E| j                  j                  t	        | j
                  | j                  j                  ¬«      «       yy)ú.Compute and fill non-persistent buffer values.N©r(   )rJ   Úzero_r:   Úcopy_r<   r"   r(   rŠ   s    r;   r‰   zAttention._init_buffers  s]   € à�;‰;Ð"Ø�K‰K×ÑÔØ×'Ñ'Ð3Ø×(Ñ(×.Ñ.Ü+¨D×,<Ñ,<ÀT×EaÑEa×EhÑEhÔiõð 4r=   c                 ó$   — | j                  «        y©z"Initialize non-persistent buffers.N©r‰   rŠ   s    r;   Úinit_non_persistent_buffersz%Attention.init_non_persistent_buffers  ó   € à×ÑÕr=   )	é   FFrl   rl   NNNN©N©r#   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   ÚjitÚFinalÚboolÚ__annotations__ÚintÚfloatr   r
   rN   ÚTensorrf   r„   r[   r‰   r“   Ú__classcell__©r`   s   @r;   r?   r?   l   sö   ø… ñð
 —	‘	—‘ Ñ%Ó%ð
 Ø"Ø&+Ø!Ø!Ø59Ø+/ØØñC àðC ð ðC ð ð	C ð
  $ðC ð ðC ð ðC ð " %¨¨S¨¡/Ñ2ðC ð $ C™=õC ðJ3 5§<¡<ó 3ñ6˜Ÿ™ð 6¸HÀUÇ\Á\Ñ<Rð 6Ð^c×^jÑ^jó 6ópó÷r=   r?   c                   ó>  ‡ — e Zd ZdZddddddddej
                  eddddfdededed	e	d
edede	de	de	de
e	   deej                     deej                     de
eeef      de
e   fˆ fd„Zdd„Zddej"                  de
ej"                     dej"                  fd„Zˆ xZS )ÚBlockzóTransformer block with attention and MLP.

    Standard transformer block consisting of multi-head self-attention and MLP
    with residual connections and layer normalization. Supports layer scale and
    stochastic depth regularization.
    Fç      @rl   NrA   rB   rC   Ú	mlp_ratioÚ	scale_mlpÚ
swiglu_mlprF   rE   Ú	drop_pathÚinit_valuesÚ	act_layerÚ
norm_layerr"   rG   c           
      óÞ  •— ||dœ}t         ‰| �  «         ||fi |¤Ž| _        t        |f||||||dœ|¤Ž| _        |	dkD  rt        |	«      nt        j                  «       | _         ||fi |¤Ž| _	        |r&t        d|t        ||z  «      |r|nd|dœ|¤Ž| _        n&t        d|t        ||z  «      ||r|nd|dœ|¤Ž| _        |	dkD  rt        |	«      nt        j                  «       | _        |
| _        |
r]t        j                   t#        j$                  |fi |¤Ž«      | _        t        j                   t#        j$                  |fi |¤Ž«      | _        nd\  | _        | _        | j+                  «        y)	a‘  Initialize transformer block.

        Args:
            dim: Input feature dimension.
            num_heads: Number of attention heads.
            qkv_bias: If True, add learnable bias to query, key, value projections.
            mlp_ratio: Ratio of MLP hidden dimension to input dimension.
            scale_mlp: If True, apply layer normalization in MLP.
            swiglu_mlp: If True, use SwiGLU activation in MLP.
            proj_drop: Dropout rate for projections.
            attn_drop: Dropout rate for attention.
            drop_path: Drop path rate for stochastic depth.
            init_values: Initial values for layer scale. If None, no layer scale.
            act_layer: Activation function class.
            norm_layer: Normalization layer class.
            window_size: Window size for relative position bias in attention.
            attn_head_dim: Dimension per attention head.
        r'   )rB   rC   rE   rF   r"   rG   rl   N)Úin_featuresÚhidden_featuresr®   Údrop)r°   r±   r­   r®   r²   ©NN© )rM   rN   Únorm1r?   rƒ   r   rP   ÚIdentityÚ
drop_path1Únorm2r   r    Úmlpr   Ú
drop_path2r¬   rS   r,   rT   Úgamma_1Úgamma_2r[   )r\   rA   rB   rC   r¨   r©   rª   rF   rE   r«   r¬   r­   r®   r"   rG   r(   r)   r]   r`   s                     €r;   rN   zBlock.__init__  sx  ø€ ðJ ¨Ñ/ˆÜ‰ÑÔÙ Ñ* rÑ*ˆŒ
ÜØð	
àØØØØ#Ø'ñ	
ð ñ	
ˆŒ	ð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
ÙÜð ØÜ # C¨)¡OÓ 4Ù)2™:¸Øñ	ð
 ñˆD�Hô ð ØÜ # C¨)¡OÓ 4Ø#Ù)2™:¸Øñð ñˆDŒHð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒà&ˆÔÙÜŸ<™<¬¯©°CÑ(>¸2Ñ(>Ó?ˆDŒLÜŸ<™<¬¯©°CÑ(>¸2Ñ(>Ó?ˆD�Là)3Ñ&ˆDŒL˜$œ,ð 	×ÑÕr=   r#   c                 óî   — | j                   �it        j                  j                  | j                   | j                  «       t        j                  j                  | j
                  | j                  «       yy)zInitialize parameters.N)r»   rP   r‡   Ú	constant_r¬   r¼   rŠ   s    r;   r[   zBlock.reset_parametersp  sM   € à�<‰<Ð#Ü�G‰G×Ñ˜dŸl™l¨D×,<Ñ,<Ô=Ü�G‰G×Ñ˜dŸl™l¨D×,<Ñ,<Õ=ð $r=   rg   rh   c           	      óî  — | j                   €h|| j                  | j                  | j                  |«      |¬«      «      z   }|| j	                  | j                  | j                  |«      «      «      z   }|S || j                  | j                   | j                  | j                  |«      |¬«      z  «      z   }|| j	                  | j                  | j                  | j                  |«      «      z  «      z   }|S )a  Forward pass of transformer block.

        Args:
            x: Input tensor of shape (batch_size, num_tokens, dim).
            shared_rel_pos_bias: Optional shared relative position bias.

        Returns:
            Output tensor of shape (batch_size, num_tokens, dim).
        ©rh   )r»   r·   rƒ   rµ   rº   r¹   r¸   r¼   )r\   rg   rh   s      r;   r„   zBlock.forwardv  sÈ   € ð �<‰<ÐØ�D—O‘O D§I¡I¨d¯j©j¸«mÐQd IÓ$eÓfÑfˆAØ�D—O‘O D§H¡H¨T¯Z©Z¸«]Ó$;Ó<Ñ<ˆAð ˆð �D—O‘O D§L¡L°4·9±9¸T¿Z¹ZÈ»]Ð`s°9Ó3tÑ$tÓuÑuˆAØ�D—O‘O D§L¡L°4·8±8¸D¿J¹JÀq»MÓ3JÑ$JÓKÑKˆAØˆr=   r—   r–   )r˜   r™   rš   r›   rP   ÚGELUr   r    rž   r¡   r   r   ÚModuler
   rN   r[   r,   r¢   r„   r£   r¤   s   @r;   r¦   r¦     s/  ø„ ñð #Ø!Ø#Ø$Ø!Ø!Ø!Ø+/Ø)+¯©Ø*3Ø59Ø+/ØØñ#Q àðQ ð ðQ ð ð	Q ð
 ðQ ð ðQ ð ðQ ð ðQ ð ðQ ð ðQ ð " %™ðQ ð ˜BŸI™I‘ðQ ð ˜RŸY™Y™ðQ ð " %¨¨S¨¡/Ñ2ðQ ð $ C™=õQ óf>ñ˜Ÿ™ð ¸HÀUÇ\Á\Ñ<Rð Ð^c×^jÑ^j÷ r=   r¦   c                   óp   ‡ — e Zd ZdZd
deeef   defˆ fd„Zdd„Zdd„Zdd„Z	de
j                  fd	„Zˆ xZS )ÚRelativePositionBiaszÊRelative position bias module for window-based attention.

    Generates learnable relative position biases for all pairs of positions
    within a window, including special handling for cls token.
    r"   rB   c                 ó´  •— ||dœ}t         ‰| �  «        || _        |d   |d   z  | _        d|d   z  dz
  d|d   z  dz
  z  dz   }t	        j
                  t        j                  ||fi |¤Ž«      | _        | j                  dt        j                  | j                  dz   | j                  dz   f|t        j                  ¬«      d¬«       | j                  «        y	)
z¶Initialize relative position bias module.

        Args:
            window_size: Height and width of the attention window.
            num_heads: Number of attention heads.
        r'   r   r   r%   r&   r:   FrK   N)rM   rN   r"   r6   rP   rS   r,   rT   rX   rV   r/   r[   )r\   r"   rB   r(   r)   r]   r5   r`   s          €r;   rN   zRelativePositionBias.__init__�  sâ   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ&ˆÔØ& q™>¨K¸©NÑ:ˆÔØ!" [°¡^Ñ!3°aÑ!7¸AÀÈAÁÑ<NÐQRÑ<RÑ SÐVWÑ WÐÜ,.¯L©L¼¿¹ÐEZÐ\eÑ9lÐikÑ9lÓ,mˆÔ)Ø×ÑØ%Ü�K‰K˜×)Ñ)¨AÑ-¨t×/?Ñ/?À!Ñ/CÐDÈVÔ[`×[eÑ[eÔfØð 	ô 	
ð 	×ÑÕr=   r#   c                 óv   — t         j                  j                  | j                  «       | j	                  «        yr†   )rP   r‡   rˆ   rX   r‰   rŠ   s    r;   r[   z%RelativePositionBias.reset_parameters¦  s$   € ä
�‰�‰�t×8Ñ8Ô9Ø×ÑÕr=   c                 óŒ   — | j                   j                  t        | j                  | j                   j                  ¬«      «       y)rŒ   r�   N)r:   r�   r<   r"   r(   rŠ   s    r;   r‰   z"RelativePositionBias._init_buffers«  s2   € à×$Ñ$×*Ñ*Ü'¨×(8Ñ(8À×A]ÑA]×AdÑAdÔeõ	
r=   c                 ó$   — | j                  «        yr‘   r’   rŠ   s    r;   r“   z0RelativePositionBias.init_non_persistent_buffers±  r”   r=   c                 óê   — | j                   | j                  j                  d«         j                  | j                  dz   | j                  dz   d«      }|j	                  ddd«      j                  «       S )z™Generate relative position bias.

        Returns:
            Relative position bias tensor of shape (num_heads, window_area+1, window_area+1).
        r+   r   r%   r   )rX   r:   rb   r6   r1   r2   rd   s     r;   r„   zRelativePositionBias.forwardµ  sm   € ð "&×!BÑ!BÀ4×C_ÑC_×CdÑCdÐegÓChÑ!i×!nÑ!nØ×Ñ˜qÑ  $×"2Ñ"2°QÑ"6¸ó"<Ðà%×-Ñ-¨a°°AÓ6×AÑAÓCÐCr=   r³   r—   )r˜   r™   rš   r›   r
   r    rN   r[   r‰   r“   r,   r¢   r„   r£   r¤   s   @r;   rÄ   rÄ   ‰  sD   ø„ ññ  E¨#¨s¨(¡Oð  Àõ  ó,ó

óðD˜Ÿ™÷ Dr=   rÄ   c            /       ó  ‡ — e Zd ZdZddddddddd	d
dddddddedd	dddddfdeeeeef   f   deeeeef   f   dedededededede	de
de	de	de
de
de
de
de
d eej                     d!ee
   d"e	d#e	d$e	d%e
f.ˆ fd&„ZdCd'e	d(dfd)„ZdDd*„ZdCd+ej                  d'e	fd,„Zej(                  j*                  d(ee   fd-„«       Zej(                  j*                  dCd.e	fd/„«       Zej(                  j*                  dEd0e	d(eeef   fd1„«       Zej(                  j*                  d(ej                  fd2„«       ZdFdedee   fd3„Z	 	 	 	 	 	 dGd4ej<                  d5eeeee   f      d6e	d7e	d8e	d9ed:e	d(eeej<                     eej<                  eej<                     f   f   fd;„Z 	 	 	 dHd5eeee   f   d<e	d=e	d(ee   fd>„Z!d4ej<                  d(ej<                  fd?„Z"dEd4ej<                  d@e	d(ej<                  fdA„Z#d4ej<                  d(ej<                  fdB„Z$ˆ xZ%S )Ir!   a  BEiT: BERT Pre-Training of Image Transformers.

    Vision Transformer model with support for relative position bias and
    shared relative position bias across layers. Implements both BEiT v1 and v2
    architectures with flexible configuration options.
    éà   é   r&   éè  Úavgé   é   Tr§   Frl   Ngü©ñÒMbP?Úimg_sizeÚ
patch_sizeÚin_chansÚnum_classesÚglobal_poolÚ	embed_dimÚdepthrB   rC   r¨   rª   r©   Ú	drop_rateÚpos_drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_rater®   r¬   Úuse_abs_pos_embÚuse_rel_pos_biasÚuse_shared_rel_pos_biasÚhead_init_scalec                 ó„  •— ||dœ}t         ‰ | �  «        || _        || _        || _        |x| _        x| _        | _        d| _        d| _	        t        d||||dœ|¤Ž| _        | j                  j                  }t        | j                  d«      r| j                  j                  «       n|}t        j                   t#        j$                  dd|fi |¤Ž«      | _        |r.t        j                   t#        j$                  d|dz   |fi |¤Ž«      nd| _        t        j*                  |¬«      | _        |r(t/        d| j                  j0                  |dœ|¤Ž| _        nd| _        t5        ||«      }t        j6                  t9        |«      D �cg c]5  }t;        d|||	|
||||||   |||r| j                  j0                  ndd	œ|¤Ž‘Œ7 c}«      | _        t9        |«      D �cg c]  }t?        d
|› �||¬«      ‘Œ c}| _         | j                  dk(  }|rt        jB                  «       n ||fi |¤Ž| _"        |r	 ||fi |¤Žnt        jB                  «       | _#        t        j*                  |«      | _$        |dkD  rt        jJ                  ||fi |¤Žnt        jB                  «       | _&        || _'        | jQ                  d¬«       yc c}w c c}w )a¤  Initialize BEiT model.

        Args:
            img_size: Input image size.
            patch_size: Patch size for patch embedding.
            in_chans: Number of input image channels.
            num_classes: Number of classes for classification head.
            global_pool: Type of global pooling ('avg' or '').
            embed_dim: Embedding dimension.
            depth: Number of transformer blocks.
            num_heads: Number of attention heads.
            qkv_bias: If True, add learnable bias to query, key, value projections.
            mlp_ratio: Ratio of MLP hidden dimension to embedding dimension.
            swiglu_mlp: If True, use SwiGLU activation in MLP.
            scale_mlp: If True, apply layer normalization in MLP.
            drop_rate: Dropout rate.
            pos_drop_rate: Dropout rate for position embeddings.
            proj_drop_rate: Dropout rate for projections.
            attn_drop_rate: Dropout rate for attention.
            drop_path_rate: Stochastic depth rate.
            norm_layer: Normalization layer class.
            init_values: Initial values for layer scale.
            use_abs_pos_emb: If True, use absolute position embeddings.
            use_rel_pos_bias: If True, use relative position bias in attention.
            use_shared_rel_pos_bias: If True, share relative position bias across layers.
            head_init_scale: Scale factor for head initialization.
        r'   r   F)rÑ   rÒ   rÓ   rÖ   Ú
feat_ratioN)ry   )r"   rB   )rA   rB   rC   r¨   r©   rª   rF   rE   r«   r®   r¬   r"   zblocks.)ÚmoduleÚnum_chsÚ	reductionrÎ   r   ©Úneeds_resetr´   ))rM   rN   rÔ   rÓ   rÕ   Únum_featuresÚhead_hidden_sizerÖ   Únum_prefix_tokensÚgrad_checkpointingr   Úpatch_embedÚnum_patchesÚhasattrrâ   rP   rS   r,   rT   Ú	cls_tokenÚ	pos_embedrY   Úpos_droprÄ   Ú	grid_sizer‚   r   Ú
ModuleListÚranger¦   ÚblocksÚdictÚfeature_infor¶   ÚnormÚfc_normÚ	head_droprQ   Úheadrà   Úinit_weights)!r\   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rB   rC   r¨   rª   r©   rØ   rÙ   rÚ   rÛ   rÜ   r®   r¬   rÝ   rÞ   rß   rà   r(   r)   r]   rí   ÚrÚdprÚiÚuse_fc_normr`   s!                                   €r;   rN   zBeit.__init__È  s´  ø€ ðn ¨Ñ/ˆÜ‰ÑÔØ&ˆÔØ ˆŒØ&ˆÔØENÐNˆÔÐN˜DÔ1°D´NØ!"ˆÔØ"'ˆÔä%ð 
ØØ!ØØñ	
ð
 ñ
ˆÔð ×&Ñ&×2Ñ2ˆÜ-4°T×5EÑ5EÀ|Ô-TˆD×Ñ×'Ñ'Ô)ÐZdˆäŸ™¤e§k¡k°!°Q¸	Ñ&HÀRÑ&HÓIˆŒá[jœŸ™¤e§k¡k°!°[À1±_ÀiÑ&VÐSUÑ&VÔWÐptˆŒÜŸ
™
 ]Ô3ˆŒá"Ü 4ð !Ø ×,Ñ,×6Ñ6Ø#ñ!ð ñ!ˆDÕð !%ˆDÔä'¨¸Ó>ˆÜ—m‘mô  ˜5“\ö!%#ð  ô ð ØØ#Ø!Ø#Ø#Ø%Ø(Ø(Ø˜a™&Ø%Ø'Ù:J˜D×,Ñ,×6Ò6ÐPTñð óò%#ó $ˆŒô$ QVÐV[ÓP\ö^ØKLŒD˜' ! ˜¨yÀAÖFò^ˆÔð ×&Ñ&¨%Ñ/ˆÙ%0”B—K‘K”M±jÀÑ6QÈbÑ6QˆŒ	Ù6A‘z )Ñ2¨rÒ2ÄrÇ{Á{Ã}ˆŒÜŸ™ IÓ.ˆŒØ?JÈQº”B—I‘I˜i¨Ñ;¸Ò;ÔTV×T_ÑT_ÓTaˆŒ	Ø.ˆÔð 	×Ñ eÐÕ,ùò9%#ùò"^s   Æ:J8ÇJ=rç   r#   c                 ó˜  — | j                  t        | j                  |¬«      «       | j                  �t	        | j                  d¬«       t	        | j
                  d¬«       | j                  «        | j                  rÂt        | j                  t        j                  «      r�t	        | j                  j                  d¬«       t        j                  «       5  | j                  j                  j                  | j                  «       | j                  j                   j                  | j                  «       ddd«       yyy# 1 sw Y   yxY w)zÙInitialize model weights.

        Args:
            needs_reset: If True, call reset_parameters() on modules that have it.
                Set to False when modules have already self-initialized in __init__.
        ræ   Nç{®Gáz”?©Ústd)Úapplyr   Ú_init_weightsrð   r   rï   Úfix_init_weightrà   Ú
isinstancerû   rP   rQ   rj   r,   Úno_gradÚmul_rI   )r\   rç   s     r;   rü   zBeit.init_weights?  sã   € ð 	�
‰
”7˜4×-Ñ-¸;ÔGÔHØ�>‰>Ð%Ü˜$Ÿ.™.¨cÕ2Ü�d—n‘n¨#Õ.à×ÑÔà×Ò¤J¨t¯y©y¼"¿)¹)Ô$DÜ˜$Ÿ)™)×*Ñ*°Õ4Ü—‘“ñ :Ø—	‘	× Ñ ×%Ñ% d×&:Ñ&:Ô;Ø—	‘	—‘×#Ñ# D×$8Ñ$8Ô9÷:ð :ð %EÐ÷:ð :ús   ÃAE Å E	c                 ó„  — t        j                  «       5  t        | j                  «      D ]~  \  }}t	        j
                  d|dz   z  «      }|j                  j                  j                  j                  |«       |j                  j                  j                  j                  |«       Œ€ 	 ddd«       y# 1 sw Y   yxY w)z¤Fix initialization weights according to BEiT paper.

        Rescales attention and MLP weights based on layer depth to improve
        training stability.
        g       @r   N)r,   r	  Ú	enumeraterõ   ÚmathÚsqrtrƒ   rZ   rj   Údiv_r¹   Úfc2)r\   Úlayer_idÚlayerrO   s       r;   r  zBeit.fix_init_weightS  s�   € ô �]‰]‹_ñ 	1Ü#,¨T¯[©[Ó#9ò 1‘�˜%ÜŸ	™	 #¨°A©Ñ"6Ó7�Ø—
‘
—‘×&Ñ&×+Ñ+¨EÔ2Ø—	‘	—‘×$Ñ$×)Ñ)¨%Õ0ñ1÷	1÷ 	1ñ 	1ús   •BB6Â6B?Úmc                 ó  — t        |t        j                  «      rOt        |j                  d¬«       |j
                  �+t        j                  j                  |j
                  d«       yy|rt        |d«      r|j                  «        yyy)z©Initialize model weights.

        Args:
            m: Module to initialize.
            needs_reset: If True, call reset_parameters() on modules that have it.
        r  r  Nr   r[   )
r  rP   rQ   r   rj   rI   r‡   r¾   rî   r[   )r\   r  rç   s      r;   r  zBeit._init_weights_  sg   € ô �aœŸ™Ô#Ü˜!Ÿ(™(¨Õ,Ø�v‰vÐ!Ü—‘×!Ñ! !§&¡&¨!Õ,ð "áœW QÐ(:Ô;Ø×ÑÕ ð <ˆ[r=   c                 ój   — ddh}| j                  «       D ]  \  }}d|v sŒ|j                  |«       Œ |S )z‘Get parameter names that should not use weight decay.

        Returns:
            Set of parameter names to exclude from weight decay.
        rð   rï   rX   )Únamed_parametersÚadd)r\   ÚnwdÚnÚ_s       r;   Úno_weight_decayzBeit.no_weight_decaym  sD   € ð ˜KÐ(ˆØ×)Ñ)Ó+ò 	‰DˆAˆqØ-°Ò2Ø—‘˜•
ð	ð ˆ
r=   Úenablec                 ó   — || _         y)z}Enable or disable gradient checkpointing.

        Args:
            enable: If True, enable gradient checkpointing.
        N)rë   )r\   r  s     r;   Úset_grad_checkpointingzBeit.set_grad_checkpointingz  s   € ð #)ˆÕr=   Úcoarsec                 ó$   — t        dddg¬«      }|S )zØCreate parameter group matcher for optimizer parameter groups.

        Args:
            coarse: If True, use coarse grouping.

        Returns:
            Dictionary mapping group names to regex patterns.
        z-^cls_token|pos_embed|patch_embed|rel_pos_bias)z^blocks\.(\d+)N)z^norm)iŸ† )Ústemrõ   )rö   )r\   r  Úmatchers      r;   Úgroup_matcherzBeit.group_matcherƒ  s!   € ô ØAØ-Ð/CÐDô
ˆð ˆr=   c                 ó   — | j                   S )z_Get the classifier head.

        Returns:
            The classification head module.
        )rû   rŠ   s    r;   Úget_classifierzBeit.get_classifier“  s   € ð �y‰yÐr=   c                 ó¬   — || _         |�|| _        |dkD  r&t        j                  | j                  |«      | _        yt        j
                  «       | _        y)z�Reset the classification head.

        Args:
            num_classes: Number of classes for new head.
            global_pool: Global pooling type.
        Nr   )rÔ   rÕ   rP   rQ   rÖ   r¶   rû   )r\   rÔ   rÕ   s      r;   Úreset_classifierzBeit.reset_classifierœ  sF   € ð 'ˆÔØÐ"Ø*ˆDÔØ>IÈAºo”B—I‘I˜dŸn™n¨kÓ:ˆ�	ÔSU×S^ÑS^ÓS`ˆ�	r=   rg   ÚindicesÚreturn_prefix_tokensrø   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc           	      ó`  — |dv sJ d«       ‚|dk(  }g }	t        t        | j                  «      |«      \  }
}|j                  \  }}}}| j	                  |«      }t        j                  | j                  j                  |j                  d   dd«      |fd¬«      }| j                  �|| j                  z   }| j                  |«      }| j                  �| j                  «       nd}t
        j                  j                  «       s|s| j                  }n| j                  d|dz    }t        |«      D ]q  \  }}| j                  r-t
        j                  j                  «       st!        |||¬	«      }n
 |||¬	«      }||
v sŒN|	j#                  |r| j%                  |«      n|«       Œs | j&                  rD|	D �cg c]  }|dd…d| j&                  …f   ‘Œ }}|	D �cg c]  }|dd…| j&                  d…f   ‘Œ }	}|ra| j                  j)                  ||f«      \  }}|	D �cg c]6  }|j+                  |||d«      j-                  dd
dd«      j/                  «       ‘Œ8 }	}t
        j                  j                  «       s|rt1        t3        |	«      «      }	|r|	S | j%                  |«      }||	fS c c}w c c}w c c}w )a
  Forward pass that returns intermediate feature maps.

        Args:
            x: Input image tensor of shape (batch_size, channels, height, width).
            indices: Block indices to return features from. If int, returns last n blocks.
            return_prefix_tokens: If True, return both prefix and spatial tokens.
            norm: If True, apply normalization to intermediate features.
            stop_early: If True, stop at last selected intermediate.
            output_fmt: Output format ('NCHW' or 'NLC').
            intermediates_only: If True, only return intermediate features.

        Returns:
            If intermediates_only is True, returns list of intermediate tensors.
            Otherwise, returns tuple of (final_features, intermediates).
        )ÚNCHWÚNLCz)Output format must be one of NCHW or NLC.r.  r   r+   r   rp   NrÀ   r&   r%   )r   Úlenrõ   rq   rì   r,   rr   rï   Úexpandrð   rñ   r‚   rœ   Úis_scriptingr  rë   r   Úappendrø   rê   Údynamic_feat_sizeru   r1   r2   ÚlistÚzip)r\   rg   r(  r)  rø   r*  r+  r,  ru   ÚintermediatesÚtake_indicesÚ	max_indexr|   r  ÚheightÚwidthr‚   rõ   rÿ   ÚblkÚyÚprefix_tokensÚHÚWs                           r;   Úforward_intermediateszBeit.forward_intermediates¨  s  € ð2 ˜_Ñ,ÐYÐ.YÓYÐ,Ø Ñ&ˆØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið  Ÿg™gÑˆˆ1ˆf�eØ×Ñ˜QÓˆÜ�I‰I�t—~‘~×,Ñ,¨Q¯W©W°Q©Z¸¸RÓ@À!ÐDÈ!ÔLˆØ�>‰>Ð%Ø�D—N‘NÑ"ˆAØ�M‰M˜!Óˆà.2×.?Ñ.?Ð.K�t×(Ñ(Ô*ÐQUˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFÜ Ó'ò 	B‰FˆAˆsØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜s A¸<ÔH‘á˜¨|Ô<�Ø�LÒ à×$Ñ$±T T§Y¡Y¨q¤\¸qÕAð	Bð ×!Ò!àERÖSÀ˜Qšq ! D×$:Ñ$:Ð":Ð:Ó;ÐSˆMÐSØDQÖR¸q˜Qšq $×"8Ñ"8Ñ"9Ð9Ó:ÐRˆMÐRÙà×#Ñ#×5Ñ5°v¸u°oÓF‰DˆAˆqØ^kÖlÐYZ˜QŸY™Y q¨!¨Q°Ó3×;Ñ;¸A¸qÀ!ÀQÓG×RÑRÕTÐlˆMÐlÜ�y‰y×%Ñ%Ô'Ñ,@ä ¤ ]°MÓ!BÓCˆMáØ Ð à�I‰I�a‹Lˆà�-ÐÐùò TùÚRùò ms   Æ0J!ÇJ&È;J+Ú
prune_normÚ
prune_headc                 ó  — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r+t        j                  «       | _        | j                  dd«       |S )a=  Prune layers not required for specified intermediate outputs.

        Args:
            indices: Indices of blocks to keep.
            prune_norm: If True, remove final normalization.
            prune_head: If True, remove classification head.

        Returns:
            List of indices that were kept.
        Nr   r   Ú )r   r0  rõ   rP   r¶   rø   rù   r'  )r\   r(  rB  rC  r8  r9  s         r;   Úprune_intermediate_layerszBeit.prune_intermediate_layersð  sj   € ô  #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙÜŸ;™;›=ˆDŒLØ×!Ñ! ! RÔ(ØÐr=   c                 ó  — | j                  |«      }t        j                  | j                  j	                  |j
                  d   dd«      |fd¬«      }| j                  �|| j                  z   }| j                  |«      }| j                  �| j                  «       nd}| j                  D ]E  }| j                  r-t        j                  j                  «       st        |||¬«      }Œ< |||¬«      }ŒG | j                  |«      }|S )zîForward pass through feature extraction layers.

        Args:
            x: Input tensor of shape (batch_size, channels, height, width).

        Returns:
            Feature tensor of shape (batch_size, num_tokens, embed_dim).
        r   r+   r   rp   NrÀ   )rì   r,   rr   rï   r1  rq   rð   rñ   r‚   rõ   rë   rœ   r2  r   rø   )r\   rg   r‚   r<  s       r;   Úforward_featureszBeit.forward_features	  sß   € ð ×Ñ˜QÓˆÜ�I‰I�t—~‘~×,Ñ,¨Q¯W©W°Q©Z¸¸RÓ@À!ÐDÈ!ÔLˆØ�>‰>Ð%Ø�D—N‘NÑ"ˆAØ�M‰M˜!Óˆà.2×.?Ñ.?Ð.K�t×(Ñ(Ô*ÐQUˆØ—;‘;ò 	=ˆCØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜s A¸<ÔH‘á˜¨|Ô<‘ð		=ð
 �I‰I�a‹LˆØˆr=   Ú
pre_logitsc                 ó  — | j                   r=| j                   dk(  r%|dd…| j                  d…f   j                  d¬«      n|dd…df   }| j                  |«      }| j	                  |«      }|r|S | j                  |«      S )a7  Forward pass through classification head.

        Args:
            x: Feature tensor of shape (batch_size, num_tokens, embed_dim).
            pre_logits: If True, return features before final linear layer.

        Returns:
            Logits tensor of shape (batch_size, num_classes) or pre-logits.
        rÎ   Nr   rp   r   )rÕ   rê   Úmeanrù   rú   rû   )r\   rg   rI  s      r;   Úforward_headzBeit.forward_head!  s€   € ð ×ÒØ=A×=MÑ=MÐQVÒ=V�’!�T×+Ñ+Ñ,Ð,Ñ-×2Ñ2°qÐ2Ô9Ð\]Ò^_ÐabÐ^bÑ\cˆAØ�L‰L˜‹OˆØ�N‰N˜1ÓˆÙˆqÐ0 D§I¡I¨a£LÐ0r=   c                 óJ   — | j                  |«      }| j                  |«      }|S )zÓForward pass through the model.

        Args:
            x: Input tensor of shape (batch_size, channels, height, width).

        Returns:
            Logits tensor of shape (batch_size, num_classes).
        )rH  rL  )r\   rg   s     r;   r„   zBeit.forward1  s)   € ð ×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr=   )Tr—   ©Fr–   )NFFFr.  F)r   FT)&r˜   r™   rš   r›   r   r   r    r
   Ústrrž   r¡   r   rP   rÂ   r   rN   rü   r  r  r,   rœ   Úignorer	   r  r  r   r   r#  r%  r'  r¢   r   rA  rF  rH  rL  r„   r£   r¤   s   @r;   r!   r!   À  sË  ø„ ñð 58Ø68ØØ#Ø$Ø ØØØ!Ø!Ø$Ø#Ø!Ø#%Ø$&Ø$&Ø$&Ø*3Ø+/Ø$(Ø%*Ø,1Ø%*ØØñ5u-à˜C  s¨C x¡Ð0Ñ1ðu-ð ˜c 5¨¨c¨¡?Ð2Ñ3ðu-ð ð	u-ð
 ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð ðu-ð !ðu-ð  "ð!u-ð" "ð#u-ð$ "ð%u-ð& ˜RŸY™Y™ð'u-ð( " %™ð)u-ð* "ð+u-ð, #ð-u-ð. &*ð/u-ð0 #õ1u-ñn:¨ð :¸ó :ó(
1ñ!˜rŸy™yð !°tó !ð ‡Y�Y×Ñð
  S¡ò 
ó ð
ð ‡Y�Y×Ññ)¨Tò )ó ð)ð ‡Y�Y×Ññ Dð °T¸#¸s¸(±^ò ó ðð ‡Y�Y×Ñð §	¡	ò ó ðñ
a¨Cð 
a¸hÀs¹mó 
að 8<Ø).ØØ$Ø$Ø',ñF à�|‰|ðF ð ˜e C¨¨c© NÑ3Ñ4ðF ð #'ð	F ð
 ðF ð ðF ð ðF ð !%ðF ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	KóF ðT ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óð2 %§,¡,ð °5·<±<ó ñ01˜eŸl™lð 1¸ð 1ÈÏÉó 1ð ˜Ÿ™ð ¨%¯,©,÷ r=   Úurlc                 ó$   — | dddddddddd	d
dœ|¥S )zÑCreate a default configuration dictionary for BEiT models.

    Args:
        url: Model weights URL.
        **kwargs: Additional configuration parameters.

    Returns:
        Configuration dictionary.
    rÍ   )r&   rË   rË   NgÍÌÌÌÌÌì?ÚbicubicT)ç      à?rT  rT  zpatch_embed.projrû   z
apache-2.0)rQ  rÔ   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚfixed_input_sizerK  r  Ú
first_convÚ
classifierÚlicenser´   )rQ  Úkwargss     r;   Ú_cfgr^  ?  s6   € ð Ø¨=ÀtØ¨ÈØ¨Ø(¸Øñð ðð r=   ztimm/)Ú	hf_hub_id)r&   é€  r`  g      ð?)r_  rU  rW  iQU  )r_  rÔ   )r&   é   ra  )r_  rK  r  )r_  rÔ   rK  r  gffffffî?)r_  rW  rK  r  )z)beit_base_patch16_224.in22k_ft_in22k_in1kz)beit_base_patch16_384.in22k_ft_in22k_in1kz$beit_base_patch16_224.in22k_ft_in22kz*beit_large_patch16_224.in22k_ft_in22k_in1kz*beit_large_patch16_384.in22k_ft_in22k_in1kz*beit_large_patch16_512.in22k_ft_in22k_in1kz%beit_large_patch16_224.in22k_ft_in22kz*beitv2_base_patch16_224.in1k_ft_in22k_in1kz$beitv2_base_patch16_224.in1k_ft_in1kz%beitv2_base_patch16_224.in1k_ft_in22kz+beitv2_large_patch16_224.in1k_ft_in22k_in1kz%beitv2_large_patch16_224.in1k_ft_in1kz&beitv2_large_patch16_224.in1k_ft_in22kÚ
state_dictÚmodelrX  Ú	antialiasc           	      ó@  — | j                  d| «      } | j                  d| «      } i }| j                  «       D �]c  \  }}d|v rŒd|v rf|j                  j                  j                  j
                  \  }}}	}
|j
                  d   |
k7  s|j
                  d   |	k7  rüt        ||	|
f||d¬«      }né|d	k(  rQ|j
                  d
   |j                  j
                  d
   k7  r(d
}t        ||j                  j                  |||d¬«      }n“|j                  d«      r‚|j                  |dd «      }|j
                  |j                  j
                  k7  s|j                  d   |j                  d
   k7  r,t        ||j                  |j                  j
                  ¬«      }|||<   �Œf |S )aÞ  Filter and process checkpoint state dict for loading.

    Handles resizing of patch embeddings, position embeddings, and relative position
    bias tables when model size differs from checkpoint.

    Args:
        state_dict: Checkpoint state dictionary.
        model: Target model to load weights into.
        interpolation: Interpolation method for resizing.
        antialias: If True, use antialiasing when resizing.

    Returns:
        Filtered state dictionary.
    rc  rã   r:   zpatch_embed.proj.weightr+   ro   T)rX  rd  Úverboserð   r   )Únew_sizerê   rX  rd  rf  rX   Niãÿÿÿr   )Únew_window_sizeÚnew_bias_shape)ÚgetÚitemsrì   rZ   rj   rq   r   rð   r   rò   ÚendswithÚget_submodulerX   r"   r   )rb  rc  rX  rd  Úout_dictr€   r�   ÚOÚIr?  r@  rê   r  s                r;   Úcheckpoint_filter_fnrq  –  s£  € ð —‘ ¨Ó4€JØ—‘ ¨*Ó5€Jð €HØ× Ñ Ó"ó  ‰ˆˆ1Ø$¨Ñ)ØØ$¨Ñ)Ø×*Ñ*×/Ñ/×6Ñ6×<Ñ<‰JˆAˆq�!�QØ�w‰w�r‰{˜aÒ 1§7¡7¨2¡;°!Ò#3Ü(ØØ˜�FØ"/Ø'Ø ô‘ð �+Ò !§'¡'¨!¡*°·±×0EÑ0EÀaÑ0HÒ"Hà !ÐÜ&ØØ×*Ñ*×4Ñ4Ø"3Ø+Ø#Øô‰Að �Z‰ZÐ6Ô7Ø×#Ñ# A d s GÓ,ˆAØ�w‰w˜!×8Ñ8×>Ñ>Ò>À!Ç-Á-ÐPQÑBRÐVW×VcÑVcÐdeÑVfÒBfÜ-ØØ$%§M¡MØ#$×#AÑ#A×#GÑ#Gô�ð
 ˆ�‹ðA ðB €Or=   ÚvariantÚ
pretrainedc                 ór   — |j                  dd«      }t        t        | |ft        t	        |d¬«      dœ|¤Ž}|S )zØCreate a BEiT model.

    Args:
        variant: Model variant name.
        pretrained: If True, load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        BEiT model instance.
    Úout_indicesr&   Úgetter)ru  Úfeature_cls)Úpretrained_filter_fnÚfeature_cfg)Úpopr   r!   rq  rö   )rr  rs  r]  ru  rc  s        r;   Ú_create_beitr{  Î  sH   € ð —*‘*˜]¨AÓ.€KÜ Üˆg�zðä1Ü [¸hÔGñð ñ	€Eð €Lr=   c           
      óZ   — t        dddddddd¬«      }t        d
d	| it        |fi |¤Ž¤Ž}|S )z0BEiT base model @ 224x224 with patch size 16x16.rÌ   rÏ   rÐ   rk   FTçš™™™™™¹?©rÒ   rÖ   r×   rB   r¨   rÝ   rÞ   r¬   rs  )Úbeit_base_patch16_224©rö   r{  ©rs  r]  Ú
model_argsrc  s       r;   r  r  ã  sF   € ô Ø ¨B¸"ÈØ°À#ôG€Jô Ñf¸ZÐfÌ4ÐPZÑKeÐ^dÑKeÑf€EØ€Lr=   c           
      óZ   — t        dddddddd¬«      }t        d
d	| it        |fi |¤Ž¤Ž}|S )z0BEiT base model @ 384x384 with patch size 16x16.r`  rÌ   rÏ   rÐ   FTr}  ©rÑ   rÒ   rÖ   r×   rB   rÝ   rÞ   r¬   rs  )Úbeit_base_patch16_384r€  r�  s       r;   r…  r…  í  sF   € ô Ø ¨s¸"ÈØ°À#ôG€Jô Ñf¸ZÐfÌ4ÐPZÑKeÐ^dÑKeÑf€EØ€Lr=   c           	      óX   — t        ddddddd¬«      }t        d	d| it        |fi |¤Ž¤Ž}|S )
z1BEiT large model @ 224x224 with patch size 16x16.rÌ   é   é   FTçñhãˆµøä>©rÒ   rÖ   r×   rB   rÝ   rÞ   r¬   rs  )Úbeit_large_patch16_224r€  r�  s       r;   r‹  r‹  ÷  sD   € ô Ø ¨R¸2Ø°À$ôH€Jô Ñg¸jÐgÌDÐQ[ÑLfÐ_eÑLfÑg€EØ€Lr=   c           
      óZ   — t        dddddddd¬«      }t        d
d	| it        |fi |¤Ž¤Ž}|S )z1BEiT large model @ 384x384 with patch size 16x16.r`  rÌ   r‡  rˆ  FTr‰  r„  rs  )Úbeit_large_patch16_384r€  r�  s       r;   r�  r�    óF   € ô Ø ¨t¸2ÈØ°À$ôH€Jô Ñg¸jÐgÌDÐQ[ÑLfÐ_eÑLfÑg€EØ€Lr=   c           
      óZ   — t        dddddddd¬«      }t        d
d	| it        |fi |¤Ž¤Ž}|S )z1BEiT large model @ 512x512 with patch size 16x16.ra  rÌ   r‡  rˆ  FTr‰  r„  rs  )Úbeit_large_patch16_512r€  r�  s       r;   r�  r�    rŽ  r=   c           
      óZ   — t        dddddddd¬«      }t        d
d	| it        |fi |¤Ž¤Ž}|S )z3BEiT v2 base model @ 224x224 with patch size 16x16.rÌ   rÏ   rÐ   rk   FTr‰  r~  rs  )Úbeitv2_base_patch16_224r€  r�  s       r;   r’  r’    sF   € ô Ø ¨B¸"ÈØ°À$ôH€Jô Ñh¸zÐhÌTÐR\ÑMgÐ`fÑMgÑh€EØ€Lr=   c           	      óX   — t        ddddddd¬«      }t        d	d| it        |fi |¤Ž¤Ž}|S )
z4BEiT v2 large model @ 224x224 with patch size 16x16.rÌ   r‡  rˆ  FTr‰  rŠ  rs  )Úbeitv2_large_patch16_224r€  r�  s       r;   r”  r”    sD   € ô Ø ¨R¸2Ø°À$ôH€Jô ÑiÀ
ÐiÌdÐS]ÑNhÐagÑNhÑi€EØ€Lr=   r–   )rE  )rS  TrN  )Cr›   r  Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   r   r   r,   Útorch.nnrP   Útorch.nn.functionalÚ
functionalrs   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r    Ú__all__r    r¢   r<   rÂ   r?   r¦   rÄ   r!   rO  r^  Údefault_cfgsrž   rq  r{  r  r…  r‹  r�  r�  r’  r”  r´   r=   r;   ú<module>r¢     sN  ðñóP Ý ß O× OÕ Oã Ý ß Ð ç A÷÷ ÷ ó õ +Ý +Ý #ß <àˆ(€ñ #¨U°3¸°8©_ð  #ÈeÏlÉló  #ôFf�—	‘	ô fôRqˆB�I‰Iô qôh4D˜2Ÿ9™9ô 4Dôn|ˆ2�9‰9ô |ñ~ˆcð  T¨#¨s¨(¡^ó ñ* %Ù15àô2ñ 26àØ ¨3ô2ñ
 -1àØô-ñ
 37àô3ñ 37àØ ¨3ô3ñ
 37àØ ¨3ô3ñ
 .2àØô.ñ 37àØ"Ð(<ô3ñ
 -1àØ"Ð(<ô-ñ
 .2àØÐ 5Ð;Oô.ñ
 48àØÐ1Ð7Kô4ñ
 .2àØÐ1Ð7Kô.ñ
 /3àØÐ 5Ð;Oô/ñu?&ó ?€ñD5 T¨#¨u¯|©|Ð*;Ñ%<ð 5ÀRÇYÁYð 5Ð_bð 5Ð{ð 5ð  LPð  QTð  V[÷  Vbñ  Vbð  Qbñ  Lcó 5ñp˜#ð ¨4ð Àdó ð* ñ dð Àò ó ðð ñ dð Àò ó ðð ñ tð À$ò ó ðð ñ tð À$ò ó ðð ñ tð À$ò ó ðð ñ¨ð À4ò ó ðð ñ¨ð ÀDò ó ñr=   