
    khM                     L   d Z ddlmZmZmZmZ ddlZddlmZ ddlm	Z
 ddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZmZ ddlmZ 	 ddlmZ d$dZ G d dej>                        Z  G d dejB                        Z"d%dZ# G d dej                  jH                        Z%d Z&d Z'd Z( G d dejR                        Z* G d dejR                        Z+ G d dejX                        Z- G d dejX                        Z. G d  d!e      Z/ G d" d#e      Z0y# e$ r	 ddlmZ Y w xY w)&aw   Normalization + Activation Layers

Provides Norm+Act fns for standard PyTorch norm layers such as
* BatchNorm
* GroupNorm
* LayerNorm

This allows swapping with alternative layers that are natively both norm + act such as
* EvoNorm (evo_norm.py)
* FilterResponseNorm (filter_response_norm.py)
* InplaceABN (inplace_abn.py)

Hacked together by / Copyright 2022 Ross Wightman
    )UnionListOptionalAnyN)nn)
functional)FrozenBatchNorm2d   )create_act_layer)is_fast_normfast_group_normfast_layer_normfast_rms_norm
rms_norm2dfast_rms_norm2d)RmsNorm	RmsNorm2d)_assert)rms_normc                     |xs i }|j                  d|       d }|rt        | fi |}|t        j                         S |S )Ninplace)
setdefaultr   r   Identity)	act_layer
act_kwargsr   	apply_actacts        P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/norm_act.py_create_actr   !   sH    !rJ)W-
Cy7J7K2;;=0S0    c                   T     e Zd ZdZdddddej
                  dddddf fd	Zd Z xZS )BatchNormAct2dzBatchNorm + Activation

    This module performs BatchNorm + Activation in a manner that will remain backwards
    compatible with weights trained with separate bn, act. This is why we inherit from BN
    instead of composing it as a .bn member.
    h㈵>g?TNc                     	 ||d}t        t        | 
  |f||||d| |
 |
       nt	        j
                         | _        t        |||	|      | _        y # t        $ r t         t        |   |||||       Y Zw xY w)N)devicedtype)epsmomentumaffinetrack_running_statsr   r   r   )	superr"   __init__	TypeErrorr   r   dropr   r   )selfnum_featuresr'   r(   r)   r*   r   r   r   r   
drop_layerr%   r&   factory_kwargs	__class__s                 r   r-   zBatchNormAct2d.__init__1   s    	(.?N.$0!$7 !" %/$:JL	yZ\ef  	.$0!$7 1 	s   A !A<;A<c           
         t        |j                  dk(  d|j                   d       | j                  d}n| j                  }| j                  rd| j                  rX| j
                  L| j
                  j                  d       | j                  dt        | j
                        z  }n| j                  }	 | j                  rd}n| j                  d u xr | j                  d u }	 t        j                  || j                  r| j                  r| j                  nd | j                  r| j                  r| j                  nd | j                  | j                  ||| j                        }| j                  |      }| j!                  |      }|S )N   zexpected 4D input (got zD input)g        r
   g      ?T)r   ndimr(   trainingr*   num_batches_trackedadd_floatrunning_meanrunning_varF
batch_normweightbiasr'   r/   r   )r0   xexponential_average_factorbn_trainings       r   forwardzBatchNormAct2d.forwardV   sR   !6qvvhhGH
 == ),&)-&==T55''3((--a0==(14uT=U=U7V1V.15.	 ==K,,4T4;K;Kt;SK	
 LL%)]]d6N6NDTX$(MMT5M5MDSWKKII&HH

 IIaLHHQKr    )	__name__
__module____qualname____doc__r   ReLUr-   rE   __classcell__r4   s   @r   r"   r"   *   s;      $gg#gJ0r    r"   c                   P     e Zd Zdej                  dej                  f fdZ xZS )SyncBatchNormActrB   returnc                     t         |   |      }t        | d      r| j                  |      }t        | d      r| j	                  |      }|S )Nr/   r   )r,   rE   hasattrr/   r   )r0   rB   r4   s     r   rE   zSyncBatchNormAct.forward   sD    GOA4 		!A4Ar    )rF   rG   rH   torchTensorrE   rK   rL   s   @r   rN   rN      s#    
 %,,  r    rN   c                    | }t        | t        j                  j                  j                  j
                        rxt        | t              rft        | j                  | j                  | j                  | j                  | j                  |      }| j                  |_        | j                  |_        nVt        j                  j                  | j                  | j                  | j                  | j                  | j                  |      }| j                  r?t        j                          5  | j"                  |_        | j$                  |_        d d d        | j&                  |_        | j(                  |_        | j*                  |_        | j,                  |_        t/        | d      r| j0                  |_        | j3                         D ]!  \  }}|j5                  |t7        ||             # ~ |S # 1 sw Y   xY w)N)process_groupqconfig)
isinstancerR   r   modules	batchnorm
_BatchNormr"   rN   r1   r'   r(   r)   r*   r   r/   SyncBatchNormno_gradr@   rA   r<   r=   r9   r8   rQ   rV   named_children
add_moduleconvert_sync_batchnorm)modulerU   module_outputnamechilds        r   r_   r_      s   M&%((**44??@fn-,##

**+M !'

M!'M "HH22##

**M == 1'-}}$%+[["1 &,%8%8"$*$6$6!,2,F,F)!'69%$*NNM!,,. Ue  '=e]'STU1 1s   (#G++G4c                        e Zd ZdZddej
                  dddfdedef fdZde	d	e
d
e	dedee
   dee
   dee
   f fdZdej                  dej                  fdZde
fdZ xZS )FrozenBatchNormAct2da$  
    BatchNormAct2d where the batch statistics and the affine parameters are fixed

    Args:
        num_features (int): Number of features ``C`` from an expected input of size ``(N, C, H, W)``
        eps (float): a value added to the denominator for numerical stability. Default: 1e-5
    r#   TNr1   r'   c                    t         |           || _        | j                  dt	        j
                  |             | j                  dt	        j                  |             | j                  dt	        j                  |             | j                  dt	        j
                  |             | |       nt        j                         | _	        t        ||||      | _        y )Nr@   rA   r<   r=   r+   )r,   r-   r'   register_bufferrR   oneszerosr   r   r/   r   r   )	r0   r1   r'   r   r   r   r   r2   r4   s	           r   r-   zFrozenBatchNormAct2d.__init__   s     	Xuzz,'?@VU[[%>?^U[[-FG]EJJ|,DE$.$:JL	yZ\efr    
state_dictprefixlocal_metadatastrictmissing_keysunexpected_keys
error_msgsc           	      H    |dz   }||v r||= t         	|   |||||||       y )Nr9   )r,   _load_from_state_dict)
r0   rj   rk   rl   rm   rn   ro   rp   num_batches_tracked_keyr4   s
            r   rr   z*FrozenBatchNormAct2d._load_from_state_dict   s?     #)+@"@"j023%oWa	
r    rB   rO   c                    | j                   j                  dddd      }| j                  j                  dddd      }| j                  j                  dddd      }| j                  j                  dddd      }||| j
                  z   j                         z  }|||z  z
  }||z  |z   }| j                  | j                  |            }|S )Nr
   )	r@   reshaperA   r=   r<   r'   rsqrtr   r/   )r0   rB   wbrvrmscalerA   s           r   rE   zFrozenBatchNormAct2d.forward   s     KK2q!,IIaQ*%%aQ2&&q"a3R$((]))++2:~IHHTYYq\"r    c                     | j                   j                   d| j                  j                  d    d| j                   d| j
                   dS )N(r   z, eps=z, act=))r4   rF   r@   shaper'   r   )r0   s    r   __repr__zFrozenBatchNormAct2d.__repr__   sJ    ..))*!DKK,=,=a,@+AzQWX\X`X`Waabccr    )rF   rG   rH   rI   r   rJ   intr;   r-   dictstrboolr   rr   rR   rS   rE   r   rK   rL   s   @r   re   re      s     ''gg g(

 
 	

 
 3i
 c
 I
$ %,, d# dr    re   c                 F   | }t        | t        t        f      rDt        | j                        }| j                  |_        | j
                  |_        | j
                  r| j                  j                  j                         j                         |j                  _        | j                  j                  j                         j                         |j                  _        | j                  j                  |j                  _        | j                  j                  |j                  _        | j                  |_        | j                  |_        | j                  |_        |S t        | t         j"                  j$                  j&                  j(                  t         j"                  j$                  j&                  j*                  f      r"t-        | j                        }| j                  |_        | j
                  |_        | j
                  r| j                  j                  j                         j                         |j                  _        | j                  j                  j                         j                         |j                  _        | j                  j                  |j                  _        | j                  j                  |j                  _        | j                  |_        |S | j/                         D ]'  \  }}t1        |      }||us|j3                  ||       ) |S )a  
    Converts all `BatchNorm2d` and `SyncBatchNorm` or `BatchNormAct2d` and `SyncBatchNormAct2d` layers
    of provided module into `FrozenBatchNorm2d` or `FrozenBatchNormAct2d` respectively.

    Args:
        module (torch.nn.Module): Any PyTorch module.

    Returns:
        torch.nn.Module: Resulting module

    Inspired by https://github.com/pytorch/pytorch/blob/a5895f85be0f10212791145bfedc0261d364f103/torch/nn/modules/batchnorm.py#L762
    )rW   r"   rN   re   r1   r)   r@   dataclonedetachrA   r<   r=   r'   r/   r   rR   r   rX   rY   BatchNorm2dr[   r	   r]   freeze_batch_norm_2dr^   r`   resrb   rc   	new_childs        r   r   r     s5    C&>+;<="6#6#67!..]]
==$mm00668??ACJJO"KK,,224;;=CHHM & 3 3 8 8%1166**;;**  J 
FUXX--77CCUXXEUEUE_E_EmEmn	o 3 34!..]]
==$mm00668??ACJJO"KK,,224;;=CHHM & 3 3 8 8%1166** J	 "002 	0KD%,U3I%tY/	0 Jr    c                 .   | }t        | t              r"t        | j                        }| j                  r| j
                  j                  j                         j                         |j
                  _        | j                  j                  j                         j                         |j                  _        | j                  j                  |j                  _        | j                  j                  |j                  _        | j                  |_        | j                  |_        | j                  |_        |S t        | t              rt         j"                  j%                  | j                        }| j                  r| j
                  j                  j                         j                         |j
                  _        | j                  j                  j                         j                         |j                  _        | j                  j                  |j                  _        | j                  j                  |j                  _        | j                  |_        |S | j'                         D ]'  \  }}t)        |      }||us|j+                  ||       ) |S )a  
    Converts all `FrozenBatchNorm2d` layers of provided module into `BatchNorm2d`. If `module` is itself and instance
    of `FrozenBatchNorm2d`, it is converted into `BatchNorm2d` and returned. Otherwise, the module is walked
    recursively and submodules are converted in place.

    Args:
        module (torch.nn.Module): Any PyTorch module.

    Returns:
        torch.nn.Module: Resulting module

    Inspired by https://github.com/pytorch/pytorch/blob/a5895f85be0f10212791145bfedc0261d364f103/torch/nn/modules/batchnorm.py#L762
    )rW   re   r"   r1   r)   r@   r   r   r   rA   r<   r=   r'   r/   r   r	   rR   r   r   r]   unfreeze_batch_norm_2dr^   r   s        r   r   r   .  s    C&./V001==$mm00668??ACJJO"KK,,224;;=CHHM & 3 3 8 8%1166**;;** J 
F-	.hh""6#6#67==$mm00668??ACJJO"KK,,224;;=CHHM & 3 3 8 8%1166** J	 "002 	0KD%.u5I%tY/	0 Jr    c                 (    |r| |z  dk(  sJ | |z  S |S )Nr    )num_channels
num_groups
group_sizes      r   _num_groupsr   W  s)    j(A---z))r    c            	       L     e Zd Zdddddej                  dddf	 fd	Zd Z xZS )GroupNormAct    r#   TNc                     t         t        |   t        |||      |||       |
 |
       nt	        j
                         | _        t        |||	|      | _        t               | _
        y )Nr'   r)   r+   )r,   r   r-   r   r   r   r/   r   r   r   
_fast_norm)r0   r   r   r'   r)   r   r   r   r   r   r2   r4   s              r   r-   zGroupNormAct.__init__`  sb     	lD*j*=	 	+ 	
 %/$:JL	yZ\ef&.r    c                 T   | j                   r8t        || j                  | j                  | j                  | j
                        }nAt        j                  || j                  | j                  | j                  | j
                        }| j                  |      }| j                  |      }|S N
r   r   r   r@   rA   r'   r>   
group_normr/   r   r0   rB   s     r   rE   zGroupNormAct.forwardx  p    ??4??DKKDHHUAQdiiRAIIaLHHQKr    rF   rG   rH   r   rJ   r-   rE   rK   rL   s   @r   r   r   ^  s.    
 gg)0r    r   c                   H     e Zd Zdddej                  dddf fd	Zd Z xZS )GroupNorm1Actr#   TNc	                     t         t        |   d|||       | |       nt        j                         | _        t        ||||      | _        t               | _	        y )Nr
   r   r+   )
r,   r   r-   r   r   r/   r   r   r   r   
r0   r   r'   r)   r   r   r   r   r2   r4   s
            r   r-   zGroupNorm1Act.__init__  sO     	mT+A|V+T$.$:JL	yZ\ef&.r    c                 T   | j                   r8t        || j                  | j                  | j                  | j
                        }nAt        j                  || j                  | j                  | j                  | j
                        }| j                  |      }| j                  |      }|S r   r   r   s     r   rE   zGroupNorm1Act.forward  r   r    r   rL   s   @r   r   r     s(     gg)"r    r   c                   t     e Zd Zdddej                  dddfdeeee   ej                  f   f fdZ
d Z xZS )LayerNormActr#   TNnormalization_shapec	                     t         t        |   |||       | |       nt        j                         | _        t        ||||      | _        t               | _	        y N)r'   elementwise_affiner+   )
r,   r   r-   r   r   r/   r   r   r   r   )
r0   r   r'   r)   r   r   r   r   r2   r4   s
            r   r-   zLayerNormAct.__init__  sO     	lD*+>C\b*c$.$:JL	yZ\ef&.r    c                 T   | j                   r8t        || j                  | j                  | j                  | j
                        }nAt        j                  || j                  | j                  | j                  | j
                        }| j                  |      }| j                  |      }|S r   )
r   r   normalized_shaper@   rA   r'   r>   
layer_normr/   r   r   s     r   rE   zLayerNormAct.forward  sw    ??4#8#8$++tyyRVRZRZ[AQ 5 5t{{DIItxxXAIIaLHHQKr    )rF   rG   rH   r   rJ   r   r   r   rR   Sizer-   rE   rK   rL   s   @r   r   r     sD     gg)!&sDIuzz'A!B)"r    r   c                   H     e Zd Zdddej                  dddf fd	Zd Z xZS )LayerNormAct2dr#   TNc	                     t         t        |   |||       | |       nt        j                         | _        t        ||||      | _        t               | _	        y r   )
r,   r   r-   r   r   r/   r   r   r   r   r   s
            r   r-   zLayerNormAct2d.__init__  sN     	nd,\sW],^$.$:JL	yZ\ef&.r    c                    |j                  dddd      }| j                  r8t        || j                  | j                  | j
                  | j                        }nAt        j                  || j                  | j                  | j
                  | j                        }|j                  dddd      }| j                  |      }| j                  |      }|S )Nr         r
   )permuter   r   r   r@   rA   r'   r>   r   r/   r   r   s     r   rE   zLayerNormAct2d.forward  s    IIaAq!??4#8#8$++tyyRVRZRZ[AQ 5 5t{{DIItxxXAIIaAq!IIaLHHQKr    r   rL   s   @r   r   r     s(     gg) 	r    r   c                   ~     e Zd ZdZdddej
                  dddf fd	Zdej                  dej                  fdZ	 xZ
S )	
RmsNormAct*   RMSNorm + Activation for '2D' NCHW tensors

    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.
    ư>TNc	                     t         	|   |||       | |       nt        j                         | _        t        ||||      | _        t               | _        y N)channelsr'   r)   r+   	r,   r-   r   r   r/   r   r   r   r   r   s
            r   r-   zRmsNormAct.__init__  K     	,CG$.$:JL	yZ\ef&.r    rB   rO   c                    | j                   r-t        || j                  | j                  | j                        }n,t        || j                  | j                  | j                        }| j                  |      }| j                  |      }|S r   )r   r   r   r@   r'   r   r/   r   r   s     r   rE   zRmsNormAct.forward  sd    ??a!6!6TXXNAD114;;IAIIaLHHQKr    rF   rG   rH   rI   r   rJ   r-   rR   rS   rE   rK   rL   s   @r   r   r     C     gg)  %,, r    r   c                   ~     e Zd ZdZdddej
                  dddf fd	Zdej                  dej                  fdZ	 xZ
S )	RmsNormAct2dr   r   TNc	                     t         	|   |||       | |       nt        j                         | _        t        ||||      | _        t               | _        y r   r   r   s
            r   r-   zRmsNormAct2d.__init__  r   r    rB   rO   c                    | j                   r-t        || j                  | j                  | j                        }n,t        || j                  | j                  | j                        }| j                  |      }| j                  |      }|S r   )r   r   r   r@   r'   r   r/   r   r   s     r   rE   zRmsNormAct2d.forward  sd    ??4#8#8$++txxPA1d33T[[$((KAIIaLHHQKr    r   rL   s   @r   r   r     r   r    r   )NFTr   )1rI   typingr   r   r   r   rR   r   torch.nnr   r>   torchvision.ops.miscr	   
create_actr   	fast_normr   r   r   r   r   r   normr   r   trace_utilsr   torch.nn.functionalr   ImportErrorr   r   r"   r[   rN   r_   Modulere   r   r   r   	GroupNormr   r   	LayerNormr   r   r   r   r   r    r   <module>r      s    . -   $ 2 ( q q $  $,
1\R^^ \~r'' (V=d588?? =d@)X&R!2<< !HBLL 82<< 8R\\ : B9 w  $#$s   
D D#"D#