
    ^j)                     v   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ  G d d	e	j                        Z G d
 de	j                        Z eee	j"                  d      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y)zl MLP module w/ dropout and configurable activation layer

Hacked together by / Copyright 2020 Ross Wightman
    )partial)OptionalTypeUnionTuple)nn   )GlobalResponseNorm)	to_2tuplec                        e Zd ZdZddej
                  ddddddf	dedee   dee   d	eej                     d
eeej                        de
eeeef   f   de
eeeef   f   def fdZd Z xZS )Mlpz MLP as used in Vision Transformer, MLP-Mixer and related networks

    NOTE: When use_conv=True, expects 2D NCHW tensors, otherwise N*C expected.
    NT        Fin_featureshidden_featuresout_features	act_layer
norm_layerbiasdropuse_convc                    |	|
d}t         |           |xs |}|xs |}t        |      }t        |      }|rt        t        j
                  d      nt        j                  } |||fd|d   i|| _         |       | _        t	        j                  |d         | _
        |	 ||fi |nt	        j                         | _         |||fd|d   i|| _        t	        j                  |d         | _        y )Ndevicedtyper	   kernel_sizer   r   )super__init__r   r   r   Conv2dLinearfc1actDropoutdrop1Identitynormfc2drop2)selfr   r   r   r   r   r   r   r   r   r   dd
drop_probslinear_layer	__class__s                 Z/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/mlp.pyr   zMlp.__init__   s     /#2{)8[t_
<Dwryya8"))_Q47QbQ;ZZ
1.
9C9OJ5"5UWU`U`Ub	RDGRrRZZ
1.
    c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S N)r!   r"   r$   r&   r'   r(   r)   xs     r.   forwardzMlp.forward/   sU    HHQKHHQKJJqMIIaLHHQKJJqMr/   __name__
__module____qualname____doc__r   GELUintr   r   Moduler   boolr   floatr   r4   __classcell__r-   s   @r.   r   r      s     .2*.)+483768"// &c]/ #3-	/
 BII/ !bii1/ eD$J//0/ uUE\223/ /8r/   r   c                        e Zd ZdZddej
                  dddddddf
dedee   dee   d	eej                     d
eeej                        de
eeeef   f   de
eeeef   f   dedef fdZd Zd Z xZS )GluMlpz MLP w/ GLU style gating
    See: https://arxiv.org/abs/1612.08083, https://arxiv.org/abs/2002.05202

    NOTE: When use_conv=True, expects 2D NCHW tensors, otherwise N*C expected.
    NTr   Fr   r   r   r   r   r   r   r   	gate_lastc                 2   |
|d}t         |           |xs |}|xs |}|dz  dk(  sJ t        |      }t        |      }|rt        t        j
                  d      nt        j                  }|rdnd| _        |	| _         |||fd|d   i|| _	         |       | _
        t	        j                  |d         | _        | ||dz  fi |nt	        j                         | _         ||dz  |fd|d   i|| _        t	        j                  |d         | _        y )Nr      r   r	   r   r   )r   r   r   r   r   r   r    	chunk_dimrC   r!   r"   r#   r$   r%   r&   r'   r(   )r)   r   r   r   r   r   r   r   r   rC   r   r   r*   r+   r,   r-   s                  r.   r   zGluMlp.__init__?   s    /#2{)8["a'''t_
<Dwryya8"))&B"_Q47QbQ;ZZ
1.
>H>TJ!3:r:Z\ZeZeZg	1 4lWaWTVWZZ
1.
r/   c                    | j                   j                  Zt        j                  j	                  | j                   j                  | j                   j                  j
                  d   dz  d         t        j                  j                  | j                   j                  | j                   j                  j
                  d   dz  d  d       y )Nr   rE   ư>std)r!   r   r   initones_shapenormal_weightr)   s    r.   init_weightszGluMlp.init_weights_   s    88==$GGMM$((--(;(;A(>!(C(DEF
(=(=a(@A(E(FGTRr/   c                 X   | j                  |      }|j                  d| j                        \  }}| j                  r|| j	                  |      z  n| j	                  |      |z  }| j                  |      }| j                  |      }| j                  |      }| j                  |      }|S )NrE   )dim)	r!   chunkrG   rC   r"   r$   r&   r'   r(   )r)   r3   x1x2s       r.   r4   zGluMlp.forwarde   s    HHQK/B!%B"TXXb\B5FJJqMIIaLHHQKJJqMr/   )r6   r7   r8   r9   r   Sigmoidr;   r   r   r<   r   r=   r   r>   r   rR   r4   r?   r@   s   @r.   rB   rB   9   s     .2*.)+483768""// &c]/ #3-	/
 BII/ !bii1/ eD$J//0/ uUE\223/ / /@Sr/   rB   F)r   rC   c                        e Zd ZdZddej
                  ddddddf	dedee   dee   d	eej                     d
eeej                        de
eeeef   f   de
eeeef   f   def fdZd Zd Z xZS )SwiGLUz SwiGLU
    NOTE: GluMLP above can implement SwiGLU, but this impl has split fc1 and
    better matches some other common impl which makes mapping checkpoints simpler.
    NTr   r   r   r   r   r   r   r   r   align_toc                     |	|
d}t         |           |xs |}|xs |}t        |      }t        |      }|r	|| |z  z   }t        j                  ||fd|d   i|| _        t        j                  ||fd|d   i|| _         |       | _        t        j                  |d         | _	        |	 ||fi |nt        j                         | _        t        j                  ||fd|d   i|| _        t        j                  |d         | _        y )Nr   r   r   r	   )r   r   r   r   r    fc1_gfc1_xr"   r#   r$   r%   r&   r'   r(   )r)   r   r   r   r   r   r   r   r[   r   r   r*   r+   r-   s                r.   r   zSwiGLU.__init__x   s    /#2{)8[t_
-/1AH1LMOYY{OP$q'PRP
YY{OP$q'PRP
;ZZ
1.
9C9OJ5"5UWU`U`Ub	99_lOaOBOZZ
1.
r/   c                     | j                   j                  3t        j                  j	                  | j                   j                         t        j                  j                  | j                   j                  d       y )NrI   rJ   )r]   r   r   rL   rM   rO   rP   rQ   s    r.   rR   zSwiGLU.init_weights   sF    ::??&GGMM$**//*


))t4r/   c                     | j                  |      }| j                  |      }| j                  |      |z  }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S r1   )r]   r^   r"   r$   r&   r'   r(   )r)   r3   x_gates      r.   r4   zSwiGLU.forward   sh    AJJqMHHVq JJqMIIaLHHQKJJqMr/   )r6   r7   r8   r9   r   SiLUr;   r   r   r<   r   r=   r   r>   r   rR   r4   r?   r@   s   @r.   rZ   rZ   s   s     .2*.)+483768// &c]/ #3-	/
 BII/ !bii1/ eD$J//0/ uUE\223/ />5r/   rZ   c                        e Zd ZdZddej
                  ddddddf	dedee   dee   deej                     d	eeej                        d
eeej                        de
eeeef   f   de
eeeef   f   f fdZd Z xZS )GatedMlpz MLP as used in gMLP
    NTr   r   r   r   r   r   
gate_layerr   r   c                 :   |	|
d}t         |           |xs |}|xs |}t        |      }t        |      }t        j                  ||fd|d   i|| _         |       | _        t        j                  |d         | _        ||dz  dk(  sJ  ||fi || _	        |dz  }nt        j                         | _	        |	 ||fi |nt        j                         | _        t        j                  ||fd|d   i|| _        t        j                  |d         | _        y )Nr   r   r   rE   r	   )r   r   r   r   r    r!   r"   r#   r$   gater%   r&   r'   r(   )r)   r   r   r   r   r   re   r   r   r   r   r*   r+   r-   s                r.   r   zGatedMlp.__init__   s    /#2{)8[t_
99[/NQN2N;ZZ
1.
!"Q&!+++"?9b9DI-2ODI9C9OJ5"5UWU`U`Ub	99_lOaOBOZZ
1.
r/   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S r1   )r!   r"   r$   rg   r&   r'   r(   r2   s     r.   r4   zGatedMlp.forward   sb    HHQKHHQKJJqMIIaLIIaLHHQKJJqMr/   r5   r@   s   @r.   rd   rd      s    
 .2*.)+48483768// &c]/ #3-	/
 BII/ !bii1/ !bii1/ eD$J//0/ uUE\223/Br/   rd   c                        e Zd ZdZddej
                  dddddfdedee   dee   deej                     d	eeej                        d
e
eeeef   f   def fdZd Z xZS )ConvMlpzG MLP using 1x1 convs that keeps spatial dims (for 2D NCHW tensors)
    NTr   r   r   r   r   r   r   r   c
                 v   ||	d}
t         |           |xs |}|xs |}t        |      }t        j                  ||fd|d   d|
| _        |r	 ||fi |
nt        j                         | _         |       | _        t        j                  |      | _
        t        j                  ||fd|d   d|
| _        y )Nr   r	   r   )r   r   )r   r   r   r   r   r!   r%   r&   r"   r#   r   r'   )r)   r   r   r   r   r   r   r   r   r   r*   r-   s              r.   r   zConvMlp.__init__   s     /#2{)8[99[/]qtTUw]Z\]9CJ5"5	;JJt$	99_l^PTUVPW^[]^r/   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S r1   )r!   r&   r"   r   r'   r2   s     r.   r4   zConvMlp.forward   sH    HHQKIIaLHHQKIIaLHHQKr/   )r6   r7   r8   r9   r   ReLUr;   r   r   r<   r   r=   r   r>   r   r4   r?   r@   s   @r.   rj   rj      s    
 .2*.)+4837__ &c]_ #3-	_
 BII_ !bii1_ eD$J//0_ _0r/   rj   c                        e Zd ZdZddej
                  dddddfdedee   dee   d	eej                     d
e
eeeef   f   de
eeeef   f   def fdZd Z xZS )GlobalResponseNormMlpz MLP w/ Global Response Norm (see grn.py), nn.Linear or 1x1 Conv2d

    NOTE: Intended for '2D' NCHW (use_conv=True) or NHWC (use_conv=False, channels-last) tensor layouts
    NTr   Fr   r   r   r   r   r   r   c
                    ||	d}
t         |           |xs |}|xs |}t        |      }t        |      }|rt        t        j
                  d      nt        j                  } |||fd|d   i|
| _         |       | _        t	        j                  |d         | _
        t        |fd| i|
| _         |||fd|d   i|
| _        t	        j                  |d         | _        y )Nr   r	   r   r   r   channels_last)r   r   r   r   r   r   r    r!   r"   r#   r$   r
   grnr'   r(   )r)   r   r   r   r   r   r   r   r   r   r*   r+   r,   r-   s                r.   r   zGlobalResponseNormMlp.__init__   s     /#2{)8[t_
<Dwryya8"))_Q47QbQ;ZZ
1.
%oX\XUWXRDGRrRZZ
1.
r/   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S r1   )r!   r"   r$   rr   r'   r(   r2   s     r.   r4   zGlobalResponseNormMlp.forward  sU    HHQKHHQKJJqMHHQKHHQKJJqMr/   r5   r@   s   @r.   ro   ro      s     .2*.)+3768"// &c]/ #3-	/
 BII/ eD$J//0/ uUE\223/ /6r/   ro   N)r9   	functoolsr   typingr   r   r   r   torchr   rr   r
   helpersr   r<   r   rB   rb   SwiGLUPackedrZ   rd   rj   ro    r/   r.   <module>rz      s     / /  # (")) (V4RYY 4n vEB2RYY 2j,ryy ,^!bii !H'BII 'r/   