Ë
    éÓ^j/Ï  ã                   ó~  — 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" ddl#m$Z$ dd	l%m&Z& dd
l'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. dgZ/ee0ee0e0f   f   Z1dejd                  dee0e0f   dejd                  fd„Z3e(dejd                  dee0e0f   dee0e0f   dejd                  fd„«       Z4 G d„ dejj                  «      Z6 G d„ dejj                  «      Z7 G d„ dejj                  «      Z8 G d„ dejj                  «      Z9 G d„ dejj                  «      Z:dee;ejd                  f   dejj                  dee;ejd                  f   fd „Z<dOd!e;d"e=de:fd#„Z>dPd$„Z? e, e?d%d&¬'«       e?d%d(d)d*d+¬,«       e?d%d-¬'«       e?d%d.d)d*d+¬,«       e?d%d/¬'«       e?d%d0¬'«       e?d%d1¬'«       e?d%d2¬'«       e?d%d3¬'«       e?d%d4¬'«       e?d%d5d6d7d8¬9«       e?d%d:d6d7d8¬9«      d;œ«      Z@e-dOd"e=de:fd<„«       ZAe-dOd"e=de:fd=„«       ZBe-dOd"e=de:fd>„«       ZCe-dOd"e=de:fd?„«       ZDe-dOd"e=de:fd@„«       ZEe-dOd"e=de:fdA„«       ZFe-dOd"e=de:fdB„«       ZGe-dOd"e=de:fdC„«       ZHe-dOd"e=de:fdD„«       ZIe-dOd"e=de:fdE„«       ZJe-dOd"e=de:fdF„«       ZKe-dOd"e=de:fdG„«       ZL e.eMdHdIdJdKdLdMdNœ«       y)QaK   Swin Transformer V2
A PyTorch impl of : `Swin Transformer V2: Scaling Up Capacity and Resolution`
    - https://arxiv.org/abs/2111.09883

Code/weights from https://github.com/microsoft/Swin-Transformer, original copyright/license info below

Modifications and additions for timm hacked together by / Copyright 2022, Ross Wightman
é    N)Úpartial)	ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnion©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚcalculate_drop_path_ratesÚ	to_2tupleÚtrunc_normal_ÚClassifierHeadÚresample_patch_embedÚndgridÚget_act_layerÚ	LayerTypeé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_function)Ú
checkpoint)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚSwinTransformerV2ÚxÚwindow_sizeÚreturnc                 óð   — | j                   \  }}}}| 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.

    Args:
        x: Input tensor of shape (B, H, W, C).
        window_size: Window size (height, width).

    Returns:
        Windows tensor of shape (num_windows*B, window_size[0], window_size[1], C).
    r   r   é   é   é   é   éÿÿÿÿ©ÚshapeÚviewÚpermuteÚ
contiguous)r$   r%   ÚBÚHÚWÚCÚwindowss          új/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/swin_transformer_v2.pyÚwindow_partitionr8   %   sŒ   € ð —‘�J€A€qˆ!ˆQØ	�‰ˆ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Ø€Nó    r6   Úimg_sizec                 óê   — |\  }}| j                   d   }| j                  d||d   z  ||d   z  |d   |d   |«      }|j                  dddddd«      j                  «       j                  d|||«      }|S )a1  Merge windows back to feature map.

    Args:
        windows: Windows tensor of shape (num_windows * B, window_size[0], window_size[1], C).
        window_size: Window size (height, width).
        img_size: Image size (height, width).

    Returns:
        Feature map tensor of shape (B, H, W, C).
    r,   r   r   r(   r)   r*   r+   r-   )r6   r%   r:   r3   r4   r5   r$   s          r7   Úwindow_reverser<   8   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Ø€Hr9   c                   ó:  ‡ — e Zd ZdZ	 	 	 	 	 	 	 ddedeeef   dedededed	ed
eeef   ddfˆ fd„Zdd„Z	dd„Z
	 	 ddeej                  ej                  f   fd„Zdeeef   ddfd„Zdd„Zddej                  deej                     dej                  fd„Zˆ xZS )ÚWindowAttentionzÔWindow based multi-head self attention (W-MSA) module with relative position bias.

    Supports both shifted and non-shifted window attention with continuous relative
    position bias and cosine attention.
    NÚdimr%   Ú	num_headsÚqkv_biasÚqkv_bias_separateÚ	attn_dropÚ	proj_dropÚpretrained_window_sizer&   c           	      ó  •— |	|
dœ}t         ‰| �  «        || _        || _        t	        |«      | _        || _        || _        t        j                  t        j                  |ddffi |¤Ž«      | _        t        j                  t        j                  dddi|¤Žt        j                  d¬«      t        j                  d|fddi|¤Ž«      | _        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| _        t        j,                  |«      | _        t        j                  ||fi |¤Ž| _        t        j,                  |«      | _        t        j4                  d¬«      | _        | j                  \  }}| j'                  dt        j                  dd|z  dz
  d|z  dz
  dfi |¤Žd¬«       | j'                  dt        j                  ||z  ||z  |	t        j8                  ¬«      d¬«       | j;                  «        y)a4  Initialize window attention module.

        Args:
            dim: Number of input channels.
            window_size: The height and width of the window.
            num_heads: Number of attention heads.
            qkv_bias: If True, add a learnable bias to query, key, value.
            qkv_bias_separate: If True, use separate bias for q, k, v projections.
            attn_drop: Dropout ratio of attention weight.
            proj_drop: Dropout ratio of output.
            pretrained_window_size: The height and width of the window in pre-training.
        ©ÚdeviceÚdtyper   r)   é   ÚbiasT)ÚinplaceFr(   Úk_bias©Ú
persistentNr,   ©r?   Úrelative_coords_tableÚrelative_position_index)r)   rJ   )ÚsuperÚ__init__r?   r%   r   rE   r@   rB   ÚnnÚ	ParameterÚtorchÚemptyÚlogit_scaleÚ
SequentialÚLinearÚReLUÚcpb_mlpÚqkvÚq_biasÚregister_bufferÚv_biasrM   ÚDropoutrC   ÚprojrD   ÚSoftmaxÚsoftmaxÚlongÚreset_parameters)Úselfr?   r%   r@   rA   rB   rC   rD   rE   rH   rI   ÚddÚwin_hÚwin_wÚ	__class__s                 €r7   rT   zWindowAttention.__init__V   s.  ø€ ð2 ¨Ñ/ˆÜ‰ÑÔØˆŒØ&ˆÔÜ&/Ð0FÓ&GˆÔ#Ø"ˆŒØ!2ˆÔäŸ<™<¬¯©°YÀÀ1Ð4EÑ(LÈÑ(LÓMˆÔô —}‘}Ü�I‰IÑ. 4Ð.¨2Ñ.Ü�G‰G˜DÔ!Ü�I‰I�c˜9Ñ7¨5Ð7°BÑ7ó
ˆŒô —9‘9˜S #¨¡'Ñ<°Ð<¸Ñ<ˆŒÙÜŸ,™,¤u§{¡{°3Ñ'=¸"Ñ'=Ó>ˆDŒKØ× Ñ  ¬5¯;©;°sÑ+A¸bÑ+AÈeÐ ÔTÜŸ,™,¤u§{¡{°3Ñ'=¸"Ñ'=Ó>ˆD�KàˆDŒKØˆDŒKØˆDŒKÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆŒÜ—z‘z bÔ)ˆŒð ×'Ñ'‰ˆˆuØ×ÑØ#Ü�K‰K˜˜1˜u™9 q™=¨!¨e©)°a©-¸ÑA¸bÑAØð 	ô 	
ð
 	×ÑØ%Ü�K‰K˜ ™ u¨u¡}¸VÌ5Ï:É:ÔVØð 	ô 	
ð 	×ÑÕr9   c                 óZ  — t         j                  j                  | j                  t	        j
                  d«      «       | j                  �Rt         j                  j                  | j                  «       t         j                  j                  | j                  «       | j                  «        y)z"Initialize parameters and buffers.é
   N)
rU   ÚinitÚ	constant_rY   ÚmathÚlogr_   Úzeros_ra   Ú_init_buffers©rh   s    r7   rg   z WindowAttention.reset_parametersž   sb   € ä
�‰×Ñ˜$×*Ñ*¬D¯H©H°R«LÔ9Ø�;‰;Ð"Ü�G‰G�N‰N˜4Ÿ;™;Ô'Ü�G‰G�N‰N˜4Ÿ;™;Ô'Ø×ÑÕr9   c                 ó`  — | j                   �| j                   j                  «        | j                  | j                  j                  j
                  | j                  j                  j                  ¬«      \  }}| j                  j                  |«       | j                  j                  |«       y)z.Compute and fill non-persistent buffer values.NrG   )
rM   Úzero_Ú"_make_pair_wise_relative_positionsrc   ÚweightrH   rI   rQ   Úcopy_rR   )rh   rQ   rR   s      r7   rt   zWindowAttention._init_buffers¦   sŠ   € à�;‰;Ð"Ø�K‰K×ÑÔØ9=×9`Ñ9`Ø—9‘9×#Ñ#×*Ñ*°$·)±)×2BÑ2B×2HÑ2Hð :aó :
Ñ6ÐÐ6ð 	×"Ñ"×(Ñ(Ð)>Ô?Ø×$Ñ$×*Ñ*Ð+BÕCr9   c                 ó   — t        j                  | j                  d   dz
   | j                  d   |t         j                  ¬«      }t        j                  | j                  d   dz
   | j                  d   |t         j                  ¬«      }t        j                  t        ||«      «      }|j                  ddd«      j                  «       j                  d«      }| j                  d   dkD  rO|dd…dd…dd…dfxx   | j                  d   dz
  z  cc<   |dd…dd…dd…dfxx   | j                  d   dz
  z  cc<   nN|dd…dd…dd…dfxx   | j                  d   dz
  z  cc<   |dd…dd…dd…dfxx   | j                  d   dz
  z  cc<   |dz  }t        j                  |«      t        j                  t        j                  |«      dz   «      z  t        j                  d«      z  }|j                  |¬«      }t        j                  | j                  d   |t         j                  ¬«      }t        j                  | j                  d   |t         j                  ¬«      }t        j                  t        ||«      «      }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   | j                  d   dz
  z  cc<   |
dd…dd…dfxx   | j                  d   dz
  z  cc<   |
dd…dd…dfxx   d| j                  d   z  dz
  z  cc<   |
j#                  d	«      }||fS )
z¡Compute pair-wise relative position index and coordinates table.

        Returns:
            Tuple of (relative_coords_table, relative_position_index)
        r   r   rG   r)   Né   ç      ð?)rI   r,   )rW   Úaranger%   Úfloat32Ústackr   r0   r1   Ú	unsqueezerE   ÚsignÚlog2Úabsrq   Útorf   ÚflattenÚsum)rh   rH   rI   Úrelative_coords_hÚrelative_coords_wrQ   Úcoords_hÚcoords_wÚcoordsÚcoords_flattenÚrelative_coordsrR   s               r7   rx   z2WindowAttention._make_pair_wise_relative_positions°   s  € ô "ŸL™LØ×Ñ˜qÑ! AÑ%Ð&¨×(8Ñ(8¸Ñ(;ÀFÔRW×R_ÑR_ôaÐä!ŸL™LØ×Ñ˜qÑ! AÑ%Ð&¨×(8Ñ(8¸Ñ(;ÀFÔRW×R_ÑR_ôaÐä %§¡¬FÐ3DÐFWÓ,XÓ YÐØ 5× =Ñ =¸aÀÀAÓ F× QÑ QÓ S× ]Ñ ]Ð^_Ó `ÐØ×&Ñ& qÑ)¨AÒ-Ø!¢!¢Qª¨1 *Ó-°$×2MÑ2MÈaÑ2PÐSTÑ2TÑUÓ-Ø!¢!¢Qª¨1 *Ó-°$×2MÑ2MÈaÑ2PÐSTÑ2TÑUÔ-à!¢!¢Qª¨1 *Ó-°$×2BÑ2BÀ1Ñ2EÈÑ2IÑJÓ-Ø!¢!¢Qª¨1 *Ó-°$×2BÑ2BÀ1Ñ2EÈÑ2IÑJÓ-Ø Ñ"ÐÜ %§
¡
Ð+@Ó AÄEÇJÁJÜ�I‰IÐ+Ó,¨sÑ2óE4ñ !4Ü6:·i±iÀ³lñ!CÐà 5× 8Ñ 8¸uÐ 8Ó EÐô —<‘< × 0Ñ 0°Ñ 3¸FÌ%Ï*É*ÔUˆÜ—<‘< × 0Ñ 0°Ñ 3¸FÌ%Ï*É*ÔUˆÜ—‘œV H¨hÓ7Ó8ˆÜŸ™ v¨qÓ1ˆØ(ªªA¨t¨Ñ4°~ÂaÈÊqÀjÑ7QÑQˆØ)×1Ñ1°!°Q¸Ó:×EÑEÓGˆØšš1˜a˜Ó  D×$4Ñ$4°QÑ$7¸!Ñ$;Ñ;Ó Øšš1˜a˜Ó  D×$4Ñ$4°QÑ$7¸!Ñ$;Ñ;Ó Øšš1˜a˜Ó  A¨×(8Ñ(8¸Ñ(;Ñ$;¸aÑ$?Ñ?Ó Ø"1×"5Ñ"5°bÓ"9Ðà$Ð&=Ð=Ð=r9   c                 ó8  — t        |«      }|| j                  k7  r€| j                  €J ‚| j                  j                  }| j                  j                  }|| _        | j                  ||¬«      \  }}| j                  d|d¬«       | j                  d|d¬«       yy)z�Update window size and regenerate relative position tables.

        Args:
            window_size: New window size (height, width).
        NrG   rQ   FrN   rR   )r   r%   rQ   rH   rI   rx   r`   )rh   r%   rH   rI   rQ   rR   s         r7   Úset_window_sizezWindowAttention.set_window_sizeÚ   s«   € ô   Ó,ˆØ˜$×*Ñ*Ò*Ø×-Ñ-Ð9Ð9Ð9Ø×/Ñ/×6Ñ6ˆFØ×.Ñ.×4Ñ4ˆEØ*ˆDÔà×7Ñ7¸vÈUÐ7ÓSñ ;Ð!Ð#:à× Ñ Ð!8Ð:OÐ\aÐ ÔbØ× Ñ Ð!:Ð<SÐ`eÐ Õfð +r9   c                 ó$   — | j                  «        y)z"Initialize non-persistent buffers.N)rt   ru   s    r7   Úinit_non_persistent_buffersz+WindowAttention.init_non_persistent_buffersë   s   € à×ÑÕr9   r$   Úmaskc                 ó²  — |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«      \  }}	}
t        j                  |d¬«      t        j                  |	d¬«      j!                  d	d«      z  }t        j"                  | j$                  t'        j(                  d
«      ¬«      j+                  «       }||z  }| j-                  | j.                  «      j1                  d| j                  «      }|| j2                  j1                  d«         j1                  | j4                  d   | j4                  d   z  | j4                  d   | j4                  d   z  d«      }|j                  ddd«      j7                  «       }dt        j8                  |«      z  }||j;                  d«      z   }|�|j                   d   }|j1                  d|| j                  ||«      |j;                  d«      j;                  d«      z   }|j1                  d| j                  ||«      }| j=                  |«      }n| j=                  |«      }| j?                  |«      }||
z  j!                  dd«      j                  |||«      }| jA                  |«      }| jC                  |«      }|S )a#  Forward pass of window attention.

        Args:
            x: Input features with shape of (num_windows*B, N, C).
            mask: Attention mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None.

        Returns:
            Output features with shape of (num_windows*B, N, C).
        )ry   rK   r(   r,   r)   r   r   r*   rP   éþÿÿÿg      Y@)Úmaxé   )"r.   r_   r^   rW   ÚcatrM   ra   rB   ÚFÚlinearry   Úreshaper@   r0   ÚunbindÚ	normalizeÚ	transposeÚclamprY   rq   rr   Úexpr]   rQ   r/   rR   r%   r1   Úsigmoidr�   re   rC   rc   rD   )rh   r$   r“   ÚB_ÚNr5   r^   rA   ÚqÚkÚvÚattnrY   Úrelative_position_bias_tableÚrelative_position_biasÚnum_wins                   r7   ÚforwardzWindowAttention.forwardï   sÏ  € ð —7‘7‰ˆˆAˆqà�;‰;ÐØ—(‘(˜1“+‰Cä—y‘y $§+¡+¨t¯{©{¸D¿K¹KÐ!HÓIˆHØ×%Ò%Ø—h‘h˜q“k�Ø�x‘‘ä—h‘h˜q¨¯©¯©¸xÔH�Ø�k‰k˜"˜a  D§N¡N°BÓ7×?Ñ?ÀÀ1ÀaÈÈAÓNˆØ—*‘*˜Q“-‰ˆˆ1ˆaô —‘˜A 2Ô&¬¯©°Q¸BÔ)?×)IÑ)IÈ"ÈbÓ)QÑQˆÜ—k‘k $×"2Ñ"2¼¿¹ÀÓ8KÔL×PÑPÓRˆØ�kÑ!ˆà'+§|¡|°D×4NÑ4NÓ'O×'TÑ'TÐUWÐY]×YgÑYgÓ'hÐ$Ø!=¸d×>ZÑ>Z×>_Ñ>_Ð`bÓ>cÑ!d×!iÑ!iØ×Ñ˜QÑ $×"2Ñ"2°1Ñ"5Ñ5°t×7GÑ7GÈÑ7JÈT×M]ÑM]Ð^_ÑM`Ñ7`Ðbdó"fÐà!7×!?Ñ!?ÀÀ1ÀaÓ!H×!SÑ!SÓ!UÐØ!#¤e§m¡mÐ4JÓ&KÑ!KÐØÐ,×6Ñ6°qÓ9Ñ9ˆàÐØ—j‘j ‘mˆGØ—9‘9˜R ¨$¯.©.¸!¸QÓ?À$Ç.Á.ÐQRÓBS×B]ÑB]Ð^_ÓB`Ñ`ˆDØ—9‘9˜R §¡°°AÓ6ˆDØ—<‘< Ó%‰Dà—<‘< Ó%ˆDà�~‰~˜dÓ#ˆà�A‰X× Ñ   AÓ&×.Ñ.¨r°1°aÓ8ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr9   )TFç        r¬   )r   r   NN©r&   N)NN©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr
   ÚboolÚfloatrT   rg   rt   rW   ÚTensorrx   r�   r’   r   r«   Ú__classcell__©rl   s   @r7   r>   r>   O   s  ø„ ñð "Ø&+Ø!Ø!Ø6<ØØñF àðF ð ˜s C˜x™ðF ð ð	F ð
 ðF ð  $ðF ð ðF ð ðF ð %*¨#¨s¨(¡OðF ð 
õF óPóDð Øñ(>ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*ó	(>ðTg¨5°°c°©?ð g¸tó gó"ñ1˜Ÿ™ð 1¨X°e·l±lÑ-Cð 1ÈuÏ|É|÷ 1r9   r>   c                   ó  ‡ — e Zd ZdZddddddddddej
                  dd	d	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ej                     defˆ fd„Z	 	 	 d&deej                      deej"                     deej$                     deej                      fd„Z	 d'ded ee   deeeef   eeef   f   fd!„Z	 d'd"eeef   deeef   dee   dd	fd#„Zdej                   dej                   fd$„Zdej                   dej                   fd%„Zˆ xZS )(ÚSwinTransformerV2BlockzªSwin Transformer V2 Block.

    A standard transformer block with window attention and shifted window attention
    for modeling long-range dependencies efficiently.
    é   r   Fç      @Tr¬   ÚgeluNr?   Úinput_resolutionr@   r%   Ú
shift_sizeÚalways_partitionÚdynamic_maskÚ	mlp_ratiorA   rD   rC   Ú	drop_pathÚ	act_layerÚ
norm_layerrE   c                 ó8  •— ||dœ}t         ‰| �  «        || _        t        |«      | _        || _        t        |«      | _        || _        || _        | j                  ||«      \  | _
        | _        | j                  d   | j                  d   z  | _        || _        t        |«      }t        |ft        | j                  «      ||	||
t        |«      dœ|¤Ž| _         ||fi |¤Ž| _        |dkD  rt%        |«      nt'        j(                  «       | _        t-        d|t/        ||z  «      ||
dœ|¤Ž| _         ||fi |¤Ž| _        |dkD  rt%        |«      nt'        j(                  «       | _        | j7                  d| j                  rdn | j8                  di |¤Žd	¬
«       y)aç  
        Args:
            dim: Number of input channels.
            input_resolution: Input resolution.
            num_heads: Number of attention heads.
            window_size: Window size.
            shift_size: Shift size for SW-MSA.
            always_partition: Always partition into full windows and shift
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            pretrained_window_size: Window size in pretraining.
        rG   r   r   )r%   r@   rA   rC   rD   rE   r¬   )Úin_featuresÚhidden_featuresrÄ   ÚdropÚ	attn_maskNFrN   © )rS   rT   r?   r   r¾   r@   Útarget_shift_sizerÀ   rÁ   Ú_calc_window_shiftr%   r¿   Úwindow_arearÂ   r   r>   r§   Únorm1r   rU   ÚIdentityÚ
drop_path1r   r³   ÚmlpÚnorm2Ú
drop_path2r`   Úget_attn_mask)rh   r?   r¾   r@   r%   r¿   rÀ   rÁ   rÂ   rA   rD   rC   rÃ   rÄ   rÅ   rE   rH   rI   ri   rl   s                      €r7   rT   zSwinTransformerV2Block.__init__*  s§  ø€ ðJ ¨Ñ/ˆÜ‰ÑÔØˆŒÜ )Ð*:Ó ;ˆÔØ"ˆŒÜ!*¨:Ó!6ˆÔØ 0ˆÔØ(ˆÔØ,0×,CÑ,CÀKÐQ[Ó,\Ñ)ˆÔ˜$œ/Ø×+Ñ+¨AÑ.°×1AÑ1AÀ!Ñ1DÑDˆÔØ"ˆŒÜ! )Ó,ˆ	ä#Øð	
ä! $×"2Ñ"2Ó3ØØØØÜ#,Ð-CÓ#Dñ	
ð ñ	
ˆŒ	ñ   Ñ* rÑ*ˆŒ
Ø1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒäð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒñ   Ñ* rÑ*ˆŒ
Ø1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒà×ÑØØ×%Ò%‰DÐ+=¨4×+=Ñ+=Ñ+CÀÑ+CØð 	õ 	
r9   r$   rH   rI   r&   c           	      óª  — t        | j                  «      �rº|€)t        j                  dg| j                  ¢d‘­||¬«      }nJt        j                  d|j
                  d   |j
                  d   df|j                  |j                  ¬«      }d}d| j                  d    f| j                  d    | j                  d    f| j                  d    dffD ]l  }d| j                  d    f| j                  d    | j                  d    f| j                  d    dffD ]$  }||dd…|d   |d   …|d   |d   …dd…f<   |dz  }Œ& Œn t        || j                  «      }|j                  d| j                  «      }|j                  d«      |j                  d«      z
  }	|	j                  |	dk7  t        d«      «      j                  |	dk(  t        d«      «      }	|	S d}	|	S )	zÊGenerate attention mask for shifted window attention.

        Args:
            x: Input tensor for dynamic shape calculation.

        Returns:
            Attention mask or None if no shift.
        Nr   rG   r)   r   r,   g      YÀr¬   )Úanyr¿   rW   Úzerosr¾   r.   rH   rI   r%   r8   r/   rÎ   r�   Úmasked_fillrµ   )
rh   r$   rH   rI   Úimg_maskÚcntÚhÚwÚmask_windowsrÊ   s
             r7   rÕ   z$SwinTransformerV2Block.get_attn_masky  sþ  € ô ˆt�‰ÕàˆyÜ Ÿ;™;¨Ð'E¨D×,AÑ,AÐ'EÀ1Ñ'EÈfÐ\aÔb‘ä Ÿ;™;¨¨1¯7©7°1©:°q·w±w¸q±zÀ1Ð'EÈaÏhÉhÐ^_×^eÑ^eÔf�ØˆCà˜×)Ñ)¨!Ñ,Ð,Ð-Ø×&Ñ& qÑ)Ð)¨D¯O©O¸AÑ,>Ð+>Ð?Ø—o‘o aÑ(Ð(¨$Ð/ðò �ð ˜T×-Ñ-¨aÑ0Ð0Ð1Ø×*Ñ*¨1Ñ-Ð-°·±ÀÑ0BÐ/BÐCØŸ/™/¨!Ñ,Ð,¨dÐ3ðò �Að
 <?�HšQ  !¡ Q q¡T 	¨1¨Q©4°°!±¨9²aÐ7Ñ8Ø˜1‘H‘Cñðô ,¨H°d×6FÑ6FÓGˆLØ'×,Ñ,¨R°×1AÑ1AÓBˆLØ$×.Ñ.¨qÓ1°L×4JÑ4JÈ1Ó4MÑMˆIØ!×-Ñ-¨i¸1©n¼eÀF»mÓL×XÑXÐYbÐfgÑYgÔinÐorÓisÓtˆIð Ðð ˆIØÐr9   Útarget_window_sizerÌ   c                 óØ  — t        |«      }|€(| j                  }t        |«      r|d   dz  |d   dz  f}nt        |«      }| j                  r||fS t        |«      }t        |«      }t	        | j
                  |«      D ��cg c]  \  }}||k  r|n|‘Œ }}}t	        | j
                  ||«      D ���cg c]  \  }}}||k  rdn|‘Œ }}}}t        |«      t        |«      fS c c}}w c c}}}w )a  Calculate window size and shift size based on input resolution.

        Args:
            target_window_size: Target window size.
            target_shift_size: Target shift size.

        Returns:
            Tuple of (adjusted_window_size, adjusted_shift_size).
        r   r)   r   )r   rÌ   r×   rÀ   Úzipr¾   Útuple)rh   rß   rÌ   ÚrrÝ   r%   Úsr¿   s           r7   rÍ   z)SwinTransformerV2Block._calc_window_shift¢  s  € ô 'Ð'9Ó:ÐØÐ$à $× 6Ñ 6ÐÜÐ$Ô%à%7¸Ñ%:¸aÑ%?ÐASÐTUÑAVÐZ[ÑA[Ð$\Ñ!ä )Ð*;Ó <Ðà× Ò Ø%Ð'8Ð8Ð8ä&Ð'9Ó:ÐÜ%Ð&7Ó8ÐÜ69¸$×:OÑ:OÐQcÓ6d×e©d¨a°˜A šF‘q¨Ñ)ÐeˆÑeÜ8;¸D×<QÑ<QÐS^Ð`qÓ8r×sÐs©W¨Q°°1˜1 š6‘a qÑ(Ðsˆ
ÒsÜ�[Ó!¤5¨Ó#4Ð4Ð4ùó fùÜss   Â CÂ1C%Ú	feat_sizec                 óú  — || _         |�|| _        | j                  t        |«      «      \  | _        | _        | j                  d   | j                  d   z  | _        | j                  j                  | j                  «       | j                  �| j                  j                  nd}| j                  �| j                  j                  nd}| j                  d| j                  rdn| j                  ||¬«      d¬«       y)zßSet input size and update window configuration.

        Args:
            feat_size: New feature map size.
            window_size: New window size.
            always_partition: Override always_partition setting.
        Nr   r   rÊ   rG   FrN   )r¾   rÀ   rÍ   r   r%   r¿   rÎ   r§   r�   rÊ   rH   rI   r`   rÁ   rÕ   )rh   rå   r%   rÀ   rH   rI   s         r7   Úset_input_sizez%SwinTransformerV2Block.set_input_sizeÃ  sß   € ð !*ˆÔØÐ'Ø$4ˆDÔ!Ø,0×,CÑ,CÄIÈkÓDZÓ,[Ñ)ˆÔ˜$œ/Ø×+Ñ+¨AÑ.°×1AÑ1AÀ!Ñ1DÑDˆÔØ�	‰	×!Ñ! $×"2Ñ"2Ô3Ø*.¯.©.Ð*D�—‘×&Ò&È$ˆØ(,¯©Ð(B�—‘×$Ò$ÈˆØ×ÑØØ×%Ò%‰D¨4×+=Ñ+=ÀVÐSXÐ+=Ó+YØð 	õ 	
r9   c           	      ó  — |j                   \  }}}}t        | j                  «      }|r7t        j                  || j                  d    | j                  d    fd¬«      }n|}| j
                  d   || j
                  d   z  z
  | j
                  d   z  }| j
                  d   || j
                  d   z  z
  | j
                  d   z  }	t        j                  j                  j                  |ddd|	d|f«      }|j                   \  }
}}}
t        || j
                  «      }|j                  d| j                  |«      }t        | dd«      r| j                  |«      }n| j                  }| j                  ||¬«      }|j                  d| j
                  d   | j
                  d   |«      }t!        || j
                  ||f«      }|d	d	…d	|…d	|…d	d	…f   j#                  «       }|r$t        j                  || j                  d¬«      }|S |}|S )
z»Apply windowed attention with optional shift.

        Args:
            x: Input tensor of shape (B, H, W, C).

        Returns:
            Output tensor of shape (B, H, W, C).
        r   r   )r   r)   )ÚshiftsÚdimsr,   rÁ   F)r“   N)r.   r×   r¿   rW   Úrollr%   rU   Ú
functionalÚpadr8   r/   rÎ   ÚgetattrrÕ   rÊ   r§   r<   r1   )rh   r$   r2   r3   r4   r5   Ú	has_shiftÚ	shifted_xÚpad_hÚpad_wÚ_ÚHpÚWpÚ	x_windowsrÊ   Úattn_windowss                   r7   Ú_attnzSwinTransformerV2Block._attnß  s  € ð —W‘W‰
ˆˆ1ˆa�ô ˜Ÿ™Ó(ˆ	ÙÜŸ
™
 1¨t¯©¸qÑ/AÐ.AÀDÇOÁOÐTUÑDVÐCVÐ-WÐ^dÔe‰IàˆIà×!Ñ! !Ñ$ q¨4×+;Ñ+;¸AÑ+>Ñ'>Ñ>À$×BRÑBRÐSTÑBUÑUˆØ×!Ñ! !Ñ$ q¨4×+;Ñ+;¸AÑ+>Ñ'>Ñ>À$×BRÑBRÐSTÑBUÑUˆÜ—H‘H×'Ñ'×+Ñ+¨I¸¸1¸aÀÈÈ5Ð7QÓRˆ	Ø —‘‰ˆˆ2ˆr�1ô % Y°×0@Ñ0@ÓAˆ	Ø—N‘N 2 t×'7Ñ'7¸Ó;ˆ	ô �4˜¨Ô/Ø×*Ñ*¨9Ó5‰IàŸ™ˆIØ—y‘y °�yÓ;ˆð $×(Ñ(¨¨T×-=Ñ-=¸aÑ-@À$×BRÑBRÐSTÑBUÐWXÓYˆÜ" <°×1AÑ1AÀBÈÀ8ÓLˆ	Øša  !  R a Rª˜lÑ+×6Ñ6Ó8ˆ	ñ Ü—
‘
˜9¨T¯_©_À6ÔJˆAð ˆð ˆAØˆr9   c                 ó>  — |j                   \  }}}}|| j                  | j                  | j                  |«      «      «      z   }|j	                  |d|«      }|| j                  | j                  | j                  |«      «      «      z   }|j	                  ||||«      }|S )Nr,   )r.   rÑ   rÏ   rø   r›   rÔ   rÓ   rÒ   )rh   r$   r2   r3   r4   r5   s         r7   r«   zSwinTransformerV2Block.forward  s†   € Ø—W‘W‰
ˆˆ1ˆa�Ø�—‘ §
¡
¨4¯:©:°a«=Ó 9Ó:Ñ:ˆØ�I‰I�a˜˜QÓˆØ�—‘ §
¡
¨4¯8©8°A«;Ó 7Ó8Ñ8ˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr9   )NNNr®   )r¯   r°   r±   r²   rU   Ú	LayerNormr³   Ú_int_or_tuple_2_tr´   rµ   r   r   ÚModulerT   r   rW   r¶   rH   rI   rÕ   r
   rÍ   rç   rø   r«   r·   r¸   s   @r7   rº   rº   #  s  ø„ ñð ./Ø,-Ø%*Ø!&Ø!Ø!Ø!Ø!Ø!Ø#)Ø*,¯,©,Ø89ØØñ%M
àðM
ð 0ðM
ð ð	M
ð
 +ðM
ð *ðM
ð #ðM
ð ðM
ð ðM
ð ðM
ð ðM
ð ðM
ð ðM
ð !ðM
ð ˜RŸY™Y™ðM
ð  %6õ!M
ðb )-Ø-1Ø+/ñ	'à˜Ÿ™Ñ%ð'ð ˜UŸ\™\Ñ*ð'ð ˜EŸK™KÑ(ð	'ð
 
�%—,‘,Ñ	ó'ðX >Bñ5à 1ð5ð  (Ð(9Ñ:ð5ð 
ˆu�S˜#�X‰  c¨3 h¡Ð/Ñ	0ó	5ðJ 04ñ	
à˜S #˜X‘ð
ð ˜s C˜x™ð
ð ' t™nð	
ð
 
ó
ð8,�u—|‘|ð ,¨¯©ó ,ð\˜Ÿ™ð ¨%¯,©,÷ r9   rº   c                   ó¦   ‡ — e Zd ZdZdej
                  ddfdedee   deej                     fˆ fd„Z
dej                  dej                  fd	„Zˆ xZS )
ÚPatchMergingzŽPatch Merging Layer.

    Merges 2x2 neighboring patches and projects to higher dimension,
    effectively downsampling the feature maps.
    Nr?   Úout_dimrÅ   c                 óÜ   •— ||dœ}t         ‰| �  «        || _        |xs d|z  | _        t	        j
                  d|z  | j                  fddi|¤Ž| _         || j                  fi |¤Ž| _        y)zì
        Args:
            dim (int): Number of input channels.
            out_dim (int): Number of output channels (or 2 * dim if None)
            norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm
        rG   r)   r*   rK   FN)rS   rT   r?   rÿ   rU   r[   Ú	reductionÚnorm)rh   r?   rÿ   rÅ   rH   rI   ri   rl   s          €r7   rT   zPatchMerging.__init__  sj   ø€ ð ¨Ñ/ˆÜ‰ÑÔØˆŒØÒ) ! c¡'ˆŒÜŸ™ 1 s¡7¨D¯L©LÑK¸uÐKÈÑKˆŒÙ˜tŸ|™|Ñ2¨rÑ2ˆ�	r9   r$   r&   c                 óh  — |j                   \  }}}}ddd|dz  d|dz  f}t        j                  j                  ||«      }|j                   \  }}}}|j	                  ||dz  d|dz  d|«      j                  dddddd«      j                  d«      }| j                  |«      }| j                  |«      }|S )Nr   r)   r   r(   r*   r+   )	r.   rU   rì   rí   r›   r0   r†   r  r  )rh   r$   r2   r3   r4   r5   Ú
pad_valuesró   s           r7   r«   zPatchMerging.forward2  sµ   € Ø—W‘W‰
ˆˆ1ˆa�à˜˜A˜q 1™u a¨¨Q©Ð/ˆ
Ü�M‰M×Ñ˜a Ó,ˆØ—W‘W‰
ˆˆ1ˆa�à�I‰I�a˜˜a™  A¨¡F¨A¨qÓ1×9Ñ9¸!¸QÀÀ1ÀaÈÓK×SÑSÐTUÓVˆØ�N‰N˜1ÓˆØ�I‰I�a‹LˆØˆr9   )r¯   r°   r±   r²   rU   rú   r³   r   r   rü   rT   rW   r¶   r«   r·   r¸   s   @r7   rþ   rþ     sb   ø„ ñð &*Ø*,¯,©,ØØñ3àð3ð ˜c‘]ð3ð ˜RŸY™Y™õ	3ð*
˜Ÿ™ð 
¨%¯,©,÷ 
r9   rþ   c            '       óL  ‡ — e Zd ZdZdddddddddej
                  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	dede	de	de	de
eeej                     f   deej                     dededdf&ˆ fd„Z	 d"deeef   dedee   ddfd„Zdej&                  dej&                  fd „Zd#d!„Zˆ xZS )$ÚSwinTransformerV2Stagez•A Swin Transformer V2 Stage.

    A single stage consisting of multiple Swin Transformer blocks with
    optional downsampling at the beginning.
    Fr¼   Tr¬   r½   r   Nr?   rÿ   r¾   Údepthr@   r%   rÀ   rÁ   Ú
downsamplerÂ   rA   rD   rC   rÃ   rÄ   rÅ   rE   Úoutput_nchwr&   c                 ó^  •— ||dœ}t         ‰| �  «        || _        || _        |	rt	        d„ |D «       «      n|| _        || _        || _        d| _        t        |«      }t	        |D �cg c]  }|dz  ‘Œ	 c}«      }|	rt        d	|||dœ|¤Ž| _        n ||k(  sJ ‚t        j                  «       | _        t        j                  t        |«      D �cg c]F  }t!        d	|| j
                  |||dz  dk(  rdn||||
|||t#        |t$        «      r||   n||||dœ|¤Ž‘ŒH c}«      | _        yc c}w c c}w )
a  
        Args:
            dim: Number of input channels.
            out_dim: Number of output channels.
            input_resolution: Input resolution.
            depth: Number of blocks.
            num_heads: Number of attention heads.
            window_size: Local window size.
            always_partition: Always partition into full windows and shift
            dynamic_mask: Create attention mask in forward based on current input size
            downsample: Use downsample layer at start of the block.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Projection dropout rate
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            act_layer: Activation layer type.
            norm_layer: Normalization layer.
            pretrained_window_size: Local window size in pretraining.
            output_nchw: Output tensors on NCHW format instead of NHWC.
        rG   c              3   ó&   K  — | ]	  }|d z  –— Œ y­w©r)   NrË   ©Ú.0Úis     r7   ú	<genexpr>z2SwinTransformerV2Stage.__init__.<locals>.<genexpr>v  s   è ø€ Ò&H°! q¨A¥vÑ&Hùó   ‚Fr)   )r?   rÿ   rÅ   r   )r?   r¾   r@   r%   r¿   rÀ   rÁ   rÂ   rA   rD   rC   rÃ   rÄ   rÅ   rE   NrË   )rS   rT   r?   r¾   râ   Úoutput_resolutionr  r	  Úgrad_checkpointingr   rþ   r  rU   rÐ   Ú
ModuleListÚrangerº   Ú
isinstanceÚlistÚblocks)rh   r?   rÿ   r¾   r  r@   r%   rÀ   rÁ   r  rÂ   rA   rD   rC   rÃ   rÄ   rÅ   rE   r	  rH   rI   ri   rÝ   r¿   r  rl   s                            €r7   rT   zSwinTransformerV2Stage.__init__F  sQ  ø€ ðX ¨Ñ/ˆÜ‰ÑÔØˆŒØ 0ˆÔÙLV¤Ñ&HÐ7GÔ&HÔ!HÐ\lˆÔØˆŒ
Ø&ˆÔØ"'ˆÔÜ Ó,ˆÜ¨KÖ8 q˜A ›FÒ8Ó9ˆ
ñ Ü*Ða¨s¸GÐPZÑaÐ^`ÑaˆD�Oà˜'’>Ð!�>Ü Ÿk™k›mˆDŒOô —m‘mô& ˜5“\ö'%#ð& ô% #ð ØØ!%×!7Ñ!7Ø#Ø'Ø!" Q¡¨!¢™1°*Ø!1Ø)Ø#Ø!Ø#Ø#Ü*4°YÄÔ*E˜) Aš,È9Ø#Ø%Ø'=ñð  ó!ò%#ó $ˆ�ùò 9ùò%#s   Á'D%ÃAD*rå   c                 ó.  — || _         t        | j                  t        j                  «      r|| _        n3t        | j                  t        «      sJ ‚t        d„ |D «       «      | _        | j                  D ]   }|j                  | j
                  ||¬«       Œ" y)zòUpdate resolution, window size and relative positions.

        Args:
            feat_size: New input (feature) resolution.
            window_size: New window size.
            always_partition: Always partition / shift the window.
        c              3   ó&   K  — | ]	  }|d z  –— Œ y­wr  rË   r  s     r7   r  z8SwinTransformerV2Stage.set_input_size.<locals>.<genexpr>¬  s   è ø€ Ò*E°a¨1°­6Ñ*Eùr  ©rå   r%   rÀ   N)
r¾   r  r  rU   rÐ   r  rþ   râ   r  rç   )rh   rå   r%   rÀ   Úblocks        r7   rç   z%SwinTransformerV2Stage.set_input_sizeš  s‚   € ð !*ˆÔÜ�d—o‘o¤r§{¡{Ô3Ø%.ˆDÕ"ä˜dŸo™o¬|Ô<Ð<Ð<Ü%*Ñ*E¸9Ô*EÓ%EˆDÔ"Ø—[‘[ò 	ˆEØ× Ñ Ø×0Ñ0Ø'Ø!1ð !õ ñ	r9   r$   c                 óÈ   — | j                  |«      }| j                  D ]A  }| j                  r+t        j                  j                  «       st        ||«      }Œ: ||«      }ŒC |S )z°Forward pass through the stage.

        Args:
            x: Input tensor of shape (B, H, W, C).

        Returns:
            Output tensor of shape (B, H', W', C').
        )r  r  r  rW   ÚjitÚis_scriptingr   )rh   r$   Úblks      r7   r«   zSwinTransformerV2Stage.forward´  sY   € ð �O‰O˜AÓˆà—;‘;ò 	ˆCØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜s AÓ&‘á˜“F‘ð		ð
 ˆr9   c                 óÆ  — | j                   D ]Ò  }t        j                  j                  |j                  j
                  d«       t        j                  j                  |j                  j                  d«       t        j                  j                  |j                  j
                  d«       t        j                  j                  |j                  j                  d«       ŒÔ y)z/Initialize residual post-normalization weights.r   N)r  rU   ro   rp   rÏ   rK   ry   rÓ   )rh   r   s     r7   Ú_init_respostnormz(SwinTransformerV2Stage._init_respostnormÆ  s‰   € à—;‘;ò 	3ˆCÜ�G‰G×Ñ˜cŸi™iŸn™n¨aÔ0Ü�G‰G×Ñ˜cŸi™i×.Ñ.°Ô2Ü�G‰G×Ñ˜cŸi™iŸn™n¨aÔ0Ü�G‰G×Ñ˜cŸi™i×.Ñ.°Õ2ñ		3r9   r®   r­   )r¯   r°   r±   r²   rU   rú   r³   rû   r´   rµ   r   Ústrr   rü   rT   r
   r   rç   rW   r¶   r«   r"  r·   r¸   s   @r7   r  r  ?  s„  ø„ ñð &+Ø!&Ø$Ø!Ø!Ø!Ø!Ø!Ø5;Ø*,¯,©,Ø89Ø %ØØñ+R$àðR$ð ðR$ð 0ð	R$ð
 ðR$ð ðR$ð +ðR$ð #ðR$ð ðR$ð ðR$ð ðR$ð ðR$ð ðR$ð ðR$ð ðR$ð  ˜S $ r§y¡y¡/Ð1Ñ2ð!R$ð" ˜RŸY™Y™ð#R$ð$ %6ð%R$ð& ð'R$ð, 
õ-R$ðp 04ñ	à˜S #˜X‘ðð ðð ' t™nð	ð
 
óð4˜Ÿ™ð ¨%¯,©,ó ÷$3r9   r  c            +       ól  ‡ — e Zd ZdZdddddddd	d
dddddddddej
                  dddfdededededede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d$ed%eeef   d&eej                     d'e	edf   f(ˆ fd(„ZdEd)e
d*dfd+„ZdEd,ej                  d)e
d*dfd-„Z	 	 	 	 	 dFdee	eef      dee	eef      dee	eef      d.ee   dee
   f
d/„Zej,                  j.                  d*ee   fd0„«       Zej,                  j.                  dGd1e
d*eeef   fd2„«       Zej,                  j.                  dEd3e
d*dfd4„«       Zej,                  j.                  d*ej                  fd5„«       ZdHdedee   d*dfd6„Z	 	 	 	 	 dId7ej@                  d8eeee!e   f      d9e
d:e
d;ed<e
d*ee!ej@                     e	ej@                  e!ej@                     f   f   fd=„Z"	 	 	 dJd8eee!e   f   d>e
d?e
fd@„Z#d7ej@                  d*ej@                  fdA„Z$dGd7ej@                  dBe
d*ej@                  fdC„Z%d7ej@                  d*ej@                  fdD„Z&ˆ xZ'S )Kr#   a   Swin Transformer V2.

    A hierarchical vision transformer using shifted windows for efficient
    self-attention computation with continuous position bias.

    A PyTorch impl of : `Swin Transformer V2: Scaling Up Capacity and Resolution`
        - https://arxiv.org/abs/2111.09883
    éà   r*   r(   éè  Úavgé`   ©r)   r)   é   r)   ©r(   r*  é   é   r»   FTr¼   r¬   gš™™™™™¹?r½   )r   r   r   r   Nr:   Ú
patch_sizeÚin_chansÚnum_classesÚglobal_poolÚ	embed_dimÚdepths.r@   r%   rÀ   Ústrict_img_sizerÂ   rA   Ú	drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_raterÄ   rÅ   Úpretrained_window_sizesc                 ód  •— t         ‰ | �  «        ||dœ}|| _        || _        |dv sJ ‚|| _        d| _        t        |«      | _        || _        t        |d| j                  dz
  z  z  «      x| _
        | _        g | _        t        |t        t        f«      s1t!        | j                  «      D �cg c]  }t        |d|z  z  «      ‘Œ }}t#        d"||||d   ||ddœ|¤Ž| _        | j$                  j&                  }t)        ||d¬	«      }g }|d   }d}t!        | j                  «      D ]›  }||   }|t+        d"i d
|“d|“d|d   |z  |d   |z  f“d||   “d|dkD  “d||   “d|	“d|
“d| “d|“d|“d|“d|“d||   “d|“d|“d||   “|¤Žgz  }|}|dkD  r|dz  }| xj                  t-        |d|z  d|› �¬«      gz  c_        Œ� t/        j0                  |Ž | _         || j                  fi |¤Ž| _        t7        | j                  |f||| j
                  dœ|¤Ž| _        | j;                  d¬ «       y!c c}w )#a]  
        Args:
            img_size: Input image size.
            patch_size: Patch size.
            in_chans: Number of input image channels.
            num_classes: Number of classes for classification head.
            embed_dim: Patch embedding dimension.
            depths: Depth of each Swin Transformer stage (layer).
            num_heads: Number of attention heads in different layers.
            window_size: Window size.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            drop_rate: Head dropout rate.
            proj_drop_rate: Projection dropout rate.
            attn_drop_rate: Attention dropout rate.
            drop_path_rate: Stochastic depth rate.
            norm_layer: Normalization layer.
            act_layer: Activation layer type.
            patch_norm: If True, add normalization after patch embedding.
            pretrained_window_sizes: Pretrained window sizes of each layer.
            output_fmt: Output tensor format if not None, otherwise output 'NHWC' by default.
        rG   )Ú r'  ÚNHWCr)   r   r   )r:   r.  r/  r2  rÅ   r4  Ú
output_fmtT)Ú	stagewiser?   rÿ   r¾   r  r  r@   r%   rÀ   rÁ   rÂ   rA   rD   rC   rÃ   rÄ   rÅ   rE   r*   úlayers.)Únum_chsr  Úmodule)Ú	pool_typer5  Ú	input_fmtF©Úneeds_resetNrË   )rS   rT   r0  r/  r1  r=  ÚlenÚ
num_layersr2  r³   Únum_featuresÚhead_hidden_sizeÚfeature_infor  râ   r  r  r   Úpatch_embedÚ	grid_sizer   r  ÚdictrU   rZ   Úlayersr  r   ÚheadÚinit_weights)!rh   r:   r.  r/  r0  r1  r2  r3  r@   r%   rÀ   r4  rÂ   rA   r5  r6  r7  r8  rÄ   rÅ   r9  rH   rI   Úkwargsri   r  rL  ÚdprrN  Úin_dimÚscalerÿ   rl   s!                                   €r7   rT   zSwinTransformerV2.__init__Ù  sú  ø€ ô` 	‰ÑÔØ¨Ñ/ˆà&ˆÔØ ˆŒØ˜kÑ)Ð)Ð)Ø&ˆÔØ ˆŒÜ˜f›+ˆŒØ"ˆŒÜ47¸	ÀAÈ$Ï/É/Ð\]ÑJ]ÑD^Ñ8^Ó4_Ð_ˆÔ˜DÔ1ØˆÔä˜)¤e¬T ]Ô3Ü:?ÀÇÁÓ:PÖQ°Qœ˜Y¨¨a©Ñ/Õ0ÐQˆIÐQô &ð 	
ØØ!ØØ ‘lØ!Ø+Øñ	
ð ñ	
ˆÔð ×$Ñ$×.Ñ.ˆ	ä'¨¸È$ÔOˆØˆØ˜1‘ˆØˆÜ�t—‘Ó'ò 	dˆAØ ‘lˆGØÔ-ò Ùðáðð #,¨A¡,°%Ñ"7¸À1¹ÈÑ9NÑ!Oðð ˜Q’ið	ð
 ˜qš5ðð $ Aš,ðñ (ðñ "2ðð "1Ñ0ðñ $ðñ "ðñ )ðñ )ðð ˜aš&ðñ $ðñ  &ð!ð" (?¸qÒ'AØñ%ð ñ ˆFð( ˆFØ�1ŠuØ˜‘
�Ø×Ò¤$¨wÀ!ÀeÁ)ÐV]Ð^_Ð]`ÐTaÔ"bÐ!cÑcÖð3	dô6 —m‘m VÐ,ˆŒÙ˜t×0Ñ0Ñ7°BÑ7ˆŒ	Ü"Ø×ÑØð
ð "ØØ—o‘oñ
ð ñ
ˆŒ	ð 	×Ñ eÐÕ,ùòu Rs   Â,H-rE  r&   c                 ó’   — | j                  t        | j                  |¬«      «       | j                  D ]  }|j	                  «        Œ y)zÿInitialize model weights.

        Args:
            needs_reset: If True, call reset_parameters() on modules (default for after to_empty()).
                If False, skip reset_parameters() (for __init__ where modules already self-initialized).
        rD  N)Úapplyr   Ú_init_weightsrN  r"  )rh   rE  Úblys      r7   rP  zSwinTransformerV2.init_weightsS  s<   € ð 	�
‰
”7˜4×-Ñ-¸;ÔGÔHØ—;‘;ò 	$ˆCØ×!Ñ!Õ#ñ	$r9   Ú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 weights for Linear layers.

        Args:
            m: Module to initialize.
            needs_reset: Whether to call reset_parameters() on modules.
        g{®Gáz”?)ÚstdNr   rg   )
r  rU   r[   r   ry   rK   ro   rp   Úhasattrrg   )rh   rY  rE  s      r7   rW  zSwinTransformerV2._init_weights^  sg   € ô �aœŸ™Ô#Ü˜!Ÿ(™(¨Õ,Ø�v‰vÐ!Ü—‘×!Ñ! !§&¡&¨!Õ,ð "áœW QÐ(:Ô;Ø×ÑÕ ð <ˆ[r9   Úwindow_ratioc                 ó^  — |€|�3| j                   j                  ||¬«       | j                   j                  }|€|�t        D �cg c]  }||z  ‘Œ	 c}«      }t	        | j
                  «      D ]9  \  }}	dt        |dz
  d«      z  }
|	j                  d   |
z  |d   |
z  f||¬«       Œ; yc c}w )aT  Updates the image resolution, window size, and so the pair-wise relative positions.

        Args:
            img_size (Optional[Tuple[int, int]]): New input resolution, if None current resolution is used
            patch_size (Optional[Tuple[int, int]): New patch size, if None use current patch size
            window_size (Optional[int]): New window size, if None based on new_img_size // window_div
            window_ratio (int): divisor for calculating window size from patch grid size
            always_partition: always partition / shift windows even if feat size is < window
        N)r:   r.  r)   r   r   r  )rK  rç   rL  râ   Ú	enumeraterN  r–   )rh   r:   r.  r%   r]  rÀ   rL  rä   ÚindexÚstageÚstage_scales              r7   rç   z SwinTransformerV2.set_input_sizel  sÈ   € ð" Ð :Ð#9Ø×Ñ×+Ñ+°XÈ*Ð+ÔUØ×(Ñ(×2Ñ2ˆIàÐ <Ð#;Ü¸IÖ F°q  lÓ!2Ò FÓGˆKä% d§k¡kÓ2ò 	‰LˆE�5Øœs 5¨1¡9¨aÓ0Ñ0ˆKØ× Ñ Ø$ Q™<¨;Ñ6¸	À!¹ÈÑ8SÐTØ'Ø!1ð !õ ñ	ùò !Gs   ÁB*c                 ó®   — t        «       }| j                  «       D ]2  \  }}t        dD �cg c]  }||v ‘Œ c}«      sŒ"|j                  |«       Œ4 |S c c}w )z‘Get parameter names that should not use weight decay.

        Returns:
            Set of parameter names to exclude from weight decay.
        )r]   rY   )ÚsetÚnamed_modulesr×   Úadd)rh   ÚnodÚnrY  Úkws        r7   Úno_weight_decayz!SwinTransformerV2.no_weight_decayŒ  sW   € ô ‹eˆØ×&Ñ&Ó(ò 	‰DˆAˆqÜÐ&@ÖA �B˜!’GÒAÕBØ—‘˜•
ð	ð ˆ
ùò Bs   ªA
Úcoarsec                 ó2   — t        d|rd¬«      S g d¢¬«      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^absolute_pos_embed|patch_embedz^layers\.(\d+)))z^layers\.(\d+).downsample)r   )z^layers\.(\d+)\.\w+\.(\d+)N)z^norm)iŸ† )Ústemr  )rM  )rh   rk  s     r7   Úgroup_matcherzSwinTransformerV2.group_matcher™  s)   € ô Ø3Ù(.Ð$ô
ð 	
ò5ô
ð 	
r9   Úenablec                 ó4   — | j                   D ]	  }||_        Œ y)z}Enable or disable gradient checkpointing.

        Args:
            enable: If True, enable gradient checkpointing.
        N)rN  r  )rh   ro  Úls      r7   Úset_grad_checkpointingz(SwinTransformerV2.set_grad_checkpointing¬  s   € ð —‘ò 	*ˆAØ#)ˆAÕ ñ	*r9   c                 ó.   — | j                   j                  S )z_Get the classifier head.

        Returns:
            The classification head module.
        )rO  Úfcru   s    r7   Úget_classifierz SwinTransformerV2.get_classifier¶  s   € ð �y‰y�|‰|Ðr9   c                 óJ   — || _         | j                  j                  ||«       y)z�Reset the classification head.

        Args:
            num_classes: Number of classes for new head.
            global_pool: Global pooling type.
        N)r0  rO  Úreset)rh   r0  r1  s      r7   Úreset_classifierz"SwinTransformerV2.reset_classifier¿  s   € ð 'ˆÔØ�	‰	�‰˜ [Õ1r9   r$   Úindicesr  Ú
stop_earlyr=  Úintermediates_onlyc                 ó>  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        | j                  «      }
t        j
                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]c  \  }} ||«      }||v sŒ|r||
dz
  k(  r| j                  |«      }n|}|j                  dddd«      j                  «       }|j                  |«       Œe |r|S | 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.Nr   r   r(   r)   )r   rF  rN  rK  rW   r  r  r_  r  r0   r1   Úappend)rh   r$   ry  r  rz  r=  r{  ÚintermediatesÚtake_indicesÚ	max_indexÚ
num_stagesÚstagesr  ra  Úx_inters                  r7   Úforward_intermediatesz'SwinTransformerV2.forward_intermediatesÉ  s  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið ×Ñ˜QÓˆä˜Ÿ™Ó%ˆ
Ü�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFÜ! &Ó)ò 	.‰HˆAˆuÙ�a“ˆAØ�LÒ Ù˜A ¨a¡Ò/Ø"Ÿi™i¨›l‘Gà�GØ!Ÿ/™/¨!¨Q°°1Ó5×@Ñ@ÓB�Ø×$Ñ$ WÕ-ð	.ñ Ø Ð à�I‰I�a‹Lˆà�-ÐÐr9   Ú
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   rF  rN  rU   rÐ   r  rx  )rh   ry  r†  r‡  r€  r�  s         r7   Úprune_intermediate_layersz+SwinTransformerV2.prune_intermediate_layersû  s]   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐr9   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S )zÀForward pass through feature extraction layers.

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            Feature tensor of shape (B, H', W', C).
        )rK  rN  r  ©rh   r$   s     r7   Úforward_featuresz"SwinTransformerV2.forward_features  s3   € ð ×Ñ˜QÓˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØˆr9   Ú
pre_logitsc                 óN   — |r| j                  |d¬«      S | j                  |«      S )a  Forward pass through classification head.

        Args:
            x: Feature tensor of shape (B, H, W, C).
            pre_logits: If True, return features before final linear layer.

        Returns:
            Logits tensor of shape (B, num_classes) or pre-logits.
        T)r�  )rO  )rh   r$   r�  s      r7   Úforward_headzSwinTransformerV2.forward_head  s&   € ñ 1;ˆt�y‰y˜ tˆyÓ,ÐLÀÇ	Á	È!ÃÐLr9   c                 óJ   — | j                  |«      }| j                  |«      }|S )z±Forward pass through the model.

        Args:
            x: Input tensor of shape (B, C, H, W).

        Returns:
            Logits tensor of shape (B, num_classes).
        )rŒ  r�  r‹  s     r7   r«   zSwinTransformerV2.forward%  s)   € ð ×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr9   )T)NNNr|   N©Fr®   )NFFr}  F)r   FT)(r¯   r°   r±   r²   rU   rú   rû   r³   r#  r
   r´   rµ   r   r   r   rü   rT   rP  rW  r   rç   rW   r  Úignorer	   rj  r   r   rn  rr  ru  rx  r¶   r   r…  r‰  rŒ  r�  r«   r·   r¸   s   @r7   r#   r#   Ï  s  ø„ ñð +.ØØØ#Ø$ØØ&2Ø)7Ø-.Ø%*Ø$(Ø!Ø!Ø!Ø$&Ø$&Ø$'Ø.4Ø*,¯,©,Ø7CØØñ/x-à'ðx-ð ðx-ð ð	x-ð
 ðx-ð ðx-ð ðx-ð ˜#˜s˜(‘Oðx-ð ˜S #˜X‘ðx-ð +ðx-ð #ðx-ð "ðx-ð ðx-ð ðx-ð ðx-ð  "ð!x-ð" "ð#x-ð$ "ð%x-ð& ˜S (˜]Ñ+ð'x-ð( ˜RŸY™Y™ð)x-ð* &+¨3°¨8¡_õ+x-ñt	$¨ð 	$¸ó 	$ñ!˜rŸy™yð !°tð !Àtó !ð  37Ø48Ø59Ø*+Ø/3ñà˜u S¨# X™Ñ/ðð !  s¨C x¡Ñ1ðð " %¨¨S¨¡/Ñ2ð	ð
 # 3™-ðð ' t™nóð@ ‡Y�Y×Ñð
  S¡ò 
ó ð
ð ‡Y�Y×Ññ
 Dð 
°T¸#¸s¸(±^ò 
ó ð
ð$ ‡Y�Y×Ññ*¨Tð *¸Tò *ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mð 2ÐW[ó 2ð 8<ØØ$Ø$Ø',ñ0 à�|‰|ð0 ð ˜e C¨¨c© NÑ3Ñ4ð0 ð ð	0 ð
 ð0 ð ð0 ð !%ð0 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó0 ðh ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ð  %§,¡,ð °5·<±<ó ñ
M˜eŸl™lð 
M¸ð 
MÈÏÉó 
Mð˜Ÿ™ð ¨%¯,©,÷ r9   Ú
state_dictÚmodelc                 ó   — | j                  d| «      } | j                  d| «      } d| v }i }ddl}| j                  «       D ]·  \  }}t        dD �cg c]  }||v ‘Œ c}«      rŒ"d|v re|j                  j
                  j                  j                  \  }}}	}
|j                  d   |	k7  s|j                  d	   |
k7  rt        ||	|
fd
dd¬«      }|s&|j                  dd„ |«      }|j                  dd«      }|||<   Œ¹ |S c c}w )aM  Filter and process checkpoint state dict for loading.

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

    Args:
        state_dict: Checkpoint state dictionary.
        model: Target model to load weights into.

    Returns:
        Filtered state dictionary.
    r”  r“  zhead.fc.weightr   N)rR   rQ   rÊ   zpatch_embed.proj.weightr•   r,   ÚbicubicT)ÚinterpolationÚ	antialiasÚverbosezlayers.(\d+).downsamplec                 óD   — dt        | j                  d«      «      dz   › d�S )Nr?  r   z.downsample)r³   Úgroup)r$   s    r7   ú<lambda>z&checkpoint_filter_fn.<locals>.<lambda>V  s$   € ¸wÄsÈ1Ï7É7ÐSTË:ÃÐYZÑGZÐF[Ð[fÐ=g€ r9   zhead.zhead.fc.)ÚgetÚreÚitemsr×   rK  rc   ry   r.   r   ÚsubÚreplace)r“  r”  Únative_checkpointÚout_dictrž  r¥   r¦   rh  ró   r3   r4   s              r7   Úcheckpoint_filter_fnr¤  3  s  € ð —‘ ¨Ó4€JØ—‘ ¨jÓ9€JØ(¨JÐ6ÐØ€HÛØ× Ñ Ó"ò ‰ˆˆ1ÜÐ aÖb˜1��Q’ÒbÔcØà$¨Ñ)Ø×*Ñ*×/Ñ/×6Ñ6×<Ñ<‰JˆAˆq�!�QØ�w‰w�r‰{˜aÒ 1§7¡7¨2¡;°!Ò#3Ü(ØØ˜�FØ"+Ø"Ø ô�ñ !à—‘Ð1Ñ3gÐijÓkˆAØ—	‘	˜' :Ó.ˆAØˆ�Šð'ð* €Oùò) cs   ÁC;
ÚvariantÚ
pretrainedc           	      óÈ   — t        d„ t        |j                  dd«      «      D «       «      }|j                  d|«      }t	        t
        | |ft        t        d|¬«      dœ|¤Ž}|S )zôCreate a Swin Transformer V2 model.

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

    Returns:
        SwinTransformerV2 model instance.
    c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wr®   rË   )r  r  ró   s      r7   r  z._create_swin_transformer_v2.<locals>.<genexpr>h  s   è ø€ Ò\¡d a¨¤Ñ\ùr  r3  )r   r   r   r   Úout_indicesT)Úflatten_sequentialr©  )Úpretrained_filter_fnÚfeature_cfg)râ   r_  r�  Úpopr   r#   r¤  rM  )r¥  r¦  rQ  Údefault_out_indicesr©  r”  s         r7   Ú_create_swin_transformer_v2r¯  ]  sj   € ô  Ñ\¬i¸¿
¹
À8È\Ó8ZÓ.[Ô\Ó\ÐØ—*‘*˜]Ð,?Ó@€Kä Ü˜7 Jðä1Ü¨D¸kÔJñð ñ	€Eð
 €Lr9   c                 ó4   — | ddddddt         t        ddd	d
œ|¥S )Nr&  )r(   é   r±  )r|   r|   gÍÌÌÌÌÌì?r–  Tzpatch_embed.projzhead.fcÚmit)Úurlr0  Ú
input_sizeÚ	pool_sizeÚcrop_pctr—  Úfixed_input_sizeÚmeanr[  Ú
first_convÚ
classifierÚlicenser   )r³  rQ  s     r7   Ú_cfgr¼  s  s5   € àØ¨=ÀvØ¨ÈÜ%Ô.BØ(¸	Øñð #ðð r9   ztimm/z{https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to16_192to256_22kto1k_ft.pth)Ú	hf_hub_idr³  z{https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to24_192to384_22kto1k_ft.pth)r(   é€  r¾  )r,  r,  r}   )r½  r³  r´  rµ  r¶  z|https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to16_192to256_22kto1k_ft.pthz|https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to24_192to384_22kto1k_ft.pthzfhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window8_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window16_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window8_256.pthzhhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window16_256.pthzfhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window8_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window16_256.pthzkhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12_192_22k.pthiQU  )r(   éÀ   r¿  )r*  r*  )r½  r³  r0  r´  rµ  zlhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12_192_22k.pth)ú2swinv2_base_window12to16_192to256.ms_in22k_ft_in1kú2swinv2_base_window12to24_192to384.ms_in22k_ft_in1kú3swinv2_large_window12to16_192to256.ms_in22k_ft_in1kú3swinv2_large_window12to24_192to384.ms_in22k_ft_in1kzswinv2_tiny_window8_256.ms_in1kz swinv2_tiny_window16_256.ms_in1kz swinv2_small_window8_256.ms_in1kz!swinv2_small_window16_256.ms_in1kzswinv2_base_window8_256.ms_in1kz swinv2_base_window16_256.ms_in1kú!swinv2_base_window12_192.ms_in22kú"swinv2_large_window12_192.ms_in22kc           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z"Swin-T V2 @ 256x256, window 16x16.r—   r(  r)  r+  ©r%   r2  r3  r@   r¦  )Úswinv2_tiny_window16_256©rM  r¯  ©r¦  rQ  Ú
model_argss      r7   rÈ  rÈ  ¸  sD   € ô  "°¸<ÐSaÔb€JÜ&Ø"ñYØ/9ðYÜ=AÀ*Ñ=WÐPVÑ=WñYð Yr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z Swin-T V2 @ 256x256, window 8x8.r|   r(  r)  r+  rÇ  r¦  )Úswinv2_tiny_window8_256rÉ  rÊ  s      r7   rÍ  rÍ  À  sC   € ô  !¨r¸,ÐR`Ôa€JÜ&Ø!ñXØ.8ðXÜ<@ÀÑ<VÈvÑ<VñXð Xr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z"Swin-S V2 @ 256x256, window 16x16.r—   r(  ©r)   r)   é   r)   r+  rÇ  r¦  )Úswinv2_small_window16_256rÉ  rÊ  s      r7   rÑ  rÑ  È  sD   € ô  "°¸=ÐTbÔc€JÜ&Ø#ñZØ0:ðZÜ>BÀ:Ñ>XÐQWÑ>XñZð Zr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z Swin-S V2 @ 256x256, window 8x8.r|   r(  rÏ  r+  rÇ  r¦  )Úswinv2_small_window8_256rÉ  rÊ  s      r7   rÓ  rÓ  Ð  sD   € ô  !¨r¸-ÐSaÔb€JÜ&Ø"ñYØ/9ðYÜ=AÀ*Ñ=WÐPVÑ=WñYð Yr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z"Swin-B V2 @ 256x256, window 16x16.r—   é€   rÏ  ©r*   r|   r—   é    rÇ  r¦  )Úswinv2_base_window16_256rÉ  rÊ  s      r7   rØ  rØ  Ø  óD   € ô  "°¸MÐUcÔd€JÜ&Ø"ñYØ/9ðYÜ=AÀ*Ñ=WÐPVÑ=WñYð Yr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z Swin-B V2 @ 256x256, window 8x8.r|   rÕ  rÏ  rÖ  rÇ  r¦  )Úswinv2_base_window8_256rÉ  rÊ  s      r7   rÛ  rÛ  à  sC   € ô  !¨s¸=ÐTbÔc€JÜ&Ø!ñXØ.8ðXÜ<@ÀÑ<VÈvÑ<VñXð Xr9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z"Swin-B V2 @ 192x192, window 12x12.r,  rÕ  rÏ  rÖ  rÇ  r¦  )Úswinv2_base_window12_192rÉ  rÊ  s      r7   rÝ  rÝ  è  rÙ  r9   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	zQSwin-B V2 @ 192x192, trained at window 12x12, fine-tuned to 256x256 window 16x16.r—   rÕ  rÏ  rÖ  ©r,  r,  r,  r*  ©r%   r2  r3  r@   r9  r¦  )Ú!swinv2_base_window12to16_192to256rÉ  rÊ  s      r7   rá  rá  ð  óK   € ô Ø #¨mÀ~Ø /ô1€Jô 'Ø+ñbØ8BðbÜFJÈ:ÑF`ÐY_ÑF`ñbð br9   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	zQSwin-B V2 @ 192x192, trained at window 12x12, fine-tuned to 384x384 window 24x24.r-  rÕ  rÏ  rÖ  rß  rà  r¦  )Ú!swinv2_base_window12to24_192to384rÉ  rÊ  s      r7   rä  rä  ú  râ  r9   c           	      óP   — t        dddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )z"Swin-L V2 @ 192x192, window 12x12.r,  r¿  rÏ  ©r*  r,  r-  é0   rÇ  r¦  )Úswinv2_large_window12_192rÉ  rÊ  s      r7   rè  rè    sD   € ô  "°¸MÐUdÔe€JÜ&Ø#ñZØ0:ðZÜ>BÀ:Ñ>XÐQWÑ>XñZð Zr9   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	zQSwin-L V2 @ 192x192, trained at window 12x12, fine-tuned to 256x256 window 16x16.r—   r¿  rÏ  ræ  rß  rà  r¦  )Ú"swinv2_large_window12to16_192to256rÉ  rÊ  s      r7   rê  rê    óK   € ô Ø #¨mÀØ /ô1€Jô 'Ø,ñcØ9CðcÜGKÈJÑGaÐZ`ÑGañcð cr9   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	zQSwin-L V2 @ 192x192, trained at window 12x12, fine-tuned to 384x384 window 24x24.r-  r¿  rÏ  ræ  rß  rà  r¦  )Ú"swinv2_large_window12to24_192to384rÉ  rÊ  s      r7   rí  rí    rë  r9   rÄ  rÀ  rÁ  rÅ  rÂ  rÃ  )Úswinv2_base_window12_192_22kÚ)swinv2_base_window12to16_192to256_22kft1kÚ)swinv2_base_window12to24_192to384_22kft1kÚswinv2_large_window12_192_22kÚ*swinv2_large_window12to16_192to256_22kft1kÚ*swinv2_large_window12to24_192to384_22kft1kr‘  )r;  )Nr²   rq   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   r   r   rW   Útorch.nnrU   Útorch.nn.functionalrì   r™   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_features_fxr   Ú_manipulater   Ú	_registryr    r!   r"   Ú__all__r³   rû   r¶   r8   r<   rü   r>   rº   rþ   r  r#   r#  r¤  r´   r¯  r¼  Údefault_cfgsrÈ  rÍ  rÑ  rÓ  rØ  rÛ  rÝ  rá  rä  rè  rê  rí  r¯   rË   r9   r7   ú<module>r     sž  ðñó Ý ß O× OÕ Oã Ý ß Ð ç A÷;÷ ;÷ ;ñ ;å *Ý +Ý 3Ý #ß YÑ YàÐ
€à˜#˜u S¨# X™Ð.Ñ/Ð ðØ�<‰<ðà˜3 ˜8‘_ðð ‡\�\óð& ðØ—‘ðà˜3 ˜8‘_ðð ˜˜S˜‘/ðð ‡\�\ò	ó ðô,Q�b—i‘iô Qôhp˜RŸY™Yô pôf&�2—9‘9ô &ôRM3˜RŸY™Yô M3ô`a˜Ÿ	™	ô aðH' T¨#¨u¯|©|Ð*;Ñ%<ð 'ÀRÇYÁYð 'ÐSWÐX[Ð]b×]iÑ]iÐXiÑSjó 'ñT¨ð ¸$ð ÐUfó ó,ñ %Ù:>Øð Jô;ñ ;?Øð JØ ¨H¸sô;ñ
 <@Øð Kô<ñ <@Øð KØ ¨H¸sô<ñ (,ØØtô(ñ )-ØØuô)ñ )-ØØuô)ñ *.ØØvô*ñ (,ØØtô(ñ )-ØØuô)ñ
 *.ØØyØ m¸vô*ñ
 +/ØØzØ m¸vô+ñe7&ó 7€ðt ñY¨ð YÐDUò Yó ðYð ñX¨ð XÐCTò Xó ðXð ñZ¨$ð ZÐEVò Zó ðZð ñY¨ð YÐDUò Yó ðYð ñY¨ð YÐDUò Yó ðYð ñX¨ð XÐCTò Xó ðXð ñY¨ð YÐDUò Yó ðYð ñb°$ð bÐM^ò bó ðbð ñb°$ð bÐM^ò bó ðbð ñZ¨$ð ZÐEVò Zó ðZð ñc°4ð cÐN_ò có ðcð ñc°4ð cÐN_ò có ðcñ ˜HØ$GØ1eØ1eØ%IØ2gØ2gñ'õ r9   