o
    ÓÙ¾i3  ã                   @   sB   d Z ddlZddlmZ ddlmZ dd„ ZG dd	„ d	ejƒZdS )
z¨ PyTorch Mixed Convolution

Paper: MixConv: Mixed Depthwise Convolutional Kernels (https://arxiv.org/abs/1907.09595)

Hacked together by / Copyright 2020 Ross Wightman
é    N)Únné   )Úcreate_conv2d_padc                    s4   ‡ ‡fdd„t ˆƒD ƒ}|d  ˆ t|ƒ 7  < |S )Nc                    s   g | ]}ˆ ˆ ‘qS © r   )Ú.0Ú_©Únum_chanÚ
num_groupsr   úL/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/mixed_conv2d.pyÚ
<listcomp>   s    z#_split_channels.<locals>.<listcomp>r   )ÚrangeÚsum)r	   r
   Úsplitr   r   r   Ú_split_channels   s   r   c                       s.   e Zd ZdZ		d
‡ fdd„	Zdd	„ Z‡  ZS )ÚMixedConv2dz¸ Mixed Grouped Convolution

    Based on MDConv and GroupedConv in MixNet impl:
      https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mixnet/custom_layers.py
    é   r   Ú Fc                    s²   t t| ƒ ¡  t|tƒr|n|g}t|ƒ}	t||	ƒ}
t||	ƒ}t|
ƒ| _t|ƒ| _	t
t||
|ƒƒD ]"\}\}}}|r<|nd}|  t|ƒt|||f||||dœ|¤Ž¡ q1|
| _d S )Nr   )ÚstrideÚpaddingÚdilationÚgroups)Úsuperr   Ú__init__Ú
isinstanceÚlistÚlenr   r   Úin_channelsÚout_channelsÚ	enumerateÚzipÚ
add_moduleÚstrr   Úsplits)Úselfr   r   Úkernel_sizer   r   r   Ú	depthwiseÚkwargsr
   Ú	in_splitsÚ
out_splitsÚidxÚkÚin_chÚout_chÚconv_groups©Ú	__class__r   r   r      s*   



ÿþþþ
zMixedConv2d.__init__c                    s:   t  || jd¡‰ ‡ fdd„t|  ¡ ƒD ƒ}t  |d¡}|S )Nr   c                    s   g | ]
\}}|ˆ | ƒ‘qS r   r   )r   ÚiÚc©Úx_splitr   r   r   1   s    z'MixedConv2d.forward.<locals>.<listcomp>)Útorchr   r#   r   ÚvaluesÚcat)r$   ÚxÚx_outr   r3   r   Úforward/   s   zMixedConv2d.forward)r   r   r   r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r:   Ú__classcell__r   r   r/   r   r      s    ÿr   )r>   r5   r   Úconv2d_samer   r   Ú
ModuleDictr   r   r   r   r   Ú<module>   s    