§
    �ÅjÎ:  ã                   ój  — d dl Z d dlmc mZ d dlmZ d dlmZm	Z	 d dl m
Z
mZ ddlmZ d„ Zd„ Zd)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ddddœ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dS )*é    N©Ú	rearrange)Ú	RearrangeÚReduce)ÚeinsumÚnné   )ÚLayerNorm2dc                 ó
   — | d uS ©N© )Úvals    úYC:\Projects\Historical\venv\Lib\site-packages\spandrel/architectures/OmniSR/__arch/OSA.pyÚexistsr      s   € Ø�dˆ?Ðó    c                 ó(   — t          | ¦  «        r| n|S r   )r   )r   Úds     r   Údefaultr      s   € Ý˜‘+”+Ð$ˆ3ˆ3 1Ð$r   c                 ó<   — t          | t          ¦  «        r| n| f|z  S r   )Ú
isinstanceÚtuple)r   Úlengths     r   Ú
cast_tupler       s!   € Ý˜S¥%Ñ(Ô(Ð?ˆ3ˆ3°¨v¸©Ð?r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚPreNormResidualc                 óˆ   •— t          ¦   «                              ¦   «          t          j        |¦  «        | _        || _        d S r   )ÚsuperÚ__init__r   Ú	LayerNormÚnormÚfn©ÚselfÚdimr!   Ú	__class__s      €r   r   zPreNormResidual.__init__(   s5   ø€ Ý‰Œ×ÒÑÔÐÝ”L Ñ%Ô%ˆŒ	ØˆŒˆˆr   c                 óX   — |                       |                      |¦  «        ¦  «        |z   S r   ©r!   r    ©r#   Úxs     r   ÚforwardzPreNormResidual.forward-   ó#   € Ø�wŠw�t—y’y ‘|”|Ñ$Ô$ qÑ(Ð(r   ©Ú__name__Ú
__module__Ú__qualname__r   r*   Ú__classcell__©r%   s   @r   r   r   '   óG   ø€ € € € € ðð ð ð ð ð
)ð )ð )ð )ð )ð )ð )r   r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚConv_PreNormResidualc                 ó~   •— t          ¦   «                              ¦   «          t          |¦  «        | _        || _        d S r   )r   r   r
   r    r!   r"   s      €r   r   zConv_PreNormResidual.__init__2   s3   ø€ Ý‰Œ×ÒÑÔÐÝ Ñ$Ô$ˆŒ	ØˆŒˆˆr   c                 óX   — |                       |                      |¦  «        ¦  «        |z   S r   r'   r(   s     r   r*   zConv_PreNormResidual.forward7   r+   r   r,   r1   s   @r   r4   r4   1   r2   r   r4   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚFeedForwardé   ç        c           	      ó\  •— t          ¦   «                              ¦   «          t          ||z  ¦  «        }t          j        t          j        ||¦  «        t          j        ¦   «         t          j        |¦  «        t          j        ||¦  «        t          j        |¦  «        ¦  «        | _        d S r   )	r   r   Úintr   Ú
SequentialÚLinearÚGELUÚDropoutÚnet©r#   r$   ÚmultÚdropoutÚ	inner_dimr%   s        €r   r   zFeedForward.__init__<   s€   ø€ Ý‰Œ×ÒÑÔÐÝ˜˜d™
‘O”Oˆ	Ý”=ÝŒI�c˜9Ñ%Ô%ÝŒG‰IŒIÝŒJ�wÑÔÝŒI�i Ñ%Ô%ÝŒJ�wÑÔñ
ô 
ˆŒˆˆr   c                 ó,   — |                       |¦  «        S r   ©rA   r(   s     r   r*   zFeedForward.forwardG   ó   € Ø�xŠx˜‰{Œ{Ðr   ©r9   r:   r,   r1   s   @r   r8   r8   ;   óL   ø€ € € € € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ðð ð ð ð ð ð r   r8   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚConv_FeedForwardr9   r:   c                 óh  •— t          ¦   «                              ¦   «          t          ||z  ¦  «        }t          j        t          j        ||ddd¦  «        t          j        ¦   «         t          j        |¦  «        t          j        ||ddd¦  «        t          j        |¦  «        ¦  «        | _        d S )Nr	   r   )	r   r   r<   r   r=   ÚConv2dr?   r@   rA   rB   s        €r   r   zConv_FeedForward.__init__L   sŒ   ø€ Ý‰Œ×ÒÑÔÐÝ˜˜d™
‘O”Oˆ	Ý”=ÝŒI�c˜9 a¨¨AÑ.Ô.ÝŒG‰IŒIÝŒJ�wÑÔÝŒI�i  a¨¨AÑ.Ô.ÝŒJ�wÑÔñ
ô 
ˆŒˆˆr   c                 ó,   — |                       |¦  «        S r   rG   r(   s     r   r*   zConv_FeedForward.forwardW   rH   r   rI   r,   r1   s   @r   rL   rL   K   rJ   r   rL   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚGated_Conv_FeedForwardr	   Fr:   c           	      ó8  •— t          ¦   «                              ¦   «          t          ||z  ¦  «        }t          j        ||dz  d|¬¦  «        | _        t          j        |dz  |dz  ddd|dz  |¬¦  «        | _        t          j        ||d|¬¦  «        | _        d S )Nr9   r	   ©Úkernel_sizeÚbiasé   ©rT   ÚstrideÚpaddingÚgroupsrU   )r   r   r<   r   rN   Ú
project_inÚdwconvÚproject_out)r#   r$   rC   rU   rD   Úhidden_featuresr%   s         €r   r   zGated_Conv_FeedForward.__init__\   s§   ø€ Ý‰Œ×ÒÑÔÐå˜c D™j™/œ/ˆåœ) C¨¸1Ñ)<È!ÐRVÐWÑWÔWˆŒå”iØ˜aÑØ˜aÑØØØØ" QÑ&Øð
ñ 
ô 
ˆŒõ œ9 _°cÀqÈtÐTÑTÔTˆÔÐÐr   c                 óâ   — |                       |¦  «        }|                      |¦  «                             dd¬¦  «        \  }}t          j        |¦  «        |z  }|                      |¦  «        }|S )Nr9   r	   ©r$   )r[   r\   ÚchunkÚFÚgelur]   )r#   r)   Úx1Úx2s       r   r*   zGated_Conv_FeedForward.forwardo   sb   € Ø�OŠO˜AÑÔˆØ—’˜Q‘”×%Ò% a¨QÐ%Ñ/Ô/‰ˆˆBÝŒF�2‰JŒJ˜‰OˆØ×Ò˜QÑÔˆØˆr   )r	   Fr:   r,   r1   s   @r   rQ   rQ   [   sR   ø€ € € € € ðUð Uð Uð Uð Uð Uð&ð ð ð ð ð ð r   rQ   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚSqueezeExcitationç      Ð?c           
      óv  •— t          ¦   «                              ¦   «          t          ||z  ¦  «        }t          j        t          dd¦  «        t          j        ||d¬¦  «        t          j        ¦   «         t          j        ||d¬¦  «        t          j        ¦   «         t          d¦  «        ¦  «        | _
        d S )Nzb c h w -> b cÚmeanF©rU   zb c -> b c 1 1)r   r   r<   r   r=   r   r>   ÚSiLUÚSigmoidr   Úgate)r#   r$   Úshrinkage_rateÚ
hidden_dimr%   s       €r   r   zSqueezeExcitation.__init__{   s–   ø€ Ý‰Œ×ÒÑÔÐÝ˜˜~Ñ-Ñ.Ô.ˆ
å”MÝÐ# VÑ,Ô,ÝŒI�c˜:¨EÐ2Ñ2Ô2ÝŒG‰IŒIÝŒI�j #¨EÐ2Ñ2Ô2ÝŒJ‰LŒLÝÐ&Ñ'Ô'ñ
ô 
ˆŒ	ˆ	ˆ	r   c                 ó2   — ||                       |¦  «        z  S r   )rn   r(   s     r   r*   zSqueezeExcitation.forwardˆ   s   € Ø�4—9’9˜Q‘<”<ÑÐr   )rh   r,   r1   s   @r   rg   rg   z   sL   ø€ € € € € ð
ð 
ð 
ð 
ð 
ð 
ð ð  ð  ð  ð  ð  ð  r   rg   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚMBConvResidualr:   c                 ó~   •— t          ¦   «                              ¦   «          || _        t          |¦  «        | _        d S r   )r   r   r!   Ú
DropsampleÚ
dropsample)r#   r!   rD   r%   s      €r   r   zMBConvResidual.__init__�   s3   ø€ Ý‰Œ×ÒÑÔÐØˆŒÝ$ WÑ-Ô-ˆŒˆˆr   c                 ó`   — |                       |¦  «        }|                      |¦  «        }||z   S r   )r!   rv   ©r#   r)   Úouts      r   r*   zMBConvResidual.forward’   s+   € Ø�gŠg�a‰jŒjˆØ�oŠo˜cÑ"Ô"ˆØ�Q‰wˆr   )r:   r,   r1   s   @r   rs   rs   Œ   sL   ø€ € € € € ð.ð .ð .ð .ð .ð .ð
ð ð ð ð ð ð r   rs   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ru   r   c                 óV   •— t          ¦   «                              ¦   «          || _        d S r   )r   r   Úprob)r#   r|   r%   s     €r   r   zDropsample.__init__™   s$   ø€ Ý‰Œ×ÒÑÔÐØˆŒ	ˆ	ˆ	r   c                 óØ   — |j         }| j        dk    s| j        s|S t          j        |j        d         dddf|¬¦  «                             ¦   «         | j        k    }||z  d| j        z
  z  S )Nr:   r   r	   )Údevice)r~   r|   ÚtrainingÚtorchÚFloatTensorÚshapeÚuniform_)r#   r)   r~   Ú	keep_masks       r   r*   zDropsample.forward�   sx   € Ø”ˆàŒ9˜ÒÐ D¤MÐØˆHõ Ô˜qœw qœz¨1¨a°Ð3¸FÐCÑCÔC×LÒLÑNÔNØŒiòð 	ð �9‰}  D¤I¡Ñ.Ð.r   )r   r,   r1   s   @r   ru   ru   ˜   sL   ø€ € € € € ðð ð ð ð ð ð
/ð 
/ð 
/ð 
/ð 
/ð 
/ð 
/r   ru   é   rh   r:   )Úexpansion_ratero   rD   c                ó|  — t          ||z  ¦  «        }|rdnd}t          j        t          j        | |d¦  «        t          j        ¦   «         t          j        ||d|d|¬¦  «        t          j        ¦   «         t          ||¬¦  «        t          j        ||d¦  «        ¦  «        }| |k    r|st          ||¬¦  «        }|S )Nr9   r	   rV   )rX   rY   rZ   )ro   )rD   )r<   r   r=   rN   r?   rg   rs   )	Údim_inÚdim_outÚ
downsampler†   ro   rD   rp   rX   rA   s	            r   ÚMBConvr‹   ª   sÅ   € õ �^ gÑ-Ñ.Ô.€JØÐ#ˆQˆQ !€Få
Œ-Ý
Œ	�&˜* aÑ(Ô(å
Œ‰	Œ	Ý
Œ	Ø˜
 A¨f¸aÈ
ð	
ñ 	
ô 	
õ 	Œ‰	Œ	Ý˜*°^ÐDÑDÔDÝ
Œ	�*˜g qÑ)Ô)ñô €Cð �ÒÐ ÐÝ˜S¨'Ð2Ñ2Ô2ˆà€Jr   c                   ó.   ‡ — e Zd Z	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )Ú	Attentioné    r:   é   Tc                 óÂ  •— t          ¦   «                              ¦   «          ||z  dk    s
J d¦   «         ‚||z  | _        |dz  | _        || _        t          j        ||dz  d¬¦  «        | _        t          j        t          j	        d¬¦  «        t          j
        |¦  «        ¦  «        | _        t          j        t          j        ||d¬¦  «        t          j
        |¦  «        ¦  «        | _        | j        rét          j        d	|z  d
z
  d	z  | j        ¦  «        | _        t          j        |¦  «        }t          j        t          j        ||¦  «        ¦  «        }t'          |d¦  «        }t'          |d¦  «        t'          |d¦  «        z
  }||d
z
  z  }|t          j        d	|z  d
z
  d
g¦  «        z                       d¬¦  «        }	|                      d|	d¬¦  «         d S d S )Nr   ú3dimension should be divisible by dimension per headç      à¿rV   Frk   éÿÿÿÿr`   r9   r	   zc i j -> (i j) czi ... -> i 1 ...zj ... -> 1 j ...Úrel_pos_indices)Ú
persistent)r   r   ÚheadsÚscaleÚwith_per   r>   Úto_qkvr=   ÚSoftmaxr@   ÚattendÚto_outÚ	EmbeddingÚrel_pos_biasr€   ÚarangeÚstackÚmeshgridr   ÚtensorÚsumÚregister_buffer)r#   r$   Údim_headrD   Úwindow_sizer˜   ÚposÚgridÚrel_posr”   r%   s             €r   r   zAttention.__init__Æ   sì  ø€ õ 	‰Œ×ÒÑÔÐà�(‰NØòð ð àEñô ð ð ˜H‘_ˆŒ
Ø˜t‘^ˆŒ
ØˆŒå”i  S¨1¡W°5Ð9Ñ9Ô9ˆŒå”m¥B¤J°2Ð$6Ñ$6Ô$6½¼
À7Ñ8KÔ8KÑLÔLˆŒå”mÝŒI�c˜3 UÐ+Ñ+Ô+­R¬Z¸Ñ-@Ô-@ñ
ô 
ˆŒð
 Œ<ð 	WÝ "¤¨a°+©oÀÑ.AÀaÑ-GÈÌÑ TÔ TˆDÔå”,˜{Ñ+Ô+ˆCÝ”;�uœ~¨c°3Ñ7Ô7Ñ8Ô8ˆDÝ˜TÐ#5Ñ6Ô6ˆDÝ Ð&8Ñ9Ô9½IØÐ(ñ=ô =ñ ˆGð �{ Q‘Ñ&ˆGØ&­¬°q¸;±ÈÑ7JÈAÐ6NÑ)OÔ)OÑO×TÒTØð Uñ ô ˆOð × Ò Ð!2°OÐPUÐ ÑVÔVÐVÐVÐVð	Wð 	Wr   c                 óL  ‡— g |j         ¢|j        ‘| j        ‘R \  }}}}}}}Št          |d¦  «        }|                      |¦  «                             dd¬¦  «        \  }	}
}ˆfd„|	|
|fD ¦   «         \  }	}
}|	| j        z  }	t          d|	|
¦  «        }| j        r-|  	                    | j
        ¦  «        }|t          |d¦  «        z   }|                      |¦  «        }t          d||¦  «        }t          |d	||¬
¦  «        }|                      |¦  «        }t          |d||¬¦  «        S )Nz"b x y w1 w2 d -> (b x y) (w1 w2) drV   r“   r`   c              3   ó<   •K  — | ]}t          |d ‰¬¦  «        V — ŒdS )zb n (h d ) -> b h n d)ÚhNr   )Ú.0Útr¬   s     €r   ú	<genexpr>z$Attention.forward.<locals>.<genexpr>  s3   øè è € ÐQÐQÀ!•9˜QÐ 7¸1Ð=Ñ=Ô=ÐQÐQÐQÐQÐQÐQr   úb h i d, b h j d -> b h i jzi j h -> h i júb h i j, b h j d -> b h i dzb h (w1 w2) d -> b w1 w2 (h d)©Úw1Úw2z(b x y) ... -> b x y ...)r)   Úy)r‚   r~   r–   r   r™   ra   r—   r   r˜   rž   r”   r›   rœ   )r#   r)   ÚbatchÚheightÚwidthÚwindow_heightÚwindow_widthÚ_r~   ÚqÚkÚvÚsimrU   Úattnry   r¬   s                   @r   r*   zAttention.forwardð   ss  ø€ ðK
ØŒWðK
àŒHðK
ð ŒJðK
ð K
ÑGˆˆv�u˜m¨\¸1¸fÀaõ �aÐ=Ñ>Ô>ˆð —+’+˜a‘.”.×&Ò& q¨bÐ&Ñ1Ô1‰ˆˆ1ˆað RÐQÐQÐQÈÈ1ÈaÀyÐQÑQÔQ‰ˆˆ1ˆað �”
‰Nˆõ Ð2°A°qÑ9Ô9ˆð Œ<ð 	:Ø×$Ò$ TÔ%9Ñ:Ô:ˆDØ�	 $Ð(8Ñ9Ô9Ñ9ˆCð �{Š{˜3ÑÔˆõ Ð2°D¸!Ñ<Ô<ˆõ ØÐ1°mÈð
ñ 
ô 
ˆð �kŠk˜#ÑÔˆÝ˜Ð8¸FÀeÐLÑLÔLÐLr   )rŽ   r:   r�   Tr,   r1   s   @r   r�   r�   Å   sh   ø€ € € € € ð ØØØð(Wð (Wð (Wð (Wð (Wð (WðT1Mð 1Mð 1Mð 1Mð 1Mð 1Mð 1Mr   r�   c                   ó0   ‡ — e Zd Z	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )	ÚBlock_AttentionrŽ   Fr:   r�   Tc           	      óü  •— t          ¦   «                              ¦   «          ||z  dk    s
J d¦   «         ‚||z  | _        || _        |dz  | _        || _        t          j        ||dz  d|¬¦  «        | _        t          j        |dz  |dz  ddd|dz  |¬¦  «        | _	        t          j
        t          j        d¬	¦  «        t          j        |¦  «        ¦  «        | _        t          j        ||d|¬¦  «        | _        d S )
Nr   r‘   r’   rV   r	   rS   rW   r“   r`   )r   r   r–   Úpsr—   r˜   r   rN   ÚqkvÚ
qkv_dwconvr=   rš   r@   r›   rœ   )r#   r$   r¥   rU   rD   r¦   r˜   r%   s          €r   r   zBlock_Attention.__init__%  s  ø€ õ 	‰Œ×ÒÑÔÐà�(‰NØòð ð àEñô ð ð ˜H‘_ˆŒ
ØˆŒØ˜t‘^ˆŒ
ØˆŒå”9˜S #¨¡'°q¸tÐDÑDÔDˆŒÝœ)Ø�!‰GØ�!‰GØØØØ˜‘7Øð
ñ 
ô 
ˆŒõ ”m¥B¤J°2Ð$6Ñ$6Ô$6½¼
À7Ñ8KÔ8KÑLÔLˆŒå”i  S°a¸dÐCÑCÔCˆŒˆˆr   c           	      óæ  ‡ — |j         \  }}}}‰                      ‰                      |¦  «        ¦  «        }|                     dd¬¦  «        \  }}}	ˆ fd„|||	fD ¦   «         \  }}}	|‰ j        z  }t          d||¦  «        }
‰                      |
¦  «        }t          d||	¦  «        }t          |d|‰ j        z  |‰ j        z  ‰ j	        ‰ j        ‰ j        ¬¦  «        }‰  
                    |¦  «        }|S )	NrV   r	   r`   c              3   ó^   •K  — | ]'}t          |d ‰j        ‰j        ‰j        ¬¦  «        V — Œ(dS )z,b (h d) (x w1) (y w2) -> (b x y) h (w1 w2) d)r¬   r³   r´   N)r   r–   rÄ   ©r­   r®   r#   s     €r   r¯   z*Block_Attention.forward.<locals>.<genexpr>P  s]   øè è € ð 	
ð 	
ð õ ØØ>Ø”*Ø”7Ø”7ðñ ô ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   r°   r±   z2(b x y) head (w1 w2) d -> b (head d) (x w1) (y w2))r)   rµ   Úheadr³   r´   )r‚   rÆ   rÅ   ra   r—   r   r›   r   rÄ   r–   rœ   )r#   r)   ÚbÚcr¬   ÚwrÅ   r¼   r½   r¾   r¿   rÀ   ry   s   `            r   r*   zBlock_Attention.forwardG  s  ø€ à”W‰
ˆˆ1ˆa�à�oŠo˜dŸhšh q™kœkÑ*Ô*ˆØ—)’)˜A 1�)Ñ%Ô%‰ˆˆ1ˆað	
ð 	
ð 	
ð 	
ð ˜˜A�Yð	
ñ 	
ô 	
‰ˆˆ1ˆað �”
‰Nˆõ Ð2°A°qÑ9Ô9ˆð �{Š{˜3ÑÔˆõ Ð2°D¸!Ñ<Ô<ˆõ ØØ@Ø�4”7‰lØ�4”7‰lØ”ØŒwØŒwð
ñ 
ô 
ˆð �kŠk˜#ÑÔˆØˆ
r   )rŽ   Fr:   r�   Tr,   r1   s   @r   rÂ   rÂ   $  sd   ø€ € € € € ð ØØØØð Dð  Dð  Dð  Dð  Dð  DðD/ð /ð /ð /ð /ð /ð /r   rÂ   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚChannel_AttentionFr:   r�   c           	      óŠ  •— t          ¦   «                              ¦   «          || _        t          j        t          j        |dd¦  «        ¦  «        | _        || _        t          j	        ||dz  d|¬¦  «        | _
        t          j	        |dz  |dz  ddd|dz  |¬¦  «        | _        t          j	        ||d|¬¦  «        | _        d S ©Nr	   rV   rS   rW   ©r   r   r–   r   Ú	Parameterr€   ÚonesÚtemperaturerÄ   rN   rÅ   rÆ   r]   ©r#   r$   r–   rU   rD   r¦   r%   s         €r   r   zChannel_Attention.__init__z  óÁ   ø€ Ý‰Œ×ÒÑÔÐØˆŒ
åœ<­¬
°5¸!¸QÑ(?Ô(?Ñ@Ô@ˆÔàˆŒå”9˜S #¨¡'°q¸tÐDÑDÔDˆŒÝœ)Ø�!‰GØ�!‰GØØØØ˜‘7Øð
ñ 
ô 
ˆŒõ œ9 S¨#¸1À4ÐHÑHÔHˆÔÐÐr   c           	      ó&  ‡ — |j         \  }}}}‰                      ‰                      |¦  «        ¦  «        }|                     dd¬¦  «        }ˆ fd„|D ¦   «         \  }}}	t	          j        |d¬¦  «        }t	          j        |d¬¦  «        }||                     dd¦  «        z  ‰ j        z  }
|
                     d¬¦  «        }
|
|	z  }t          |d|‰ j
        z  |‰ j
        z  ‰ j
        ‰ j
        ‰ j        ¬¦  «        }‰                      |¦  «        }|S )	NrV   r	   r`   c              3   ó^   •K  — | ]'}t          |d ‰j        ‰j        ‰j        ¬¦  «        V — Œ(dS )z2b (head d) (h ph) (w pw) -> b (h w) head d (ph pw)©ÚphÚpwrÊ   N©r   rÄ   r–   rÉ   s     €r   r¯   z,Channel_Attention.forward.<locals>.<genexpr>”  ó]   øè è € ð 	
ð 	
ð õ ØØDØ”7Ø”7Ø”Zðñ ô ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   r“   éþÿÿÿz2b (h w) head d (ph pw) -> b (head d) (h ph) (w pw)©r¬   rÍ   rÛ   rÜ   rÊ   ©r‚   rÆ   rÅ   ra   rb   Ú	normalizeÚ	transposerÕ   Úsoftmaxr   rÄ   r–   r]   ©r#   r)   rË   rÌ   r¬   rÍ   rÅ   r¼   r½   r¾   rÀ   ry   s   `           r   r*   zChannel_Attention.forwardŽ  ó-  ø€ Ø”W‰
ˆˆ1ˆa�à�oŠo˜dŸhšh q™kœkÑ*Ô*ˆØ�iŠi˜˜qˆiÑ!Ô!ˆð	
ð 	
ð 	
ð 	
ð ð	
ñ 	
ô 	
‰ˆˆ1ˆaõ ŒK˜˜rÐ"Ñ"Ô"ˆÝŒK˜˜rÐ"Ñ"Ô"ˆà�A—K’K  BÑ'Ô'Ñ'¨4Ô+;Ñ;ˆØ�|Š| ˆ|Ñ#Ô#ˆØ�Q‰hˆåØØ@Ø�4”7‰lØ�4”7‰lØŒwØŒwØ”ð
ñ 
ô 
ˆð ×Ò˜sÑ#Ô#ˆàˆ
r   ©Fr:   r�   r,   r1   s   @r   rÏ   rÏ   y  óR   ø€ € € € € ðIð Ið Ið Ið Ið Ið($ð $ð $ð $ð $ð $ð $r   rÏ   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚChannel_Attention_gridFr:   r�   c           	      óŠ  •— t          ¦   «                              ¦   «          || _        t          j        t          j        |dd¦  «        ¦  «        | _        || _        t          j	        ||dz  d|¬¦  «        | _
        t          j	        |dz  |dz  ddd|dz  |¬¦  «        | _        t          j	        ||d|¬¦  «        | _        d S rÑ   rÒ   rÖ   s         €r   r   zChannel_Attention_grid.__init__¶  r×   r   c           	      ó&  ‡ — |j         \  }}}}‰                      ‰                      |¦  «        ¦  «        }|                     dd¬¦  «        }ˆ fd„|D ¦   «         \  }}}	t	          j        |d¬¦  «        }t	          j        |d¬¦  «        }||                     dd¦  «        z  ‰ j        z  }
|
                     d¬¦  «        }
|
|	z  }t          |d|‰ j
        z  |‰ j
        z  ‰ j
        ‰ j
        ‰ j        ¬¦  «        }‰                      |¦  «        }|S )	NrV   r	   r`   c              3   ó^   •K  — | ]'}t          |d ‰j        ‰j        ‰j        ¬¦  «        V — Œ(dS )z2b (head d) (h ph) (w pw) -> b (ph pw) head d (h w)rÚ   NrÝ   rÉ   s     €r   r¯   z1Channel_Attention_grid.forward.<locals>.<genexpr>Ð  rÞ   r   r“   rß   z2b (ph pw) head d (h w) -> b (head d) (h ph) (w pw)rà   rá   rå   s   `           r   r*   zChannel_Attention_grid.forwardÊ  ræ   r   rç   r,   r1   s   @r   rê   rê   µ  rè   r   rê   c                   ó.   ‡ — e Zd Z	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )Ú	OSA_Blocké@   é   Fr:   c                 ó  •— t          ¦   «                              ¦   «          |}t          j        t	          ||ddd¬¦  «        t          d||¬¦  «        t          |t          ||dz  |||¬¦  «        ¦  «        t          d	¦  «        t          |t          ||¬
¦  «        ¦  «        t          |t          |d||¬¦  «        ¦  «        t          |t          ||¬
¦  «        ¦  «        t          d||¬¦  «        t          |t          ||dz  |||¬¦  «        ¦  «        t          d¦  «        t          |t          ||¬
¦  «        ¦  «        t          |t          |d||¬¦  «        ¦  «        t          |t          ||¬
¦  «        ¦  «        ¦  «        | _        d S )NFr	   rh   )rŠ   r†   ro   z"b d (x w1) (y w2) -> b x y w1 w2 dr²   r…   )r$   r¥   rD   r¦   r˜   z"b x y w1 w2 d -> b d (x w1) (y w2))r$   rD   )r$   r–   rD   r¦   z"b d (w1 x) (w2 y) -> b x y w1 w2 dz"b x y w1 w2 d -> b d (w1 x) (w2 y))r   r   r   r=   r‹   r   r   r�   r4   rQ   rÏ   rê   Úlayer)r#   Úchannel_numr¦   r˜   rD   rÍ   r%   s         €r   r   zOSA_Block.__init__ò  sù  ø€ õ 	‰Œ×ÒÑÔÐàˆå”]ÝØØØ Ø Ø#ðñ ô õ Ø4¸¸qðñ ô õ ØÝØ#Ø(¨AÑ-Ø#Ø +Ø#ðñ ô ñ	ô 	õ Ð:Ñ;Ô;Ý ØÕ3¸ÈWÐUÑUÔUñô õ !ØÝ!Ø#¨1°gÈ;ðñ ô ñô õ !ØÕ3¸ÈWÐUÑUÔUñô õ Ø4¸¸qðñ ô õ ØÝØ#Ø(¨AÑ-Ø#Ø +Ø#ðñ ô ñ	ô 	õ Ð:Ñ;Ô;Ý ØÕ3¸ÈWÐUÑUÔUñô õ !ØÝ&Ø#¨1°gÈ;ðñ ô ñô õ !ØÕ3¸ÈWÐUÑUÔUñô ñw>
ô >
ˆŒ
ˆ
ˆ
r   c                 ó0   — |                       |¦  «        }|S r   )ró   rx   s      r   r*   zOSA_Block.forward=  s   € Ø�jŠj˜‰mŒmˆØˆ
r   )rð   rñ   Fr:   r,   r1   s   @r   rï   rï   ñ  sa   ø€ € € € € ð ØØØðI
ð I
ð I
ð I
ð I
ð I
ðVð ð ð ð ð ð r   rï   )r	   )r€   Útorch.nn.functionalr   Ú
functionalrb   Úeinopsr   Úeinops.layers.torchr   r   r   Ú	layernormr
   r   r   r   ÚModuler   r4   r8   rL   rQ   rg   rs   ru   r‹   r�   rÂ   rÏ   rê   rï   r   r   r   ú<module>rü      sD  ðð €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø Ð Ð Ð Ð Ð Ð Ð à "Ð "Ð "Ð "Ð "Ð "ð
ð ð ð%ð %ð %ð@ð @ð @ð @ð)ð )ð )ð )ð )�b”iñ )ô )ð )ð)ð )ð )ð )ð )˜2œ9ñ )ô )ð )ðð ð ð ð �"”)ñ ô ð ð ð ð ð ð �r”yñ ô ð ð ð ð ð ð ˜RœYñ ô ð ð> ð  ð  ð  ð  ˜œ	ñ  ô  ð  ð$	ð 	ð 	ð 	ð 	�R”Yñ 	ô 	ð 	ð/ð /ð /ð /ð /�”ñ /ô /ð /ð& 45ÀTÐSVðð ð ð ð ð6\Mð \Mð \Mð \Mð \M�”	ñ \Mô \Mð \Mð~Rð Rð Rð Rð R�b”iñ Rô Rð Rðj9ð 9ð 9ð 9ð 9˜œ	ñ 9ô 9ð 9ðx9ð 9ð 9ð 9ð 9˜RœYñ 9ô 9ð 9ðxNð Nð Nð Nð N�”	ñ Nô Nð Nð Nð Nr   