o
    )Îjþ  ã                   @   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ÚlinearZ	LayerNormÚnormZDropoutÚdrop1Údrop2ÚprojectÚConv2dÚconv1Úconv2)Úselfr   r   r   r   r   r   Zdropout©Ú	__class__© úm/var/www/html/Deteccion_Ine/venv/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   é   é   )ÚFZrelur   r   r   r   r   ÚthÚ	unsqueezeZpermuteÚpadr   r   r   r   r   Úsqueeze)
r   ÚinputÚf1Úp1ÚxZx_perÚyÚyrÚoutZ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   Z
state_dictÚnpZflipudr*   ÚnumpyÚTr   )r   Zre_strZlfitersr.   Zproj_weightsZlinear_weightsZ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 r±tdƒ‚|\}}tj| j| jdd| _t | j| j¡| _tj t |¡ tj¡¡| j_t|ƒ}|d u rät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   r4   Zfliplrr6   Úcopyr   r   r   r   r'   Z
from_numpyÚtypeZFloatTensorr(   Ú	ParameterÚweightr   r   r   r   r
   )
r   ÚinstrÚoutputÚlrZ
hiddensizer   r:   ZmatZmat1Zmat_thr"   r"   r#   Úload_kaldi_nneta   s˜   þþ
þ
þþü

ÿÿ
ÿzDeepFsmn.load_kaldi_nnet)NNNFr   )Ú__name__Ú
__module__Ú__qualname__r   r2   r7   rB   Ú__classcell__r"   r"   r    r#   r      s    ù&r   )r5   r4   Ztorchr'   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr&   Z
layer_baser   r   r   r   r   r"   r"   r"   r#   Ú<module>   s   