
    Ng
                         d Z ddlmZ ddlmZmZ ddlZddlmZ ddl	mc m
Z ddlZddlmZ ddlmZ  G d d	ej                  Zdd
dej        fdedee         dededeeej                          dej        fdZdS )z
BlurPool layer inspired by
 - Kornia's Max_BlurPool2d
 - Making Convolutional Networks Shift-Invariant Again :cite:`zhang2019shiftinvar`

Hacked together by Chris Ha and Ross Wightman
    )partial)OptionalTypeN   )get_padding)	LayerTypec                   r     e Zd ZdZ	 	 	 	 ddee         deded	ed
df
 fdZdej	        d
ej	        fdZ
 xZS )
BlurPool2da  Creates a module that computes blurs and downsample a given feature map.
    See :cite:`zhang2019shiftinvar` for more details.
    Corresponds to the Downsample class, which does blurring and subsampling

    Args:
        channels = Number of input channels
        filt_size (int): binomial filter size for blurring. currently supports 3 (default) and 5.
        stride (int): downsampling filter stride

    Returns:
        torch.Tensor: the transformed tensor.
    N      reflectchannels	filt_sizestridepad_modereturnc                 6   t          t          |                                            |dk    sJ || _        || _        || _        || _        t          ||d          gdz  | _        t          j
        t          j        d          | j        dz
  z  j                            t          j                            }|d d d f         |d d d f         z  d d d d d d f         }||                    | j        ddd          }|                     d|d           d S )Nr   )dilation   )      ?r   filtF)
persistent)superr
   __init__r   r   r   r   r   paddingtorchtensornppoly1dcoeffsastypefloat32repeatregister_buffer)selfr   r   r   r   r    blur_filter	__class__s          Q/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/blur_pool.pyr   zBlurPool2d.__init__!   s    	j$((***1}}}} " #IvBBBCaGry44!9KLT[[\^\fgghhaaagaaa8$aaa:JK%,,T]Aq!DDKV[UCCCCC    xc                    t          j        || j        | j                  }| j        5|j        d         }| j                            |d| j        | j                  }n| j        }| j        }t          j	        ||| j
        |          S )N)moder   )r   groups)Fpadr   r   r   shaper   expandr   conv2dr   )r%   r*   r   weights       r(   forwardzBlurPool2d.forward6   sy    E!T\666= wqzHY%%h4>4>RRFF}HYFx6$+hGGGGr)   )Nr   r   r   )__name__
__module____qualname____doc__r   intstrr   r   Tensorr4   __classcell__)r'   s   @r(   r
   r
      s          '+%D DsmD D 	D
 D 
D D D D D D*H H%, H H H H H H H Hr)   r
   r   Taa_layerr   r   enablenoopr   c                    | r|s|
 |            ndS t          | t                    r|                                                     dd                              dd          } | dk    s| dk    rt          j        } n?| dk    s| dk    rt          } n+| d	k    rt          t          d
          } nJ d|  d            	  | ||          S # t          $ r} | |          cY d}~S d}~ww xY w)z Anti-aliasing N_ -avgavgpoolblurblurpoolblurpcconstant)r   FzUnknown anti-aliasing layer (z).)r   r   )	
isinstancer:   lowerreplacenn	AvgPool2dr
   r   	TypeError)r=   r   r   r>   r?   es         r(   	create_aarQ   A   s8     46 4)ttvvvt3(C   
G>>##++C44<<S"EEuI 5 5|HH8z#9#9!HH!!zJ???HH GF(FFFFFF x&9999      x s   =C
 

C)
C$C)$C))r8   	functoolsr   typingr   r   r   torch.nnrM   torch.nn.functional
functionalr.   numpyr   r   r   r   Moduler
   Identityr9   boolrQ    r)   r(   <module>r\      sR          ! ! ! ! ! ! ! !                                      *H *H *H *H *H *H *H *H^ #'*,+    3-    	 
 tBI'  Y           r)   