U
    ¯Ê¹j¥  ã                   @   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ed	œd
d„Zd ed	œdd„Zd!ed	œ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 d S )NÚ	catavgmaxé   r   )Úendswith©Ú	pool_type© r   ú_/var/www/html/bwave/python/venv/lib/python3.8/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  | |¡} nN|dkr*t| |ƒ} n:|dkr>t| |ƒ} n&|dkrTt  | |¡} ndsdtd| ƒ‚| S )zFSelectable global pooling function with dynamic input kernel size
    r   Úavgmaxr	   ÚmaxFzInvalid pool type: %s)r   r   r   r   r   ÚAssertionError)r   r   r   r   r   r   Úselect_adaptive_pool2d*   s    r#   c                       s.   e Zd Zdeedœ‡ fdd„Zdd„ Z‡  ZS )	ÚFastAdaptiveAvgPoolFÚNCHW©ÚflattenÚ	input_fmtc                    s"   t t| ƒ ¡  || _t|ƒ| _d S ©N)Úsuperr$   Ú__init__r'   r   Údim©Úselfr'   r(   ©Ú	__class__r   r   r+   ;   s    zFastAdaptiveAvgPool.__init__c                 C   s   |j | j| j d�S ©N©Zkeepdim)Úmeanr,   r'   ©r.   r   r   r   r   Úforward@   s    zFastAdaptiveAvgPool.forward)Fr%   )Ú__name__Ú
__module__Ú__qualname__Úboolr   r+   r5   Ú__classcell__r   r   r/   r   r$   :   s   r$   c                       s.   e Zd Zdeedœ‡ fdd„Zdd„ Z‡  ZS )	ÚFastAdaptiveMaxPoolFr%   r&   c                    s"   t t| ƒ ¡  || _t|ƒ| _d S r)   )r*   r;   r+   r'   r   r,   r-   r/   r   r   r+   E   s    zFastAdaptiveMaxPool.__init__c                 C   s   |j | j| j d�S r1   )Úamaxr,   r'   r4   r   r   r   r5   J   s    zFastAdaptiveMaxPool.forward)Fr%   ©r6   r7   r8   r9   Ústrr+   r5   r:   r   r   r/   r   r;   D   s   r;   c                       s.   e Zd Zdeedœ‡ fdd„Zdd„ Z‡  ZS )	ÚFastAdaptiveAvgMaxPoolFr%   r&   c                    s"   t t| ƒ ¡  || _t|ƒ| _d S r)   )r*   r?   r+   r'   r   r,   r-   r/   r   r   r+   O   s    zFastAdaptiveAvgMaxPool.__init__c                 C   s8   |j | j| j d�}|j| j| j d�}d| d|  S )Nr2   r   )r3   r,   r'   r<   ©r.   r   r   r   r   r   r   r5   T   s    zFastAdaptiveAvgMaxPool.forward)Fr%   r=   r   r   r/   r   r?   N   s   r?   c                       s.   e Zd Zdeedœ‡ fdd„Zdd„ Z‡  ZS )	ÚFastAdaptiveCatAvgMaxPoolFr%   r&   c                    s8   t t| ƒ ¡  || _t|ƒ| _|r*d| _n
t|ƒ| _d S r   )r*   rA   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 r1   )r3   rB   r'   r<   r   r   rC   r@   r   r   r   r5   d   s    z!FastAdaptiveCatAvgMaxPool.forward)Fr%   r=   r   r   r/   r   rA   Z   s   	rA   c                       s,   e Zd Zdedœ‡ fdd„Zdd„ Z‡  ZS )ÚAdaptiveAvgMaxPool2dr   r   c                    s   t t| ƒ ¡  || _d S r)   )r*   rD   r+   r   ©r.   r   r/   r   r   r+   k   s    zAdaptiveAvgMaxPool2d.__init__c                 C   s   t || jƒS r)   )r   r   r4   r   r   r   r5   o   s    zAdaptiveAvgMaxPool2d.forward)r   ©r6   r7   r8   Ú_int_tuple_2_tr+   r5   r:   r   r   r/   r   rD   j   s   rD   c                       s,   e Zd Zdedœ‡ fdd„Zdd„ Z‡  ZS )ÚAdaptiveCatAvgMaxPool2dr   r   c                    s   t t| ƒ ¡  || _d S r)   )r*   rH   r+   r   rE   r/   r   r   r+   t   s    z AdaptiveCatAvgMaxPool2d.__init__c                 C   s   t || jƒS r)   )r   r   r4   r   r   r   r5   x   s    zAdaptiveCatAvgMaxPool2d.forward)r   rF   r   r   r/   r   rH   s   s   rH   c                       sN   e Zd ZdZdeeeedœ‡ 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                    sN  t t| ƒ ¡  |dkst‚|p d| _|sLt ¡ | _|r@t d¡nt ¡ | _	nþ| 
d¡s^|dkrÖ|dksntdƒ‚| d¡rˆt||d�| _nB| d	¡r¢t||d�| _n(| d
¡r¼t||d�| _nt||d�| _t ¡ | _	nt|dksât‚|d	kröt|ƒ| _n:|dk�rt|ƒ| _n$|d
k�r$t |¡| _nt |¡| _|�r@t d¡nt ¡ | _	d S )N)r%   ZNHWCÚ r   rJ   r%   zAFast pooling and non NCHW input formats require output_size == 1.r	   )r(   r    r!   )r*   rI   r+   r"   r   ÚnnZIdentityÚpoolZFlattenr'   Ú
startswithr   rA   r?   r;   r$   rD   rH   ZAdaptiveMaxPool2dZAdaptiveAvgPool2d)r.   r   r   r'   r(   r/   r   r   r+      s2    






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)   )rM   r'   r4   r   r   r   r5   ¦   s    

zSelectAdaptivePool2d.forwardc                 C   s
   t | jƒS r)   )r   r   rO   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   r6   r   r>   r'   rO   r   r   r   Ú__repr__®   s    
ÿÿþþþzSelectAdaptivePool2d.__repr__)r   rJ   Fr%   )r6   r7   r8   Ú__doc__rG   r>   r9   r+   rP   r5   rQ   rT   r:   r   r   r/   r   rI   |   s       ûû$rI   )r   )r   )r   )r   r   )rU   Útypingr   r   r   r   Ztorch.nnrL   Ztorch.nn.functionalZ
functionalr   Úformatr   r   ÚintrG   r   r   r   r#   ÚModuler$   r;   r?   rA   rD   rH   rI   r   r   r   r   Ú<module>   s"   


		