U
    ¯Ê¹j˜  ã                   @   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 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ejedœdd„Zejjejejejedœdd„ƒZejejejedœdd„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_normc                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	Ú	GroupNormé    çñhãˆµøä>Tc                    s    t ƒ j||||d� tƒ | _d S )N)ÚepsÚaffine©ÚsuperÚ__init__r   Ú	fast_norm)ÚselfÚnum_channelsÚ
num_groupsr   r   ©Ú	__class__© úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/norm.pyr      s    zGroupNorm.__init__c                 C   s<   | j rt|| j| j| j| jƒS t || j| j| j| j¡S d S ©N©r   r   r   ÚweightÚbiasr   ÚFZ
group_norm©r   Úxr   r   r   Úforward   s    zGroupNorm.forward)r	   r
   T)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r      s   r   c                       s4   e Zd ZdZ‡ fdd„Zejejdœdd„Z‡  ZS )Ú
GroupNorm1zL Group Normalization with 1 group.
    Input: tensor in shape [B, C, *]
    c                    s   t ƒ jd|f|Ž tƒ | _d S )Nr   r   )r   r   Úkwargsr   r   r   r   #   s    zGroupNorm1.__init__©r   Úreturnc                 C   s<   | j rt|| j| j| j| jƒS t || j| j| j| j¡S d S r   r   r   r   r   r   r   '   s    zGroupNorm1.forward©	r    r!   r"   Ú__doc__r   ÚtorchÚTensorr   r#   r   r   r   r   r$      s   r$   c                       s6   e Zd ZdZd	‡ fdd„	Zejejdœdd„Z‡  ZS )
Ú	LayerNormz# LayerNorm w/ fast norm option
    ç�íµ ÷Æ°>Tc                    s   t ƒ j|||d� tƒ | _d S ©N)r   Úelementwise_affine©r   r   r   Ú
_fast_norm©r   r   r   r   r   r   r   r   1   s    zLayerNorm.__init__r&   c                 C   s>   | j r t|| j| j| j| jƒ}nt || j| j| j| j¡}|S r   )r1   r   Únormalized_shaper   r   r   r   Ú
layer_normr   r   r   r   r   5   s    zLayerNorm.forward)r-   Tr(   r   r   r   r   r,   .   s   r,   c                       s6   e Zd ZdZd	‡ fdd„	Zejejdœdd„Z‡  ZS )
ÚLayerNorm2dz5 LayerNorm for channels of '2D' spatial NCHW tensors r-   Tc                    s   t ƒ j|||d� tƒ | _d S r.   r0   r2   r   r   r   r   ?   s    zLayerNorm2d.__init__r&   c                 C   s^   |  dddd¡}| jr0t|| j| j| j| jƒ}nt || j| j| j| j¡}|  dddd¡}|S ©Nr   é   é   r   )	Úpermuter1   r   r3   r   r   r   r   r4   r   r   r   r   r   C   s    zLayerNorm2d.forward)r-   Tr(   r   r   r   r   r5   =   s   r5   )Útensorr'   c                 C   s$   t j ¡ r|  ¡ S | jt jd�S d S )N)Zmemory_format)r*   ÚjitZis_scriptingZis_contiguousZcontiguous_format)r:   r   r   r   Ú_is_contiguousM   s    
r<   )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)ÚdimZunbiasedÚkeepdim)r*   Zvar_meanÚrsqrt)r   r   r   r   ÚsÚur   r   r   Ú_layer_norm_cfU   s    (rB   c                 C   sl   | j ddd�}| |  j ddd�||   d¡}| | t || ¡ } | | dddd¡ | dddd¡ } | S )Nr   T)r=   r>   r   éÿÿÿÿ)ZmeanÚclampr*   r?   Úview)r   r   r   r   rA   r@   r   r   r   Ú_layer_norm_cf_sqm]   s
     $rF   c                       s2   e Zd ZdZd‡ fdd„	Zejdœ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.
    r-   c                    s   t ƒ j||d� d S )N)r   )r   r   )r   r   r   r   r   r   r   n   s    zLayerNormExp2d.__init__©r'   c                 C   sT   t |ƒr<t | dddd¡| j| j| j| j¡ dddd¡}nt|| j| j| jƒ}|S r6   )	r<   r   r4   r9   r3   r   r   r   rB   r   r   r   r   r   q   s        ÿ   ÿzLayerNormExp2d.forward)r-   r(   r   r   r   r   rG   e   s   rG   c                       sv   e Zd ZU dZdddgZeedf ed< eed< e	ed< ddd	œ‡ fd
d„Z
dd	œdd„Zejejdœdd„Z‡  ZS )ÚRmsNormz. RmsNorm w/ fast (apex) norm if available
    r3   r   r/   .r-   TNrH   c                    sx   ||dœ}t ƒ  ¡  |}t|tjƒr*|f}t|ƒ| _|| _|| _| jr`t	 
tj| jf|Ž¡| _n|  dd ¡ |  ¡  d S )N)ÚdeviceÚdtyper   )r   r   Ú
isinstanceÚnumbersÚIntegralÚtupler3   r   r/   ÚnnÚ	Parameterr*   Úemptyr   Zregister_parameterÚreset_parameters)r   Zchannelsr   r   rJ   rK   Zfactory_kwargsr3   r   r   r   r   ‚   s    


zRmsNorm.__init__c                 C   s   | j rtj | j¡ d S r   )r/   rP   ÚinitZones_r   )r   r   r   r   rS   “   s    zRmsNorm.reset_parametersr&   c                 C   s   t || j| j| jƒ}|S r   )r   r3   r   r   r   r   r   r   r   —   s    zRmsNorm.forward)r-   TNN)r    r!   r"   r)   Z__constants__r   ÚintÚ__annotations__ÚfloatÚboolr   rS   r*   r+   r   r#   r   r   r   r   rI   z   s   

rI   )r)   rM   Útypingr   r*   Ztorch.nnrP   Ztorch.nn.functionalZ
functionalr   r   r   r   r   r   r   r$   r,   r5   r+   rX   r<   r;   ÚscriptrW   rB   rF   rG   ÚModulerI   r   r   r   r   Ú<module>   s    