o
    )ÎjXD  ã                   @   sj  d Z ddlmZ ddlZddlZddlmZ ddlm  m	Z
 dd„ Z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		d)dededededef
dd„ZG dd„ dejƒZedkr³edddddd d!dddd"ƒZeeƒ ed#d$„ e ¡ D ƒƒZed% e¡ƒ e dd&d¡Zeeƒ\ZZed' ej ¡ƒ ed( ej ¡ƒ ee !¡ ƒ dS dS )*z8
FSMN implementation.

Copyright: 2022-03-09 yueyue.nyy
é    )ÚTupleNc                 C   s:   t jt jt jd t| ƒ}| dd¡}| dd¡}d| S )N)Ú	thresholdZ	linewidthú[Ú ú]z[ %s ]
)ÚnpZset_printoptionsÚinfÚnanÚstrÚreplace)Znp_matZout_str© r   úk/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/audio/kws/nearfield/fsmn.pyÚtoKaldiMatrix   s
   r   c                 C   s,   d}|   ¡  ¡  ¡ }|t|ƒ7 }t|ƒ d S )Nr   )ÚdetachÚsqueezeÚnumpyr   Úprint)Ztorch_tensorÚre_strÚxr   r   r   ÚprintTensor   s   r   c                       ó4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚLinearTransformc                    sH   t t| ƒ ¡  || _|| _tj||dd| _tj	 
¡ | _tj	 ¡ | _d S )NF)Úbias)Úsuperr   Ú__init__Ú	input_dimÚ
output_dimÚnnÚLinearÚlinearÚtorchÚquantizationÚ	QuantStubÚquantÚDeQuantStubÚdequant©Úselfr   r   ©Ú	__class__r   r   r   !   s   zLinearTransform.__init__c                 C   ó"   |   |¡}|  |¡}|  |¡}|S ©N©r#   r   r%   ©r'   ÚinputÚoutputr   r   r   Úforward)   ó   


zLinearTransform.forwardc                 C   sH   d}|d| j | jf 7 }|d7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|S )Nr   z<LinearTransform> %d %d
z<LearnRateCoef> 1
úlinear.weight©r   r   Ú
state_dictr   r   r   )r'   r   Úlinear_weightsr   r   r   r   Úto_kaldi_net0   s   ÿzLinearTransform.to_kaldi_netc           
      C   s  |  ¡ }| ¡  ¡ }t|ƒdksJ ‚|d dksJ ‚t|d ƒ| _t|d ƒ| _|  ¡ }| d¡dks5J ‚| j 	¡  t
j| j| jft
jd}t| jƒD ]/}|  ¡ }| ¡  d	¡ ¡  ¡ }t|ƒ| jkseJ ‚t
jd
d„ |D ƒt
jd}	|	||d d …f< qK|| jj_d S )Né   r   z<LinearTransform>é   é   ÚLearnRateCoeféÿÿÿÿ©Zdtypeú[]c                 S   ó   g | ]}t |ƒ‘qS r   ©Úfloat©Ú.0Úitemr   r   r   Ú
<listcomp>R   ó    z2LinearTransform.to_pytorch_net.<locals>.<listcomp>)ÚreadlineÚstripÚsplitÚlenÚintr   r   Úfindr   Úreset_parametersr    ÚzerosÚfloat32ÚrangeÚtensorÚweightÚdata)
r'   ÚfreadZlinear_lineZlinear_splitÚlearn_rate_lineÚnew_weightsÚiÚlineÚsplitsÚcolsr   r   r   Úto_pytorch_net=   s*   
ÿÿzLinearTransform.to_pytorch_net©Ú__name__Ú
__module__Ú__qualname__r   r0   r6   rZ   Ú__classcell__r   r   r(   r   r      s
    r   c                       r   )	ÚAffineTransformc                    sD   t t| ƒ ¡  || _|| _t ||¡| _tj	 
¡ | _tj	 ¡ | _d S r+   )r   r`   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r(   r   r   r   [   s   zAffineTransform.__init__c                 C   r*   r+   r,   r-   r   r   r   r0   d   r1   zAffineTransform.forwardc                 C   sl   d}|d| j | jf 7 }|d7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|S )Nr   z<AffineTransform> %d %d
z4<LearnRateCoef> 1 <BiasLearnRateCoef> 1 <MaxNorm> 0
r2   zlinear.biasr3   )r'   r   r5   r   Zlinear_biasr   r   r   r6   k   s   ÿzAffineTransform.to_kaldi_netc                 C   sl  |  ¡ }| ¡  ¡ }t|ƒdksJ ‚|d dksJ ‚t|d ƒ| _t|d ƒ| _td| j| jf ƒ |  ¡ }| d¡dks?J ‚| j	 
¡  tj| j| jftjd	}t| jƒD ]/}|  ¡ }| ¡  d
¡ ¡  ¡ }t|ƒ| jksoJ ‚tjdd„ |D ƒtjd	}	|	||d d …f< qU|| j	j_|  ¡ }
|
 ¡  d
¡ ¡  ¡ }t|ƒ| jks¢J ‚tjdd„ |D ƒtjd	}|| j	j_d S )Nr7   r   z<AffineTransform>r8   r9   z'AffineTransform output/input dim: %d %dr:   r;   r<   r=   c                 S   r>   r   r?   rA   r   r   r   rD   “   rE   z2AffineTransform.to_pytorch_net.<locals>.<listcomp>c                 S   r>   r   r?   rA   r   r   r   rD   ž   rE   )rF   rG   rH   rI   rJ   r   r   r   rK   r   rL   r    rM   rN   rO   rP   rQ   rR   r   )r'   rS   Zaffine_lineZaffine_splitrT   rU   rV   rW   rX   rY   Z	bias_lineZnew_biasr   r   r   rZ   |   s>   
ÿ
ÿÿ
ÿzAffineTransform.to_pytorch_netr[   r   r   r(   r   r`   Y   s
    	r`   c                       sH   e Zd Z				ddedef‡ fdd„Zdd„ Zd	d
„ Zdd„ Z‡  ZS )Ú	FSMNBlockNr8   r   r   c                    s°   t t| ƒ ¡  || _|d u rd S || _|| _|| _|| _tj	| j| j|dg|dg| jdd| _
|dkrGtj	| j| j|dg|dg| jdd| _nd | _tj ¡ | _tj ¡ | _d S )Nr8   F)ZdilationÚgroupsr   r   )r   ra   r   ÚdimÚlorderÚrorderÚlstrideÚrstrider   ZConv2dÚ	conv_leftÚ
conv_rightr    r!   r"   r#   r$   r%   )r'   r   r   rd   re   rf   rg   r(   r   r   r   ¦   s4   	
û

ûzFSMNBlock.__init__c           	      C   sî   t  |d¡}| dddd¡}t |dd| jd | j dg¡}|  |¡}|  |¡}|  	|¡}|| }| j
d urht |ddd| j| j g¡}|d d …d d …| jd …d d …f }|  |¡}|  
|¡}|  	|¡}||7 }| dddd¡}| d¡}|S )Nr8   r   r7   r9   )r    Z	unsqueezeZpermuteÚFÚpadrd   rf   r#   rh   r%   ri   re   rg   r   )	r'   r.   r   Zx_perZy_leftÚoutZy_rightZout_perr/   r   r   r   r0   Ï   s"    



"



zFSMNBlock.forwardc                 C   s–   d}|d| j | j f 7 }|dd| j| j| j| jf 7 }|  ¡ d }t | ¡  	¡ j
¡}|t|ƒ7 }| jd urI|  ¡ d }| ¡  	¡ j
}|t|ƒ7 }|S )Nr   z<Fsmn> %d %d
zQ<LearnRateCoef> %d <LOrder> %d <ROrder> %d <LStride> %d <RStride> %d <MaxNorm> 0
r8   zconv_left.weightzconv_right.weight)rc   rd   re   rf   rg   r4   r   Zflipudr   r   ÚTr   ri   )r'   r   Zlfitersr   Zrfitersr   r   r   r6   æ   s   ÿ
zFSMNBlock.to_kaldi_netc                 C   s²  |  ¡ }| ¡  ¡ }t|ƒdksJ ‚|d dksJ ‚t|d ƒ| _|  ¡ }| ¡  d¡ ¡  ¡ }t|ƒdks8J ‚|d dks@J ‚|d d	ksHJ ‚t|d ƒ| _|d
 dksWJ ‚t|d ƒ| _|d dksfJ ‚t|d ƒ| _|d dksuJ ‚t|d ƒ| _	|d dks„J ‚t
dƒ tj| jd| jdftjd}t| jƒD ]<}t
d| ƒ |  ¡ }| ¡  d¡ ¡  ¡ }	t|	ƒ| jks»J ‚tjdd„ |	D ƒtjd}
|
|| jd | dd d …df< q›t |dd¡}| j ¡  || jj_| jdkrWt
dƒ tj| jd| jdftjd}|  ¡ }t| jƒD ]9}t
d| ƒ |  ¡ }| ¡  d¡ ¡  ¡ }	t|	ƒ| jks+J ‚tjdd„ |	D ƒtjd}
|
||dd d …df< q
t |dd¡}| j ¡  || jj_d S d S )Nr7   r   z<Fsmn>r8   r=   é   z<LearnRateCoef>r9   z<LOrder>é   z<ROrder>é   é   z	<LStride>é   é   z	<RStride>é	   é
   z	<MaxNorm>zread conv_left weightr<   zread conv_left weight -- %dc                 S   r>   r   r?   rA   r   r   r   rD     rE   z,FSMNBlock.to_pytorch_net.<locals>.<listcomp>zread conv_right weightzread conv_right weight -- %dc                 S   r>   r   r?   rA   r   r   r   rD   /  rE   )rF   rG   rH   rI   rJ   rc   rd   re   rf   rg   r   r    rM   rN   rO   rP   Z	transposerh   rL   rQ   rR   ri   )r'   rS   Z	fsmn_lineZ
fsmn_splitZparams_lineZparams_splitZnew_lfiltersrV   rW   rX   rY   Znew_rfiltersr   r   r   rZ   ù   sj   ÿÿ 

ÿÿ
ízFSMNBlock.to_pytorch_net)NNr8   r8   )	r\   r]   r^   rJ   r   r0   r6   rZ   r_   r   r   r(   r   ra   ¤   s    ùþý)ra   c                       r   )	ÚRectifiedLinearc                    s.   t t| ƒ ¡  || _t ¡ | _t d¡| _d S )Ngš™™™™™¹?)	r   rv   r   rc   r   ZReLUÚreluZDropoutZdropoutr&   r(   r   r   r   <  s   
zRectifiedLinear.__init__c                 C   s   |   |¡}|S r+   )rw   )r'   r.   rl   r   r   r   r0   B  s   
zRectifiedLinear.forwardc                 C   s   d}|d| j | j f 7 }|S )Nr   z<RectifiedLinear> %d %d
)rc   )r'   r   r   r   r   r6   G  s   zRectifiedLinear.to_kaldi_netc                 C   sx   |  ¡ }| ¡  ¡ }t|ƒdksJ ‚|d dksJ ‚t|d ƒt|d ƒks(J ‚t|d ƒ| jks3J ‚t|d ƒ| _d S )Nr7   r   z<RectifiedLinear>r8   r9   )rF   rG   rH   rI   rJ   rc   )r'   rS   rW   rX   r   r   r   rZ   U  s   zRectifiedLinear.to_pytorch_netr[   r   r   r(   r   rv   :  s
    rv   r8   Úfsmn_layersÚ
linear_dimÚproj_dimrd   re   c                    s&   ‡ ‡‡‡fdd„t | ƒD ƒ}tj|Ž S )Nc                    s<   g | ]}t  tˆ ˆƒtˆˆˆˆd d ƒtˆˆ ƒtˆ ˆ ƒ¡‘qS )r8   )r   Ú
Sequentialr   ra   r`   rv   )rB   rV   ©ry   rd   rz   re   r   r   rD   h  s    ûüÿz"_build_repeats.<locals>.<listcomp>)rO   r   r{   )rx   ry   rz   rd   re   rf   rg   Zrepeatsr   r|   r   Ú_build_repeats_  s   	ú
	r}   c                       sœ   e Zd Zdedededededededed	ed
edef‡ fdd„Zdd„ Zejdddejdfdej	dej	de
ej	ej	f fdd„Zdd„ Zdd„ Z‡  ZS )ÚFSMNr   Úinput_affine_dimrx   ry   rz   rd   re   rf   rg   Úoutput_affine_dimr   c                    s¦   t t| ƒ ¡  || _|| _|| _|| _|| _|| _|| _	|| _
|	| _|
| _|| _t||ƒ| _t||ƒ| _t||ƒ| _t|||||||	ƒ| _t||
ƒ| _t|
|ƒ| _dS )a´  
            Args:
                input_dim:              input dimension
                input_affine_dim:       input affine layer dimension
                fsmn_layers:            no. of fsmn units
                linear_dim:             fsmn input dimension
                proj_dim:               fsmn projection dimension
                lorder:                 fsmn left order
                rorder:                 fsmn right order
                lstride:                fsmn left stride
                rstride:                fsmn right stride
                output_affine_dim:      output affine layer dimension
                output_dim:             output dimension
        N)r   r~   r   r   r   rx   ry   rz   rd   re   rf   rg   r€   r   r`   Ú
in_linear1Ú
in_linear2rv   rw   r}   ÚfsmnÚout_linear1Úout_linear2)r'   r   r   rx   ry   rz   rd   re   rf   rg   r€   r   r(   r   r   r   v  s(   
ÿzFSMN.__init__c                 C   s   d S r+   r   )r'   r   r   r   Úfuse_modules«  s   zFSMN.fuse_modulesr   r<   r.   Úin_cacheÚreturnc           	      C   sD   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}||fS )zŸ
        Args:
            input (torch.Tensor): Input tensor (B, T, D)
            in_cache(torch.Tensor): (B, D, C), C is the accumulated cache size
        )r   r‚   rw   rƒ   r„   r…   )	r'   r.   r‡   Úx1Zx2Zx3Zx4Zx5Zx6r   r   r   r0   ®  s   





zFSMN.forwardc                 C   s¾   d}|d7 }|| j  ¡ 7 }|| j ¡ 7 }|| j ¡ 7 }| jD ]"}||d  ¡ 7 }||d  ¡ 7 }||d  ¡ 7 }||d  ¡ 7 }q|| j ¡ 7 }|| j ¡ 7 }|d| j| jf 7 }|d7 }|S )	Nr   z<Nnet>
r   r8   r9   r7   z<Softmax> %d %d
z</Nnet>
)r   r6   r‚   rw   rƒ   r„   r…   r   )r'   r   rƒ   r   r   r   r6   Ê  s   
zFSMN.to_kaldi_netc                 C   sH  t |ddd}t |dƒ}| ¡ }| ¡ dksJ ‚| j |¡ | j |¡ | j |¡ | jD ]}|d  |¡ |d  |¡ |d  |¡ |d  |¡ q.| j |¡ | j	 |¡ | ¡ }| ¡  
¡ }|d  ¡ d	ksmJ ‚t|d ƒ| jksxJ ‚t|d ƒ| jksƒJ ‚| ¡ }| ¡ d
ksJ ‚W d   ƒ n1 s™w   Y  | ¡  d S )NÚrÚutf8)Úencodingz<Nnet>r   r8   r9   r7   z	<Softmax>z</Nnet>)ÚopenrF   rG   r   rZ   r‚   rw   rƒ   r„   r…   rH   rJ   r   Úclose)r'   Z
kaldi_filerS   Znnet_start_linerƒ   Zsoftmax_lineZsoftmax_splitZnnet_end_liner   r   r   rZ   ß  s.   

æzFSMN.to_pytorch_net)r\   r]   r^   rJ   r   r†   r    rM   r@   ZTensorr   r0   r6   rZ   r_   r   r   r(   r   r~   t  sF    þýüûúùø	÷
öõô5ýþý
ür~   Ú__main__i  éŒ   ro   éú   é€   ru   r9   i'
  c                 c   s    | ]}|  ¡ V  qd S r+   )Znumel)rB   Úpr   r   r   Ú	<genexpr>  s   € r”   zthe number of model params: {}éÈ   zinput shape: {}zoutput shape: {})r8   r8   )"Ú__doc__Útypingr   r   r   r    Ztorch.nnr   Ztorch.nn.functionalZ
functionalrj   r   r   ÚModuler   r`   ra   rv   rJ   r}   r~   r\   rƒ   r   ÚsumÚ
parametersZ
num_paramsÚformatrM   r   ÚyÚ_Úshaper6   r   r   r   r   Ú<module>   sN    :K +ùÿþýü
û õ