
    Ng                        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  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j        defdZdej        dej        dej        defdZdej        dej        dej        defdZ G d dej                  Z G d dej                  Z G 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                   &     e Zd Zd fd	Zd Z xZS )	GroupNorm    h㈵>Tc                 x    t                                          ||||           t                      | _        d S )N)epsaffinesuper__init__r   	fast_norm)selfnum_channels
num_groupsr   r   	__class__s        L/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/norm.pyr   zGroupNorm.__init__   s3    \s6JJJ%    c                     | j         r't          || 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   K    > 	V"1dot{DItxXXX<4?DKDHUUUr   )r   r   T)__name__
__module____qualname__r   r#   __classcell__r   s   @r   r
   r
      sS        ( ( ( ( ( (
V V V V V V Vr   r
   c                   F     e Zd ZdZ 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, *]
    c                 d     t                      j        d|fi | t                      | _        d S )Nr   r   )r   r   kwargsr   s      r   r   zGroupNorm1.__init__#   s3    L33F333%r   r"   returnc                     | j         r't          || 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   torchTensorr#   r(   r)   s   @r   r+   r+      sr         ( ( ( ( (V V%, V V V V V V V Vr   r+   c                   H     e Zd ZdZd fd	Zdej        dej        fdZ xZS )		LayerNormz# LayerNorm w/ fast norm option
    ư>Tc                 v    t                                          |||           t                      | _        d S N)r   elementwise_affiner   r   r   
_fast_normr   r   r   r   r   s       r   r   zLayerNorm.__init__1   1    36JJJ&..r   r"   r.   c                     | j         r(t          || j        | j        | j        | j                  }n,t          j        || j        | j        | j        | j                  }|S r   )r;   r   normalized_shaper   r   r   r   
layer_normr!   s     r   r#   zLayerNorm.forward5   sT    ? 	Y4#8$+tyRVRZ[[AAQ 5t{DItxXXAr   r6   Tr0   r)   s   @r   r5   r5   .   sm         ) ) ) ) ) ) %,        r   r5   c                   H     e Zd ZdZd fd	Zdej        dej        fdZ xZS )	LayerNorm2dz5 LayerNorm for channels of '2D' spatial NCHW tensors r6   Tc                 v    t                                          |||           t                      | _        d S r8   r:   r<   s       r   r   zLayerNorm2d.__init__?   r=   r   r"   r.   c                    |                     dddd          }| j        r(t          || j        | j        | j        | j                  }n,t          j        || j        | j        | j        | j                  }|                     dddd          }|S Nr         r   )	permuter;   r   r?   r   r   r   r   r@   r!   s     r   r#   zLayerNorm2d.forwardC   s    IIaAq!!? 	Y4#8$+tyRVRZ[[AAQ 5t{DItxXXAIIaAq!!r   rA   r0   r)   s   @r   rC   rC   =   si        ??) ) ) ) ) ) %,        r   rC   tensorr.   c                     t           j                                        r|                                 S |                     t           j                  S )N)memory_format)r2   jitis_scriptingis_contiguouscontiguous_format)rJ   s    r   _is_contiguousrQ   M   sE    y K##%%%##%2I#J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)r2   var_meanrsqrt)r"   r   r   r   sus         r   _layer_norm_cfrZ   U   sl    >!UDAAADAq	
Q%+a#g&&&A	F111dD=!!DD$$77AHr   c                 <   |                      dd          }| | z                       dd          ||z  z
                      d          }| |z
  t          j        ||z             z  } | |                    dddd          z  |                    dddd          z   } | S )Nr   T)rS   rU   r   )meanclampr2   rW   view)r"   r   r   r   rY   rX   s         r   _layer_norm_cf_sqmr`   \   s    	1d##A
a%!T	*	*a!e	4;;A>>A	
Q%+a#g&&&A	FKK2q!$$$tyyB1'='==AHr   c                   :     e Zd ZdZd 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.
    r6   c                 N    t                                          ||           d S )N)r   )r   r   )r   r   r   r   s      r   r   zLayerNormExp2d.__init__m   s&    3/////r   r.   c                    t          |          rYt          j        |                    dddd          | j        | j        | j        | j                                      dddd          }n!t          || j        | j        | j                  }|S rF   )	rQ   r   r@   rI   r?   r   r   r   rZ   r!   s     r   r#   zLayerNormExp2d.forwardp   s    ! 	D		!Q1%%t'<dk49VZV^` ``g`ghiklnoqr`s`s A q$+ty$(CCAr   )r6   r0   r)   s   @r   rb   rb   d   sd         0 0 0 0 0 0EL        r   rb   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 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
    r?   r   r9   .r?   r   r9   r6   TNr.   c                    ||d}t                                                       |}t          |t          j                  r|f}t          |          | _        || _        || _        | j        r/t          j
        t          j        | j        fi |          | _        n|                     dd            |                                  d S N)devicedtyper   r   r   
isinstancenumbersIntegraltupler?   r   r9   nn	Parameterr2   emptyr   register_parameterreset_parameters	r   channelsr   r   rk   rl   factory_kwargsr?   r   s	           r   r   zRmsNorm.__init__       $*U;;#&(899 	3 02 %&6 7 7"(" 	4,u{43H'['[N'['[\\DKK##Hd333r   c                 `    | j         r&t          j                            | j                   d S d S r   r9   rr   initones_r   r   s    r   rv   zRmsNorm.reset_parameters   3    " 	'GMM$+&&&&&	' 	'r   r"   c                 H    t          || j        | j        | j                  }|S r   )r   r?   r   r   r!   s     r   r#   zRmsNorm.forward   s#     !T2DKJJr   r6   TNNr.   Nr%   r&   r'   r1   __constants__r   int__annotations__floatboolr   rv   r2   r3   r#   r(   r)   s   @r   rf   rf   y   s          EEEMCHo%%%	JJJ             "' ' ' ' %,        r   rf   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 fdZ
ddZdej        d
ej        fdZ xZS )	RmsNorm2drg   rh   .r?   r   r9   r6   TNr.   c                    ||d}t                                                       |}t          |t          j                  r|f}t          |          | _        || _        || _        | j        r/t          j
        t          j        | j        fi |          | _        n|                     dd            |                                  d S rj   rm   rw   s	           r   r   zRmsNorm2d.__init__   rz   r   c                 `    | j         r&t          j                            | j                   d S d S r   r|   r   s    r   rv   zRmsNorm2d.reset_parameters   r   r   r"   c                     |                     dddd          }t          || j        | j        | j                  }|                     dddd          }|S rF   )rI   r   r?   r   r   r!   s     r   r#   zRmsNorm2d.forward   sQ    IIaAq!! !T2DKJJIIaAq!!r   r   r   r   r)   s   @r   r   r      s          EEEMCHo%%%	JJJ             "' ' ' ' %,        r   r   )r1   ro   typingr   r2   torch.nnrr   torch.nn.functional
functionalr   r   r   r   r   r   r
   r+   r5   rC   r3   r   rQ   r   rZ   r`   rb   Modulerf   r    r   r   <module>r      sm                           T T T T T T T T T T T T
V 
V 
V 
V 
V 
V 
V 
VV V V V V V V V            ",    K5< KD K K K Kel EL  SX    %,  EL W\        R\   *! ! ! ! !bi ! ! !H# # # # #	 # # # # #r   