
    RЦic                        S r SSKJr  SSKJr  SSKJrJrJrJ	r	  SSK
r
SSKJr  SSKJs  Jr  SSKJr  SSKJr   " S	 S
\R&                  5      rS\S\S\R&                  4   4S jrS\S\R&                  4   4S jrS\S\R&                  4   S\4S jrSSS\R2                  SS4S\S\\   S\S\S\\\R&                        S\\R&                     4S jjrg)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)CallableOptionalTypeUnionN   )get_padding)	LayerTypec                      ^  \ rS rSrSr      SS\\   S\S\S\SS4
U 4S	 jjjrSS
 jr	SS jr
S\R                  S\R                  4S jrSS jrSrU =r$ )
BlurPool2d   a  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U ]  5         US:  d   eXl        X l        X0l        X@l        [        X#SS9/S-  U l        U=(       d    SSX"4nU R                  S[        R                  " XuUS9SS9  U R                  5         g )Nr	   )dilation   filtdevicedtypeF)
persistent)super__init__r   r   r   r   r
   paddingregister_buffertorchemptyreset_parameters)	selfr   r   r   r   r   r   
filt_shape	__class__s	           T/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/blur_pool.pyr   BlurPool2d.__init__!   s     	1}} " #IBCaG m!Q	=
VU[[RW%Xejk 	    c                 $    U R                  5         g)zInitialize buffers.N_init_buffersr#   s    r&   r"   BlurPool2d.reset_parameters9       r(   c           	         [         R                  " [        U R                  5       Vs/ s H  n[	        U R                  S-
  U5      PM     snS[         R
                  S9SU R                  S-
  -  -  nUSS2S4   USSS24   -  SSSS2SS24   nU R                  b  UR                  U R                  SSS5      nU R                  R                  U5        gs  snf )z.Compute and fill non-persistent buffer values.r	   cpur      N)
r    tensorranger   r   float32r   repeatr   copy_)r#   kcoeffsblur_filters       r&   r+   BlurPool2d._init_buffers=   s     272GH2GQT$..1$a(2GH--
 4>>A%&	(
 aga8$a:JK==$%,,T]]Aq!DK		$ Is   #Cxc                 b   [         R                  " XR                  U R                  S9nU R                  cB  UR
                  S   nU R                  R                  USU R                  U R                  5      nOU R                  nU R                  n[         R                  " XU R                  US9$ )N)moder	   )r   groups)Fpadr   r   r   shaper   expandr   conv2dr   )r#   r;   r   weights       r&   forwardBlurPool2d.forwardJ   s|    EE!\\6== wwqzHYY%%h4>>4>>RF}}HYYFxx$++hGGr(   c                 $    U R                  5         g)z"Initialize non-persistent buffers.Nr*   r,   s    r&   init_non_persistent_buffers&BlurPool2d.init_non_persistent_buffersT   r.   r(   )r   r   r   r   r   )N   r1   reflectNN)r   N)__name__
__module____qualname____firstlineno____doc__r   intstrr   r"   r+   r    TensorrE   rH   __static_attributes____classcell__)r%   s   @r&   r   r      s     '+% sm    	 
   
   0%H H%,, H r(   r   aa_layerr   .c                    [        U [        5      (       au  U R                  5       R                  SS5      R                  SS5      nUS;   a  [        R
                  $ US;   a  [        $ US:X  a  [        [        SS9$ [        S	U  S
35      eU $ )z6Map string shorthands to callables (class or partial)._ -)avgavgpool)blurblurpoolblurpcconstant)r   zUnknown anti-aliasing layer (z).)	
isinstancerR   lowerreplacenn	AvgPool2dr   r   AssertionError)rV   keys     r&   _normalize_aa_layerrh   Y   s    (C  nn&&sB/77R@$$<<&&(?:
;;<XJbIJJOr(   layer_callablec                 v    [        U [        5      (       a  U R                  $ [        U [        5      (       a  U $ S$ )z?Return the class behind a callable (unwrap partial), else None.N)ra   r   functype)ri   s    r&   _underlying_clsrm   h   s2    .'**"""'==>G4Gr(   c                 p    [        U 5      n [        U[        5      $ ! [         a     g[         a     gf = f)z2True if callable is BlurPool2d or a partial of it.F)rm   
issubclassr   	TypeError	Exception)ri   clss     r&   _is_blurpoolrs   o   s;    
.
)C#z**  s    
5	55r1   Tr   r   enablenoopc                 R   U (       a  U(       d  Ub  U" 5       $ S$ [        U 5      n XS.n[        U 5      (       aN  [        U [        5      (       a  U R                  (       a  U R                  O0 nSU;  a  Ub  XWS'   SU;  a  Ub  XgS'    U " S0 UD6$ ! [
         a    U " U5      s $ f = f)zDAnti-aliasing factory that supports strings, classes, and partials. N)r   r   r   r    )rh   rs   ra   r   keywordsrp   )	rV   r   r   rt   ru   r   r   call_kwargsexisting_kws	            r&   	create_aar{   z   s     6)tv3t3 #8,H  (:K H+5h+H+HXM^M^h''df;&6+=$*!+%%*;#(  &+&&   s   	B B&%B&)rP   	functoolsr   mathr   typingr   r   r   r   r    torch.nnrd   torch.nn.functional
functionalr?   r   r
   r   Moduler   rh   rm   boolrs   IdentityrQ   r{   rw   r(   r&   <module>r      s     2 2       B BJ) bii0H HHS"))^$< H#ryy.!9 d  #'*,++! ! 3-!  !  	! 
 tBII'!  bii! r(   