
    kh                        d Z ddlmZ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mZ eeeeef   f   ZddZddefdZddefd	Zddefd
Z G d dej(                        Z G d dej(                        Z G d dej(                        Z G d dej(                        Z G d dej(                        Z G d dej(                        Z G d dej(                        Zy)a   PyTorch selectable adaptive pooling
Adaptive pooling with the ability to select the type of pooling from:
    * 'avg' - Average pooling
    * 'max' - Max pooling
    * 'avgmax' - Sum of average and max pooling re-scaled by 0.5
    * 'avgmaxc' - Concatenation of average and max pooling along feature dim, doubles feature dim

Both a functional and a nn.Module version of the pooling is provided.

Hacked together by / Copyright 2020 Ross Wightman
    )OptionalTupleUnionN   )get_spatial_dimget_channel_dimc                 (    | j                  d      ryy)N	catavgmax   r   )endswith	pool_types    \/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/adaptive_avgmax_pool.pyadaptive_pool_feat_multr      s    +&    output_sizec                 j    t        j                  | |      }t        j                  | |      }d||z   z  S )N      ?)Fadaptive_avg_pool2dadaptive_max_pool2dxr   x_avgx_maxs       r   adaptive_avgmax_pool2dr      s5    !!![1E!!![1E%%-  r   c                     t        j                  | |      }t        j                  | |      }t        j                  ||fd      S Nr   )r   r   r   torchcatr   s       r   adaptive_catavgmax_pool2dr!   $   s;    !!![1E!!![1E99eU^Q''r   c                     |dk(  rt        j                  | |      } | S |dk(  rt        | |      } | S |dk(  rt        | |      } | S |dk(  rt        j                  | |      } | S J d|z         )zFSelectable global pooling function with dynamic input kernel size
    avgavgmaxr
   maxInvalid pool type: %s)r   r   r   r!   r   )r   r   r   s      r   select_adaptive_pool2dr'   *   s     E!!![1 H 
h	"1k2 H 
k	!%a5
 H	 
e	!!![1 H 	:-	99ur   c                   0     e Zd Zddedef fdZd Z xZS )FastAdaptiveAvgPoolflatten	input_fmtc                 X    t         t        |           || _        t	        |      | _        y N)superr)   __init__r*   r   dimselfr*   r+   	__class__s      r   r/   zFastAdaptiveAvgPool.__init__;   $    !413"9-r   c                 R    |j                  | j                  | j                         S Nkeepdim)meanr0   r*   r2   r   s     r   forwardzFastAdaptiveAvgPool.forward@        vvdhhDLL(8v99r   FNCHW)__name__
__module____qualname__boolr   r/   r;   __classcell__r3   s   @r   r)   r)   :   s    . . .
:r   r)   c                   0     e Zd Zddedef fdZd Z xZS )FastAdaptiveMaxPoolr*   r+   c                 X    t         t        |           || _        t	        |      | _        y r-   )r.   rF   r/   r*   r   r0   r1   s      r   r/   zFastAdaptiveMaxPool.__init__E   r4   r   c                 R    |j                  | j                  | j                         S r6   )amaxr0   r*   r:   s     r   r;   zFastAdaptiveMaxPool.forwardJ   r<   r   r=   r?   r@   rA   rB   strr/   r;   rC   rD   s   @r   rF   rF   D   s    . . .
:r   rF   c                   0     e Zd Zddedef fdZd Z xZS )FastAdaptiveAvgMaxPoolr*   r+   c                 X    t         t        |           || _        t	        |      | _        y r-   )r.   rM   r/   r*   r   r0   r1   s      r   r/   zFastAdaptiveAvgMaxPool.__init__O   s$    $d46"9-r   c                     |j                  | j                  | j                         }|j                  | j                  | j                         }d|z  d|z  z   S )Nr7   r   )r9   r0   r*   rI   r2   r   r   r   s       r   r;   zFastAdaptiveAvgMaxPool.forwardT   sO    txxT\\)9:txxT\\)9:U{S5[((r   r=   rJ   rD   s   @r   rM   rM   N   s    . . .
)r   rM   c                   0     e Zd Zddedef fdZd Z xZS )FastAdaptiveCatAvgMaxPoolr*   r+   c                     t         t        |           || _        t	        |      | _        |rd| _        y t        |      | _        y r   )r.   rR   r/   r*   r   
dim_reducedim_catr   r1   s      r   r/   z"FastAdaptiveCatAvgMaxPool.__init__[   s:    '79))4DL*95DLr   c                     |j                  | j                  | j                         }|j                  | j                  | j                         }t	        j
                  ||f| j                        S r6   )r9   rT   r*   rI   r   r    rU   rP   s       r   r;   z!FastAdaptiveCatAvgMaxPool.forwardd   sU    tDLL0@AtDLL0@Ayy%66r   r=   rJ   rD   s   @r   rR   rR   Z   s    6 6 67r   rR   c                   ,     e Zd Zddef fdZd Z xZS )AdaptiveAvgMaxPool2dr   c                 8    t         t        |           || _        y r-   )r.   rX   r/   r   r2   r   r3   s     r   r/   zAdaptiveAvgMaxPool2d.__init__k   s    "D24&r   c                 .    t        || j                        S r-   )r   r   r:   s     r   r;   zAdaptiveAvgMaxPool2d.forwardo   s    %a)9)9::r   r   r?   r@   rA   _int_tuple_2_tr/   r;   rC   rD   s   @r   rX   rX   j   s    'N ';r   rX   c                   ,     e Zd Zddef fdZd Z xZS )AdaptiveCatAvgMaxPool2dr   c                 8    t         t        |           || _        y r-   )r.   r`   r/   r   rZ   s     r   r/   z AdaptiveCatAvgMaxPool2d.__init__t   s    %t57&r   c                 .    t        || j                        S r-   )r!   r   r:   s     r   r;   zAdaptiveCatAvgMaxPool2d.forwardx   s    (D,<,<==r   r\   r]   rD   s   @r   r`   r`   s   s    'N '>r   r`   c            	       V     e Zd ZdZ	 	 	 	 ddedededef fdZd Zd Z	d	 Z
d
 Z xZS )SelectAdaptivePool2dzCSelectable global pooling layer with dynamic input kernel size
    r   r   r*   r+   c                     t         t        |           |dv sJ |xs d| _        |j	                         }|sPt        j                         | _        |rt        j                  d      | _	        y t        j                         | _	        y |j                  d      s|dk7  r|dk(  sJ d       |j                  d      rt        ||      | _        n{|j                  d	      rt        ||      | _        nW|j                  d
      rt        ||      | _        n3|dk(  s|j                  d      rt        ||      | _        n
J d|z         t        j                         | _	        y |dk(  sJ |d	k(  rt!        |      | _        n`|dk(  rt#        |      | _        nJ|d
k(  rt        j$                  |      | _        n*|dk(  rt        j&                  |      | _        n
J d|z         |rt        j                  d      nt        j                         | _	        y )N)r>   NHWC r   fastr>   zAFast pooling and non NCHW input formats require output_size == 1.r
   )r+   r$   r%   r#   r&   )r.   rd   r/   r   lowernnIdentitypoolFlattenr*   
startswithr   rR   rM   rF   r)   rX   r`   AdaptiveMaxPool2dAdaptiveAvgPool2d)r2   r   r   r*   r+   r3   s        r   r/   zSelectAdaptivePool2d.__init__   s    	"D24,,,,"bOO%	DI,32::a=DLDL!!&)Y&-@!#h%hh#!!+.5gS	##H-27iP	##E*/9M	f$	(:(:5(A/9M	A5	AAu;;=DL&&&H$0=	k)3K@	e#00=	e#00=	A5	AAu,32::a=DLr   c                     | j                    S r-   r   r2   s    r   is_identityz SelectAdaptivePool2d.is_identity   s    >>!!r   c                 J    | j                  |      }| j                  |      }|S r-   )rl   r*   r:   s     r   r;   zSelectAdaptivePool2d.forward   s!    IIaLLLOr   c                 ,    t        | j                        S r-   )r   r   rr   s    r   	feat_multzSelectAdaptivePool2d.feat_mult   s    &t~~66r   c                     | j                   j                  dz   dz   | j                  z   dz   t        | j                        z   dz   S )N(z
pool_type=z
, flatten=))r3   r?   r   rK   r*   rr   s    r   __repr__zSelectAdaptivePool2d.__repr__   sN    ~~&&, $/ #DLL 12478 	8r   )r   rh   Fr>   )r?   r@   rA   __doc__r^   rK   rB   r/   rs   r;   rv   rz   rC   rD   s   @r   rd   rd   |   s[     +,#!#'G''G 'G 	'G
 'GR"
78r   rd   )r#   r\   )r#   r   )r{   typingr   r   r   r   torch.nnrj   torch.nn.functional
functionalr   formatr   r   intr^   r   r   r!   r'   Moduler)   rF   rM   rR   rX   r`   rd    r   r   <module>r      s   
 * )     4sE#s(O+,!> !(n (N  :")) ::")) :	)RYY 	)7		 7 ;299 ;>bii >:8299 :8r   