Ë
    éÓ^jË  ã                   ó˜   — d Z ddl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eZ G d	„ d
ej                  «      Zy)a
   Depthwise Separable Conv Modules

Basic DWS convs. Other variations of DWS exist with batch norm or activations between the
DW and PW convs such as the Depthwise modules in MobileNetV2 / EfficientNet and Xception.

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚOptionalÚTypeÚUnion)Únné   )Úcreate_conv2d)Úget_norm_act_layerc                   ó  ‡ — e Zd ZdZdddddddej
                  ej                  ddddfd	ed
ededededede	de
dedeej                     deej                     de	deeej                        fˆ fd„Zed„ «       Zed„ «       Zd„ Zˆ xZS )ÚSeparableConvNormActz4 Separable Conv w/ trailing Norm and Activation
    é   r   Ú Fç      ð?TNÚin_channelsÚout_channelsÚkernel_sizeÚstrideÚdilationÚpaddingÚbiasÚchannel_multiplierÚpw_kernel_sizeÚ
norm_layerÚ	act_layerÚ	apply_actÚ
drop_layerc                 ó  •— ||dœ}t         ‰| �  «        t        |t        ||z  «      |f|||ddœ|¤Ž| _        t        t        ||z  «      ||	f||dœ|¤Ž| _        t        |
|«      }|�t        |¬«      ni } ||fd|i|¤|¤Ž| _        y )N©ÚdeviceÚdtypeT©r   r   r   Ú	depthwise©r   r   )r   r   )	ÚsuperÚ__init__r   ÚintÚconv_dwÚconv_pwr	   ÚdictÚbn)Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ÚddÚnorm_act_layerÚnorm_kwargsÚ	__class__s                      €úe/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/separable_conv.pyr$   zSeparableConvNormAct.__init__   sÌ   ø€ ð$ ¨Ñ/ˆÜ‰ÑÔä$ØÜ�Ð0Ñ0Ó1Øð	
ð ØØØñ	
ð ñ	
ˆŒô %Ü�Ð0Ñ0Ó1ØØð
ð Øñ
ð ñ
ˆŒô ,¨J¸	ÓBˆØ5?Ð5K”d jÕ1ÐQSˆÙ  ÑX¸ÐXÀkÐXÐUWÑXˆ�ó    c                 ó.   — | j                   j                  S ©N©r&   r   ©r*   s    r/   r   z SeparableConvNormAct.in_channels@   ó   € à�|‰|×'Ñ'Ð'r0   c                 ó.   — | j                   j                  S r2   ©r'   r   r4   s    r/   r   z!SeparableConvNormAct.out_channelsD   ó   € à�|‰|×(Ñ(Ð(r0   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r2   )r&   r'   r)   ©r*   Úxs     r/   ÚforwardzSeparableConvNormAct.forwardH   s.   € Ø�L‰L˜‹OˆØ�L‰L˜‹OˆØ�G‰G�A‹JˆØˆr0   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚBatchNorm2dÚReLUr%   ÚstrÚboolÚfloatr   ÚModuler   r$   Úpropertyr   r   r<   Ú__classcell__©r.   s   @r/   r   r      s  ø„ ñð  !ØØØØØ(+Ø"#Ø*,¯.©.Ø)+¯©Ø"Ø48ØØñ!+Yàð+Yð ð+Yð ð	+Yð
 ð+Yð ð+Yð ð+Yð ð+Yð !&ð+Yð  ð+Yð ˜RŸY™Y™ð+Yð ˜BŸI™I‘ð+Yð ð+Yð !  b§i¡i¡Ñ1õ+YðZ ñ(ó ð(ð ñ)ó ð)ör0   r   c                   ó\   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 dˆ fd„	Zed„ «       Zed„ «       Zd„ Zˆ xZ	S )ÚSeparableConv2dz Separable Conv
    c                 ó¸   •— |
|dœ}t         ‰| �  «        t        |t        ||z  «      |f|||ddœ|¤Ž| _        t        t        ||z  «      ||	f||dœ|¤Ž| _        y )Nr   Tr    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SeparableConv2d.__init__U   s�   ø€ ð ¨Ñ/ˆÜ‰ÑÔä$ØÜ�Ð0Ñ0Ó1Øð	
ð ØØØñ	
ð ñ	
ˆŒô %Ü�Ð0Ñ0Ó1ØØð
ð Øñ
ð ñ
ˆ�r0   c                 ó.   — | j                   j                  S r2   r3   r4   s    r/   r   zSeparableConv2d.in_channelsz   r5   r0   c                 ó.   — | j                   j                  S r2   r7   r4   s    r/   r   zSeparableConv2d.out_channels~   r8   r0   c                 óJ   — | j                  |«      }| j                  |«      }|S r2   )r&   r'   r:   s     r/   r<   zSeparableConv2d.forward‚   s!   € Ø�L‰L˜‹OˆØ�L‰L˜‹OˆØˆr0   )	r   r   r   r   Fr   r   NN)
r=   r>   r?   r@   r$   rG   r   r   r<   rH   rI   s   @r/   rK   rK   R   sX   ø„ ñð ØØØØØ"ØØØõ#
ðJ ñ(ó ð(ð ñ)ó ð)ör0   rK   N)r@   Útypingr   r   r   Útorchr   r   Úcreate_norm_actr	   rF   r   ÚSeparableConvBnActrK   © r0   r/   ú<module>rU      sD   ðñ÷ )Ñ (å å (Ý /ô<˜2Ÿ9™9ô <ð~ *Ð ô3�b—i‘iõ 3r0   