§
    �Åj³—  ã                   ó.  — d dl Z d dlZd dlmZ d dlmc mZ d dlmZ d dl	m
Z
mZmZ ddlmZ  G d„ dej        ¦  «        Zd„ Zd	„ Z G d
„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z e¦   «          G d„ dej        ¦  «        ¦   «         ZdS )é    N)Ústore_hyperparameters)ÚDropPathÚ	to_2tupleÚtrunc_normal_é   )Úpad_to_multiplec                   ó8   ‡ — e Zd Zddej        dfˆ fd„	Zd„ Zˆ xZS )ÚMlpNç        c                 ó  •— t          ¦   «                              ¦   «          |p|}|p|}t          j        ||¦  «        | _         |¦   «         | _        t          j        ||¦  «        | _        t          j        |¦  «        | _        d S ©N)	ÚsuperÚ__init__ÚnnÚLinearÚfc1ÚactÚfc2ÚDropoutÚdrop)ÚselfÚin_featuresÚhidden_featuresÚout_featuresÚ	act_layerr   Ú	__class__s         €ú\C:\Projects\Historical\venv\Lib\site-packages\spandrel/architectures/SwinIR/__arch/SwinIR.pyr   zMlp.__init__   sw   ø€ õ 	‰Œ×ÒÑÔÐØ#Ð2 {ˆØ)Ð8¨[ˆÝ”9˜[¨/Ñ:Ô:ˆŒØ�9‘;”;ˆŒÝ”9˜_¨lÑ;Ô;ˆŒÝ”J˜tÑ$Ô$ˆŒ	ˆ	ˆ	ó    c                 óØ   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|S r   )r   r   r   r   ©r   Úxs     r   ÚforwardzMlp.forward$   sR   € Ø�HŠH�Q‰KŒKˆØ�HŠH�Q‰KŒKˆØ�IŠI�a‰LŒLˆØ�HŠH�Q‰KŒKˆØ�IŠI�a‰LŒLˆØˆr   )Ú__name__Ú
__module__Ú__qualname__r   ÚGELUr   r"   Ú__classcell__©r   s   @r   r
   r
      s\   ø€ € € € € ð ØØ”'Øð%ð %ð %ð %ð %ð %ð ð ð ð ð ð ð r   r
   c                 óâ   — | j         \  }}}}|                      |||z  |||z  ||¦  «        } |                      dddddd¦  «                             ¦   «                              d|||¦  «        }|S )zš
    Args:
        x: (B, H, W, C)
        window_size (int): window size

    Returns:
        windows: (num_windows*B, window_size, window_size, C)
    r   é   r   é   é   é   éÿÿÿÿ)ÚshapeÚviewÚpermuteÚ
contiguous)r!   Úwindow_sizeÚBÚHÚWÚCÚwindowss          r   Úwindow_partitionr9   -   s   € ð ”�J€A€qˆ!ˆQØ	�Šˆq�!�{Ñ" K°°kÑ1AÀ;ÐPQÑRÔR€Aà	�	Š	�!�Q˜˜1˜a Ñ#Ô#×.Ò.Ñ0Ô0×5Ò5°b¸+À{ÐTUÑVÔVð ð €Nr   c                 ó  — t          | j        d         ||z  |z  |z  z  ¦  «        }|                      |||z  ||z  ||d¦  «        }|                     dddddd¦  «                             ¦   «                              |||d¦  «        }|S )zÛ
    Args:
        windows: (num_windows*B, window_size, window_size, C)
        window_size (int): Window size
        H (int): Height of image
        W (int): Width of image

    Returns:
        x: (B, H, W, C)
    r   r.   r*   r   r+   r,   r-   )Úintr/   r0   r1   r2   )r8   r3   r5   r6   r4   r!   s         r   Úwindow_reverser<   >   s—   € õ 	ˆGŒM˜!Ô  A¡¨Ñ 3°kÑ AÑBÑCÔC€AØ�ŠØ	ˆ1�Ñ˜Q +Ñ-¨{¸KÈñ	ô 	€Að 	
�	Š	�!�Q˜˜1˜a Ñ#Ô#×.Ò.Ñ0Ô0×5Ò5°a¸¸A¸rÑBÔB€AØ€Hr   c                   óF   ‡ — e Zd ZdZ	 	 	 	 d
ˆ fd„	Zdd„Zdefd„Zd	„ Zˆ xZ	S )ÚWindowAttentiona§  Window based multi-head self attention (W-MSA) module with relative position bias.
    It supports both of shifted and non-shifted window.

    Args:
        dim (int): Number of input channels.
        window_size (tuple[int]): The height and width of the window.
        num_heads (int): Number of attention heads.
        qkv_bias (bool, optional):  If True, add a learnable bias to query, key, value. Default: True
        qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set
        attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0
        proj_drop (float, optional): Dropout ratio of output. Default: 0.0
    TNr   c                 ó  •— t          ¦   «                              ¦   «          || _        || _        || _        ||z  }|p|dz  | _        t          j        t          j	        d|d         z  dz
  d|d         z  dz
  z  |¦  «        ¦  «        | _
        t          j        | j        d         ¦  «        }	t          j        | j        d         ¦  «        }
t          j        t          j        |	|
g¦  «        ¦  «        }t          j        |d¦  «        }|d d …d d …d f         |d d …d d d …f         z
  }|                     ddd¦  «                             ¦   «         }|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<   |                     d¦  «        }|                      d|¦  «         t          j        ||dz  |¬¦  «        | _        t          j        |¦  «        | _        t          j        ||¦  «        | _        t          j        |¦  «        | _        t3          | j
        d	¬
¦  «         t          j        d¬¦  «        | _        d S )Ng      à¿r+   r   r*   r.   Úrelative_position_indexr   ©Úbiasç{®Gáz”?©Ústd)Údim)r   r   rF   r3   Ú	num_headsÚscaler   Ú	ParameterÚtorchÚzerosÚrelative_position_bias_tableÚarangeÚstackÚmeshgridÚflattenr1   r2   ÚsumÚregister_bufferr   Úqkvr   Ú	attn_dropÚprojÚ	proj_dropr   ÚSoftmaxÚsoftmax)r   rF   r3   rG   Úqkv_biasÚqk_scalerT   rV   Úhead_dimÚcoords_hÚcoords_wÚcoordsÚcoords_flattenÚrelative_coordsr@   r   s                  €r   r   zWindowAttention.__init___   s¤  ø€ õ 	‰Œ×ÒÑÔÐØˆŒØ&ˆÔØ"ˆŒØ˜)Ñ#ˆØÐ/ ¨4¡ˆŒ
õ -/¬LÝŒK˜˜[¨œ^Ñ+¨aÑ/°A¸ÀA¼Ñ4FÈÑ4JÑKÈYÑWÔWñ-
ô -
ˆÔ)õ
 ”< Ô 0°Ô 3Ñ4Ô4ˆÝ”< Ô 0°Ô 3Ñ4Ô4ˆÝ”�Uœ^¨X°xÐ,@ÑAÔAÑBÔBˆÝœ v¨qÑ1Ô1ˆà˜1˜1˜1˜a˜a˜a ˜:Ô&¨¸¸¸¸4ÀÀÀ¸
Ô)CÑCð 	ð *×1Ò1Øˆq�!ñ
ô 
ç
Š*‰,Œ,ð 	ð 	˜˜˜˜1˜1˜1˜a˜Ð Ð Ô  DÔ$4°QÔ$7¸!Ñ$;Ñ;Ð Ð Ñ Ø˜˜˜˜1˜1˜1˜a˜Ð Ð Ô  DÔ$4°QÔ$7¸!Ñ$;Ñ;Ð Ð Ñ Ø˜˜˜˜1˜1˜1˜a˜Ð Ð Ô  A¨Ô(8¸Ô(;Ñ$;¸aÑ$?Ñ?Ð Ð Ñ Ø"1×"5Ò"5°bÑ"9Ô"9ÐØ×ÒÐ6Ð8OÑPÔPÐPå”9˜S #¨¡'°Ð9Ñ9Ô9ˆŒÝœ IÑ.Ô.ˆŒÝ”I˜c 3Ñ'Ô'ˆŒ	åœ IÑ.Ô.ˆŒå�dÔ7¸TÐBÑBÔBÐBÝ”z bÐ)Ñ)Ô)ˆŒˆˆr   c                 ó¨  — |j         \  }}}|                      |¦  «                             ||d| j        || j        z  ¦  «                             ddddd¦  «        }|d         |d         |d         }	}}|| j        z  }||                     dd¦  «        z  }
| j        | j         	                    d¦  «                  	                    | j
        d         | j
        d         z  | j
        d         | j
        d         z  d¦  «        }|                     ddd¦  «                             ¦   «         }|
|                     d¦  «        z   }
|�Š|j         d         }|
 	                    ||z  || j        ||¦  «        |                     d¦  «                             d¦  «        z   }
|
 	                    d| j        ||¦  «        }
|                      |
¦  «        }
n|                      |
¦  «        }
|                      |
¦  «        }
|
|	z                       dd¦  «                             |||¦  «        }|                      |¦  «        }|                      |¦  «        }|S )z«
        Args:
            x: input features with shape of (num_windows*B, N, C)
            mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None
        r   r+   r   r*   r,   éþÿÿÿr.   )r/   rS   ÚreshaperG   r1   rH   Ú	transposerL   r@   r0   r3   r2   Ú	unsqueezerX   rT   rU   rV   )r   r!   ÚmaskÚB_ÚNr7   rS   ÚqÚkÚvÚattnÚrelative_position_biasÚnWs                r   r"   zWindowAttention.forward�   s;  € ð ”7‰ˆˆAˆqà�HŠH�Q‰KŒKßŠW�R˜˜A˜tœ~¨q°D´NÑ/BÑCÔCßŠW�Q˜˜1˜a Ñ#Ô#ð 	ð �ŒFØ�ŒFØ�ŒFð ˆ1ˆð �”
‰NˆØ�1—;’;˜r 2Ñ&Ô&Ñ&ˆà!%Ô!BØÔ(×-Ò-¨bÑ1Ô1ô"
ç
Š$ØÔ˜QÔ $Ô"2°1Ô"5Ñ5ØÔ˜QÔ $Ô"2°1Ô"5Ñ5Øñ
ô 
ð 	ð "8×!?Ò!?Øˆq�!ñ"
ô "
ç
Š*‰,Œ,ð 	ð Ð,×6Ò6°qÑ9Ô9Ñ9ˆàÐØ”˜A”ˆBØ—9’9˜R 2™X r¨4¬>¸1¸aÑ@Ô@À4Ç>Â>ØñDô DçŠi˜‰lŒlñˆDð —9’9˜R ¤°°AÑ6Ô6ˆDØ—<’< Ñ%Ô%ˆDˆDà—<’< Ñ%Ô%ˆDà�~Š~˜dÑ#Ô#ˆà�A‰X× Ò   AÑ&Ô&×.Ò.¨r°1°aÑ8Ô8ˆØ�IŠI�a‰LŒLˆØ�NŠN˜1ÑÔˆØˆr   Úreturnc                 ó6   — d| j         › d| j        › d| j        › �S )Núdim=ú, window_size=ú, num_heads=)rF   r3   rG   ©r   s    r   Ú
extra_reprzWindowAttention.extra_reprÁ   s'   € Ø\�d”hÐ\Ð\¨dÔ.>Ð\Ð\ÈDÌNÐ\Ð\Ð\r   c                 óä   — d}||| j         z  dz  | j         z  z  }|| j        |z  | j         | j        z  z  |z  z  }|| j        |z  |z  | j         | j        z  z  z  }||| j         z  | j         z  z  }|S )Nr   r   )rF   rG   )r   rh   Úflopss      r   rw   zWindowAttention.flopsÄ   s‡   € àˆà��T”X‘ Ñ! D¤HÑ,Ñ,ˆà�” !Ñ# t¤x°4´>Ñ'AÑBÀQÑFÑFˆà�” !Ñ# aÑ'¨4¬8°t´~Ñ+EÑFÑFˆà��T”X‘ ¤Ñ(Ñ(ˆØˆr   )TNr   r   r   )
r#   r$   r%   Ú__doc__r   r"   Ústrru   rw   r'   r(   s   @r   r>   r>   Q   sš   ø€ € € € € ðð ð$ ØØØð.*ð .*ð .*ð .*ð .*ð .*ð`0ð 0ð 0ð 0ðd]˜Cð ]ð ]ð ]ð ]ðð ð ð ð ð ð r   r>   c            
       ój   ‡ — e Zd ZdZddddddddej        ej        f
ˆ fd„	Zd	„ Zd
„ Z	de
fd„Zd„ Zˆ xZS )ÚSwinTransformerBlocka•  Swin Transformer Block.

    Args:
        dim (int): Number of input channels.
        input_resolution (tuple[int]): Input resulotion.
        num_heads (int): Number of attention heads.
        window_size (int): Window size.
        shift_size (int): Shift size for SW-MSA.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
        qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
        drop (float, optional): Dropout rate. Default: 0.0
        attn_drop (float, optional): Attention dropout rate. Default: 0.0
        drop_path (float, optional): Stochastic depth rate. Default: 0.0
        act_layer (nn.Module, optional): Activation layer. Default: nn.GELU
        norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm
    é   r   ç      @TNr   c           	      ó   •— t          ¦   «                              ¦   «          || _        || _        || _        || _        || _        || _        t          | j        ¦  «        | j        k    r d| _        t          | j        ¦  «        | _        d| j        cxk    r| j        k     sn J d¦   «         ‚ ||¦  «        | _	        t          |t          | j        ¦  «        ||||
|	¬¦  «        | _        |dk    rt          |¦  «        nt          j        ¦   «         | _         ||¦  «        | _        t%          ||z  ¦  «        }t'          ||||	¬¦  «        | _        | j        dk    r|                      | j        ¦  «        }nd }|                      d|¦  «         d S )Nr   z shift_size must in 0-window_size)r3   rG   rY   rZ   rT   rV   r   )r   r   r   r   Ú	attn_mask)r   r   rF   Úinput_resolutionrG   r3   Ú
shift_sizeÚ	mlp_ratioÚminÚnorm1r>   r   rl   r   r   ÚIdentityÚ	drop_pathÚnorm2r;   r
   ÚmlpÚcalculate_maskrR   )r   rF   r€   rG   r3   r�   r‚   rY   rZ   r   rT   r†   r   Ú
norm_layerÚmlp_hidden_dimr   r   s                   €r   r   zSwinTransformerBlock.__init__å   s¤  ø€ õ  	‰Œ×ÒÑÔÐØˆŒØ 0ˆÔØ"ˆŒØ&ˆÔØ$ˆŒØ"ˆŒÝˆtÔ$Ñ%Ô%¨Ô)9Ò9Ð9àˆDŒOÝ" 4Ô#8Ñ9Ô9ˆDÔà�”Ð3Ð3Ò3Ð3 4Ô#3Ò3Ð3Ð3Ð3Ð3Ø-ñ 4Ô3Ð3ð  �Z ‘_”_ˆŒ
Ý#ØÝ! $Ô"2Ñ3Ô3ØØØØØð
ñ 
ô 
ˆŒ	ð 1:¸C²°� )Ñ,Ô,Ð,ÅRÄ[Á]Ä]ˆŒØ�Z ‘_”_ˆŒ
Ý˜S 9™_Ñ-Ô-ˆÝØØ*ØØð	
ñ 
ô 
ˆŒð Œ?˜QÒÐØ×+Ò+¨DÔ,AÑBÔBˆIˆIàˆIà×Ò˜[¨)Ñ4Ô4Ð4Ð4Ð4r   c           	      óÂ  — |\  }}t          j        d||df¦  «        }t          d| j         ¦  «        t          | j         | j         ¦  «        t          | j         d ¦  «        f}t          d| j         ¦  «        t          | j         | j         ¦  «        t          | j         d ¦  «        f}d}|D ]}|D ]}	||d d …||	d d …f<   |dz  }ŒŒt          || j        ¦  «        }
|
                     d| j        | j        z  ¦  «        }
|
                     d¦  «        |
                     d¦  «        z
  }|                     |dk    d¦  «                             |dk    d¦  «        }|S )Nr*   r   r.   r+   g      YÀr   )	rJ   rK   Úslicer3   r�   r9   r0   re   Úmasked_fill)r   Úx_sizer5   r6   Úimg_maskÚh_slicesÚw_slicesÚcntÚhÚwÚmask_windowsr   s               r   r‰   z#SwinTransformerBlock.calculate_mask   s–  € à‰ˆˆ1Ý”;  1 a¨˜|Ñ,Ô,ˆå�!�dÔ&Ð&Ñ'Ô'Ý�4Ô#Ð# d¤oÐ%5Ñ6Ô6Ý�4”?Ð" DÑ)Ô)ð
ˆõ �!�dÔ&Ð&Ñ'Ô'Ý�4Ô#Ð# d¤oÐ%5Ñ6Ô6Ý�4”?Ð" DÑ)Ô)ð
ˆð
 ˆØð 	ð 	ˆAØð ð �Ø'*�˜˜˜˜A˜q ! ! !˜Ñ$Ø�q‘��ðõ (Ø�dÔ&ñ
ô 
ˆð $×(Ò(¨¨TÔ-=ÀÔ@PÑ-PÑQÔQˆØ ×*Ò*¨1Ñ-Ô-°×0FÒ0FÀqÑ0IÔ0IÑIˆ	Ø×)Ò)¨)°qª.¸&ÑAÔA×MÒMØ˜ŠN˜Cñ
ô 
ˆ	ð Ðr   c                 óä  — |\  }}|j         \  }}}|}|                      |¦  «        }|                     ||||¦  «        }| j        dk    r&t	          j        || j         | j         fd¬¦  «        }	n|}	t          |	| j        ¦  «        }
|
                     d| j        | j        z  |¦  «        }
| j        |k    r|  	                    |
| j
        ¬¦  «        }nB|  	                    |
|                      |¦  «                             |j        ¦  «        ¬¦  «        }|                     d| j        | j        |¦  «        }t          || j        ||¦  «        }	| j        dk    r$t	          j        |	| j        | j        fd¬¦  «        }n|	}|                     |||z  |¦  «        }||                      |¦  «        z   }||                      |                      |                      |¦  «        ¦  «        ¦  «        z   }|S )Nr   )r*   r+   )ÚshiftsÚdimsr.   )rf   )r/   r„   r0   r�   rJ   Úrollr9   r3   r€   rl   r   r‰   ÚtoÚdevicer<   r†   rˆ   r‡   )r   r!   r�   r5   r6   r4   ÚLr7   ÚshortcutÚ	shifted_xÚ	x_windowsÚattn_windowss               r   r"   zSwinTransformerBlock.forward?  s  € Ø‰ˆˆ1Ø”'‰ˆˆ1ˆað ˆØ�JŠJ�q‰MŒMˆØ�FŠF�1�a˜˜AÑÔˆð Œ?˜QÒÐÝœ
Ø˜DœOÐ+¨d¬oÐ-=Ð>ÀVðñ ô ˆIˆIð ˆIõ %Ø�tÔ'ñ
ô 
ˆ	ð —N’NØ�Ô  4Ô#3Ñ3°Qñ
ô 
ˆ	ð
 Ô  FÒ*Ð*ØŸ9š9Ø ¤ð %ñ ô ˆLˆLð  Ÿ9š9Ø × 3Ò 3°FÑ ;Ô ;× >Ò >¸q¼xÑ HÔ Hð %ñ ô ˆLð
 $×(Ò(¨¨TÔ-=¸tÔ?OÐQRÑSÔSˆÝ" <°Ô1AÀ1ÀaÑHÔHˆ	ð Œ?˜QÒÐÝ”
Ø 4¤?°D´OÐ"DÈ6ðñ ô ˆAˆAð ˆAØ�FŠF�1�a˜!‘e˜QÑÔˆð �t—~’~ aÑ(Ô(Ñ(ˆØ�—’˜tŸxšx¨¯
ª
°1©¬Ñ6Ô6Ñ7Ô7Ñ7ˆàˆr   ro   c                 óf   — d| j         › d| j        › d| j        › d| j        › d| j        › d| j        › �S )Nrq   ú, input_resolution=rs   rr   z, shift_size=z, mlp_ratio=)rF   r€   rG   r3   r�   r‚   rt   s    r   ru   zSwinTransformerBlock.extra_repru  su   € ðh�4”8ð hð h°Ô0Eð hð hÐSWÔSað hð hØÔ+ðhð hØ:>¼/ðhð hØW[ÔWeðhð hð	
r   c                 ó(  — d}| j         \  }}|| j        |z  |z  z  }||z  | j        z  | j        z  }||| j                             | j        | j        z  ¦  «        z  z  }|d|z  |z  | j        z  | j        z  | j        z  z  }|| j        |z  |z  z  }|S )Nr   r+   )r€   rF   r3   rl   rw   r‚   )r   rw   r5   r6   rn   s        r   rw   zSwinTransformerBlock.flops{  sª   € ØˆØÔ$‰ˆˆ1à�”˜A‘ Ñ!Ñ!ˆà�‰U�TÔ%Ñ%¨Ô(8Ñ8ˆØ��d”i—o’o dÔ&6¸Ô9IÑ&IÑJÔJÑJÑJˆà��Q‘˜‘˜TœXÑ%¨¬Ñ0°4´>ÑAÑAˆà�”˜A‘ Ñ!Ñ!ˆØˆr   )r#   r$   r%   rx   r   r&   Ú	LayerNormr   r‰   r"   ry   ru   rw   r'   r(   s   @r   r{   r{   Ò   sµ   ø€ € € € € ðð ð. ØØØØØØØØ”'Ø”<ð95ð 95ð 95ð 95ð 95ð 95ðvð ð ð>4ð 4ð 4ðl
˜Cð 
ð 
ð 
ð 
ðð ð ð ð ð ð r   r{   c                   óH   ‡ — e Zd ZdZej        fˆ fd„	Zd„ Zdefd„Z	d„ Z
ˆ xZS )ÚPatchMergingzëPatch Merging Layer.

    Args:
        input_resolution (tuple[int]): Resolution of input feature.
        dim (int): Number of input channels.
        norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm
    c                 óÎ   •— t          ¦   «                              ¦   «          || _        || _        t	          j        d|z  d|z  d¬¦  «        | _         |d|z  ¦  «        | _        d S )Nr,   r+   FrA   )r   r   r€   rF   r   r   Ú	reductionÚnorm)r   r€   rF   rŠ   r   s       €r   r   zPatchMerging.__init__“  sa   ø€ Ý‰Œ×ÒÑÔÐØ 0ˆÔØˆŒÝœ 1 s¡7¨A°©G¸%Ð@Ñ@Ô@ˆŒØ�J˜q 3™wÑ'Ô'ˆŒ	ˆ	ˆ	r   c                 ó6  — | j         \  }}|j        \  }}}|||z  k    s
J d¦   «         ‚|dz  dk    r	|dz  dk    sJ d|› d|› d�¦   «         ‚|                     ||||¦  «        }|dd…ddd…ddd…dd…f         }|dd…ddd…ddd…dd…f         }|dd…ddd…ddd…dd…f         }	|dd…ddd…ddd…dd…f         }
t          j        |||	|
gd	¦  «        }|                     |d	d
|z  ¦  «        }|                      |¦  «        }|                      |¦  «        }|S )z
        x: B, H*W, C
        zinput feature has wrong sizer+   r   zx size (Ú*z) are not even.Nr*   r.   r,   )r€   r/   r0   rJ   Úcatrª   r©   )r   r!   r5   r6   r4   r�   r7   Úx0Úx1Úx2Úx3s              r   r"   zPatchMerging.forwardš  sx  € ð Ô$‰ˆˆ1Ø”'‰ˆˆ1ˆaØ�A˜‘EŠzˆzˆzÐ9‰zŒzˆzØ�1‰u˜Šzˆz˜a !™e qšj˜j˜jÐ*K°QÐ*KÐ*K¸Ð*KÐ*KÐ*K™jœjÐ(à�FŠF�1�a˜˜AÑÔˆàˆqˆqˆq�!�$�Q�$˜˜˜1˜˜a˜a˜aÐÔ ˆØˆqˆqˆq�!�$�Q�$˜˜˜1˜˜a˜a˜aÐÔ ˆØˆqˆqˆq�!�$�Q�$˜˜˜1˜˜a˜a˜aÐÔ ˆØˆqˆqˆq�!�$�Q�$˜˜˜1˜˜a˜a˜aÐÔ ˆÝŒI�r˜2˜r 2Ð&¨Ñ+Ô+ˆØ�FŠF�1�b˜!˜a™%Ñ Ô ˆà�IŠI�a‰LŒLˆØ�NŠN˜1ÑÔˆàˆr   ro   c                 ó&   — d| j         › d| j        › �S )Nzinput_resolution=z, dim=©r€   rF   rt   s    r   ru   zPatchMerging.extra_repr±  s   € ØJ 4Ô#8ÐJÐJÀÄÐJÐJÐJr   c                 ó|   — | j         \  }}||z  | j        z  }||dz  |dz  z  dz  | j        z  dz  | j        z  z  }|S )Nr+   r,   r³   ©r   r5   r6   rw   s       r   rw   zPatchMerging.flops´  sR   € ØÔ$‰ˆˆ1Ø�A‘˜œÑ ˆØ�!�q‘&˜Q !™VÑ$ qÑ(¨4¬8Ñ3°aÑ7¸$¼(ÑBÑBˆØˆr   ©r#   r$   r%   rx   r   r¥   r   r"   ry   ru   rw   r'   r(   s   @r   r§   r§   Š  sŒ   ø€ € € € € ðð ð :<¼ð (ð (ð (ð (ð (ð (ðð ð ð.K˜Cð Kð Kð Kð Kðð ð ð ð ð ð r   r§   c            	       óX   ‡ — e Zd ZdZddddddej        ddf	ˆ fd„	Zd„ Zd	efd
„Z	d„ Z
ˆ xZS )Ú
BasicLayera.  A basic Swin Transformer layer for one stage.

    Args:
        dim (int): Number of input channels.
        input_resolution (tuple[int]): Input resolution.
        depth (int): Number of blocks.
        num_heads (int): Number of attention heads.
        window_size (int): Local window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
        qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
        drop (float, optional): Dropout rate. Default: 0.0
        attn_drop (float, optional): Attention dropout rate. Default: 0.0
        drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
        norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
        downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
        use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
    r}   TNr   Fc                 óJ  •‡‡‡‡‡‡‡‡	‡
‡‡— t          ¦   «                              ¦   «          ‰| _        ‰| _        || _        || _        t          j        ˆ
ˆˆ	ˆˆˆˆˆˆˆˆfd„t          |¦  «        D ¦   «         ¦  «        | _	        |� |‰‰‰¬¦  «        | _
        d S d | _
        d S )Nc                 óœ   •— g | ]H}t          ‰‰‰	‰|d z  dk    rdn‰d z  ‰‰‰
‰‰t          ‰t          ¦  «        r‰|         n‰‰¬¦  «        ‘ŒIS )r+   r   )rF   r€   rG   r3   r�   r‚   rY   rZ   r   rT   r†   rŠ   )r{   Ú
isinstanceÚlist)Ú.0ÚirT   rF   r   r†   r€   r‚   rŠ   rG   rZ   rY   r3   s     €€€€€€€€€€€r   ú
<listcomp>z'BasicLayer.__init__.<locals>.<listcomp>è  s�   ø€ ð ð ð ð" õ! %ØØ%5Ø'Ø +Ø%&¨¡U¨a¢Z Z˜q˜q°kÀQÑ6FØ'Ø%Ø%ØØ'å! )­TÑ2Ô2ð#˜i¨œl˜là"Ø)ðñ ô ðð ð r   )rF   rŠ   )r   r   rF   r€   ÚdepthÚuse_checkpointr   Ú
ModuleListÚrangeÚblocksÚ
downsample)r   rF   r€   rÀ   rG   r3   r‚   rY   rZ   r   rT   r†   rŠ   rÅ   rÁ   r   s    `` `````````  €r   r   zBasicLayer.__init__Ï  sñ   øøøøøøøøøøøø€ õ" 	‰Œ×ÒÑÔÐØˆŒØ 0ˆÔØˆŒ
Ø,ˆÔõ ”mðð ð ð ð ð ð ð ð ð ð ð ð ð õ" ˜u™œð#ñ ô ñ
ô 
ˆŒð. Ð!Ø(˜jØ  c°jðñ ô ˆDŒOˆOˆOð #ˆDŒOˆOˆOr   c                 ó¦   — | j         D ],}| j        rt          j        |||¦  «        }Œ  |||¦  «        }Œ-| j        �|                      |¦  «        }|S r   )rÄ   rÁ   Ú
checkpointrÅ   )r   r!   r�   Úblks       r   r"   zBasicLayer.forward  sc   € Ø”;ð 	#ð 	#ˆCØÔ"ð #ÝÔ)¨#¨q°&Ñ9Ô9��à�C˜˜6‘N”N��ØŒ?Ð&Ø—’ Ñ"Ô"ˆAØˆr   ro   c                 ó6   — d| j         › d| j        › d| j        › �S )Nrq   r£   z, depth=)rF   r€   rÀ   rt   s    r   ru   zBasicLayer.extra_repr  s)   € Ø^�d”hÐ^Ð^°4Ô3HÐ^Ð^ÐRVÔR\Ð^Ð^Ð^r   c                 ó’   — d}| j         D ]}||                     ¦   «         z  }Œ| j        �|| j                             ¦   «         z  }|S ©Nr   )rÄ   rw   rÅ   )r   rw   rÈ   s      r   rw   zBasicLayer.flops  sQ   € ØˆØ”;ð 	!ð 	!ˆCØ�S—Y’Y‘[”[Ñ ˆEˆEØŒ?Ð&Ø�T”_×*Ò*Ñ,Ô,Ñ,ˆEØˆr   r¶   r(   s   @r   r¸   r¸   »  s¥   ø€ € € € € ðð ð4 ØØØØØØ”<ØØð4#ð 4#ð 4#ð 4#ð 4#ð 4#ðlð ð ð_˜Cð _ð _ð _ð _ðð ð ð ð ð ð r   r¸   c                   óR   ‡ — e Zd ZdZddddddej        ddddd	fˆ fd
„	Zd„ Zd„ Zˆ xZ	S )ÚRSTBa¹  Residual Swin Transformer Block (RSTB).

    Args:
        dim (int): Number of input channels.
        input_resolution (tuple[int]): Input resolution.
        depth (int): Number of blocks.
        num_heads (int): Number of attention heads.
        window_size (int): Local window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
        qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
        drop (float, optional): Dropout rate. Default: 0.0
        attn_drop (float, optional): Attention dropout rate. Default: 0.0
        drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
        norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
        downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
        use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
        img_size: Input image size.
        patch_size: Patch size.
        resi_connection: The convolutional block before residual connection.
    r}   TNr   Féà   r,   Ú1convc                 ó†  •— t          ¦   «                              ¦   «          || _        || _        t	          |||||||||	|
||||¬¦  «        | _        |dk    rt          j        ||ddd¦  «        | _        n™|dk    r“t          j	        t          j        ||dz  ddd¦  «        t          j
        dd¬	¦  «        t          j        |dz  |dz  ddd
¦  «        t          j
        dd¬	¦  «        t          j        |dz  |ddd¦  «        ¦  «        | _        t          ||d
|d ¬¦  «        | _        t          ||d
|d ¬¦  «        | _        d S )N)rF   r€   rÀ   rG   r3   r‚   rY   rZ   r   rT   r†   rŠ   rÅ   rÁ   rÏ   r   r*   Ú3convr,   çš™™™™™É?T©Únegative_slopeÚinplacer   ©Úimg_sizeÚ
patch_sizeÚin_chansÚ	embed_dimrŠ   )r   r   rF   r€   r¸   Úresidual_groupr   ÚConv2dÚconvÚ
SequentialÚ	LeakyReLUÚ
PatchEmbedÚpatch_embedÚPatchUnEmbedÚpatch_unembed)r   rF   r€   rÀ   rG   r3   r‚   rY   rZ   r   rT   r†   rŠ   rÅ   rÁ   r×   rØ   Úresi_connectionr   s                     €r   r   zRSTB.__init__2  sz  ø€ õ( 	‰Œ×ÒÑÔÐàˆŒØ 0ˆÔå(ØØ-ØØØ#ØØØØØØØ!Ø!Ø)ð
ñ 
ô 
ˆÔð" ˜gÒ%Ð%Ýœ	 # s¨A¨q°!Ñ4Ô4ˆDŒIˆIØ Ò'Ð'åœÝ”	˜#˜s a™x¨¨A¨qÑ1Ô1Ý”¨C¸Ð>Ñ>Ô>Ý”	˜# ™( C¨1¡H¨a°°AÑ6Ô6Ý”¨C¸Ð>Ñ>Ô>Ý”	˜# ™( C¨¨A¨qÑ1Ô1ñô ˆDŒIõ &ØØ!ØØØð
ñ 
ô 
ˆÔõ *ØØ!ØØØð
ñ 
ô 
ˆÔÐÐr   c           
      ó¨   — |                       |                      |                      |                      ||¦  «        |¦  «        ¦  «        ¦  «        |z   S r   )rá   rÝ   rã   rÛ   )r   r!   r�   s      r   r"   zRSTB.forwardx  sS   € à×ÒØ—	’	˜$×,Ò,¨T×-@Ò-@ÀÀFÑ-KÔ-KÈVÑTÔTÑUÔUñô ð ñð	
r   c                 óü   — d}|| j                              ¦   «         z  }| j        \  }}|||z  | j        z  | j        z  dz  z  }|| j                             ¦   «         z  }|| j                             ¦   «         z  }|S )Nr   é	   )rÛ   rw   r€   rF   rá   rã   ©r   rw   r5   r6   s       r   rw   z
RSTB.flops€  s„   € ØˆØ�Ô$×*Ò*Ñ,Ô,Ñ,ˆØÔ$‰ˆˆ1Ø��Q‘˜œÑ! D¤HÑ,¨qÑ0Ñ0ˆØ�Ô!×'Ò'Ñ)Ô)Ñ)ˆØ�Ô#×)Ò)Ñ+Ô+Ñ+ˆàˆr   )
r#   r$   r%   rx   r   r¥   r   r"   rw   r'   r(   s   @r   rÍ   rÍ     s”   ø€ € € € € ðð ð: ØØØØØØ”<ØØØØØð%D
ð D
ð D
ð D
ð D
ð D
ðL
ð 
ð 
ðð ð ð ð ð ð r   rÍ   c                   ó2   ‡ — e Zd ZdZ	 d
ˆ fd„	Zd„ Zd	„ Zˆ xZS )rà   aw  Image to Patch Embedding

    Args:
        img_size (int): Image size.  Default: 224.
        patch_size (int): Patch token size. Default: 4.
        in_chans (int): Number of input image channels. Default: 3.
        embed_dim (int): Number of linear projection output channels. Default: 96.
        norm_layer (nn.Module, optional): Normalization layer. Default: None
    rÎ   r,   r   é`   Nc                 óp  •— t          ¦   «                              ¦   «          t          |¦  «        }t          |¦  «        }|d         |d         z  |d         |d         z  g}|| _        || _        || _        |d         |d         z  | _        || _        || _        |� ||¦  «        | _	        d S d | _	        d S ©Nr   r*   )
r   r   r   r×   rØ   Úpatches_resolutionÚnum_patchesrÙ   rÚ   rª   ©r   r×   rØ   rÙ   rÚ   rŠ   rí   r   s          €r   r   zPatchEmbed.__init__–  sÁ   ø€ õ 	‰Œ×ÒÑÔÐÝ˜XÑ&Ô&ˆÝ˜zÑ*Ô*ˆ
à�QŒK˜: aœ=Ñ(Ø�QŒK˜: aœ=Ñ(ð
Ðð !ˆŒØ$ˆŒØ"4ˆÔØ-¨aÔ0Ð3EÀaÔ3HÑHˆÔà ˆŒØ"ˆŒàÐ!Ø"˜
 9Ñ-Ô-ˆDŒIˆIˆIàˆDŒIˆIˆIr   c                 ó�   — |                      d¦  «                             dd¦  «        }| j        �|                      |¦  «        }|S )Nr+   r*   )rP   rd   rª   r    s     r   r"   zPatchEmbed.forward­  s=   € Ø�IŠI�a‰LŒL×"Ò" 1 aÑ(Ô(ˆØŒ9Ð Ø—	’	˜!‘”ˆAØˆr   c                 óL   — d}| j         \  }}| j        �|||z  | j        z  z  }|S rË   )r×   rª   rÚ   rè   s       r   rw   zPatchEmbed.flops³  s4   € ØˆØŒ}‰ˆˆ1ØŒ9Ð Ø�Q˜‘U˜Tœ^Ñ+Ñ+ˆEØˆr   ©rÎ   r,   r   rê   N©r#   r$   r%   rx   r   r"   rw   r'   r(   s   @r   rà   rà   ‹  sl   ø€ € € € € ðð ð PTðð ð ð ð ð ð.ð ð ðð ð ð ð ð ð r   rà   c                   ó2   ‡ — e Zd ZdZ	 d
ˆ fd„	Zd„ Zd	„ Zˆ xZS )râ   ay  Image to Patch Unembedding

    Args:
        img_size (int): Image size.  Default: 224.
        patch_size (int): Patch token size. Default: 4.
        in_chans (int): Number of input image channels. Default: 3.
        embed_dim (int): Number of linear projection output channels. Default: 96.
        norm_layer (nn.Module, optional): Normalization layer. Default: None
    rÎ   r,   r   rê   Nc                 ó:  •— t          ¦   «                              ¦   «          t          |¦  «        }t          |¦  «        }|d         |d         z  |d         |d         z  g}|| _        || _        || _        |d         |d         z  | _        || _        || _        d S rì   )	r   r   r   r×   rØ   rí   rî   rÙ   rÚ   rï   s          €r   r   zPatchUnEmbed.__init__Æ  sŸ   ø€ õ 	‰Œ×ÒÑÔÐÝ˜XÑ&Ô&ˆÝ˜zÑ*Ô*ˆ
à�QŒK˜: aœ=Ñ(Ø�QŒK˜: aœ=Ñ(ð
Ðð !ˆŒØ$ˆŒØ"4ˆÔØ-¨aÔ0Ð3EÀaÔ3HÑHˆÔà ˆŒØ"ˆŒˆˆr   c                 ó–   — |j         \  }}}|                     dd¦  «                             || j        |d         |d         ¦  «        }|S )Nr*   r+   r   )r/   rd   r0   rÚ   )r   r!   r�   r4   ÚHWr7   s         r   r"   zPatchUnEmbed.forwardØ  sE   € Ø”7‰ˆˆ2ˆqØ�KŠK˜˜1ÑÔ×"Ò" 1 d¤n°f¸Q´iÀÈÄÑKÔKˆØˆr   c                 ó
   — d}|S rË   © )r   rw   s     r   rw   zPatchUnEmbed.flopsÝ  s   € ØˆØˆr   rò   ró   r(   s   @r   râ   râ   »  sl   ø€ € € € € ðð ð PTð#ð #ð #ð #ð #ð #ð$ð ð ð
ð ð ð ð ð ð r   râ   c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚUpsamplez¡Upsample module.

    Args:
        scale (int): Scale factor. Supported scales: 2^n and 3.
        num_feat (int): Channel number of intermediate features.
    c           
      ó>  •— g }||dz
  z  dk    rˆt          t          t          j        |d¦  «        ¦  «        ¦  «        D ]W}|                     t          j        |d|z  ddd¦  «        ¦  «         |                     t          j        d¦  «        ¦  «         ŒXno|dk    rV|                     t          j        |d|z  ddd¦  «        ¦  «         |                     t          j        d¦  «        ¦  «         nt          d|› d�¦  «        ‚ t          ¦   «         j
        |Ž  d S )	Nr*   r   r+   r,   r   rç   zscale z/ is not supported. Supported scales: 2^n and 3.)rÃ   r;   ÚmathÚlogÚappendr   rÜ   ÚPixelShuffleÚ
ValueErrorr   r   )r   rH   Únum_featÚmÚ_r   s        €r   r   zUpsample.__init__ê  s!  ø€ ØˆØ�U˜Q‘YÑ AÒ%Ð%Ý�3�tœx¨¨qÑ1Ô1Ñ2Ô2Ñ3Ô3ð -ð -�Ø—’�œ 8¨Q°©\¸1¸aÀÑCÔCÑDÔDÐDØ—’�œ¨Ñ+Ô+Ñ,Ô,Ð,Ð,ð-ð �aŠZˆZØ�HŠH•R”Y˜x¨¨X©°q¸!¸QÑ?Ô?Ñ@Ô@Ð@Ø�HŠH•R”_ QÑ'Ô'Ñ(Ô(Ð(Ð(åØR˜ÐRÐRÐRñô ð ð 	�‰ŒÔ˜!ÐÐÐÐr   )r#   r$   r%   rx   r   r'   r(   s   @r   rû   rû   â  sB   ø€ € € € € ðð ðð ð ð ð ð ð ð ð r   rû   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚUpsampleOneStepa*  UpsampleOneStep module (the difference with Upsample is that it always only has 1conv + 1pixelshuffle)
       Used in lightweight SR to save parameters.

    Args:
        scale (int): Scale factor. Supported scales: 2^n and 3.
        num_feat (int): Channel number of intermediate features.

    Nc           	      ó  •— || _         || _        g }|                     t          j        ||dz  |z  ddd¦  «        ¦  «         |                     t          j        |¦  «        ¦  «          t          ¦   «         j        |Ž  d S )Nr+   r   r*   )r  r€   rÿ   r   rÜ   r   r   r   )r   rH   r  Ú
num_out_chr€   r  r   s         €r   r   zUpsampleOneStep.__init__  sz   ø€ Ø ˆŒØ 0ˆÔØˆØ	�Š•”˜8 e¨Q¡h°*Ñ%<¸aÀÀAÑFÔFÑGÔGÐGØ	�Š•” Ñ'Ô'Ñ(Ô(Ð(Ø�‰ŒÔ˜!ÐÐÐÐr   c                 ó@   — | j         \  }}||z  | j        z  dz  dz  }|S )Nr   rç   )r€   r  rµ   s       r   rw   zUpsampleOneStep.flops  s-   € ØÔ$‰ˆˆ1Ø�A‘˜œÑ%¨Ñ)¨AÑ-ˆØˆr   r   )r#   r$   r%   rx   r   rw   r'   r(   s   @r   r  r  ú  sV   ø€ € € € € ðð ðð ð ð ð ð ðð ð ð ð ð ð r   r  c                   óÚ   ‡ — e Zd ZdZi Zddddg d¢g d¢ddd	d
dddej        dd	dddddddœˆ fd„
Zd„ Ze	j
        j        d„ ¦   «         Ze	j
        j        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚSwinIRa×  SwinIR
        A PyTorch impl of : `SwinIR: Image Restoration Using Swin Transformer`, based on Swin Transformer.

    Args:
        img_size (int | tuple(int)): Input image size. Default 64
        patch_size (int | tuple(int)): Patch size. Default: 1
        in_chans (int): Number of input image channels. Default: 3
        embed_dim (int): Patch embedding dimension. Default: 96
        depths (tuple(int)): Depth of each Swin Transformer layer.
        num_heads (tuple(int)): Number of attention heads in different layers.
        window_size (int): Window size. Default: 7
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4
        qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True
        qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. Default: None
        drop_rate (float): Dropout rate. Default: 0
        attn_drop_rate (float): Attention dropout rate. Default: 0
        drop_path_rate (float): Stochastic depth rate. Default: 0.1
        norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
        ape (bool): If True, add absolute position embedding to the patch embedding. Default: False
        patch_norm (bool): If True, add normalization after patch embedding. Default: True
        use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False
        upscale: Upscale factor. 2/3/4/8 for image SR, 1 for denoising and compress artifact reduction
        img_range: Image range. 1. or 255.
        upsampler: The reconstruction reconstruction module. 'pixelshuffle'/'pixelshuffledirect'/'nearest+conv'/None
        resi_connection: The convolutional block before residual connection. '1conv'/'3conv'
    é@   r*   r   rê   )é   r  r  r  r|   r}   TNr   gš™™™™™¹?Fç      ð?Ú rÏ   )r×   rØ   rÙ   rÚ   ÚdepthsrG   r3   r‚   rY   rZ   Ú	drop_rateÚattn_drop_rateÚdrop_path_raterŠ   ÚapeÚ
patch_normrÁ   ÚupscaleÚ	img_rangeÚ	upsamplerrä   Ústart_unshufflec                óv  •— t          ¦   «                              ¦   «          || _        || j        dz  z  }|}d}|| _        |dk    r2d}t	          j        |¦  «                             dddd¦  «        | _        nt	          j        dddd¦  «        | _        || _	        || _
        || _        t          j        ||ddd¦  «        | _        t          |¦  «        | _        || _        || _        || _        || _        || _        t-          ||||| j        r|nd ¬¦  «        | _        | j        j        }| j        j        }|| _        t5          ||||| j        r|nd ¬¦  «        | _        | j        rCt          j        t	          j        d||¦  «        ¦  «        | _        t=          | j        d¬¦  «         t          j        |¬	¦  «        | _         d
„ t	          j!        d|tE          |¦  «        ¦  «        D ¦   «         }t          j#        ¦   «         | _$        tK          | j        ¦  «        D ]­}tM          d(i d|“d|d         |d         f“d||         “d||         “d|“d| j        “d|	“d|
“d|“d|“d|tE          |d |…         ¦  «        tE          |d |dz   …         ¦  «        …         “d|“dd “d|“d|“d|“d|“Ž}| j$         '                    |¦  «         Œ® || j        ¦  «        | _(        |dk    rt          j        ||ddd¦  «        | _)        n™|dk    r“t          j*        t          j        ||dz  ddd¦  «        t          j+        d d!¬"¦  «        t          j        |dz  |dz  ddd¦  «        t          j+        d d!¬"¦  «        t          j        |dz  |ddd¦  «        ¦  «        | _)        | j
        d#k    rwt          j*        t          j        ||ddd¦  «        t          j+        d!¬$¦  «        ¦  «        | _,        t[          ||¦  «        | _.        t          j        ||ddd¦  «        | _/        �n| j
        d%k    r'ta          ||||d         |d         f¦  «        | _.        �nM| j
        d&k    �r$t          j*        t          j        ||ddd¦  «        t          j+        d!¬$¦  «        ¦  «        | _,        t          j        ||ddd¦  «        | _1        | j	        dk    rt          j        ||ddd¦  «        | _2        nE| j	        d'k    r:t          j        ||ddd¦  «        | _2        t          j        ||ddd¦  «        | _3        t          j        ||ddd¦  «        | _4        t          j        ||ddd¦  «        | _/        t          j+        d d!¬"¦  «        | _5        nt          j        ||ddd¦  «        | _/        |  6                    | j7        ¦  «         d S ))Nr+   r  r   )gšwœ¢#¹Ü?gï8EGrùÛ?gB`åÐ"ÛÙ?r*   rÖ   rC   rD   )Úpc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rù   )Úitem)r½   r!   s     r   r¿   z#SwinIR.__init__.<locals>.<listcomp>†  s-   € ð 
ð 
ð 
ØˆA�FŠF‰HŒHð
ð 
ð 
r   r   rF   r€   rÀ   rG   r3   r‚   rY   rZ   r   rT   r†   rŠ   rÅ   rÁ   r×   rØ   rä   rÏ   rÑ   r,   rÒ   TrÓ   Úpixelshuffle)rÕ   Úpixelshuffledirectúnearest+convé   rù   )8r   r   r  r  rJ   ÚTensorr0   ÚmeanrK   r  r  r3   r   rÜ   Ú
conv_firstÚlenÚ
num_layersrÚ   r  r  Únum_featuresr‚   rà   rá   rî   rí   râ   rã   rI   Úabsolute_pos_embedr   r   Úpos_dropÚlinspacerQ   rÂ   ÚlayersrÃ   rÍ   rÿ   rª   Úconv_after_bodyrÞ   rß   Úconv_before_upsamplerû   ÚupsampleÚ	conv_lastr  Úconv_up1Úconv_up2Úconv_up3Úconv_hrÚlreluÚapplyÚ_init_weights)!r   r×   rØ   rÙ   rÚ   r  rG   r3   r‚   rY   rZ   r  r  r  rŠ   r  r  rÁ   r  r  r  rä   r  Ú	num_in_chr  r  Úrgb_meanrî   rí   ÚdprÚi_layerÚlayerr   s!                                   €r   r   zSwinIR.__init__1  sP  ø€ õ4 	‰Œ×ÒÑÔÐØ.ˆÔØ˜tÔ3°QÑ6Ñ6ˆ	Øˆ
ØˆØ"ˆŒØ�qŠ=ˆ=Ø/ˆHÝœ XÑ.Ô.×3Ò3°A°q¸!¸QÑ?Ô?ˆDŒIˆIåœ A q¨!¨QÑ/Ô/ˆDŒIØˆŒØ"ˆŒØ&ˆÔõ œ) I¨y¸!¸QÀÑBÔBˆŒõ ˜f™+œ+ˆŒØ"ˆŒØˆŒØ$ˆŒØ%ˆÔØ"ˆŒõ &ØØ!ØØØ%)¤_Ð>�z�z¸$ð
ñ 
ô 
ˆÔð Ô&Ô2ˆØ!Ô-Ô@ÐØ"4ˆÔõ *ØØ!ØØØ%)¤_Ð>�z�z¸$ð
ñ 
ô 
ˆÔð Œ8ð 	=Ý&(¤lÝ”˜A˜{¨IÑ6Ô6ñ'ô 'ˆDÔ#õ ˜$Ô1°tÐ<Ñ<Ô<Ð<åœ
 YÐ/Ñ/Ô/ˆŒð
ð 
Ý#œn¨Q°ÅÀFÁÄÑLÔLð
ñ 
ô 
ˆõ
 ”m‘o”oˆŒÝ˜Tœ_Ñ-Ô-ð 	&ð 	&ˆGÝð ð ð Ø�Iðà"4°QÔ"7Ð9KÈAÔ9NÐ!OÐ!Oðð ˜W”o�oðð $ GÔ,Ð,ð	ð
 (˜Kðð œ.˜.ðð "˜ðð "˜ðð �Yðð )˜.ðð Ý˜˜x ˜xÔ(Ñ)Ô)­CØ˜} ¨1¡˜}Ô-ñ-ô -ð ôð ðð  &˜:ð!ð"  ˜4ð#ð$  .˜~ð%ð& "˜ð'ð( &˜:ð)ð* !0 ð+ˆEð. ŒK×Ò˜uÑ%Ô%Ð%Ð%Ø�J˜tÔ0Ñ1Ô1ˆŒ	ð ˜gÒ%Ð%Ý#%¤9¨Y¸	À1ÀaÈÑ#KÔ#KˆDÔ Ð Ø Ò'Ð'å#%¤=Ý”	˜) Y°!¡^°Q¸¸1Ñ=Ô=Ý”¨C¸Ð>Ñ>Ô>Ý”	˜) q™.¨)°q©.¸!¸QÀÑBÔBÝ”¨C¸Ð>Ñ>Ô>Ý”	˜) q™.¨)°Q¸¸1Ñ=Ô=ñ$ô $ˆDÔ ð Œ>˜^Ò+Ð+å(*¬Ý”	˜) X¨q°!°QÑ7Ô7½¼ÈdÐ9SÑ9SÔ9Sñ)ô )ˆDÔ%õ % W¨hÑ7Ô7ˆDŒMÝœY x°¸QÀÀ1ÑEÔEˆDŒN‰NØŒ^Ð3Ò3Ð3å+ØØØØ# AÔ&Ð(:¸1Ô(=Ð>ñ	ô ˆDŒM‰Mð Œ^˜~Ò-Ñ-å(*¬Ý”	˜) X¨q°!°QÑ7Ô7½¼ÈdÐ9SÑ9SÔ9Sñ)ô )ˆDÔ%õ œI h°¸!¸QÀÑBÔBˆDŒMØŒ|˜qÒ Ð Ý "¤	¨(°H¸aÀÀAÑ FÔ F�”�Ø” Ò"Ð"Ý "¤	¨(°H¸aÀÀAÑ FÔ F�”Ý "¤	¨(°H¸aÀÀAÑ FÔ F�”Ýœ9 X¨x¸¸A¸qÑAÔAˆDŒLÝœY x°¸QÀÀ1ÑEÔEˆDŒNÝœ°SÀ$ÐGÑGÔGˆDŒJˆJõ  œY y°*¸aÀÀAÑFÔFˆDŒNà�
Š
�4Ô%Ñ&Ô&Ð&Ð&Ð&r   c                 óÊ  — t          |t          j        ¦  «        rbt          |j        d¬¦  «         t          |t          j        ¦  «        r.|j        �)t          j                             |j        d¦  «         d S d S d S t          |t          j        ¦  «        rLt          j                             |j        d¦  «         t          j                             |j        d¦  «         d S d S )NrC   rD   r   r  )	r»   r   r   r   ÚweightrB   ÚinitÚ	constant_r¥   )r   r  s     r   r6  zSwinIR._init_weightsÙ  sÎ   € Ý�a�œÑ#Ô#ð 	-Ý˜!œ(¨Ð-Ñ-Ô-Ð-Ý˜!�RœYÑ'Ô'ð -¨A¬FÐ,>Ý”×!Ò! !¤&¨!Ñ,Ô,Ð,Ð,Ð,ð-ð -Ð,>Ð,>å˜�2œ<Ñ(Ô(ð 	-ÝŒG×Ò˜aœf aÑ(Ô(Ð(ÝŒG×Ò˜aœh¨Ñ,Ô,Ð,Ð,Ð,ð	-ð 	-r   c                 ó   — dhS )Nr(  rù   rt   s    r   Úno_weight_decayzSwinIR.no_weight_decayâ  s   € à$Ð%Ð%r   c                 ó   — dhS )NrL   rù   rt   s    r   Úno_weight_decay_keywordszSwinIR.no_weight_decay_keywordsæ  s   € à.Ð/Ð/r   c                 ó0   — t          || j        d¬¦  «        S )NÚreflect)Úmode)r   r3   r    s     r   Úcheck_image_sizezSwinIR.check_image_sizeê  s   € Ý˜q $Ô"2¸ÐCÑCÔCÐCr   c                 ó2  — |j         d         |j         d         f}|                      |¦  «        }| j        r
|| j        z   }|                      |¦  «        }| j        D ]} |||¦  «        }Œ|                      |¦  «        }|                      ||¦  «        }|S )Nr+   r   )r/   rá   r  r(  r)  r+  rª   rã   )r   r!   r�   r;  s       r   Úforward_featureszSwinIR.forward_featuresí  s    € Ø”'˜!”*˜aœg aœjÐ)ˆØ×Ò˜QÑÔˆØŒ8ð 	,Ø�DÔ+Ñ+ˆAØ�MŠM˜!ÑÔˆà”[ð 	!ð 	!ˆEØ��a˜Ñ Ô ˆAˆAà�IŠI�a‰LŒLˆØ×Ò˜q &Ñ)Ô)ˆàˆr   c           	      óà  — |j         dd …         \  }}|                      |¦  «        }| j                             |¦  «        | _        || j        z
  | j        z  }| j        dk    r*t          j        j         	                    || j        ¦  «        }| j
        dk    r|                      |¦  «        }|                      |                      |¦  «        ¦  «        |z   }|                      |¦  «        }|                      |                      |¦  «        ¦  «        }�n¢| j
        dk    rW|                      |¦  «        }|                      |                      |¦  «        ¦  «        |z   }|                      |¦  «        }�n@| j
        dk    �rÜ|                      |¦  «        }|                      |                      |¦  «        ¦  «        |z   }|                      |¦  «        }|                      |                      t          j        j                             |dd¬¦  «        ¦  «        ¦  «        }| j        dk    rN|                      |                      t          j        j                             |dd¬¦  «        ¦  «        ¦  «        }n¥| j        d	k    rš|                      |                      t          j        j                             |dd¬¦  «        ¦  «        ¦  «        }|                      |                      t          j        j                             |dd¬¦  «        ¦  «        ¦  «        }|                      |                      |                      |¦  «        ¦  «        ¦  «        }nX|                      |¦  «        }|                      |                      |¦  «        ¦  «        |z   }||                      |¦  «        z   }|| j        z  | j        z   }|d d …d d …d || j        z  …d || j        z  …f         S )
Nr+   r*   r  r  r   Únearest)Úscale_factorrF  r,   r!  )r/   rG  r#  Útype_asr  r  rJ   r   Ú
functionalÚpixel_unshuffler  r$  r,  rI  r-  r/  r.  r4  r0  Úinterpolater  r1  r2  r3  )r   r!   r5   r6   Úx_firstÚress         r   r"   zSwinIR.forwardü  sŸ  € ØŒw�q�r�rŒ{‰ˆˆ1Ø×!Ò! !Ñ$Ô$ˆà”I×%Ò% aÑ(Ô(ˆŒ	Ø�”‰]˜dœnÑ,ˆàÔ !Ò#Ð#Ý”Ô#×3Ò3°A°tÔ7KÑLÔLˆAàŒ>˜^Ò+Ð+à—’ Ñ"Ô"ˆAØ×$Ò$ T×%:Ò%:¸1Ñ%=Ô%=Ñ>Ô>ÀÑBˆAØ×)Ò)¨!Ñ,Ô,ˆAØ—’˜tŸ}š}¨QÑ/Ô/Ñ0Ô0ˆA‰AØŒ^Ð3Ò3Ð3à—’ Ñ"Ô"ˆAØ×$Ò$ T×%:Ò%:¸1Ñ%=Ô%=Ñ>Ô>ÀÑBˆAØ—’˜aÑ Ô ˆA‰AØŒ^˜~Ò-Ñ-à—’ Ñ"Ô"ˆAØ×$Ò$ T×%:Ò%:¸1Ñ%=Ô%=Ñ>Ô>ÀÑBˆAØ×)Ò)¨!Ñ,Ô,ˆAØ—
’
Ø—’Ý”HÔ'×3Ò3°AÀAÈIÐ3ÑVÔVñô ñô ˆAð
 Œ|˜qÒ Ð Ø—J’JØ—M’MÝœÔ+×7Ò7Ø¨A°Ið 8ñ ô ñô ñô ��ð ” Ò"Ð"Ø—J’JØ—M’MÝœÔ+×7Ò7Ø¨A°Ið 8ñ ô ñô ñô �ð —J’JØ—M’MÝœÔ+×7Ò7Ø¨A°Ið 8ñ ô ñô ñô �ð —’˜tŸzšz¨$¯,ª,°q©/¬/Ñ:Ô:Ñ;Ô;ˆAˆAð —o’o aÑ(Ô(ˆGØ×&Ò& t×'<Ò'<¸WÑ'EÔ'EÑFÔFÈÑPˆCØ�D—N’N 3Ñ'Ô'Ñ'ˆAà�”Ñ ¤Ñ*ˆà����A�A�AÐ)˜˜Tœ\Ñ)Ð)Ð+=¨Q°´Ñ-=Ð+=Ð=Ô>Ð>r   c                 óR  — d}| j         \  }}|||z  dz  | j        z  dz  z  }|| j                             ¦   «         z  }t	          | j        ¦  «        D ]\  }}||                     ¦   «         z  }Œ|||z  dz  | j        z  | j        z  z  }|| j                             ¦   «         z  }|S )Nr   r   rç   )rí   rÚ   rá   rw   Ú	enumerater+  r.  )r   rw   r5   r6   r¾   r;  s         r   rw   zSwinIR.flops=  s¸   € ØˆØÔ&‰ˆˆ1Ø��Q‘˜‘˜Tœ^Ñ+¨aÑ/Ñ/ˆØ�Ô!×'Ò'Ñ)Ô)Ñ)ˆÝ! $¤+Ñ.Ô.ð 	#ð 	#‰HˆAˆuØ�U—[’[‘]”]Ñ"ˆEˆEØ��Q‘˜‘˜Tœ^Ñ+¨d¬nÑ<Ñ<ˆØ�”×$Ò$Ñ&Ô&Ñ&ˆØˆr   )r#   r$   r%   rx   Úhyperparametersr   r¥   r   r6  rJ   ÚjitÚignorerA  rC  rG  rI  r"   rw   r'   r(   s   @r   r  r    s:  ø€ € € € € ðð ð6 €Oð
 ØØØØˆ|ˆ|Ø�,�,ØØØØØØØØ”<ØØØØØØØØð1f'ð f'ð f'ð f'ð f'ð f'ð f'ðP-ð -ð -ð „YÔð&ð &ñ Ôð&ð „YÔð0ð 0ñ Ôð0ðDð Dð Dðð ð ð??ð ??ð ??ðB	ð 	ð 	ð 	ð 	ð 	ð 	r   r  )rý   rJ   Útorch.nnr   Útorch.utils.checkpointÚutilsrÇ   Úspandrel.utilr   Úspandrel.util.timmr   r   r   Ú__arch_helpers.paddingr   ÚModuler
   r9   r<   r>   r{   r§   r¸   rÍ   rà   râ   rÞ   rû   r  r  rù   r   r   ú<module>r_     sÛ  ðð €€€à €€€Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à /Ð /Ð /Ð /Ð /Ð /Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ˆ"Œ)ñ ô ð ð4ð ð ð"ð ð ð&~ð ~ð ~ð ~ð ~�b”iñ ~ô ~ð ~ðBuð uð uð uð u˜2œ9ñ uô uð uðp.ð .ð .ð .ð .�2”9ñ .ô .ð .ðb]ð ]ð ]ð ]ð ]�”ñ ]ô ]ð ]ð@mð mð mð mð mˆ2Œ9ñ mô mð mð`-ð -ð -ð -ð -�”ñ -ô -ð -ð`$ð $ð $ð $ð $�2”9ñ $ô $ð $ðNð ð ð ð ˆrŒ}ñ ô ð ð0ð ð ð ð �b”mñ ô ð ð0 ÐÑÔðsð sð sð sð sˆRŒYñ sô sñ Ôðsð sð sr   