U
    ¯Ê¹j‚  ã                   @   sl   d dl mZ d dlZd dlmZ d dlm  mZ ddlm	Z	 ddl
mZ ddlmZ G dd„ dejƒZdS )	é    )ÚOptionalNé   )Úuse_fused_attn)ÚMlp)Útrunc_normal_tf_c                       sh   e Zd ZU dZejje ed< de	e	e	e	e
eee	e	eeeej e
dœ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚAttentionPoolLatentz' Attention pooling w/ latent query
    Ú
fused_attnNé   ç      @TFr   Ú Útokenç        )Úin_featuresÚout_featuresÚ	embed_dimÚ	num_headsÚ	mlp_ratioÚqkv_biasÚqk_normÚ
latent_lenÚ
latent_dimÚ	pos_embedÚ	pool_typeÚ
norm_layerÚdropc                    sT  t ƒ  ¡  |p|}|p|}|| dks*t‚|| _|| | _| jd | _|| _tƒ | _|
dkrx| j	}t
 t ||¡¡| _nd | _|	p„|| _|| _t
 t d| j|¡¡| _t
j|||d�| _t
j||d |d�| _|rÜ|| jƒnt
 ¡ | _|rô|| jƒnt
 ¡ | _t
 ||¡| _t
 |¡| _|d k	�r*||ƒnt
 ¡ | _t|t|| ƒƒ| _|  ¡  d S )Nr   ç      à¿Úabsr   )Zbiasé   ) ÚsuperÚ__init__ÚAssertionErrorr   Úhead_dimÚscaleÚpoolr   r   Z	feat_sizeÚnnÚ	ParameterÚtorchZzerosr   r   r   ÚlatentZLinearÚqÚkvZIdentityÚq_normÚk_normÚprojZDropoutÚ	proj_dropÚnormr   ÚintÚmlpÚinit_weights)Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   Zspatial_len©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/attention_pool.pyr      s2    


zAttentionPoolLatent.__init__c                 C   s<   | j d k	r$t| j | j jd d d� t| j| jd d� d S )Nr   r   )Zstd)r   r   Úshaper'   r   )r2   r5   r5   r6   r1   A   s    
z AttentionPoolLatent.init_weightsc                 C   sl  |j \}}}| jd k	r.|| j d¡ |j¡ }| j |dd¡}|  |¡ || j	| j
| j¡ dd¡}|  |¡ ||d| j
| j¡ ddddd¡}| d¡\}}	|  |¡|  |¡ }}| jrÆt |||	¡}n.|| j }|| dd¡ }
|
jdd�}
|
|	 }| dd¡ || j	|¡}|  |¡}|  |¡}||  |  |¡¡ }| jd	k�rR|d d …df }n| jd
k�rh| d¡}|S )Nr   éÿÿÿÿr   r   é   é   éþÿÿÿ)Údimr   Úavg)r7   r   Z	unsqueezeÚtoZdtyper'   Úexpandr(   Zreshaper   r   r!   Z	transposer)   ZpermuteZunbindr*   r+   r   ÚFZscaled_dot_product_attentionr"   Zsoftmaxr,   r-   r0   r.   r#   Zmean)r2   ÚxÚBÚNÚCZq_latentr(   r)   ÚkÚvZattnr5   r5   r6   ÚforwardF   s.    
$*



zAttentionPoolLatent.forward)NNr	   r
   TFr   Nr   r   Nr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   ZjitÚFinalÚboolÚ__annotations__r/   ÚfloatÚstrr   r$   ÚModuler   r1   rG   Ú__classcell__r5   r5   r3   r6   r      s>   
            òò0r   )Útypingr   r&   Ztorch.nnr$   Ztorch.nn.functionalZ
functionalr@   Úconfigr   r0   r   Zweight_initr   rQ   r   r5   r5   r5   r6   Ú<module>   s   