Ë
    éÓ^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“_ˆ
Ù<D”wœrŸy™y°aÕ8Ì"Ï)É)ˆá ¨_ÑQÀ4ÈÁ7ÐQÈbÑQˆŒÙ“;ˆŒÜ—Z‘Z 
¨1¡Ó.ˆŒ
Ø9CÐ9O‘J˜Ñ5°"Ò5ÔUW×U`ÑU`ÓUbˆŒ	Ù °ÑRÀDÈÁGÐRÈrÑRˆŒÜ—Z‘Z 
¨1¡Ó.ˆ�
ó    c                 óÒ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|S ©N)r!   r"   r$   r&   r'   r(   ©r)   Úxs     r.   ÚforwardzMlp.forward/   sU   € Ø�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØˆr/   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚGELUÚintr   r   ÚModuler   Úboolr   Úfloatr   r4   Ú__classcell__©r-   s   @r.   r   r      sÄ   ø„ ñð .2Ø*.Ø)+¯©Ø48Ø37Ø68Ø"ØØñ/àð/ð & c™]ð/ð # 3™-ð	/ð
 ˜BŸI™I‘ð/ð !  b§i¡i¡Ñ1ð/ð ˜˜e D¨$ JÑ/Ð/Ñ0ð/ð ˜˜u U¨E \Ñ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“_ˆ
Ù<D”wœrŸy™y°aÕ8Ì"Ï)É)ˆÙ&™¨BˆŒØ"ˆŒá ¨_ÑQÀ4ÈÁ7ÐQÈbÑQˆŒÙ“;ˆŒÜ—Z‘Z 
¨1¡Ó.ˆŒ
Ø>HÐ>T‘J˜°!Ñ3Ñ:°rÒ:ÔZ\×ZeÑZeÓZgˆŒ	Ù °1Ñ 4°lÑWÈÈaÉÐWÐTVÑWˆŒÜ—Z‘Z 
¨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„   € à�8‰8�=‰=Ð$Ü�G‰G�M‰M˜$Ÿ(™(Ÿ-™-¨¯©¯©×(;Ñ(;¸AÑ(>À!Ñ(CÐ(DÐEÔFÜ
�‰�‰˜Ÿ™Ÿ™¨¯©¯©×(=Ñ(=¸aÑ(@ÀAÑ(EÐ(FÐGÈTˆÕ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‰   € Ø�H‰H�Q‹KˆØ—‘˜ §¡�Ó/‰ˆˆBØ!%§¢ˆB�—‘˜"“Ò°T·X±X¸b³\ÀBÑ5FˆØ�J‰J�q‹MˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØˆ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Ø*.Ø)+¯©Ø48Ø37Ø68Ø"Ø"ØØñ/àð/ð & c™]ð/ð # 3™-ð	/ð
 ˜BŸI™I‘ð/ð !  b§i¡i¡Ñ1ð/ð ˜˜e D¨$ JÑ/Ð/Ñ0ð/ð ˜˜u U¨E \Ñ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“_ˆ
áØ-°/Ð1AÀHÑ1LÑMˆOä—Y‘Y˜{¨OÑPÀ$ÀqÁ'ÐPÈRÑPˆŒ
Ü—Y‘Y˜{¨OÑPÀ$ÀqÁ'ÐPÈRÑPˆŒ
Ù“;ˆŒÜ—Z‘Z 
¨1¡Ó.ˆŒ
Ø9CÐ9O‘J˜Ñ5°"Ò5ÔUW×U`ÑU`ÓUbˆŒ	Ü—9‘9˜_¨lÑOÀÀaÁÐOÈBÑOˆŒÜ—Z‘Z 
¨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   € à�:‰:�?‰?Ð&Ü�G‰G�M‰M˜$Ÿ*™*Ÿ/™/Ô*Ü
�‰�‰˜Ÿ
™
×)Ñ)¨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“ˆØ�J‰J�q‹MˆØ�H‰H�VÓ˜qÑ ˆØ�J‰J�q‹MˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØˆ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Ø*.Ø)+¯©Ø48Ø37Ø68ØØØñ/àð/ð & c™]ð/ð # 3™-ð	/ð
 ˜BŸI™I‘ð/ð !  b§i¡i¡Ñ1ð/ð ˜˜e D¨$ JÑ/Ð/Ñ0ð/ð ˜˜u U¨E \Ñ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“_ˆ
ä—9‘9˜[¨/ÑNÀÀQÁÐNÈ2ÑNˆŒÙ“;ˆŒÜ—Z‘Z 
¨1¡Ó.ˆŒ
ØÐ!Ø" QÑ&¨!Ò+Ð+Ð+Ù" ?Ñ9°bÑ9ˆDŒIØ-°Ñ2‰OäŸ™›ˆDŒIØ9CÐ9O‘J˜Ñ5°"Ò5ÔUW×U`ÑU`ÓUbˆŒ	Ü—9‘9˜_¨lÑOÀÀaÁÐOÈBÑOˆŒÜ—Z‘Z 
¨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   € Ø�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØ�I‰I�a‹LˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØˆr/   r5   r@   s   @r.   rd   rd   ¨   sÒ   ø„ ñð
 .2Ø*.Ø)+¯©Ø48Ø48Ø37Ø68ØØñ/àð/ð & c™]ð/ð # 3™-ð	/ð
 ˜BŸI™I‘ð/ð !  b§i¡i¡Ñ1ð/ð !  b§i¡i¡Ñ1ð/ð ˜˜e D¨$ JÑ/Ð/Ñ0ð/ð ˜˜u U¨E \Ñ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¨[ˆÜ˜‹ˆä—9‘9˜[¨/Ð]ÀqÈtÐTUÉwÑ]ÐZ\Ñ]ˆŒÙ9C‘J˜Ñ5°"Ò5ÌÏÉËˆŒ	Ù“;ˆŒÜ—J‘J˜tÓ$ˆŒ	Ü—9‘9˜_¨lÐ^ÈÐPTÐUVÑPWÑ^Ð[]Ñ^ˆ�r/   c                 ó°   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }|S r1   )r!   r&   r"   r   r'   r2   s     r.   r4   zConvMlp.forwardò   sH   € Ø�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØˆr/   )r6   r7   r8   r9   r   ÚReLUr;   r   r   r<   r   r=   r   r>   r   r4   r?   r@   s   @r.   rj   rj   ×   s¬   ø„ ñð
 .2Ø*.Ø)+¯©Ø48Ø37ØØØñ_àð_ð & c™]ð_ð # 3™-ð	_ð
 ˜BŸI™I‘ð_ð !  b§i¡i¡Ñ1ð_ð ˜˜e D¨$ 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“_ˆ
Ù<D”wœrŸy™y°aÕ8Ì"Ï)É)ˆá ¨_ÑQÀ4ÈÁ7ÐQÈbÑQˆŒÙ“;ˆŒÜ—Z‘Z 
¨1¡Ó.ˆŒ
Ü% oÑXÈÀ\ÐXÐUWÑXˆŒÙ °ÑRÀDÈÁGÐRÈrÑRˆŒÜ—Z‘Z 
¨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   € Ø�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�H‰H�Q‹KˆØ�J‰J�q‹MˆØˆr/   r5   r@   s   @r.   ro   ro   û   sª   ø„ ñð .2Ø*.Ø)+¯©Ø37Ø68Ø"ØØñ/àð/ð & c™]ð/ð # 3™-ð	/ð
 ˜BŸI™I‘ð/ð ˜˜e D¨$ JÑ/Ð/Ñ0ð/ð ˜˜u U¨E \Ñ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ˆR�Y‰Yô 4ñn �v¨¯©¸EÔB€ô2ˆR�Y‰Yô 2ôj,ˆr�y‰yô ,ô^!ˆb�i‰iô !ôH'˜BŸI™Iõ 'r/   