o
    4ѹg#                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlm  m	Z
 d dlmZ d dlmZmZmZ G dd deZeG 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ZG dd dejZG dd dejZdS )    N)Enumauto)	dataclass)	LayerNormSamePadTransposeLastc                   @   s   e Zd Ze ZdS )ModalityN)__name__
__module____qualname__r   ZAUDIO r   r   e/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/models/emotion2vec/modules.pyr      s    
r   c                   @   s   e Zd ZU dZeed< dZeed< dZeed< dZeed< dZ	e
ed	< d
Zeed< d
Zeed< dZeed< dZeed< dZe
ed< dS )D2vDecoderConfigi  decoder_dim   decoder_groups   decoder_kerneldecoder_layersg?input_dropoutFadd_positions_maskedadd_positions_allTdecoder_residual   projection_layersg       @projection_ratioN)r	   r
   r   r   int__annotations__r   r   r   r   floatr   boolr   r   r   r   r   r   r   r   r      s   
 r   c                       $   e Zd Z fddZdd Z  ZS )FixedPositionalEncoderc                       t    || _d S N)super__init__	positions)selfZ	pos_embed	__class__r   r   r%   (      

zFixedPositionalEncoder.__init__c                 C   s   | j S r#   )r&   r'   xpadding_maskr   r   r   forward,   s   zFixedPositionalEncoder.forwardr	   r
   r   r%   r.   __classcell__r   r   r(   r   r!   '   s    r!   c                       s(   e Zd ZdZ fddZdd Z  ZS )TextFeatPositionalEncoderz
    Original encoder expects (B, T) long input. This module wraps it to take
    local_encoder output which are (B, T, D) float tensors
    c                    r"   r#   )r$   r%   pos_encoder)r'   r2   r(   r   r   r%   6   r*   z"TextFeatPositionalEncoder.__init__c                 C   s   |  |d S )N).r   )r2   r+   r   r   r   r.   :   s   z!TextFeatPositionalEncoder.forward)r	   r
   r   __doc__r%   r.   r0   r   r   r(   r   r1   0   s    r1   c                       r    )BlockEncoderc                    s6   t    || _|| _|| _|| _tj|dd| _d S )NTZinplace)	r$   r%   blocksnormlayer_norm_first	layerdropnnDropoutdropout)r'   r6   
norm_layerr8   r9   r<   r(   r   r   r%   A   s   
zBlockEncoder.__init__c           
      C   s   | j d ur| js|  |}| |}t| jD ]=\}}| jr+| jdks+tj | jkrT|}|d urL|d urL|	ddkr@|| n|
d}||| }||||\}}	q| j d urb| jrb|  |}|S )Nr   r   )r7   r8   r<   	enumerater6   Ztrainingr9   nprandomsizeZsqueezetype_as)
r'   r,   r-   
alibi_biasZalibi_scaleiZblkabscale_r   r   r   r.   I   s   

  
zBlockEncoder.forwardr/   r   r   r(   r   r4   @   s    r4   c                       s<   e Zd ZU eed< def fddZdd Zdd Z  ZS )	DecoderBasedecoder_cfgcfgc                    r"   r#   )r$   r%   rI   )r'   rJ   r(   r   r   r%   `   s   

zDecoderBase.__init__c                 C   s(   | j  D ]}t|tjr|  qd S r#   )projmodules
isinstancer:   Linearreset_parameters)r'   modr   r   r   rO   e   s
   zDecoderBase.reset_parametersc                 C   s4   |d u s| j jr|d|dkr|S || }|S )Nr   )rI   r   rA   )r'   r,   residualrD   	mask_inforetr   r   r   add_residualj   s   zDecoderBase.add_residual)	r	   r
   r   r   r   r%   rO   rT   r0   r   r   r(   r   rH   ]   s
   
 rH   c                       s*   e Zd Zdef fddZdd Z  ZS )	Decoder1drJ   c                    s   t     fddtj fddt jD  | _g } j}t jd D ]!}|dkr7t	| j
 n|}|t|| |t  |}q*|t| t|dkrb|d | _d S tj| | _d S )Nc                    sN   t j|  j j jd  jdt jt t jddt t  g}t j	| S )N   )Zkernel_sizepaddinggroupsF)Zelementwise_affine)
r:   ZConv1dr   r   r   r   r   r   GELU
Sequential)Zin_dimblock)rJ   r   r   
make_block{   s   
z&Decoder1d.__init__.<locals>.make_blockc                    s"   g | ]}|d krn j qS )r   )r   ).0rD   rJ   	input_dimr\   r   r   
<listcomp>   s    z&Decoder1d.__init__.<locals>.<listcomp>r   r   )r$   r%   r:   rZ   ranger   r6   r   r   r   r   appendrN   rY   lenrK   )r'   rJ   r_   ZprojsZcurr_dimrD   Znext_dimr(   r^   r   r%   x   s$   zDecoder1d.__init__c                 C   sZ   | dd}|}t| jD ]\}}||}| ||||}|}q| dd}| |}|S )Nr   rV   )	transposer>   r6   rT   rK   )r'   r,   rR   rQ   rD   Zlayerr   r   r   r.      s   
zDecoder1d.forward)r	   r
   r   r   r%   r.   r0   r   r   r(   r   rU   w   s    )rU   c                       sF   e Zd Zddddddddejejdddf fdd	Zd
dd	Z  ZS )AltBlockg      @FN        Tc              	      s   t    || _|| _ddlm}m} ||| _t|||||||d| _	|
dkr,||
nt
 | _||| _t|| }|||||d| _t
j|	dd| _d S )Nr   )DropPathMlp)	num_headsqkv_biasqk_scale	attn_drop	proj_dropcosine_attentionrf   )Zin_featuresZhidden_features	act_layerdropFr5   )r$   r%   r8   ffn_targetsZ&funasr.models.emotion2vec.timm_modulesrg   rh   norm1AltAttentionattnr:   ZIdentity	drop_pathnorm2r   mlpr;   post_mlp_dropout)r'   dimri   Z	mlp_ratiorj   rk   rp   rl   Zmlp_dropZpost_mlp_dropru   ro   r=   r8   rq   rn   rg   rh   Zmlp_hidden_dimr(   r   r   r%      s0   



zAltBlock.__init__c                 C   s   | j r1|| | | ||| }| | | }}|}|| | | }| js-|}||fS || | ||| }| | }}| |}|}| || | | }| js]|}||fS r#   )r8   ru   rt   rr   rw   rv   rx   rq   )r'   r,   r-   rC   rtr   r   r   r.      s    

zAltBlock.forwardNN)	r	   r
   r   r:   rY   r   r%   r.   r0   r   r   r(   r   re      s     /re   c                       s4   e Zd Z						d	 fdd	Zd
ddZ  ZS )rs      FNrf   c           	   	      s   t    || _|| }|p|d | _tj||d |d| _t|| _t||| _	t|| _
|| _|rKtjtdt|ddf dd| _d S d S )Ng         )Zbias
   r   T)Zrequires_grad)r$   r%   ri   rF   r:   rN   qkvr;   rl   rK   rm   rn   	ParametertorchlogZoneslogit_scale)	r'   ry   ri   rj   rk   rl   rm   rn   Zhead_dimr(   r   r   r%      s   

zAltAttention.__init__c                 C   s  |j \}}}| |||d| j|| j ddddd}|d |d |d }}	}
|j}| jrXtj|ddtj|	dd	dd }t
j| jt
t
d	d
 }|| }n|| j }||		dd }|d ur||}|d d d |df  |7  < |d ur| r||ddt
jtd}|jdt
jdj|d}| |}||
 	dd}||||}| |}| |}|S )Nr~   rV   r   r      )ry   g      Y@)maxz-inf)ry   dtype)r   )shaper   Zreshaperi   Zpermuter   rn   F	normalizerd   r   clampr   r   ZtensorexprF   rB   rA   anyZmasked_fillZ	unsqueezetor   r   ZsoftmaxZfloat32rl   rK   rm   )r'   r,   r-   rC   BNCr   qkvr   rt   r   r   r   r   r.     sF   
$


"


zAltAttention.forward)r}   FNrf   rf   Fr|   r/   r   r   r(   r   rs      s    rs   )r   Znumpyr?   Ztorch.nnr:   enumr   r   Ztorch.nn.functionalZ
functionalr   dataclassesr   Z)funasr.models.emotion2vec.fairseq_modulesr   r   r   r   r   Moduler!   r1   r4   rH   rU   re   rs   r   r   r   r   <module>   s"   	:D