a
    þd3  ã                   @   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   úa/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/layers/mixed_conv2d.pyÚ
<listcomp>   ó    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 ]D\}\}}}|rx|nd}|  t|ƒt|||f||||dœ|¤Ž¡ qb|
| _d S )Nr   )ÚstrideÚpaddingÚdilationÚgroups)Úsuperr   Ú__init__Ú
isinstanceÚlistÚlenr   r   Úin_channelsÚout_channelsÚ	enumerateÚzipZ
add_moduleÚstrr   Úsplits)Úselfr   r   Zkernel_sizer   r   r   Z	depthwiseÚkwargsr
   Z	in_splitsZ
out_splitsÚidxÚkZin_chZout_chZ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©Zx_splitr   r   r   1   r   z'MixedConv2d.forward.<locals>.<listcomp>)Útorchr   r#   r    ÚvaluesÚcat)r$   ÚxZx_outr   r,   r   Úforward/   s    zMixedConv2d.forward)r   r   r   r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   Ú__classcell__r   r   r(   r   r      s
     ÿr   )r5   r-   r   Zconv2d_samer   r   Z
ModuleDictr   r   r   r   r   Ú<module>   s
   