a
    d                     @   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 )Nr   )r   shapeFconv2d)xr   r   r   r   r   r    r   `/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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 u 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i |\}}|rptrZt rZt rFJ t| ||fi |S t| ||fi |S ntj	| ||fd|i|S d S )Nr    r   F)
pop
setdefaultr	   _USE_EXPORT_CONVr   r   r)   r   r-   Conv2d)Zin_chsZout_chsr   kwargsr   Z
is_dynamicr   r   r   create_conv2d_pad`   s    

r4   )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   r2   r   r)   r4   r   r   r   r   <module>   s.        


'