U
    ¯Ê¹j�  ã                   @   sÌ   d Z ddlZddlmZ ddlm  mZ ddlmZm	Z	 ddl
mZmZ ddlmZmZmZ dZdeje	ej eeef eeef eeef ed
œdd„ZG dd„ dejƒZG dd„ dejƒZdd„ ZdS )zK Conv2d w/ Same Padding

Hacked together by / Copyright 2020 Ross Wightman
é    N)ÚTupleÚOptionalé   )Úis_exportableÚis_scriptable)Úpad_sameÚpad_same_argÚget_padding_valueF©r   r   ©r   r   )ÚweightÚbiasÚstrideÚpaddingÚdilationÚgroupsc              	   C   s.   t | |jdd … ||ƒ} t | |||d||¡S )Néþÿÿÿr   )r   ÚshapeÚFÚconv2d)Úxr   r   r   r   r   r   © r   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/conv2d_same.pyÚconv2d_same   s    	r   c                       s*   e Zd ZdZd	‡ fdd„	Zdd„ Z‡  ZS )
Ú
Conv2dSamezD Tensorflow like 'SAME' convolution wrapper for 2D convolutions
    r   r   Tc	           	   
      s"   t t| ƒ ||||d|||¡ d S )Nr   )Úsuperr   Ú__init__©	ÚselfZin_channelsZout_channelsÚkernel_sizer   r   r   r   r   ©Ú	__class__r   r   r   "   s    
      þzConv2dSame.__init__c                 C   s    t || j| j| j| j| j| jƒS )N)r   r   r   r   r   r   r   )r   r   r   r   r   Úforward2   s         þzConv2dSame.forward)r   r   r   r   T©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   Ú__classcell__r   r   r    r   r      s        ÷r   c                       s*   e Zd ZdZd	‡ fdd„	Zdd„ Z‡  ZS )
ÚConv2dSameExportz— ONNX export friendly Tensorflow like 'SAME' convolution wrapper for 2D convolutions

    NOTE: This does not currently work with torch.jit.script
    r   r   Tc	           	   
      s.   t t| ƒ ||||d|||¡ d | _d| _d S )Nr   r   )r   r)   r   ÚpadÚpad_input_sizer   r    r   r   r   @   s    
      þzConv2dSameExport.__init__c              	   C   sx   |  ¡ dd … }| jd krLt|| j  ¡ dd … | j| jƒ}t |¡| _|| _|  |¡}t	 
|| j| j| j| j| j| j¡S )Nr   )Úsizer*   r   r   r   r   ÚnnZ	ZeroPad2dr+   r   r   r   r   r   )r   r   Z
input_sizeZpad_argr   r   r   r"   R   s    
 
     þzConv2dSameExport.forward)r   r   r   r   Tr#   r   r   r    r   r)   9   s        ÷r)   c                 K   s‚   |  dd¡}| dd¡ t||f|Ž\}}|rdtrRtƒ rRtƒ rBt‚t| ||f|ŽS t| ||f|ŽS nt	j
| ||fd|i|—ŽS d S )Nr   Ú r   F)ÚpopÚ
setdefaultr	   Ú_USE_EXPORT_CONVr   r   ÚAssertionErrorr)   r   r-   ÚConv2d)Zin_chsZout_chsr   Úkwargsr   Z
is_dynamicr   r   r   Úcreate_conv2d_pad`   s    

r5   )Nr
   r   r
   r   )r'   ZtorchZtorch.nnr-   Ztorch.nn.functionalZ
functionalr   Útypingr   r   Úconfigr   r   r   r   r   r	   r1   ZTensorÚintr   r3   r   r)   r5   r   r   r   r   Ú<module>   s.        ù


ù'