Ë
    éÓ^jøM  ã                   óÞ  — d Z ddlZddlmZ ddlZddlmZ ddlmc mZ	 ddl
mZmZmZmZmZmZmZmZ 	 ddlm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ej6                  defd„Zdej6                  dej6                  dej6                  defd„Zdej6                  dej6                  dej6                  defd„Z  G d„ dej.                  «      Z! G d„ dejD                  «      Z# G d „ d!ejD                  «      Z$ G d"„ d#ejD                  «      Z% G d$„ d%ejD                  «      Z& G d&„ d'ejD                  «      Z' G d(„ d)ejD                  «      Z( G d*„ d+ejD                  «      Z) G d,„ d-ejD                  «      Z*y# e$ r
 ddl
mZ Y �Œ°w xY w).zº Normalization layers and wrappers

Norm layer definitions that support fast norm and consistent channel arg order (always first arg).

Hacked together by / Copyright 2022 Ross Wightman
é    N)ÚTupleé   )Úis_fast_normÚfast_group_normÚfast_layer_normÚfast_rms_normÚ
rms_norm2dÚfast_rms_norm2dÚfast_simple_normÚsimple_norm)Úrms_normc            	       óx   ‡ — e Zd ZU ej                  j
                  e   ed<   	 	 	 ddedede	defˆ fd„Z
d„ Zˆ xZS )	Ú	GroupNormÚ
_fast_normÚnum_channelsÚ
num_groupsÚepsÚaffinec                 óL   •— t        ‰| �  ||f||dœ|¤Ž t        «       | _        y )N)r   r   ©ÚsuperÚ__init__r   r   )Úselfr   r   r   r   ÚkwargsÚ	__class__s         €ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/norm.pyr   zGroupNorm.__init__"   s)   ø€ ô 	‰Ñ˜ \ÐT°sÀ6ÑTÈVÒTÜ&›.ˆ�ó    c                 ó
  — | j                   r7t        || j                  | j                  | j                  | j
                  «      S t        j                  || j                  | j                  | j                  | j
                  «      S ©N©r   r   r   ÚweightÚbiasr   ÚFÚ
group_norm©r   Úxs     r   ÚforwardzGroupNorm.forward.   óS   € Ø�?Š?Ü" 1 d§o¡o°t·{±{ÀDÇIÁIÈtÏxÉxÓXÐXä—<‘<  4§?¡?°D·K±KÀÇÁÈDÏHÉHÓUÐUr   )é    gñhãˆµøä>T)Ú__name__Ú
__module__Ú__qualname__ÚtorchÚjitÚFinalÚboolÚ__annotations__ÚintÚfloatr   r'   Ú__classcell__©r   s   @r   r   r      sR   ø… Ø—	‘	—‘ Ñ%Ó%ð
 !ØØñ
)àð
)ð ð
)ð ð	
)ð
 õ
)öVr   r   c                   óš   ‡ — e Zd ZU dZej
                  j                  e   ed<   de	fˆ fd„Z
dej                  dej                  fd„Zˆ xZS )Ú
GroupNorm1zL Group Normalization with 1 group.
    Input: tensor in shape [B, C, *]
    r   r   c                 óF   •— t        ‰| �  d|fi |¤Ž t        «       | _        y )Nr   r   )r   r   r   r   s      €r   r   zGroupNorm1.__init__;   s    ø€ Ü‰Ñ˜˜LÑ3¨FÒ3Ü&›.ˆ�r   r&   Úreturnc                 ó
  — | j                   r7t        || j                  | j                  | j                  | j
                  «      S t        j                  || j                  | j                  | j                  | j
                  «      S r   r    r%   s     r   r'   zGroupNorm1.forward?   r(   r   )r*   r+   r,   Ú__doc__r-   r.   r/   r0   r1   r2   r   ÚTensorr'   r4   r5   s   @r   r7   r7   5   sG   ø… ñð —	‘	—‘ Ñ%Ó%ð) Sõ )ðV˜Ÿ™ð V¨%¯,©,÷ Vr   r7   c                   ó¨   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 d
de	de
defˆ fd„Zdej                  dej                  fd	„Zˆ xZS )Ú	LayerNormz# LayerNorm w/ fast norm option
    r   r   r   r   c                 óJ   •— t        ‰| �  |f||dœ|¤Ž t        «       | _        y ©N)r   Úelementwise_affiner   ©r   r   r   r   r   r   s        €r   r   zLayerNorm.__init__K   ó'   ø€ ô 	‰Ñ˜ÐT¨3À6ÑTÈVÒTÜ&›.ˆ�r   r&   r9   c                 ó  — | j                   r9t        || j                  | j                  | j                  | j
                  «      }|S t        j                  || j                  | j                  | j                  | j
                  «      }|S r   )r   r   Únormalized_shaper!   r"   r   r#   Ú
layer_normr%   s     r   r'   zLayerNorm.forwardU   sf   € Ø�?Š?Ü  4×#8Ñ#8¸$¿+¹+ÀtÇyÁyÐRV×RZÑRZÓ[ˆAð ˆô —‘˜Q × 5Ñ 5°t·{±{ÀDÇIÁIÈtÏxÉxÓXˆAØˆr   ©ç�íµ ÷Æ°>T©r*   r+   r,   r;   r-   r.   r/   r0   r1   r2   r3   r   r<   r'   r4   r5   s   @r   r>   r>   F   s_   ø… ñà—	‘	—‘ Ñ%Ó%ð
 Øñ	)àð)ð ð)ð õ	)ð˜Ÿ™ð ¨%¯,©,÷ r   r>   c                   ón   ‡ — e Zd ZdZ	 	 d	dededefˆ fd„Zdej                  dej                  fd„Z
ˆ xZS )
ÚLayerNormFp32z LayerNorm
    r   r   r   c                 ó,   •— t        ‰| �  |f||dœ|¤Ž y r@   ©r   r   rB   s        €r   r   zLayerNormFp32.__init__a   ó   ø€ ô 	‰Ñ˜ÐT¨3À6ÑTÈVÓTr   r&   r9   c                 óN  — | j                   �| j                   j                  «       nd }| j                  �| j                  j                  «       nd }t        j                  |j                  «       | j
                  ||| j                  «      j                  |j                  «      }|S r   )	r!   r3   r"   r#   rF   rE   r   ÚtoÚdtype©r   r&   r!   r"   s       r   r'   zLayerNormFp32.forwardj   sw   € Ø(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆØ$(§I¡IÐ$9ˆt�y‰y�‰Ô ¸tˆÜ�L‰L˜Ÿ™› D×$9Ñ$9¸6À4ÈÏÉÓR×UÑUÐVW×V]ÑV]Ó^ˆØˆr   rG   ©r*   r+   r,   r;   r2   r3   r0   r   r-   r<   r'   r4   r5   s   @r   rK   rK   ]   sP   ø„ ñð Øñ	UàðUð ðUð õ	Uð˜Ÿ™ð ¨%¯,©,÷ r   rK   c                   ó¨   ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 d
de	de
defˆ fd„Zdej                  dej                  fd	„Zˆ xZS )ÚLayerNorm2dú5 LayerNorm for channels of '2D' spatial NCHW tensors r   r   r   r   c                 óJ   •— t        ‰| �  |f||dœ|¤Ž t        «       | _        y r@   r   rB   s        €r   r   zLayerNorm2d.__init__u   rC   r   r&   r9   c                 ó`  — |j                  dddd«      }| j                  r8t        || j                  | j                  | j
                  | j                  «      }nAt        j                  || j                  | j                  | j
                  | j                  «      }|j                  dddd«      }|S ©Nr   é   é   r   )	Úpermuter   r   rE   r!   r"   r   r#   rF   r%   s     r   r'   zLayerNorm2d.forward   s…   € Ø�I‰I�a˜˜A˜qÓ!ˆØ�?Š?Ü  4×#8Ñ#8¸$¿+¹+ÀtÇyÁyÐRV×RZÑRZÓ[‰Aä—‘˜Q × 5Ñ 5°t·{±{ÀDÇIÁIÈtÏxÉxÓXˆAØ�I‰I�a˜˜A˜qÓ!ˆØˆr   rG   rI   r5   s   @r   rU   rU   q   s]   ø… Ù?Ø—	‘	—‘ Ñ%Ó%ð
 Øñ	)àð)ð ð)ð õ	)ð˜Ÿ™ð ¨%¯,©,÷ r   rU   c                   ón   ‡ — e Zd ZdZ	 	 d	dededefˆ fd„Zdej                  dej                  fd„Z
ˆ xZS )
ÚLayerNorm2dFp32rV   r   r   r   c                 ó,   •— t        ‰| �  |f||dœ|¤Ž y r@   rM   rB   s        €r   r   zLayerNorm2dFp32.__init__Œ   rN   r   r&   r9   c                 óž  — |j                  dddd«      }| j                  �| j                  j                  «       nd }| j                  �| j                  j                  «       nd }t	        j
                  |j                  «       | j                  ||| j                  «      j                  |j                  «      }|j                  dddd«      }|S rY   )
r\   r!   r3   r"   r#   rF   rE   r   rP   rQ   rR   s       r   r'   zLayerNorm2dFp32.forward•   sŸ   € Ø�I‰I�a˜˜A˜qÓ!ˆØ(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆØ$(§I¡IÐ$9ˆt�y‰y�‰Ô ¸tˆÜ�L‰L˜Ÿ™› D×$9Ñ$9¸6À4ÈÏÉÓR×UÑUÐVW×V]ÑV]Ó^ˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr   rG   rS   r5   s   @r   r^   r^   ‰   sN   ø„ Ù?ð
 Øñ	UàðUð ðUð õ	Uð˜Ÿ™ð ¨%¯,©,÷ r   r^   Útensorr9   c                 óž   — t         j                  j                  «       r| j                  «       S | j                  t         j                  ¬«      S )N)Úmemory_format)r-   r.   Úis_scriptingÚis_contiguousÚcontiguous_format)ra   s    r   Ú_is_contiguousrg   ž   s;   € ä‡y�y×ÑÔØ×#Ñ#Ó%Ð%à×#Ñ#´%×2IÑ2IÐ#ÓJÐJr   r&   r!   r"   r   c                 óª   — t        j                  | ddd¬«      \  }}| |z
  t        j                  ||z   «      z  } | |d d …d d f   z  |d d …d d f   z   } | S )Nr   FT)ÚdimÚunbiasedÚkeepdim)r-   Úvar_meanÚrsqrt)r&   r!   r"   r   ÚsÚus         r   Ú_layer_norm_cfrp   ¦   s_   € Ü�>‰>˜! ¨U¸DÔA�D€A€qØ	
ˆQ‰”%—+‘+˜a #™gÓ&Ñ&€AØ	ˆF’1�d˜D�=Ñ!Ñ! Dª¨D°$¨Ñ$7Ñ7€AØ€Hr   c                 ó  — | j                  dd¬«      }| | z  j                  dd¬«      ||z  z
  j                  d«      }| |z
  t        j                  ||z   «      z  } | |j	                  dddd«      z  |j	                  dddd«      z   } | S )Nr   T)ri   rk   r   éÿÿÿÿ)ÚmeanÚclampr-   rm   Úview)r&   r!   r"   r   ro   rn   s         r   Ú_layer_norm_cf_sqmrv   ­   s‹   € Ø	�‰�1˜dˆÓ#€AØ
ˆa‰%�‰˜! TˆÓ	*¨a°!©eÑ	4×;Ñ;¸AÓ>€AØ	
ˆQ‰”%—+‘+˜a #™gÓ&Ñ&€AØ	ˆF�K‰K˜˜2˜q !Ó$Ñ$ t§y¡y°°B¸¸1Ó'=Ñ=€AØ€Hr   c                   óN   ‡ — e Zd ZdZddedefˆ fd„Zdej                  fd„Z	ˆ xZ
S )ÚLayerNormExp2da_   LayerNorm for channels_first tensors with 2d spatial dimensions (ie N, C, H, W).

    Experimental implementation w/ manual norm for tensors non-contiguous tensors.

    This improves throughput in some scenarios (tested on Ampere GPU), esp w/ channels_last
    layout. However, benefits are not always clear and can perform worse on other GPUs.
    r   r   c                 ó(   •— t         ‰| �  ||¬«       y )N)r   rM   )r   r   r   r   s      €r   r   zLayerNormExp2d.__init__¾   s   ø€ Ü‰Ñ˜¨3ÐÕ/r   r9   c                 óB  — t        |«      rgt        j                  |j                  dddd«      | j                  | j
                  | j                  | j                  «      j                  dddd«      }|S t        || j
                  | j                  | j                  «      }|S rY   )	rg   r#   rF   r\   rE   r!   r"   r   rp   r%   s     r   r'   zLayerNormExp2d.forwardÁ   sŠ   € Ü˜!ÔÜ—‘Ø—	‘	˜!˜Q  1Ó% t×'<Ñ'<¸d¿k¹kÈ4Ï9É9ÐVZ×V^ÑV^ó`ß`gÑ`gÐhiÐklÐnoÐqrÓ`sð ð ˆô ˜q $§+¡+¨t¯y©y¸$¿(¹(ÓCˆAØˆr   )rH   )r*   r+   r,   r;   r2   r3   r   r-   r<   r'   r4   r5   s   @r   rx   rx   µ   s+   ø„ ññ0 Sð 0¨uõ 0ð˜EŸL™L÷ r   rx   c            	       óº   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   e	ed<   	 	 	 	 dd	eded
e	ddfˆ fd„Z
dd„Zdej                  dej                  fd„Zˆ xZS )ÚRmsNormú. RmsNorm w/ fast (apex) norm if available
    ©rE   r   rA   r   .rE   r   rA   r   NÚchannelsr   r9   c                 ó’  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        t        «       | _
        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j!                  dd «       | j#                  «        y ©N)ÚdevicerQ   r!   ©r   r   Ú
isinstanceÚnumbersÚIntegralÚtuplerE   r   rA   r   r   ÚnnÚ	Parameterr-   Úemptyr!   Úregister_parameterÚreset_parameters©	r   r   r   r   r‚   rQ   ÚddrE   r   s	           €r   r   zRmsNorm.__init__Ó   ó©   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ#ÐÜÐ&¬×(8Ñ(8Ô9à 0Ð2ÐÜ %Ð&6Ó 7ˆÔØˆŒØ"(ˆÔÜ&›.ˆŒà×"Ò"ÜŸ,™,¤u§{¡{°4×3HÑ3HÑ'OÈBÑ'OÓPˆD�Kà×#Ñ# H¨dÔ3à×ÑÕr   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   ©rA   rˆ   ÚinitÚones_r!   ©r   s    r   rŒ   zRmsNorm.reset_parametersí   ó$   € Ø×"Ò"Ü�G‰G�M‰M˜$Ÿ+™+Õ&ð #r   r&   c                 óÒ   — | j                   r.t        || j                  | j                  | j                  «      }|S t        || j                  | j                  | j                  «      }|S r   )r   r   rE   r!   r   r   r%   s     r   r'   zRmsNorm.forwardñ   sU   € ð �?Š?Ü˜a ×!6Ñ!6¸¿¹ÀTÇXÁXÓNˆAð ˆô ˜˜D×1Ñ1°4·;±;ÀÇÁÓIˆAØˆr   ©rH   TNN©r9   N©r*   r+   r,   r;   Ú__constants__r   r2   r1   r3   r0   r   rŒ   r-   r<   r'   r4   r5   s   @r   r|   r|   Ê   ó…   ø… ñâS€MØ˜C ˜H‘oÓ%Ø	ƒJØÓØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó4'ð˜Ÿ™ð ¨%¯,©,÷ r   r|   c            	       ó°   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   	 	 	 	 ddeded	e	d
dfˆ fd„Z
dd„Zdej                  d
ej                  fd„Zˆ xZS )ÚRmsNormFp32r}   ©rE   r   rA   .rE   r   rA   Nr   r   r9   c                 ót  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j                  dd «       | j                  «        y r�   ©r   r   r„   r…   r†   r‡   rE   r   rA   rˆ   r‰   r-   rŠ   r!   r‹   rŒ   r�   s	           €r   r   zRmsNormFp32.__init__  ó    ø€ ð ¨Ñ/ˆÜ‰ÑÔØ#ÐÜÐ&¬×(8Ñ(8Ô9à 0Ð2ÐÜ %Ð&6Ó 7ˆÔØˆŒØ"(ˆÔà×"Ò"ÜŸ,™,¤u§{¡{°4×3HÑ3HÑ'OÈBÑ'OÓPˆD�Kà×#Ñ# H¨dÔ3à×ÑÕr   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zRmsNormFp32.reset_parameters  r•   r   r&   c                 óè   — | j                   �| j                   j                  «       nd }t        |j                  «       | j                  || j                  «      j                  |j                  «      }|S r   )r!   r3   r   rE   r   rP   rQ   ©r   r&   r!   s      r   r'   zRmsNormFp32.forward   sS   € Ø(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆÜ�Q—W‘W“Y × 5Ñ 5°v¸t¿x¹xÓH×KÑKÈAÏGÉGÓTˆØˆr   r—   r˜   r™   r5   s   @r   r�   r�   û   ó   ø… ñâE€MØ˜C ˜H‘oÓ%Ø	ƒJØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó2'ð˜Ÿ™ð ¨%¯,©,÷ r   r�   c            	       óº   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   e	ed<   	 	 	 	 dd	eded
e	ddfˆ fd„Z
dd„Zdej                  dej                  fd„Zˆ xZS )Ú	RmsNorm2dáB   RmsNorm2D for NCHW tensors, w/ fast apex or cast norm if available

    NOTE: It's currently (2025-05-10) faster to use an eager 2d kernel that does reduction
    on dim=1 than to permute and use internal PyTorch F.rms_norm, this may change if something
    like https://github.com/pytorch/pytorch/pull/150576 lands.
    r~   .rE   r   rA   r   Nr   r   r9   c                 ó’  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        t        «       | _
        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j!                  dd «       | j#                  «        y r�   rƒ   r�   s	           €r   r   zRmsNorm2d.__init__3  r�   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zRmsNorm2d.reset_parametersM  r•   r   r&   c                 óÒ   — | j                   r.t        || j                  | j                  | j                  «      }|S t        || j                  | j                  | j                  «      }|S r   )r   r
   rE   r!   r   r	   r%   s     r   r'   zRmsNorm2d.forwardQ  sU   € ð �?Š?Ü  4×#8Ñ#8¸$¿+¹+ÀtÇxÁxÓPˆAð ˆô ˜1˜d×3Ñ3°T·[±[À$Ç(Á(ÓKˆAØˆr   r—   r˜   r™   r5   s   @r   r§   r§   &  sˆ   ø… ñò T€MØ˜C ˜H‘oÓ%Ø	ƒJØÓØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó4'ð˜Ÿ™ð ¨%¯,©,÷ r   r§   c            	       ó°   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   	 	 	 	 ddeded	e	d
dfˆ fd„Z
dd„Zdej                  d
ej                  fd„Zˆ xZS )ÚRmsNorm2dFp32r¨   rž   .rE   r   rA   Nr   r   r9   c                 ót  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j                  dd «       | j                  «        y r�   r    r�   s	           €r   r   zRmsNorm2dFp32.__init__g  r¡   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zRmsNorm2dFp32.reset_parameters€  r•   r   r&   c                 óè   — | j                   �| j                   j                  «       nd }t        |j                  «       | j                  || j                  «      j                  |j                  «      }|S r   )r!   r3   r	   rE   r   rP   rQ   r¤   s      r   r'   zRmsNorm2dFp32.forward„  sS   € Ø(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆÜ�q—w‘w“y $×"7Ñ"7¸ÀÇÁÓJ×MÑMÈaÏgÉgÓVˆØˆr   r—   r˜   r™   r5   s   @r   r­   r­   [  s‚   ø… ñò F€MØ˜C ˜H‘oÓ%Ø	ƒJØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó2'ð˜Ÿ™ð ¨%¯,©,÷ r   r­   c            	       óº   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   e	ed<   	 	 	 	 dd	eded
e	ddfˆ fd„Z
dd„Zdej                  dej                  fd„Zˆ xZS )Ú
SimpleNormú SimpleNorm (x / std(x))
    r~   .rE   r   rA   r   Nr   r   r9   c                 ó’  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        t        «       | _
        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j!                  dd «       | j#                  «        y r�   rƒ   r�   s	           €r   r   zSimpleNorm.__init__“  r�   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zSimpleNorm.reset_parameters­  r•   r   r&   c                 óÒ   — | j                   r.t        || j                  | j                  | j                  «      }|S t        || j                  | j                  | j                  «      }|S r   )r   r   rE   r!   r   r   r%   s     r   r'   zSimpleNorm.forward±  sS   € Ø�?Š?Ü   D×$9Ñ$9¸4¿;¹;ÈÏÉÓQˆAð ˆô ˜A˜t×4Ñ4°d·k±kÀ4Ç8Á8ÓLˆAØˆr   r—   r˜   r™   r5   s   @r   r²   r²   Š  s…   ø… ñâS€MØ˜C ˜H‘oÓ%Ø	ƒJØÓØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó4'ð˜Ÿ™ð ¨%¯,©,÷ r   r²   c            	       ó°   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   	 	 	 	 ddeded	e	d
dfˆ fd„Z
dd„Zdej                  d
ej                  fd„Zˆ xZS )ÚSimpleNormFp32r³   rž   .rE   r   rA   Nr   r   r9   c                 ót  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j                  dd «       | j                  «        y r�   r    r�   s	           €r   r   zSimpleNormFp32.__init__Á  r¡   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zSimpleNormFp32.reset_parametersÚ  r•   r   r&   c                 óè   — | j                   �| j                   j                  «       nd }t        |j                  «       | j                  || j                  «      j                  |j                  «      }|S r   )r!   r3   r   rE   r   rP   rQ   r¤   s      r   r'   zSimpleNormFp32.forwardÞ  sS   € Ø(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆÜ˜Ÿ™›	 4×#8Ñ#8¸&À$Ç(Á(ÓK×NÑNÈqÏwÉwÓWˆØˆr   r—   r˜   r™   r5   s   @r   r¸   r¸   ¹  r¥   r   r¸   c            	       óº   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   e	ed<   	 	 	 	 dd	eded
e	ddfˆ fd„Z
dd„Zdej                  dej                  fd„Zˆ xZS )ÚSimpleNorm2dú! SimpleNorm for NCHW tensors
    r~   .rE   r   rA   r   Nr   r   r9   c                 ó’  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        t        «       | _
        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j!                  dd «       | j#                  «        y r�   rƒ   r�   s	           €r   r   zSimpleNorm2d.__init__í  r�   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   zSimpleNorm2d.reset_parameters  r•   r   r&   c                 ó   — |j                  dddd«      }| j                  r-t        || j                  | j                  | j
                  «      }n,t        || j                  | j                  | j
                  «      }|j                  dddd«      }|S rY   )r\   r   r   rE   r!   r   r   r%   s     r   r'   zSimpleNorm2d.forward  sr   € Ø�I‰I�a˜˜A˜qÓ!ˆØ�?Š?Ü   D×$9Ñ$9¸4¿;¹;ÈÏÉÓQ‰Aä˜A˜t×4Ñ4°d·k±kÀ4Ç8Á8ÓLˆAØ�I‰I�a˜˜A˜qÓ!ˆØˆr   r—   r˜   r™   r5   s   @r   r½   r½   ä  r›   r   r½   c            	       ó°   ‡ — e Zd ZU dZg d¢Zeedf   ed<   eed<   e	ed<   	 	 	 	 ddeded	e	d
dfˆ fd„Z
dd„Zdej                  d
ej                  fd„Zˆ xZS )ÚSimpleNorm2dFp32r¾   rž   .rE   r   rA   Nr   r   r9   c                 ót  •— ||dœ}t         ‰| �  «        |}t        |t        j                  «      r|f}t        |«      | _        || _        || _        | j                  r9t        j                  t        j                  | j                  fi |¤Ž«      | _        n| j                  dd «       | j                  «        y r�   r    r�   s	           €r   r   zSimpleNorm2dFp32.__init__  r¡   r   c                 óp   — | j                   r*t        j                  j                  | j                  «       y y r   r‘   r”   s    r   rŒ   z!SimpleNorm2dFp32.reset_parameters6  r•   r   r&   c                 ó8  — |j                  dddd«      }| j                  �| j                  j                  «       nd }t        |j                  «       | j                  || j
                  «      j                  |j                  «      }|j                  dddd«      }|S rY   )r\   r!   r3   r   rE   r   rP   rQ   r¤   s      r   r'   zSimpleNorm2dFp32.forward:  s{   € Ø�I‰I�a˜˜A˜qÓ!ˆØ(,¯©Ð(?�—‘×"Ñ"Ô$ÀTˆÜ˜Ÿ™›	 4×#8Ñ#8¸&À$Ç(Á(ÓK×NÑNÈqÏwÉwÓWˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr   r—   r˜   r™   r5   s   @r   rÃ   rÃ     s   ø… ñâE€MØ˜C ˜H‘oÓ%Ø	ƒJØÓð
 ØØØñ àð ð ð ð ð	 ð 
õ ó2'ð˜Ÿ™ð ¨%¯,©,÷ r   rÃ   )+r;   r…   Útypingr   r-   Útorch.nnrˆ   Útorch.nn.functionalÚ
functionalr#   Ú	fast_normr   r   r   r   r	   r
   r   r   r   ÚImportErrorr   r7   r>   rK   rU   r^   r<   r0   rg   r3   rp   rv   rx   ÚModuler|   r�   r§   r­   r²   r¸   r½   rÃ   © r   r   ú<module>rÏ      s¾  ðñó Ý ã Ý ß Ð ÷	÷ 	ó 	ð$Ý,ô
V�—‘ô Vô,V�—‘ô Vô"�—‘ô ô.�B—L‘Lô ô(�"—,‘,ô ô0�b—l‘lô ð*K˜5Ÿ<™<ð K¨Dó Kð�e—l‘lð ¨E¯L©Lð ÀÇÁð ÐSXó ð˜%Ÿ,™,ð °·±ð ÀEÇLÁLð ÐW\ó ô�R—\‘\ô ô*.ˆb�i‰iô .ôb(�"—)‘)ô (ôV2�—	‘	ô 2ôj,�B—I‘Iô ,ô^,�—‘ô ,ô^(�R—Y‘Yô (ôV.�2—9‘9ô .ôb*�r—y‘yõ *øðu ò $ß#Ð#ð$ús   µG ÇG,Ç+G,