
    h                        S SK r S SKJr  S SKJrJrJr  S SKrS SKJ	s  J
r  S SKJ	r	Jr  SSKJrJr  SSKJr  SSKJrJr  SS	KJr  S
SKJrJrJr  S
SKJr  S
SKJrJr  / SQr S\R                  S\R                  4S jr!\RD                  RG                  S5        S\R                  S\R                  S\$\%   S\R                  4S jr&\RD                  RG                  S5         " S S\	RN                  5      r( " S S\	RN                  5      r)      SSS\S\S\S \S\$\%   S!\%S"\$\%   S#\*S$\*S%\\   S&\\   S'\\R                     S(\+S\4S) jjr,\RD                  RG                  S*5         " S+ S,\	RN                  5      r- " S- S.\-5      r. " S/ S0\	RN                  5      r/ " S1 S2\/5      r0 " S3 S4\	RN                  5      r1S5\$\%   S6\%S7\$\%   S!\$\%   S\$\%   S8\*S9\\   S:\+S;\S\14S< jr2S=\0r3 " S> S?\5      r4 " S@ SA\5      r5 " SB SC\5      r6 " SD SE\5      r7 " SF SG\5      r8 " SH SI\5      r9\" 5       \" SJ\4Rt                  4SK9SSSL.S9\\4   S:\+S;\S\14SM jj5       5       r;\" 5       \" SJ\5Rt                  4SK9SSSL.S9\\5   S:\+S;\S\14SN jj5       5       r<\" 5       \" SJ\6Rt                  4SK9SSSL.S9\\6   S:\+S;\S\14SO jj5       5       r=\" 5       \" SJ\7Rt                  4SK9SSSL.S9\\7   S:\+S;\S\14SP jj5       5       r>\" 5       \" SJ\8Rt                  4SK9SSSL.S9\\8   S:\+S;\S\14SQ jj5       5       r?\" 5       \" SJ\9Rt                  4SK9SSSL.S9\\9   S:\+S;\S\14SR jj5       5       r@g)T    N)partial)AnyCallableOptional)nnTensor   )MLPPermute)StochasticDepth)ImageClassificationInterpolationMode)_log_api_usage_once   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface)SwinTransformerSwin_T_WeightsSwin_S_WeightsSwin_B_WeightsSwin_V2_T_WeightsSwin_V2_S_WeightsSwin_V2_B_Weightsswin_tswin_sswin_b	swin_v2_t	swin_v2_s	swin_v2_bxreturnc           
      *   U R                   SS  u  pn[        R                  " U SSSUS-  SUS-  45      n U SSS S2SS S2S S 24   nU SSS S2SS S2S S 24   nU SSS S2SS S2S S 24   nU SSS S2SS S2S S 24   n[        R                  " XEXg/S5      n U $ )Nr   r	   .r   )shapeFpadtorchcat)r$   HW_x0x1x2x3s           [/var/www/auris/envauris/lib/python3.13/site-packages/torchvision/models/swin_transformer.py_patch_merging_padr6   #   s    ggbclGA!	a!Q1q5!QU+,A	
31addA	B	
31addA	B	
31addA	B	
31addA	B		22"B'AH    r6   relative_position_bias_tablerelative_position_indexwindow_sizec                     US   US   -  nX   nUR                  X3S5      nUR                  SSS5      R                  5       R                  S5      nU$ )Nr   r   r(   r	   )viewpermute
contiguous	unsqueeze)r8   r9   r:   Nrelative_position_biass        r5   _get_relative_position_biasrB   1   sb     	AQ'A9R388rB3;;Aq!DOOQ[[\]^!!r7   rB   c                   ~   ^  \ rS rSrSr\R                  4S\S\S\R                  4   4U 4S jjjr
S\4S jrS	rU =r$ )
PatchMerging>   zPatch Merging Layer.
Args:
    dim (int): Number of input channels.
    norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
dim
norm_layer.c                    > [         TU ]  5         [        U 5        Xl        [        R
                  " SU-  SU-  SS9U l        U" SU-  5      U l        g N   r	   Fbiassuper__init__r   rF   r   Linear	reductionnormselfrF   rG   	__class__s      r5   rO   PatchMerging.__init__E   G    D!1s7AG%@q3w'	r7   r$   c                 `    [        U5      nU R                  U5      nU R                  U5      nU$ z
Args:
    x (Tensor): input tensor with expected layout of [..., H, W, C]
Returns:
    Tensor with layout of [..., H/2, W/2, 2*C]
)r6   rR   rQ   rT   r$   s     r5   forwardPatchMerging.forwardL   s.     q!IIaLNN1r7   rF   rR   rQ   __name__
__module____qualname____firstlineno____doc__r   	LayerNormintr   ModulerO   r   r[   __static_attributes____classcell__rU   s   @r5   rD   rD   >   I     IK (C (Xc299n-E ( (
 
 
r7   rD   c                   ~   ^  \ rS rSrSr\R                  4S\S\S\R                  4   4U 4S jjjr
S\4S jrS	rU =r$ )
PatchMergingV2Y   zPatch Merging Layer for Swin Transformer V2.
Args:
    dim (int): Number of input channels.
    norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
rF   rG   .c                    > [         TU ]  5         [        U 5        Xl        [        R
                  " SU-  SU-  SS9U l        U" SU-  5      U l        g rI   rM   rS   s      r5   rO   PatchMergingV2.__init__`   rW   r7   r$   c                 `    [        U5      nU R                  U5      nU R                  U5      nU$ rY   )r6   rQ   rR   rZ   s     r5   r[   PatchMergingV2.forwardg   s.     q!NN1IIaLr7   r]   r^   ri   s   @r5   rl   rl   Y   rj   r7   rl   Tinput
qkv_weightproj_weightrA   	num_heads
shift_sizeattention_dropoutdropoutqkv_bias	proj_biaslogit_scaletrainingc           	      :   U R                   u  pnnUS   XS   -  -
  US   -  nUS   XS   -  -
  US   -  n[        R                  " U SSSUSU45      nUR                   u  nnnnUR                  5       nUS   U:  a  SUS'   US   U:  a  SUS'   [	        U5      S:  a   [
        R                  " UUS   * US   * 4SS9nUUS   -  UUS   -  -  nUR                  UUUS   -  US   UUS   -  US   U5      nUR                  SSSSSS5      R                  UU-  US   US   -  U5      nUb<  U	b9  U	R                  5       n	U	R                  5       S-  nU	USU-   R                  5         [        R                  " UX5      nUR                  UR                  S5      UR                  S5      SUUU-  5      R                  SSSSS5      nUS   US   US   nnnUbx  [        R                  " US
S9[        R                  " US
S9R!                  SS
5      -  n[
        R"                  " U[$        R&                  " S5      S9R)                  5       nUU-  nO,UUU-  S-  -  nUR+                  UR!                  SS
5      5      nUU-   n[	        U5      S:  Ga  UR-                  UU45      nSUS   * 4US   * US   * 4US   * S	44nSUS   * 4US   * US   * 4US   * S	44n Sn!U H(  n"U  H  n#U!UU"S   U"S   2U#S   U#S   24'   U!S-  n!M!     M*     UR                  UUS   -  US   UUS   -  US   5      nUR                  SSSS5      R                  UUS   US   -  5      nUR/                  S5      UR/                  S5      -
  nUR1                  US:g  [3        S5      5      R1                  US:H  [3        S5      5      nUR                  UR                  S5      U-  UUUR                  S5      UR                  S5      5      nUUR/                  S5      R/                  S5      -   nUR                  S
UUR                  S5      UR                  S5      5      n[        R4                  " US
S9n[        R6                  " UX|S9nUR+                  U5      R!                  SS5      R                  UR                  S5      UR                  S5      U5      n[        R                  " UX*5      n[        R6                  " UXS9nUR                  UUUS   -  UUS   -  US   US   U5      nUR                  SSSSSS5      R                  UUUU5      n[	        U5      S:  a  [
        R                  " UUS   US   4SS9nUS	S	2S	U2S	U2S	S	24   R9                  5       nU$ )a  
Window based multi-head self attention (W-MSA) module with relative position bias.
It supports both of shifted and non-shifted window.
Args:
    input (Tensor[N, H, W, C]): The input tensor or 4-dimensions.
    qkv_weight (Tensor[in_dim, out_dim]): The weight tensor of query, key, value.
    proj_weight (Tensor[out_dim, out_dim]): The weight tensor of projection.
    relative_position_bias (Tensor): The learned relative position bias added to attention.
    window_size (List[int]): Window size.
    num_heads (int): Number of attention heads.
    shift_size (List[int]): Shift size for shifted window attention.
    attention_dropout (float): Dropout ratio of attention weight. Default: 0.0.
    dropout (float): Dropout ratio of output. Default: 0.0.
    qkv_bias (Tensor[out_dim], optional): The bias tensor of query, key, value. Default: None.
    proj_bias (Tensor[out_dim], optional): The bias tensor of projection. Default: None.
    logit_scale (Tensor[out_dim], optional): Logit scale of cosine attention for Swin Transformer V2. Default: None.
    training (bool, optional): Training flag used by the dropout parameters. Default: True.
Returns:
    Tensor[N, H, W, C]: The output tensor after shifted window attention.
r   r   )r   r	   )shiftsdims   r	   rJ      Nr(   )rF   g      Y@)maxg      g      Y        )pr|   )r)   r*   r+   copysumr,   rollr<   r=   reshapeclonenumelzero_linearsize	normalize	transposeclampmathlogexpmatmul	new_zerosr?   masked_fillfloatsoftmaxrx   r>   )$rr   rs   rt   rA   r:   ru   rv   rw   rx   ry   rz   r{   r|   Br.   r/   Cpad_rpad_br$   r0   pad_Hpad_Wnum_windowslengthqkvqkvattn	attn_maskh_slicesw_slicescounthws$                                       r5   shifted_window_attentionr   t   s   F JA!Q^aa.00KNBE^aa.00KNBE	eaAua/0AAueQ"J1~
11~
1 :JJq:a=.:a=.!AO KN*uA/FGK	q%;q>);q>5KPQN;RT_`aTbdefA			!Q1a#++AO[^kZ[n=\^_`A 8#7>>#!Q&!f*%++-
((1j
+C
++affQiAy!y.
I
Q
QRSUVXY[\^_
`C!fc!fc!f!qA{{1"%A2(>(H(HR(PPkk+488E?CGGIk!iD((xxB+,((D
:KK/	Q(KN?Z]N*KzZ[}n^bMcdQ(KN?Z]N*KzZ[}n^bMcdA6;	!A$1+qtad{23
   NN5KN#:KNEU`abUcLcepqrest	%%aAq199+{ST~XcdeXfGfg	''*Y-@-@-CC	)))q.%-HTTU^bcUcejkneop	yyk1;	166RS9VWV\V\]^V_`i))!,66q99yyYq	166!9=99Tr"D99T.BDA  A&..qvvay!&&)QGA	K+A			!w2A 	
q%;q>)5KN+BKPQNT_`aTbdefA			!Q1a#++AueQ?A :JJq*Q-A!?fM 	
!RaR!Q,""$AHr7   r   c                      ^  \ rS rSrSr    SS\S\\   S\\   S\S\S\S	\S
\4U 4S jjjr	S r
S rS\R                  4S jrS\S\4S jrSrU =r$ )ShiftedWindowAttention   z'
See :func:`shifted_window_attention`.
rF   r:   rv   ru   ry   rz   rw   rx   c	                 ^  > [         T	U ]  5         [        U5      S:w  d  [        U5      S:w  a  [        S5      eX l        X0l        X@l        Xpl        Xl        [        R                  " XS-  US9U l        [        R                  " XUS9U l        U R                  5         U R                  5         g )Nr	   z.window_size and shift_size must be of length 2r   rK   )rN   rO   len
ValueErrorr:   rv   ru   rw   rx   r   rP   r   proj#define_relative_position_bias_tabledefine_relative_position_index)
rT   rF   r:   rv   ru   ry   rz   rw   rx   rU   s
            r5   rO   ShiftedWindowAttention.__init__   s     	{q C
Oq$8MNN&$"!299S'9IIcY7	002++-r7   c                    [         R                  " [        R                  " SU R                  S   -  S-
  SU R                  S   -  S-
  -  U R
                  5      5      U l        [         R                  R                  U R                  SS9  g )Nr	   r   r   {Gz?std)	r   	Parameterr,   zerosr:   ru   r8   inittrunc_normal_rT   s    r5   r   :ShiftedWindowAttention.define_relative_position_bias_table	  sw    ,.LLKKT--a0014T=M=Ma=P9PST9TUW[WeWef-
) 	d??TJr7   c                    [         R                  " U R                  S   5      n[         R                  " U R                  S   5      n[         R                  " [         R                  " XSS95      n[         R
                  " US5      nUS S 2S S 2S 4   US S 2S S S 24   -
  nUR                  SSS5      R                  5       nUS S 2S S 2S4==   U R                  S   S-
  -  ss'   US S 2S S 2S4==   U R                  S   S-
  -  ss'   US S 2S S 2S4==   SU R                  S   -  S-
  -  ss'   UR                  S5      R                  5       nU R                  SU5        g )Nr   r   ijindexingr	   r(   r9   )
r,   aranger:   stackmeshgridflattenr=   r>   r   register_buffer)rT   coords_hcoords_wcoordscoords_flattenrelative_coordsr9   s          r5   r   5ShiftedWindowAttention.define_relative_position_index  s=   << 0 0 34<< 0 0 34U^^HNOvq1(At4~aqj7QQ)11!Q:EEG1a D$4$4Q$7!$;; 1a D$4$4Q$7!$;; 1a A(8(8(;$;a$?? "1"5"5b"9"A"A"C68OPr7   r%   c                 X    [        U R                  U R                  U R                  5      $ N)rB   r8   r9   r:   r   s    r5   get_relative_position_bias1ShiftedWindowAttention.get_relative_position_bias  s(    *--t/K/KTM]M]
 	
r7   r$   c                 b   U R                  5       n[        UU R                  R                  U R                  R                  UU R
                  U R                  U R                  U R                  U R                  U R                  R                  U R                  R                  U R                  S9$ ){
Args:
    x (Tensor): Tensor with layout of [B, H, W, C]
Returns:
    Tensor with same layout as input, i.e. [B, H, W, C]
)rv   rw   rx   ry   rz   r|   )r   r   r   weightr   r:   ru   rv   rw   rx   rL   r|   rT   r$   rA   s      r5   r[   ShiftedWindowAttention.forward#  s     "&!@!@!B'HHOOII"NN"44LLXX]]iinn]]
 	
r7   )rw   rx   ru   r   r   r8   rv   r:   TTr   r   )r_   r`   ra   rb   rc   re   listboolr   rO   r   r   r,   r   r   r[   rg   rh   ri   s   @r5   r   r      s     #&.. #Y. I	.
 . . . !. . .4KQ
ELL 


 
F 
 
r7   r   c                      ^  \ rS rSrSr    SS\S\\   S\\   S\S\S\S	\S
\4U 4S jjjr	S r
S\R                  4S jrS\4S jrSrU =r$ )ShiftedWindowAttentionV2i;  z*
See :func:`shifted_window_attention_v2`.
rF   r:   rv   ru   ry   rz   rw   rx   c	                 4  > [         T
U ]  UUUUUUUUS9  [        R                  " [        R
                  " S[        R                  " USS45      -  5      5      U l        [        R                  " [        R                  " SSSS9[        R                  " SS9[        R                  " SUS	S95      U l        U(       a\  U R                  R                  R                  5       S
-  n	U R                  R                  U	SU	-   R                  R!                  5         g g )N)ry   rz   rw   rx   
   r   r	   i   TrK   )inplaceFr   )rN   rO   r   r   r,   r   onesr{   
SequentialrP   ReLUcpb_mlpr   rL   r   datar   )rT   rF   r:   rv   ru   ry   rz   rw   rx   r   rU   s             r5   rO   !ShiftedWindowAttentionV2.__init__@  s     	/ 	 		
 <<		"uzz9aQRBS7T2T(UV}}IIa4("''$*?3PY`eAf
 XX]]((*a/FHHMM&1v:.3399; r7   c                    [         R                  " U R                  S   S-
  * U R                  S   [         R                  S9n[         R                  " U R                  S   S-
  * U R                  S   [         R                  S9n[         R                  " [         R
                  " X/SS95      nUR                  SSS5      R                  5       R                  S5      nUS S 2S S 2S S 2S4==   U R                  S   S-
  -  ss'   US S 2S S 2S S 2S4==   U R                  S   S-
  -  ss'   US-  n[         R                  " U5      [         R                  " [         R                  " U5      S-   5      -  S	-  nU R                  S
U5        g )Nr   r   )dtyper   r   r	      g      ?g      @relative_coords_table)r,   r   r:   float32r   r   r=   r>   r?   signlog2absr   )rT   relative_coords_hrelative_coords_wr   s       r5   r   <ShiftedWindowAttentionV2.define_relative_position_bias_table_  sb   !LL4+;+;A+>+B)CTEUEUVWEX`e`m`mn!LL4+;+;A+>+B)CTEUEUVWEX`e`m`mn %ENN<M;alp,q r 5 = =aA F Q Q S ] ]^_ `aAqj)T-=-=a-@1-DD)aAqj)T-=-=a-@1-DD)"JJ,-

599EZ;[^a;a0bbehh 	 	46KLr7   r%   c                     [        U R                  U R                  5      R                  SU R                  5      U R
                  U R                  5      nS[        R                  " U5      -  nU$ )Nr(      )	rB   r   r   r<   ru   r9   r:   r,   sigmoid)rT   rA   s     r5   r   3ShiftedWindowAttentionV2.get_relative_position_biaso  s_    !<LL33499"dnnM(("

 "$emm4J&K!K%%r7   r$   c                 x   U R                  5       n[        UU R                  R                  U R                  R                  UU R
                  U R                  U R                  U R                  U R                  U R                  R                  U R                  R                  U R                  U R                  S9$ )r   )rv   rw   rx   ry   rz   r{   r|   )r   r   r   r   r   r:   ru   rv   rw   rx   rL   r{   r|   r   s      r5   r[    ShiftedWindowAttentionV2.forwardx  s     "&!@!@!B'HHOOII"NN"44LLXX]]iinn((]]
 	
r7   )r   r{   r   )r_   r`   ra   rb   rc   re   r   r   r   rO   r   r,   r   r   r[   rg   rh   ri   s   @r5   r   r   ;  s     #&<< #Y< I	<
 < < < !< < <>M &ELL &
 
 
r7   r   c                      ^  \ rS rSrSrSSSS\R                  \4S\S\S\	\   S\	\   S	\
S
\
S\
S\
S\S\R                  4   S\S\R                  4   4U 4S jjjrS\4S jrSrU =r$ )SwinTransformerBlocki  a  
Swin Transformer Block.
Args:
    dim (int): Number of input channels.
    num_heads (int): Number of attention heads.
    window_size (List[int]): Window size.
    shift_size (List[int]): Shift size for shifted window attention.
    mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0.
    dropout (float): Dropout rate. Default: 0.0.
    attention_dropout (float): Attention dropout rate. Default: 0.0.
    stochastic_depth_prob: (float): Stochastic depth rate. Default: 0.0.
    norm_layer (nn.Module): Normalization layer.  Default: nn.LayerNorm.
    attn_layer (nn.Module): Attention layer. Default: ShiftedWindowAttention
      @r   rF   ru   r:   rv   	mlp_ratiorx   rw   stochastic_depth_probrG   .
attn_layerc           	      L  > [         TU ]  5         [        U 5        U	" U5      U l        U
" UUUUUUS9U l        [        US5      U l        U	" U5      U l        [        U[        X-  5      U/[        R                  S US9U l        U R                  R                  5        H  n[        U[        R                  5      (       d  M$  [        R                   R#                  UR$                  5        UR&                  c  M\  [        R                   R)                  UR&                  SS9  M     g )N)rw   rx   row)activation_layerr   rx   gư>r   )rN   rO   r   norm1r   r   stochastic_depthnorm2r
   re   r   GELUmlpmodules
isinstancerP   r   xavier_uniform_r   rL   normal_)rT   rF   ru   r:   rv   r   rx   rw   r   rG   r   mrU   s               r5   rO   SwinTransformerBlock.__init__  s     	D!_
/
	 !00Eu M_
sS137"''[_ipq!!#A!RYY''''166%GGOOAFFO5	 $r7   r$   c                     XR                  U R                  U R                  U5      5      5      -   nXR                  U R                  U R	                  U5      5      5      -   nU$ r   )r  r   r  r  r  rZ   s     r5   r[   SwinTransformerBlock.forward  sO    %%dii

1&>??%%dhhtzz!}&=>>r7   )r   r  r  r  r  )r_   r`   ra   rb   rc   r   rd   r   re   r   r   r   rf   rO   r   r[   rg   rh   ri   s   @r5   r   r     s    * #&'*/1||/E!6!6 !6 #Y	!6
 I!6 !6 !6 !!6  %!6 S"))^,!6 S"))^,!6 !6F  r7   r   c                      ^  \ rS rSrSrSSSS\R                  \4S\S\S\	\   S\	\   S	\
S
\
S\
S\
S\S\R                  4   S\S\R                  4   4U 4S jjjrS\4S jrSrU =r$ )SwinTransformerBlockV2i  a  
Swin Transformer V2 Block.
Args:
    dim (int): Number of input channels.
    num_heads (int): Number of attention heads.
    window_size (List[int]): Window size.
    shift_size (List[int]): Shift size for shifted window attention.
    mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0.
    dropout (float): Dropout rate. Default: 0.0.
    attention_dropout (float): Attention dropout rate. Default: 0.0.
    stochastic_depth_prob: (float): Stochastic depth rate. Default: 0.0.
    norm_layer (nn.Module): Normalization layer.  Default: nn.LayerNorm.
    attn_layer (nn.Module): Attention layer. Default: ShiftedWindowAttentionV2.
r   r   rF   ru   r:   rv   r   rx   rw   r   rG   .r   c                 2   > [         TU ]  UUUUUUUUU	U
S9
  g )N)r   rx   rw   r   rG   r   )rN   rO   )rT   rF   ru   r:   rv   r   rx   rw   r   rG   r   rU   s              r5   rO   SwinTransformerBlockV2.__init__  s5     	/"7!! 	 	
r7   r$   c                     XR                  U R                  U R                  U5      5      5      -   nXR                  U R                  U R	                  U5      5      5      -   nU$ r   )r  r  r   r  r  rZ   s     r5   r[   SwinTransformerBlockV2.forward  sQ     %%djj1&>??%%djj!&=>>r7    )r_   r`   ra   rb   rc   r   rd   r   re   r   r   r   rf   rO   r   r[   rg   rh   ri   s   @r5   r  r    s    * #&'*/1||/G

 
 #Y	

 I
 
 
 !
  %
 S"))^,
 S"))^,
 
4  r7   r  c                      ^  \ rS rSrSrSSSSSSS\4S\\   S	\S
\\   S\\   S\\   S\S\S\S\S\S\	\
S\R                  4      S\	\
S\R                  4      S\
S\R                  4   4U 4S jjjrS rSrU =r$ )r   i  a  
Implements Swin Transformer from the `"Swin Transformer: Hierarchical Vision Transformer using
Shifted Windows" <https://arxiv.org/abs/2103.14030>`_ paper.
Args:
    patch_size (List[int]): Patch size.
    embed_dim (int): Patch embedding dimension.
    depths (List(int)): Depth of each Swin Transformer layer.
    num_heads (List(int)): Number of attention heads in different layers.
    window_size (List[int]): Window size.
    mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0.
    dropout (float): Dropout rate. Default: 0.0.
    attention_dropout (float): Attention dropout rate. Default: 0.0.
    stochastic_depth_prob (float): Stochastic depth rate. Default: 0.1.
    num_classes (int): Number of classes for classification head. Default: 1000.
    block (nn.Module, optional): SwinTransformer Block. Default: None.
    norm_layer (nn.Module, optional): Normalization layer. Default: None.
    downsample_layer (nn.Module): Downsample layer (patch merging). Default: PatchMerging.
r   r   g?i  N
patch_size	embed_dimdepthsru   r:   r   rx   rw   r   num_classesrG   .blockdownsample_layerc                   > [         TU ]  5         [        U 5        Xl        Uc  [        nUc  [        [        R                  SS9n/ nUR                  [        R                  " [        R                  " SX!S   US   4US   US   4S9[        / SQ5      U" U5      5      5        [        U5      nSn[        [        U5      5       H  n/ nUSU-  -  n[        UU   5       H[  nU	[        U5      -  US-
  -  nUR                  U" UUU   UU Vs/ s H  nUS-  S:X  a  SOUS-  PM     snUUUUUS	9	5        US-  nM]     UR                  [        R                  " U6 5        U[        U5      S-
  :  d  M  UR                  U" UU5      5        M     [        R                  " U6 U l        US[        U5      S-
  -  -  nU" U5      U l        [        / S
Q5      U l        [        R&                  " S5      U l        [        R*                  " S5      U l        [        R.                  " UU
5      U l        U R3                  5        H  n[5        U[        R.                  5      (       d  M$  [        R6                  R9                  UR:                  SS9  UR<                  c  M[  [        R6                  R?                  UR<                  5        M     g s  snf )Ngh㈵>)epsr   r   r   )kernel_sizestride)r   r	   r   r   r	   )r:   rv   r   rx   rw   r   rG   )r   r   r   r	   r   r   ) rN   rO   r   r  r   r   r   rd   appendr   Conv2dr   r   ranger   r   featuresrR   r=   AdaptiveAvgPool2davgpoolFlattenr   rP   headr  r  r   r   r   rL   zeros_)rT   r  r  r  ru   r:   r   rx   rw   r   r  rG   r  r  layerstotal_stage_blocksstage_block_idi_stagestagerF   i_layersd_probr   num_featuresr  rU   s                            r5   rO   SwinTransformer.__init__  sw     	D!&=(E 48J"$MM		y!}jm.LV`abVceopqerUs %9%	
 ![S[)G%'Eaj(C 1/%2GGK]`aKab!'*$/OZ#[{!1)9AqAv$E{#["+ '*;.5#-
 !#! 2" MM"--/0#f+/*.sJ?@/ *0 v. 1Vq#99|,	|,++A.zz!}IIlK8	A!RYY''%%ahhD%966%GGNN166*	  - $\s   Kc                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU$ r   )r$  rR   r=   r&  r   r(  rZ   s     r5   r[   SwinTransformer.forward_  sV    MM!IIaLLLOLLOLLOIIaLr7   )r&  r$  r   r(  rR   r  r=   )r_   r`   ra   rb   rc   rD   r   re   r   r   r   r   rf   rO   r[   rg   rh   ri   s   @r5   r   r     s   4 #&'*9=485AM+IM+ M+ S		M+
 9M+ #YM+ M+ M+ !M+  %M+ M+ Xc299n56M+ bii01M+ #3		>2M+ M+^ r7   r   r  r  r  r   weightsprogresskwargsc           
          Ub#  [        US[        UR                  S   5      5        [        SU UUUUUS.UD6n	Ub  U	R	                  UR                  USS95        U	$ )Nr  
categories)r  r  r  ru   r:   r   T)r6  
check_hashr  )r   r   metar   load_state_dictget_state_dict)
r  r  r  ru   r:   r   r5  r6  r7  models
             r5   _swin_transformerr?  i  s{     fmSl9S5TU 3 E g44hSW4XYLr7   r9  c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i  z7https://download.pytorch.org/models/swin_t-704ceda3.pth      	crop_sizeresize_sizeinterpolationibrA  rA  Uhttps://github.com/pytorch/vision/tree/main/references/classification#swintransformerImageNet-1KguV^T@glW@zacc@1zacc@5gX9@g\([@YThese weights reproduce closely the results of the paper using a similar training recipe.
num_paramsmin_sizerecipe_metrics_ops
_file_size_docsurl
transformsr;  r  Nr_   r`   ra   rb   r   r   r   r   BICUBIC_COMMON_METAIMAGENET1K_V1DEFAULTrg   r  r7   r5   r   r     sg    E3CO`OhOh


""m##   t
M* Gr7   r   c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i  z7https://download.pytorch.org/models/swin_s-5e29d889.pthrA     rC  irrG  rH  rI  gCT@gףp=
X@rJ  gZd{!@gx&g@rK  rL  rT  r  NrW  r  r7   r5   r   r     sg    E3CO`OhOh


""m##  !t
M* Gr7   r   c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i  z7https://download.pytorch.org/models/swin_b-68c6b09e.pthrA     rC  i<;rG  rH  rI  gh|?T@g)\(X@rJ  g&1.@gt@rK  rL  rT  r  NrW  r  r7   r5   r   r     sg    E3CO`OhOh


""m##  !t
M* Gr7   r   c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i  z:https://download.pytorch.org/models/swin_v2_t-b137f0e2.pth     rC  iRra  ra  Xhttps://github.com/pytorch/vision/tree/main/references/classification#swintransformer-v2rI  gS㥛T@g rX@rJ  g(\@gMb([@rK  rL  rT  r  NrW  r  r7   r5   r   r     sg    H3CO`OhOh


""p##  !t
M* Gr7   r   c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i  z:https://download.pytorch.org/models/swin_v2_s-637d8ceb.pthra  rb  rC  irc  rd  rI  g!rhT@gNbX94X@rJ  gd;O'@gg@rK  rL  rT  r  NrW  r  r7   r5   r   r     g    H3CO`OhOh


""p##  !t
M* Gr7   r   c                   l    \ rS rSr\" S\" \SS\R                  S90 \	ESSSS	S
SS.0SSSS.ES9r
\
rSrg)r   i	  z:https://download.pytorch.org/models/swin_v2_b-781e5279.pthra  i  rC  i=rc  rd  rI  gI+U@gK7X@rJ  g33333S4@gˡEu@rK  rL  rT  r  NrW  r  r7   r5   r   r   	  rf  r7   r   
pretrained)r5  )r5  r6  c                 d    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU US.UD6$ )	a  
Constructs a swin_tiny architecture from
`Swin Transformer: Hierarchical Vision Transformer using Shifted Windows <https://arxiv.org/abs/2103.14030>`_.

Args:
    weights (:class:`~torchvision.models.Swin_T_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_T_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_T_Weights
    :members:
rJ   `   r	   r	      r	   r   rl           皙?r  r  r  ru   r:   r   r5  r6  r  )r   verifyr?  r5  r6  r7  s      r5   r   r   "  sP    . ##G,G 
q6 F!
 
 
r7   c                 d    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU US.UD6$ )	a  
Constructs a swin_small architecture from
`Swin Transformer: Hierarchical Vision Transformer using Shifted Windows <https://arxiv.org/abs/2103.14030>`_.

Args:
    weights (:class:`~torchvision.models.Swin_S_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_S_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_S_Weights
    :members:
rJ   rj  r	   r	      r	   rm  rp  333333?rr  r  )r   rs  r?  rt  s      r5   r   r   H  sP    . ##G,G 
q6 F!
 
 
r7   c                 d    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU US.UD6$ )	a  
Constructs a swin_base architecture from
`Swin Transformer: Hierarchical Vision Transformer using Shifted Windows <https://arxiv.org/abs/2103.14030>`_.

Args:
    weights (:class:`~torchvision.models.Swin_B_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_B_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_B_Weights
    :members:
rJ      rv  rJ   r   r       rp        ?rr  r  )r   rs  r?  rt  s      r5   r    r    n  sP    . ##G,G 
q6 F!
 
 
r7   c                 x    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU U[        [        S.
UD6$ )	a|  
Constructs a swin_v2_tiny architecture from
`Swin Transformer V2: Scaling Up Capacity and Resolution <https://arxiv.org/abs/2111.09883>`_.

Args:
    weights (:class:`~torchvision.models.Swin_V2_T_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_V2_T_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_V2_T_Weights
    :members:
rJ   rj  rk  rm  r   rq  
r  r  r  ru   r:   r   r5  r6  r  r  r  )r   rs  r?  r  rl   rt  s      r5   r!   r!     sV    .  &&w/G q6 F!$'  r7   c                 x    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU U[        [        S.
UD6$ )	a}  
Constructs a swin_v2_small architecture from
`Swin Transformer V2: Scaling Up Capacity and Resolution <https://arxiv.org/abs/2111.09883>`_.

Args:
    weights (:class:`~torchvision.models.Swin_V2_S_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_V2_S_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_V2_S_Weights
    :members:
rJ   rj  rv  rm  r   rx  r  r  )r   rs  r?  r  rl   rt  s      r5   r"   r"     sV    .  &&w/G q6 F!$'  r7   c                 x    [         R                  U 5      n [        SSS/S/ SQ/ SQSS/SU U[        [        S.
UD6$ )	a|  
Constructs a swin_v2_base architecture from
`Swin Transformer V2: Scaling Up Capacity and Resolution <https://arxiv.org/abs/2111.09883>`_.

Args:
    weights (:class:`~torchvision.models.Swin_V2_B_Weights`, optional): The
        pretrained weights to use. See
        :class:`~torchvision.models.Swin_V2_B_Weights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the
        download to stderr. Default is True.
    **kwargs: parameters passed to the ``torchvision.models.swin_transformer.SwinTransformer``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_
        for more details about this class.

.. autoclass:: torchvision.models.Swin_V2_B_Weights
    :members:
rJ   rz  rv  r{  r   r}  r  r  )r   rs  r?  r  rl   rt  s      r5   r#   r#     sV    .  &&w/G q6 F!$'  r7   )r   r   NNNT)Ar   	functoolsr   typingr   r   r   r,   torch.nn.functionalr   
functionalr*   r   ops.miscr
   r   ops.stochastic_depthr   transforms._presetsr   r   utilsr   _apir   r   r   _metar   _utilsr   r   __all__r6   fxwrapr   re   rB   rf   rD   rl   r   r   r   r   r   r   r  r   r?  rY  r   r   r   r   r   r   rZ  r   r   r    r!   r"   r#   r  r7   r5   <module>r     s     * *     # 2 H ' 6 6 ' B"%,, 5<<  " #""',,"IN"dhildm"
\\" + ,299 6RYY F  #!%"&*.ppp p #	p
 cp p S	p p p vp p %,,'p p pf ( )N
RYY N
bS
5 S
l6299 6r/1 /djbii jZS	 I Cy	
 c ! k"   > &
[ 2[ 2[ 2 2 2 2 ,0L0L!MN26 !x/ !$ !Y\ !ap ! O !H ,0L0L!MN26 !x/ !$ !Y\ !ap ! O !H ,0L0L!MN26 !x/ !$ !Y\ !ap ! O !H ,0A0O0O!PQ8<t #(#45 # #_b #gv # R #L ,0A0O0O!PQ8<t #(#45 # #_b #gv # R #L ,0A0O0O!PQ8<t #(#45 # #_b #gv # R #r7   