
    ^j                        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    k/var/www/ramen.bs-engineer-server.com/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                 P    t         |           || _        t        |      | _        y Nsuper__init__r*   r   dimselfr*   r+   	__class__s      r   r0   zFastAdaptiveAvgPool.__init__;   !    "9-r   c                 R    |j                  | j                  | j                         S Nkeepdim)meanr1   r*   r3   r   s     r   forwardzFastAdaptiveAvgPool.forward@        vvdhhDLL(8v99r   FNCHW)__name__
__module____qualname__boolr   r0   r<   __classcell__r4   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                 P    t         |           || _        t        |      | _        y r-   r.   r2   s      r   r0   zFastAdaptiveMaxPool.__init__E   r5   r   c                 R    |j                  | j                  | j                         S r7   )amaxr1   r*   r;   s     r   r<   zFastAdaptiveMaxPool.forwardJ   r=   r   r>   r@   rA   rB   rC   strr0   r<   rD   rE   s   @r   rG   rG   D   s    . . .
:r   rG   c                   0     e Zd Zddedef fdZd Z xZS )FastAdaptiveAvgMaxPoolr*   r+   c                 P    t         |           || _        t        |      | _        y r-   r.   r2   s      r   r0   zFastAdaptiveAvgMaxPool.__init__O   r5   r   c                     |j                  | j                  | j                         }|j                  | j                  | j                         }d|z  d|z  z   S )Nr8   r   )r:   r1   r*   rJ   r3   r   r   r   s       r   r<   zFastAdaptiveAvgMaxPool.forwardT   sO    txxT\\)9:txxT\\)9:U{S5[((r   r>   rK   rE   s   @r   rN   rN   N   s    . . .
)r   rN   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        |      | _        |rd| _        y t        |      | _        y r   )r/   r0   r*   r   
dim_reducedim_catr   r2   s      r   r0   z"FastAdaptiveCatAvgMaxPool.__init__[   s7    ))4DL*95DLr   c                     |j                  | j                  | j                         }|j                  | j                  | j                         }t	        j
                  ||f| j                        S r7   )r:   rU   r*   rJ   r   r    rV   rQ   s       r   r<   z!FastAdaptiveCatAvgMaxPool.forwardd   sU    tDLL0@AtDLL0@Ayy%66r   r>   rK   rE   s   @r   rS   rS   Z   s    6 6 67r   rS   c                   ,     e Zd Zddef fdZd Z xZS )AdaptiveAvgMaxPool2dr   c                 0    t         |           || _        y r-   r/   r0   r   r3   r   r4   s     r   r0   zAdaptiveAvgMaxPool2d.__init__k       &r   c                 .    t        || j                        S r-   )r   r   r;   s     r   r<   zAdaptiveAvgMaxPool2d.forwardo   s    %a)9)9::r   r   r@   rA   rB   _int_tuple_2_tr0   r<   rD   rE   s   @r   rY   rY   j   s    'N ';r   rY   c                   ,     e Zd Zddef fdZd Z xZS )AdaptiveCatAvgMaxPool2dr   c                 0    t         |           || _        y r-   r[   r\   s     r   r0   z AdaptiveCatAvgMaxPool2d.__init__t   r]   r   c                 .    t        || j                        S r-   )r!   r   r;   s     r   r<   zAdaptiveCatAvgMaxPool2d.forwardx   s    (D,<,<==r   r_   r`   rE   s   @r   rc   rc   s   s    'N '>r   rc   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         |           |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/   r0   r   lowernnIdentitypoolFlattenr*   
startswithr   rS   rN   rG   r)   rY   rc   AdaptiveMaxPool2dAdaptiveAvgPool2d)r3   r   r   r*   r+   r4   s        r   r0   zSelectAdaptivePool2d.__init__   s    	,,,,"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   r3   s    r   is_identityz SelectAdaptivePool2d.is_identity   s    >>!!r   c                 J    | j                  |      }| j                  |      }|S r-   )ro   r*   r;   s     r   r<   zSelectAdaptivePool2d.forward   s!    IIaLLLOr   c                 ,    t        | j                        S r-   )r   r   ru   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=))r4   r@   r   rL   r*   ru   s    r   __repr__zSelectAdaptivePool2d.__repr__   sN    ~~&&, $/ #DLL 12478 	8r   )r   rk   Fr?   )r@   rA   rB   __doc__ra   rL   rC   r0   rv   r<   ry   r}   rD   rE   s   @r   rg   rg   |   s[     +,#!#'G''G 'G 	'G
 'GR"
78r   rg   )r#   r_   )r#   r   )r~   typingr   r   r   r   torch.nnrm   torch.nn.functional
functionalr   formatr   r   intra   r   r   r!   r'   Moduler)   rG   rN   rS   rY   rc   rg    r   r   <module>r      s   
 * )     4sE#s(O+,!> !(n (N  :")) ::")) :	)RYY 	)7		 7 ;299 ;>bii >:8299 :8r   