o
    پi                     @   s  d Z ddlmZmZmZ ddlZddlmZ ddlm  m	Z
 ddlmZmZ eeeeef f ZdddZdd	efd
dZdd	efddZd d	efddZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdS )!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_dimavgc                 C   s   |  drdS dS )N	catavgmax   r   )endswith	pool_type r   T/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/adaptive_avgmax_pool.pyadaptive_pool_feat_mult   s   
r   output_sizec                 C   s$   t | |}t | |}d||  S )N      ?)Fadaptive_avg_pool2dadaptive_max_pool2dxr   x_avgx_maxr   r   r   adaptive_avgmax_pool2d   s   r   c                 C   s(   t | |}t | |}t||fdS Nr   )r   r   r   torchcatr   r   r   r   adaptive_catavgmax_pool2d$   s   r   c                 C   sh   |dkrt | |} | S |dkrt| |} | S |dkr"t| |} | S |dkr.t | |} | S J d| )zFSelectable global pooling function with dynamic input kernel size
    r   avgmaxr	   maxFInvalid pool type: %s)r   r   r   r   r   )r   r   r   r   r   r   select_adaptive_pool2d*   s   	

r"   c                       0   e Zd Zd	dedef fddZdd Z  ZS )
FastAdaptiveAvgPoolFNCHWflatten	input_fmtc                    "   t t|   || _t|| _d S N)superr$   __init__r&   r   dimselfr&   r'   	__class__r   r   r+   ;      zFastAdaptiveAvgPool.__init__c                 C      |j | j| j dS Nkeepdim)meanr,   r&   r.   r   r   r   r   forward@      zFastAdaptiveAvgPool.forwardFr%   )__name__
__module____qualname__boolr   r+   r8   __classcell__r   r   r/   r   r$   :       r$   c                       r#   )
FastAdaptiveMaxPoolFr%   r&   r'   c                    r(   r)   )r*   rA   r+   r&   r   r,   r-   r/   r   r   r+   E   r1   zFastAdaptiveMaxPool.__init__c                 C   r2   r3   )amaxr,   r&   r7   r   r   r   r8   J   r9   zFastAdaptiveMaxPool.forwardr:   r;   r<   r=   r>   strr+   r8   r?   r   r   r/   r   rA   D   r@   rA   c                       r#   )
FastAdaptiveAvgMaxPoolFr%   r&   r'   c                    r(   r)   )r*   rE   r+   r&   r   r,   r-   r/   r   r   r+   O   r1   zFastAdaptiveAvgMaxPool.__init__c                 C   s8   |j | j| j d}|j| j| j d}d| d|  S )Nr4   r   )r6   r,   r&   rB   r.   r   r   r   r   r   r   r8   T   s   zFastAdaptiveAvgMaxPool.forwardr:   rC   r   r   r/   r   rE   N   r@   rE   c                       r#   )
FastAdaptiveCatAvgMaxPoolFr%   r&   r'   c                    s:   t t|   || _t|| _|rd| _d S t|| _d S r   )r*   rG   r+   r&   r   
dim_reducedim_catr   r-   r/   r   r   r+   [   s   

z"FastAdaptiveCatAvgMaxPool.__init__c                 C   s:   |j | j| j d}|j| j| j d}t||f| jS r3   )r6   rH   r&   rB   r   r   rI   rF   r   r   r   r8   d   s   z!FastAdaptiveCatAvgMaxPool.forwardr:   rC   r   r   r/   r   rG   Z   s    	rG   c                       ,   e Zd Zddef fddZdd Z  ZS )AdaptiveAvgMaxPool2dr   r   c                       t t|   || _d S r)   )r*   rK   r+   r   r.   r   r/   r   r   r+   k      
zAdaptiveAvgMaxPool2d.__init__c                 C      t || jS r)   )r   r   r7   r   r   r   r8   o      zAdaptiveAvgMaxPool2d.forwardr   r;   r<   r=   _int_tuple_2_tr+   r8   r?   r   r   r/   r   rK   j       rK   c                       rJ   )AdaptiveCatAvgMaxPool2dr   r   c                    rL   r)   )r*   rU   r+   r   rM   r/   r   r   r+   t   rN   z AdaptiveCatAvgMaxPool2d.__init__c                 C   rO   r)   )r   r   r7   r   r   r   r8   x   rP   zAdaptiveCatAvgMaxPool2d.forwardrQ   rR   r   r   r/   r   rU   s   rT   rU   c                	       s\   e Zd ZdZ				ddededed	ef fd
dZdd Zdd Z	dd Z
dd Z  ZS )SelectAdaptivePool2dzCSelectable global pooling layer with dynamic input kernel size
    r   fastFr%   r   r   r&   r'   c                    s  t t|   |dv sJ |pd| _| }|s.t | _|r'td| _	d S t | _	d S |
ds7|dkr|dks?J d|drLt||d| _n1|d	rYt||d| _n$|d
rft||d| _n|dkso|drwt||d| _nJ d| t | _	d S |dksJ |d	krt|| _n&|dkrt|| _n|d
krt|| _n|dkrt|| _nJ d| |rtdnt | _	d S )N)r%   NHWC r   rW   r%   zAFast pooling and non NCHW input formats require output_size == 1.r	   )r'   r   r    r   Fr!   )r*   rV   r+   r   lowernnIdentitypoolFlattenr&   
startswithr   rG   rE   rA   r$   rK   rU   AdaptiveMaxPool2dAdaptiveAvgPool2d)r.   r   r   r&   r'   r/   r   r   r+      s<   

"


zSelectAdaptivePool2d.__init__c                 C   s   | j  S r)   r   r.   r   r   r   is_identity   s   z SelectAdaptivePool2d.is_identityc                 C   s   |  |}| |}|S r)   )r]   r&   r7   r   r   r   r8      s   

zSelectAdaptivePool2d.forwardc                 C   s
   t | jS r)   )r   r   rb   r   r   r   	feat_mult   s   
zSelectAdaptivePool2d.feat_multc                 C   s(   | j jd d | j d t| j d S )N(z
pool_type=z
, flatten=))r0   r;   r   rD   r&   rb   r   r   r   __repr__   s   
zSelectAdaptivePool2d.__repr__)r   rW   Fr%   )r;   r<   r=   __doc__rS   rD   r>   r+   rc   r8   rd   rg   r?   r   r   r/   r   rV   |   s&    )rV   )r   rQ   )r   r   )rh   typingr   r   r   r   torch.nnr[   torch.nn.functional
functionalr   formatr   r   intrS   r   r   r   r"   Moduler$   rA   rE   rG   rK   rU   rV   r   r   r   r   <module>   s$    


		