o
    ϯi                     @   sR   d Z ddlZddlmZ G dd dejZG dd dejZG dd dejZdS )	a5  
Feature Fusion for Varible-Length Data Processing
AFF/iAFF is referred and modified from https://github.com/YimianDai/open-aff/blob/master/aff_pytorch/aff_net/fusion.py
According to the paper: Yimian Dai et al, Attentional Feature Fusion, IEEE Winter Conference on Applications of Computer Vision, WACV 2021
    Nc                       s(   e Zd ZdZ fddZdd Z  ZS )DAFu$   
    直接相加 DirectAddFuse
    c                    s   t t|   d S N)superr   __init__)self	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/clap_module/feature_fusion.pyr      s   zDAF.__init__c                 C   s   || S r   r	   )r   xresidualr	   r	   r
   forward   s   zDAF.forward__name__
__module____qualname____doc__r   r   __classcell__r	   r	   r   r
   r      s    r   c                       *   e Zd ZdZd	 fdd	Zdd Z  ZS )
iAFFu   
    多特征融合 iAFF
    @      2Dc                    s  t t|   t|| }|dkrttj||ddddt|tjddtj||ddddt|| _	tt
dtj||ddddt|tjddtj||ddddt|| _ttj||ddddt|tjddtj||ddddt|| _tt
dtj||ddddt|tjddtj||ddddt|| _n|dkrHttj||ddddt|tjddtj||ddddt|| _	ttdtj||ddddt|tjddtj||ddddt|| _ttj||ddddt|tjddtj||ddddt|| _ttdtj||ddddt|tjddtj||ddddt|| _ndt | _d S )	N1D   r   kernel_sizestridepaddingTinplacer   zthe type is not supported)r   r   r   intnn
SequentialConv1dBatchNorm1dReLU	local_attAdaptiveAvgPool1d
global_att
local_att2global_att2Conv2dBatchNorm2dAdaptiveAvgPool2dSigmoidsigmoidr   channelsrtypeinter_channelsr   r	   r
   r      s   
	





	



	ziAFF.__init__c                 C   s   d}|| }| ddkrtj||gdd}d}| |}| |}|| }| |}|| |d|   }	| |	}
| |	}|
| }| |}|| |d|   }|r[|d d}|S )NFr   r   dimT)sizetorchcatr'   r)   r0   r*   	unsqueeze)r   r   r   flagxaxlxgxlgweixixl2xg2xlg2wei2xor	   r	   r
   r   o   s$   





ziAFF.forwardr   r   r   r   r	   r	   r   r
   r      s    Sr   c                       r   )
AFFu   
    多特征融合 AFF
    r   r   r   c                    sp  t t|   t|| }|dkr^ttj||ddddt|tjddtj||ddddt|| _	tt
dtj||ddddt|tjddtj||ddddt|| _nS|dkrttj||ddddt|tjddtj||ddddt|| _	ttdtj||ddddt|tjddtj||ddddt|| _ndt | _d S )	Nr   r   r   r   Tr   r   zthe type is not supported.)r   rI   r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r,   r-   r.   r/   r0   r1   r   r	   r
   r      sH   



	zAFF.__init__c           
      C   s   d}|| }| ddkrtj||gdd}d}| |}| |}|| }| |}d| | d| d|   }	|rB|	d d}	|	S )NFr   r   r6   T   )r8   r9   r:   r'   r)   r0   r;   )
r   r   r   r<   r=   r>   r?   r@   rA   rG   r	   r	   r
   r      s   


zAFF.forwardrH   r   r	   r	   r   r
   rI      s    )rI   )r   r9   torch.nnr"   Moduler   r   rI   r	   r	   r	   r
   <module>   s    n