o
    پi                     @   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d
ejde	ej deeef deeef deeef def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 )Nr   )r   shapeFconv2d)xr   r   r   r   r   r    r   K/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/conv2d_same.pyconv2d_same   s   	r   c                       4   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__	selfin_channels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                       r   )
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 u r&t|| j  dd  | j| j}t|| _|| _| |}t	
|| j| j| j| j| j| jS )Nr   )sizer.   r   r   r   r   nn	ZeroPad2dr/   r   r   r   r   r   )r   r   
input_sizepad_argr   r   r   r%   R   s   
 

zConv2dSameExport.forwardr&   r'   r   r   r#   r   r-   9   s    r-   c                 K   s   | dd}|dd t||fi |\}}|r7tr-t r-t r#J t| ||fi |S t| ||fi |S tj	| ||fd|i|S )Nr    r   F)
pop
setdefaultr	   _USE_EXPORT_CONVr   r   r-   r   r1   Conv2d)in_chsout_chsr"   kwargsr   
is_dynamicr   r   r   create_conv2d_pad`   s   

r>   )Nr
   r   r
   r   )r+   torchtorch.nnr1   torch.nn.functional
functionalr   typingr   r   configr   r   r   r   r   r	   r8   Tensorintr   r9   r   r-   r>   r   r   r   r   <module>   s:    



'