
    kh                        d Z ddlm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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y)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)comb)OptionalTypeN   )get_padding)	LayerTypec                        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channels	filt_sizestridepad_modereturnc           	         t         t        |           |dkD  sJ || _        || _        || _        || _        t        ||d      gdz  | _        t        j                  t        |      D cg c]  }t        |dz
  |       c}t        j                        d|dz
  z  z  }|d d d f   |d d d f   z  d d d d d d f   }||j                  | j                  ddd      }| j                  d|d       y c c}w )	Nr   )dilation   )dtype   filtF)
persistent)superr   __init__r   r   r   r   r   paddingtorchtensorranger   float32repeatregister_buffer)	selfr   r   r   r   kcoeffsblur_filter	__class__s	           Q/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/blur_pool.pyr   zBlurPool2d.__init__!   s     	j$(*1}} " #IvBCaG -29-=>T)a-#>--
 9q=!# aga8$a:JK%,,T]]Aq!DKV[UC ?s   *C3xc                 l   t        j                  || j                  | j                        }| j                  B|j
                  d   }| j                  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.forward:   s    EE!T\\6== wwqzHYY%%h4>>4>>RF}}HYYFxx6$++hGG    )N   r   reflect)__name__
__module____qualname____doc__r   intstrr   r   Tensorr1   __classcell__)r%   s   @r&   r   r      ss     '+%DsmD D 	D
 D 
D2H H%,, Hr2   r   r   Taa_layerr   r   enablenoopr   c                    | r|s| |       S dS t        | t              r~| j                         j                  dd      j                  dd      } | dk(  s| dk(  rt        j
                  } n3| 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   zUnknown anti-aliasing layer (z).)r   r   )	
isinstancer:   lowerreplacenn	AvgPool2dr   r   	TypeError)r=   r   r   r>   r?   es         r&   	create_aarQ   E   s     6)tv3t3(C >>#++C4<<S"EuI 5||H8z#9!H!zJ?H G9(2FF5 &99   s   	B) )	C2B?9C?C)r8   	functoolsr   mathr   typingr   r   r   torch.nnrM   torch.nn.functional
functionalr+   r   r   r	   Moduler   Identityr9   boolrQ    r2   r&   <module>r\      s      !       .H .Hf #'*,++  3-    	 
 tBII'  YY r2   