o
    ߥi                     @   sZ   d dl Zd dlZd dlmZ d dlm  mZ ddl	m
Z
mZmZmZ G dd de
ZdS )    N   )	LayerBaseexpect_kaldi_matrixexpect_token_numberto_kaldi_matrixc                       s@   e Zd Z					d fdd	Zdd Zdd	 Zd
d Z  ZS )DeepFsmnNFr   c                    s   t t|   || _|| _|d u rd S || _|| _|| _|| _t	
||| _t	|| _t	j|d| _t	j|d| _t	j
||dd| _t	j|||dgddg|dd| _t	j|||dgddg|dd| _d S )N)pFbiasr   groupsr
   )superr   __init__	input_dim
output_dimlorderrorderhidden_size
layer_normnnLinearlinear	LayerNormnormDropoutdrop1drop2projectConv2dconv1conv2)selfr   r   r   r   r   r   dropout	__class__ `/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/audio/aec/layers/deep_fsmn.pyr      s4   zDeepFsmn.__init__c           
      C   s   t | |}| |}| jr| |}| |}t|d}|	dddd}t 
|dd| jd dg}t 
|ddd| jg}|d d d d dd d d f }|| | | | }| |}|	dddd}	||	  S )Nr   r         )Frelur   r   r   r   r   th	unsqueezepermutepadr   r   r   r    r   squeeze)
r!   inputf1p1xx_peryyroutout1r%   r%   r&   forward4   s   


 
zDeepFsmn.forwardc                 C   s   d}|d| j | jf 7 }|dd| j| jdf 7 }|  d }t|  j	}|t
|7 }|  d }|  }|t
|7 }|  d }|  }|t
|7 }|  d }|  }|t
|7 }|S )	N z<UniDeepFsmn> %d %d
zE<LearnRateCoef> %d <HidSize> %d <LOrder> %d <LStride> %d <MaxNorm> 0
r   zconv1.weightzproject.weightzlinear.weightzlinear.bias)r   r   r   r   
state_dictnpflipudr/   numpyTr   )r!   re_strlfitersr3   proj_weightslinear_weightslinear_biasr%   r%   r&   to_kaldi_nnetM   s(   
zDeepFsmn.to_kaldi_nnetc           
      C   s2  t |d}|d u rtd|\}}t |d}|d u rtd|\}}t|| _t |d}|d u r4td|\}}t|| _t |d}|d u rJtd|\}}|| _t |d	}|d u r^td
t|}|d u rjtd|\}}t|j	
 }tj| j| j| jdgddg| jdd| _t|tj}	|	d}	|	d}	tj|	| j_t|}|d u rtd|\}}tj| j| jdd| _t| j| j| _tjt|tj| j_t|}|d u rtd|\}}tjt|tj| j_t|}|d u rtd|\}}tjt|tj| j_|S )Nz<LearnRateCoef>z,UniDeepFsmn format error for <LearnRateCoef>z	<HidSize>z&UniDeepFsmn format error for <HidSize>z<LOrder>z%UniDeepFsmn format error for <LOrder>z	<LStride>z&UniDeepFsmn format error for <LStride>z	<MaxNorm>z&UniDeepFsmn format error for <MaxNorm>z+UniDeepFsmn format error for parsing matrixr   Fr   r'   r	   )r   	Exceptionintr   r   lstrider   r<   fliplrr?   copyr   r   r   r   r+   
from_numpytypeFloatTensorr,   	Parameterweightr   r   r   r   r
   )
r!   instroutputlr
hiddensizer   rH   matmat1mat_thr%   r%   r&   load_kaldi_nneta   s   




zDeepFsmn.load_kaldi_nnet)NNNFr   )__name__
__module____qualname__r   r9   rE   rW   __classcell__r%   r%   r#   r&   r      s    &r   )r>   r<   torchr+   torch.nnr   torch.nn.functional
functionalr)   
layer_baser   r   r   r   r   r%   r%   r%   r&   <module>   s   