o
    پi-                     @   s  d Z ddlZddlmZ ddlZddlmZ ddlm  mZ	 ddl
mZmZmZmZmZmZmZmZ zddlmZ W n eyJ   ddl
mZ Y nw G dd dejZG d	d
 d
ejZG dd dejZG dd dejZdejdefddZdejdejdejdefddZdejdejdejdefddZG dd dejZG dd dej Z!G dd  d ej Z"G d!d" d"ej Z#G d#d$ d$ej Z$dS )%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                       s8   e Zd ZU ejje ed< d	 fdd	Zdd Z	  Z
S )
	GroupNorm
_fast_norm    h㈵>Tc                    s    t  j||||d t | _d S )N)epsaffinesuper__init__r   r   )selfnum_channels
num_groupsr   r   	__class__ D/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/norm.pyr      s   zGroupNorm.__init__c                 C   8   | j rt|| j| j| j| jS t|| j| j| j| jS Nr   r   r   weightbiasr   F
group_normr   xr   r   r   forward!      zGroupNorm.forward)r   r   T)__name__
__module____qualname__torchjitFinalbool__annotations__r   r&   __classcell__r   r   r   r   r      s   
 r   c                       sH   e Zd ZU dZejje ed<  fddZ	dej
dej
fddZ  ZS )	
GroupNorm1zL Group Normalization with 1 group.
    Input: tensor in shape [B, C, *]
    r   c                    s"   t  jd|fi | t | _d S )Nr   r   )r   r   kwargsr   r   r   r   .   s   zGroupNorm1.__init__r%   returnc                 C   r   r   r   r$   r   r   r   r&   2   r'   zGroupNorm1.forwardr(   r)   r*   __doc__r+   r,   r-   r.   r/   r   Tensorr&   r0   r   r   r   r   r1   (   s
   
 r1   c                       J   e Zd ZU dZejje ed< d fdd	Z	dej
dej
fd	d
Z  ZS )	LayerNormz# LayerNorm w/ fast norm option
    r   ư>Tc                       t  j|||d t | _d S N)r   elementwise_affiner   r   r   r   r   r   r   r   r   >      zLayerNorm.__init__r%   r3   c                 C   s@   | j rt|| j| j| j| j}|S t|| j| j| j| j}|S r   )r   r   normalized_shaper    r!   r   r"   
layer_normr$   r   r   r   r&   B   s
   zLayerNorm.forwardr9   Tr4   r   r   r   r   r8   9   s
   
 r8   c                       r7   )LayerNorm2dz5 LayerNorm for channels of '2D' spatial NCHW tensors r   r9   Tc                    r:   r;   r   r=   r   r   r   r   N   r>   zLayerNorm2d.__init__r%   r3   c                 C   s^   | dddd}| jrt|| j| j| j| j}nt|| j| j| j| j}| dddd}|S Nr         r   )	permuter   r   r?   r    r!   r   r"   r@   r$   r   r   r   r&   R   s   zLayerNorm2d.forwardrA   r4   r   r   r   r   rB   J   s
   
 rB   tensorr3   c                 C   s    t j r	|  S | jt jdS )N)memory_format)r+   r,   is_scriptingis_contiguouscontiguous_format)rG   r   r   r   _is_contiguous\   s   
rL   r%   r    r!   r   c                 C   sX   t j| dddd\}}| | t ||  } | |d d d d f  |d d d d f  } | S )Nr   FT)dimunbiasedkeepdim)r+   var_meanrsqrt)r%   r    r!   r   sur   r   r   _layer_norm_cfd   s   (rT   c                 C   sl   | j ddd}| |  j ddd||  d}| | t||  } | |dddd |dddd } | S )Nr   T)rM   rO   r   )meanclampr+   rQ   view)r%   r    r!   r   rS   rR   r   r   r   _layer_norm_cf_sqmk   s
    $rY   c                       s2   e Zd ZdZd fdd	ZdejfddZ  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.
    r9   c                    s   t  j||d d S )N)r   )r   r   )r   r   r   r   r   r   r   |   s   zLayerNormExp2d.__init__r3   c                 C   sV   t |rt|dddd| j| j| j| jdddd}|S t|| j| j| j}|S rC   )	rL   r"   r@   rF   r?   r    r!   r   rT   r$   r   r   r   r&      s   zLayerNormExp2d.forward)r9   )	r(   r)   r*   r5   r   r+   r6   r&   r0   r   r   r   r   rZ   s   s    rZ   c                       v   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 fddZ
dddZdejdejfddZ  ZS )RmsNormz. RmsNorm w/ fast (apex) norm if available
    r?   r   r<   r   .r?   r   r<   r   r9   TNr3   c                       ||d}t    |}t|tjr|f}t|| _|| _|| _t	 | _
| jr6ttj| jfi || _n| dd  |   d S N)devicedtyper    r   r   
isinstancenumbersIntegraltupler?   r   r<   r   r   nn	Parameterr+   emptyr    register_parameterreset_parametersr   channelsr   r   r`   ra   factory_kwargsr?   r   r   r   r         


zRmsNorm.__init__c                 C      | j rtj| j d S d S r   r<   rg   initones_r    r   r   r   r   rk         zRmsNorm.reset_parametersr%   c                 C   6   | j rt|| j| j| j}|S t|| j| j| j}|S r   )r   r   r?   r    r   r   r$   r   r   r   r&      
   zRmsNorm.forwardr9   TNNr3   Nr(   r)   r*   r5   __constants__r   intr/   floatr.   r   rk   r+   r6   r&   r0   r   r   r   r   r\         
 
r\   c                       r[   )	RmsNorm2daB   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]   .r?   r   r<   r   r9   TNr3   c                    r^   r_   rb   rl   r   r   r   r      ro   zRmsNorm2d.__init__c                 C   rp   r   rq   rt   r   r   r   rk      ru   zRmsNorm2d.reset_parametersr%   c                 C   rv   r   )r   r	   r?   r    r   r   r$   r   r   r   r&      rw   zRmsNorm2d.forwardrx   ry   rz   r   r   r   r   r      s   
 
r   c                       r[   )
SimpleNormz SimpleNorm (x / std(x))
    r]   .r?   r   r<   r   r9   TNr3   c                    r^   r_   rb   rl   r   r   r   r      ro   zSimpleNorm.__init__c                 C   rp   r   rq   rt   r   r   r   rk      ru   zSimpleNorm.reset_parametersr%   c                 C   rv   r   )r   r
   r?   r    r   r   r$   r   r   r   r&      s
   zSimpleNorm.forwardrx   ry   rz   r   r   r   r   r      r~   r   c                       r[   )SimpleNorm2dz! SimpleNorm for NCHW tensors
    r]   .r?   r   r<   r   r9   TNr3   c                    r^   r_   rb   rl   r   r   r   r     ro   zSimpleNorm2d.__init__c                 C   rp   r   rq   rt   r   r   r   rk   $  ru   zSimpleNorm2d.reset_parametersr%   c                 C   sT   | dddd}| jrt|| j| j| j}n
t|| j| j| j}| dddd}|S rC   )rF   r   r
   r?   r    r   r   r$   r   r   r   r&   (  s   zSimpleNorm2d.forwardrx   ry   rz   r   r   r   r   r     r~   r   )%r5   rd   typingr   r+   torch.nnrg   torch.nn.functional
functionalr"   	fast_normr   r   r   r   r   r	   r
   r   r   ImportErrorr   r1   r8   rB   r6   r.   rL   r}   rT   rY   rZ   Moduler\   r   r   r   r   r   r   r   <module>   s0    (  *.(