
    RЦi                        S r SSK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Jr  \\\\\4   4   rSS jrSS\4S jjrSS\4S	 jjrSS\4S
 jjr " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\R(                  5      rg)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                 2    U R                  S5      (       a  gg)N	catavgmax   r   )endswith	pool_types    _/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/adaptive_avgmax_pool.pyadaptive_pool_feat_multr      s    +&&    output_sizec                 h    [         R                  " X5      n[         R                  " X5      nSX#-   -  $ )N      ?)Fadaptive_avg_pool2dadaptive_max_pool2dxr   x_avgx_maxs       r   adaptive_avgmax_pool2dr      s/    !!!1E!!!1E%-  r   c                     [         R                  " X5      n[         R                  " X5      n[        R                  " X#4S5      $ Nr   )r   r   r   torchcatr   s       r   adaptive_catavgmax_pool2dr!   $   s5    !!!1E!!!1E99e^Q''r   c                     US:X  a  [         R                  " X5      n U $ US:X  a  [        X5      n U $ US:X  a  [        X5      n U $ US:X  a  [         R                  " X5      n U $  SU-  5       e)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	"12 H 
k	!%a5
 H	 
e	!!!1 H 	:-	99ur   c                   >   ^  \ rS rSrSS\S\4U 4S jjjrS rSrU =r	$ )FastAdaptiveAvgPool:   flatten	input_fmtc                 N   > [         TU ]  5         Xl        [        U5      U l        g Nsuper__init__r+   r   dimselfr+   r,   	__class__s      r   r1   FastAdaptiveAvgPool.__init__;       "9-r   c                 T    UR                  U R                  U R                  (       + S9$ Nkeepdim)meanr2   r+   r4   r   s     r   forwardFastAdaptiveAvgPool.forward@        vvdhhDLL(8v99r   r2   r+   FNCHW)
__name__
__module____qualname____firstlineno__boolr   r1   r>   __static_attributes____classcell__r5   s   @r   r)   r)   :   s%    . . . .
: :r   r)   c                   >   ^  \ rS rSrSS\S\4U 4S jjjrS rSrU =r	$ )FastAdaptiveMaxPoolD   r+   r,   c                 N   > [         TU ]  5         Xl        [        U5      U l        g r.   r/   r3   s      r   r1   FastAdaptiveMaxPool.__init__E   r7   r   c                 T    UR                  U R                  U R                  (       + S9$ r9   )amaxr2   r+   r=   s     r   r>   FastAdaptiveMaxPool.forwardJ   r@   r   rA   rB   
rD   rE   rF   rG   rH   strr1   r>   rI   rJ   rK   s   @r   rM   rM   D   s%    . . . .
: :r   rM   c                   >   ^  \ rS rSrSS\S\4U 4S jjjrS rSrU =r	$ )FastAdaptiveAvgMaxPoolN   r+   r,   c                 N   > [         TU ]  5         Xl        [        U5      U l        g r.   r/   r3   s      r   r1   FastAdaptiveAvgMaxPool.__init__O   r7   r   c                     UR                  U R                  U R                  (       + S9nUR                  U R                  U R                  (       + S9nSU-  SU-  -   $ )Nr:   r   )r<   r2   r+   rR   r4   r   r   r   s       r   r>   FastAdaptiveAvgMaxPool.forwardT   sO    txxT\\)9:txxT\\)9:U{S5[((r   rA   rB   rT   rK   s   @r   rW   rW   N   s%    . . . .
) )r   rW   c                   >   ^  \ rS rSrSS\S\4U 4S jjjrS rSrU =r	$ )FastAdaptiveCatAvgMaxPoolZ   r+   r,   c                    > [         TU ]  5         Xl        [        U5      U l        U(       a  SU l        g [        U5      U l        g r   )r0   r1   r+   r   
dim_reducedim_catr   r3   s      r   r1   "FastAdaptiveCatAvgMaxPool.__init__[   s5    ))4DL*95DLr   c                     UR                  U R                  U R                  (       + S9nUR                  U R                  U R                  (       + S9n[        R
                  " X#4U R                  5      $ r9   )r<   rb   r+   rR   r   r    rc   r\   s       r   r>   !FastAdaptiveCatAvgMaxPool.forwardd   sS    tDLL0@AtDLL0@Ayy%66r   )rc   rb   r+   rB   rT   rK   s   @r   r_   r_   Z   s%    6 6 6 67 7r   r_   c                   :   ^  \ rS rSrSS\4U 4S jjjrS rSrU =r$ )AdaptiveAvgMaxPool2dj   r   c                 .   > [         TU ]  5         Xl        g r.   r0   r1   r   r4   r   r5   s     r   r1   AdaptiveAvgMaxPool2d.__init__k       &r   c                 ,    [        XR                  5      $ r.   )r   r   r=   s     r   r>   AdaptiveAvgMaxPool2d.forwardo   s    %a)9)9::r   r   r   	rD   rE   rF   rG   _int_tuple_2_tr1   r>   rI   rJ   rK   s   @r   rh   rh   j   s    'N ' '; ;r   rh   c                   :   ^  \ rS rSrSS\4U 4S jjjrS rSrU =r$ )AdaptiveCatAvgMaxPool2ds   r   c                 .   > [         TU ]  5         Xl        g r.   rk   rl   s     r   r1    AdaptiveCatAvgMaxPool2d.__init__t   rn   r   c                 ,    [        XR                  5      $ r.   )r!   r   r=   s     r   r>   AdaptiveCatAvgMaxPool2d.forwardx   s    (,<,<==r   rq   rr   rs   rK   s   @r   rv   rv   s   s    'N ' '> >r   rv   c            	       d   ^  \ rS rSrSr    SS\S\S\S\4U 4S jjjrS r	S	 r
S
 rS rSrU =r$ )SelectAdaptivePool2d|   zCSelectable global pooling layer with dynamic input kernel size
    r   r   r+   r,   c                 j  > [         TU ]  5         US;   d   eU=(       d    SU l        UR                  5       nU(       dR  [        R
                  " 5       U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        g UR                  S5      (       d  US:w  a  US:X  d   S5       eUR                  S5      (       a  [        X4S9U l        OUR                  S	5      (       a  [        X4S9U l        OZUR                  S
5      (       a  [        X4S9U l        O5US:X  d  UR                  S5      (       a  [        X4S9U l        O
 SU-  5       e[        R
                  " 5       U l        g US:X  d   eUS	:X  a  [        U5      U l        OeUS:X  a  [!        U5      U l        ONUS
:X  a  [        R"                  " U5      U l        O,US:X  a  [        R$                  " U5      U l        O
 SU-  5       eU(       a  [        R                  " S5      O[        R
                  " 5       U l        g )N)rC   NHWC r   fastrC   zAFast pooling and non NCHW input formats require output_size == 1.r
   )r,   r$   r%   r#   r&   )r0   r1   r   lowernnIdentitypoolFlattenr+   
startswithr   r_   rW   rM   r)   rh   rv   AdaptiveMaxPool2dAdaptiveAvgPool2d)r4   r   r   r+   r,   r5   s        r   r1   SelectAdaptivePool2d.__init__   s    	,,,,"bOO%	DI,32::a=DL!!&))Y&-@!#h%hh#!!+..5gS	##H--27P	##E**/M	f$	(:(:5(A(A/M	A5	AAu;;=DL&&&H$0=	k)3K@	e#00=	e#00=	A5	AAu,32::a=DLr   c                 $    U R                   (       + $ r.   r   r4   s    r   is_identity SelectAdaptivePool2d.is_identity   s    >>!!r   c                 J    U R                  U5      nU R                  U5      nU$ r.   )r   r+   r=   s     r   r>   SelectAdaptivePool2d.forward   s!    IIaLLLOr   c                 ,    [        U R                  5      $ r.   )r   r   r   s    r   	feat_multSelectAdaptivePool2d.feat_mult   s    &t~~66r   c                     U R                   R                  S-   S-   U R                  -   S-   [        U R                  5      -   S-   $ )N(z
pool_type=z
, flatten=))r5   rD   r   rU   r+   r   s    r   __repr__SelectAdaptivePool2d.__repr__   sN    ~~&&, $/ #DLL 12478 	8r   )r+   r   r   )r   r   FrC   )rD   rE   rF   rG   __doc__rt   rU   rH   r1   r   r>   r   r   rI   rJ   rK   s   @r   r}   r}   |   sf     +,#!#'G''G 'G 	'G
 'G 'GR"
78 8r   r}   )r#   rr   )r#   r   )r   typingr   r   r   r   torch.nnr   torch.nn.functional
functionalr   formatr   r   intrt   r   r   r!   r'   Moduler)   rM   rW   r_   rh   rv   r}    r   r   <module>r      s   
 * )     4sE#s(O+,!> !(n (N  :")) ::")) :	)RYY 	)7		 7 ;299 ;>bii >:8299 :8r   