a
    d                     @   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__ Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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i | 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   )meanclampr*   r?   view)r   r   r   r   rA   r@   r   r   r   _layer_norm_cf_sqm]   s
     $rG   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   rH   e   s   rH   c                       st   e Zd ZU dZg d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/   .r3   r   r/   r-   TNrI   c                    s|   ||d}t    |}t|tjr*|f}t|| _|| _|| _| jrdt	
tj| jfi || _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   rK   rL   Zfactory_kwargsr3   r   r   r   r      s    


zRmsNorm.__init__c                 C   s   | j rtj| j d S r   )r/   rQ   initZones_r   )r   r   r   r   rT      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   rT   r*   r+   r   r#   r   r   r   r   rJ   z   s   
rJ   )r)   rN   typingr   r*   Ztorch.nnrQ   Ztorch.nn.functionalZ
functionalr   r   r   r   r   r   r   r$   r,   r5   r+   rY   r<   r;   scriptrX   rB   rG   rH   ModulerJ   r   r   r   r   <module>   s    