Ë
    éÓ^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   € Ü×!Ñ! ! [Ó1€EÜ×!Ñ! ! [Ó1€EØ�%˜%‘-Ñ Ð r   c                 óŠ   — t        j                  | |«      }t        j                  | |«      }t        j                  ||fd«      S ©Nr   )r   r   r   ÚtorchÚcatr   s       r   Úadaptive_catavgmax_pool2dr!   $   s;   € Ü×!Ñ! ! [Ó1€EÜ×!Ñ! ! [Ó1€EÜ�9‰9�e˜U�^ 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Ò	Ü" 1 kÓ2ˆð €Hð 
�kÒ	!Ü% a¨Ó5ˆð
 €Hð	 
�eÒ	Ü×!Ñ! ! [Ó1ˆð €Hð 	:Ð-°	Ñ9Ó9ˆur   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@   ó    € Ø�v‰v�d—h‘h¨D¯L©LÐ(8ˆvÓ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   € Ø—‘�t—x‘x¨T¯\©\Ð)9�Ó:ˆØ—‘�t—x‘x¨T¯\©\Ð)9�Ó:ˆØ�U‰{˜S 5™[Ñ(Ð(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ˆŒÙØˆD�Lä*¨9Ó5ˆD�Lr   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—‘°D·L±LÐ0@�ÓAˆØ—‘�t—‘°D·L±LÐ0@�ÓAˆÜ�y‰y˜% ˜¨¯©Ó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ˆŒØ—O‘OÓ%ˆ	ÙÜŸ™›ˆDŒIÙ,3œ2Ÿ:™: a›=ˆD�L¼¿¹»ˆD�LØ×!Ñ! &Ô)¨Y¸&Ò-@Ø !Ò#ÐhÐ%hÓhÐ#Ø×!Ñ! +Ô.Ü5°gÈÔS�•	Ø×#Ñ# HÔ-Ü2°7ÀiÔP�•	Ø×#Ñ# EÔ*Ü/°À9ÔM�•	Ø˜fÒ$¨	×(:Ñ(:¸5Ô(AÜ/°À9ÔM�•	àAÐ5¸	ÑAÓA�uÜŸ;™;›=ˆD�Là Ò&Ð&Ð&Ø˜HÒ$Ü0°Ó=�•	Ø˜kÒ)Ü3°KÓ@�•	Ø˜eÒ#Ü×0Ñ0°Ó=�•	Ø˜eÒ#Ü×0Ñ0°Ó=�•	àAÐ5¸	ÑAÓA�uÙ,3œ2Ÿ:™: aœ=¼¿¹»ˆD�Lr   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!   € Ø�I‰I�a‹LˆØ�L‰L˜‹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   € Ø�~‰~×&Ñ&¨Ñ,ØñØ $§¡ñ/àñä # D§L¡LÓ 1ñ2à47ñ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à�s˜E # s (™OÐ+Ñ,€óñ!¨>ó !ñ(¨nó (ñ¸Nó ô :˜"Ÿ)™)ô :ô:˜"Ÿ)™)ô :ô	)˜RŸY™Yô 	)ô7 §	¡	ô 7ô ;˜2Ÿ9™9ô ;ô>˜bŸi™iô >ô:8˜2Ÿ9™9õ :8r   