§
    @Äjú–  ã                   ó*  — d dl Z d dlmZmZmZ d dlZdgZdej        dej        fd„Z	 ddej        dej        d	ej        dej        d
ej        deej                 deej                 fd„Z	de
dej        j        fd„Zdee
         dedeee                  fd„Zdee         dee         dedej        dej        f
d„Z G d„ dej        j        ¦  «        Z G d„ dej        j        ¦  «        Z G d„ dej        j        ¦  «        Z G d„ de¦  «        ZdS )é    N)ÚListÚOptionalÚTupleÚEmformerÚlengthsÚreturnc                 ó  — | j         d         }t          t          j        | ¦  «                             ¦   «         ¦  «        }t          j        || j        | j        ¬¦  «                             ||¦  «        |  	                    d¦  «        k    }|S )Nr   )ÚdeviceÚdtypeé   )
ÚshapeÚintÚtorchÚmaxÚitemÚaranger
   r   ÚexpandÚ	unsqueeze)r   Ú
batch_sizeÚ
max_lengthÚpadding_masks       úKC:\Projects\Historical\venv\Lib\site-packages\torchaudio/models/emformer.pyÚ_lengths_to_padding_maskr   
   s~   € Ø”˜qÔ!€JÝ•U”Y˜wÑ'Ô'×,Ò,Ñ.Ô.Ñ/Ô/€JÝ”< 
°7´>ÈÌÐWÑWÔW×^Ò^Ø�Jñô à	×	Ò	˜1Ñ	Ô	ò€Lð Ðó    Ú	utteranceÚright_contextÚsummaryÚmemsÚleft_context_keyc                 óÐ  — |                      d¦  «        |                       d¦  «        z   |                      d¦  «        z   }|                      d¦  «        }|dk    rd }n†|t          j        |¦  «                             ¦   «         z
  |                      d¦  «        z
  }	|�|                      d¦  «        nd}
||                      d¦  «        z   |	z   |
z   }t	          |¬¦  «        }|S )Nr   r   )r   )Úsizer   r   r   r   )r   r   r   r   r   r   ÚTÚBr   Úright_context_blocks_lengthÚleft_context_blocks_lengthÚklengthss               r   Ú_gen_padding_maskr'      sá   € ð 	×Ò˜1ÑÔ 	§¢¨qÑ 1Ô 1Ñ1°G·L²LÀ±O´OÑC€AØ×Ò˜1ÑÔ€AØˆA‚v€vØˆˆà&'­%¬)°GÑ*<Ô*<×*@Ò*@Ñ*BÔ*BÑ&BÀWÇ\Â\ÐRSÁ_Ä_Ñ&TÐ#ØAQÐA]Ð%5×%:Ò%:¸1Ñ%=Ô%=Ð%=ÐcdÐ"Ø˜TŸYšY q™\œ\Ñ)Ð,GÑGÐJdÑdˆÝ/¸ÐAÑAÔAˆØÐr   Ú
activationc                 óþ   — | dk    rt           j                             ¦   «         S | dk    rt           j                             ¦   «         S | dk    rt           j                             ¦   «         S t          d| › �¦  «        ‚)NÚreluÚgeluÚsiluzUnsupported activation )r   ÚnnÚReLUÚGELUÚSiLUÚ
ValueError)r(   s    r   Ú_get_activation_moduler2   '   sj   € Ø�VÒÐÝŒx�}Š}‰ŒÐØ	�vÒ	Ð	ÝŒx�}Š}‰ŒÐØ	�vÒ	Ð	ÝŒx�}Š}‰ŒÐåÐ?°:Ð?Ð?Ñ@Ô@Ð@r   Úweight_init_scale_strategyÚ
num_layersc                 óØ   — | €d„ t          |¦  «        D ¦   «         S | dk    rd„ t          |¦  «        D ¦   «         S | dk    rd„ t          |¦  «        D ¦   «         S t          d| › �¦  «        ‚)Nc                 ó   — g | ]}d ‘ŒS ©N© )Ú.0Ú_s     r   ú
<listcomp>z*_get_weight_init_gains.<locals>.<listcomp>4   s   € Ð0Ð0Ð0˜�Ð0Ð0Ð0r   Ú	depthwisec                 óB   — g | ]}d t          j        |dz   ¦  «        z  ‘ŒS )ç      ð?r   ©ÚmathÚsqrt©r9   Ú	layer_idxs     r   r;   z*_get_weight_init_gains.<locals>.<listcomp>6   s+   € ÐRÐRÐR°9�•d”i 	¨A¡Ñ.Ô.Ñ.ÐRÐRÐRr   Úconstantc                 ó<   — g | ]}d t          j        d¦  «        z  ‘ŒS )r>   é   r?   rB   s     r   r;   z*_get_weight_init_gains.<locals>.<listcomp>8   s%   € ÐFÐFÐF y�•d”i ‘l”lÑ"ÐFÐFÐFr   z-Unsupported weight_init_scale_strategy value )Úranger1   )r3   r4   s     r   Ú_get_weight_init_gainsrH   2   sŠ   € Ø!Ð)Ø0Ð0�e JÑ/Ô/Ð0Ñ0Ô0Ð0Ø	# {Ò	2Ð	2ØRÐRÅÀjÑ@QÔ@QÐRÑRÔRÐRØ	# zÒ	1Ð	1ØFÐFµE¸*Ñ4EÔ4EÐFÑFÔFÐFåÐeÐIcÐeÐeÑfÔfÐfr   Ú
col_widthsÚcol_maskÚnum_rowsr
   c                 óÊ   ‡‡— t          | ¦  «        t          |¦  «        k    rt          d¦  «        ‚ˆˆfd„t          | |¦  «        D ¦   «         }t          j        |d¬¦  «        S )Nz0Length of col_widths must match that of col_maskc                 óv   •— g | ]5\  }}|rt          j        ‰|‰¬ ¦  «        nt          j        ‰|‰¬ ¦  «        ‘Œ6S )©r
   )r   ÚonesÚzeros)r9   Ú	col_widthÚis_ones_colr
   rK   s      €€r   r;   z-_gen_attention_mask_block.<locals>.<listcomp>C   s^   ø€ ð ð ð ñ #ˆI�{ð ð	=�Œ
�8˜Y¨vÐ6Ñ6Ô6Ð6åŒ[˜ 9°VÐ<Ñ<Ô<ðð ð r   r   ©Údim)Úlenr1   Úzipr   Úcat)rI   rJ   rK   r
   Ú
mask_blocks     `` r   Ú_gen_attention_mask_blockrY   =   s|   øø€ õ ˆ:�„�#˜h™-œ-Ò'Ð'ÝÐKÑLÔLÐLðð ð ð ð õ '*¨*°hÑ&?Ô&?ð	ñ ô €Jõ Œ9�Z QÐ'Ñ'Ô'Ð'r   c                   ó  ‡ — e Zd ZdZ	 	 	 	 ddededed	ee         d
edefˆ fd„Zde	j
        de	j
        dee	j
        e	j
        f         fd„Zde	j
        de	j
        dee	j
                 de	j
        fd„Z	 	 dde	j
        de	j
        de	j
        de	j
        de	j
        de	j
        dee	j
                 dee	j
                 dee	j
        e	j
        e	j
        e	j
        f         fd„Zde	j
        de	j
        de	j
        de	j
        de	j
        de	j
        dee	j
        e	j
        f         fd„Ze	j        j        de	j
        de	j
        de	j
        de	j
        de	j
        de	j
        de	j
        dee	j
        e	j
        e	j
        e	j
        f         fd„¦   «         Zˆ xZS ) Ú_EmformerAttentiona_  Emformer layer attention module.

    Args:
        input_dim (int): input dimension.
        num_heads (int): number of attention heads in each Emformer layer.
        dropout (float, optional): dropout probability. (Default: 0.0)
        weight_init_gain (float or None, optional): scale factor to apply when initializing
            attention module parameters. (Default: ``None``)
        tanh_on_mem (bool, optional): if ``True``, applies tanh to memory elements. (Default: ``False``)
        negative_inf (float, optional): value to use for negative infinity in attention weights. (Default: -1e8)
    ç        NFç    „×—ÁÚ	input_dimÚ	num_headsÚdropoutÚweight_init_gainÚtanh_on_memÚnegative_infc                 ó²  •— t          ¦   «                              ¦   «          ||z  dk    rt          d|› d|› d�¦  «        ‚|| _        || _        || _        || _        || _        | j        | j        z  dz  | _        t          j
                             |d|z  d¬¦  «        | _        t          j
                             ||d¬¦  «        | _        t          j
                             ||d¬¦  «        | _        |rbt          j
        j                             | j        j        |¬	¦  «         t          j
        j                             | j        j        |¬	¦  «         d S d S )
Nr   zinput_dim (z") is not a multiple of num_heads (z).g      à¿rF   T)Úbias)Úgain)ÚsuperÚ__init__r1   r^   r_   r`   rb   rc   Úscalingr   r-   ÚLinearÚemb_to_key_valueÚemb_to_queryÚout_projÚinitÚxavier_uniform_Úweight)Úselfr^   r_   r`   ra   rb   rc   Ú	__class__s          €r   rh   z_EmformerAttention.__init__Y   sB  ø€ õ 	‰Œ×ÒÑÔÐà�yÑ  AÒ%Ð%ÝÐe¨9ÐeÐeÐXaÐeÐeÐeÑfÔfÐfà"ˆŒØ"ˆŒØˆŒØ&ˆÔØ(ˆÔàœ¨$¬.Ñ8¸TÑAˆŒå %¤§¢°	¸1¸y¹=Èt Ñ TÔ TˆÔÝ!œHŸOšO¨I°yÀt˜OÑLÔLˆÔÝœŸš¨	°9À4˜ÑHÔHˆŒàð 	[ÝŒHŒM×)Ò)¨$Ô*?Ô*FÐM]Ð)Ñ^Ô^Ð^ÝŒHŒM×)Ò)¨$Ô*;Ô*BÐIYÐ)ÑZÔZÐZÐZÐZð	[ð 	[r   Úinputr   r   c                 óð   — |j         \  }}}|                     d¦  «        dz   }|d ||z
  …         }t          j        ||g¦  «        }|                      |¦  «                             dd¬¦  «        \  }}	||	fS )Nr   r   rF   ©ÚchunksrT   )r   r!   r   rW   rk   Úchunk)
rq   rs   r   r"   r:   Úsummary_lengthÚright_ctx_utterance_blockÚmems_right_ctx_utterance_blockÚkeyÚvalues
             r   Ú_gen_key_valuez!_EmformerAttention._gen_key_valuew   s†   € Ø”+‰ˆˆ1ˆaØŸš 1™œ¨Ñ)ˆØ$)Ð*>¨A°Ñ,>Ð*>Ô$?Ð!Ý).¬°DÐ:SÐ3TÑ)UÔ)UÐ&Ø×*Ò*Ð+IÑJÔJ×PÒPÐXYÐ_`ÐPÑaÔa‰
ˆˆUØ�EˆzÐr   Úattention_weightsÚattention_maskr   c                 ó  — |                      ¦   «         }|                     |                     d¦  «        | j        ¦  «        }|                     d¦  «        }|                     d¦  «        | j        z  }|�š|                     || j        |d¦  «        }|                     |                     d¦  «                             d¦  «                             t          j	        ¦  «        | j        ¦  «        }|                     || j        z  |d¦  «        }t          j
        j                             |d¬¦  «                             |¦  «        }t          j
        j                             |t          | j        ¦  «        | j        ¬¦  «        S )Nr   r   éÿÿÿÿrF   rS   )ÚpÚtraining)ÚfloatÚmasked_fillr   rc   r!   r_   ÚviewÚtor   Úboolr-   Ú
functionalÚsoftmaxÚtype_asr`   rƒ   )rq   r~   r   r   Úattention_weights_floatr"   r#   Úattention_probss           r   Ú_gen_attention_probsz'_EmformerAttention._gen_attention_probs   sY  € ð #4×"9Ò"9Ñ";Ô";ÐØ"9×"EÒ"EÀn×F^ÒF^Ð_`ÑFaÔFaÐcgÔctÑ"uÔ"uÐØ×"Ò" 1Ñ%Ô%ˆØ×"Ò" 1Ñ%Ô%¨¬Ñ7ˆØÐ#Ø&=×&BÒ&BÀ1ÀdÄnÐVWÐY[Ñ&\Ô&\Ð#Ø&=×&IÒ&IØ×&Ò& qÑ)Ô)×3Ò3°AÑ6Ô6×9Ò9½%¼*ÑEÔEÀtÔGXñ'ô 'Ð#ð '>×&BÒ&BÀ1ÀtÄ~ÑCUÐWXÐZ\Ñ&]Ô&]Ð#Ýœ(Ô-×5Ò5Ð6MÐSUÐ5ÑVÔV×^Ò^Ð_pÑqÔqˆÝŒxÔ"×*Ò*¨?½eÀDÄLÑ>QÔ>QÐ\`Ô\iÐ*ÑjÔjÐjr   r   r   r   r   r   Úleft_context_valc	                 óL  ‡ ‡— |                      d¦  «        Š|                      d¦  «        |                      d¦  «        z   |                      d¦  «        z   }	‰                      t          j        |||g¦  «        ¦  «        }
‰                      t          j        |||g¦  «        ¦  «                             dd¬¦  «        \  }}|�ç|�å|	t          j        |¦  «                             ¦   «         z
  |                      d¦  «        z
  }t          j        |d |                      d¦  «        |z   …         |||                      d¦  «        |z   d …         g¦  «        }t          j        |d |                      d¦  «        |z   …         |||                      d¦  «        |z   d …         g¦  «        }ˆˆ fd„|
||fD ¦   «         \  }}}t          j        |‰ j	        z  | 
                    dd¦  «        ¦  «        }t          ||||||¦  «        }‰                      |||¦  «        }t          j        ||¦  «        }|j        ‰‰ j        z  |	‰ j        ‰ j        z  fk    rt!          d¦  «        ‚| 
                    dd¦  «                             ¦   «                              |	‰‰ j        ¦  «        }‰                      |¦  «        }|                      d¦  «        }|d |	|z
  …         }||	|z
  d …         }‰ j        rt          j        |¦  «        }nt          j        |dd¬	¦  «        }||||fS )
Nr   r   rF   ru   c                 ó´   •— g | ]T}|                      ¦   «                              d ‰‰j        z  ‰j        ‰j        z  ¦  «                             dd¦  «        ‘ŒUS )r�   r   r   )Ú
contiguousr†   r_   r^   Ú	transpose)r9   Útensorr#   rq   s     €€r   r;   z4_EmformerAttention._forward_impl.<locals>.<listcomp>¸   si   ø€ ð 8
ð 8
ð 8
àð ×ÒÑÔ×$Ò$ R¨¨T¬^Ñ);¸T¼^ÈtÌ~Ñ=]Ñ^Ô^×hÒhÐijÐlmÑnÔnð8
ð 8
ð 8
r   z+Computed attention has incorrect dimensionsiöÿÿÿé
   )Úminr   )r!   rl   r   rW   rk   rw   r   r   Úbmmri   r“   r'   rŽ   r   r_   r^   ÚAssertionErrorr’   r†   rm   rb   ÚtanhÚclamp)rq   r   r   r   r   r   r   r   r�   r"   Úqueryr{   r|   r$   Úreshaped_queryÚreshaped_keyÚreshaped_valuer~   r   r�   Ú	attentionÚoutput_right_context_memsrx   Úoutput_right_contextÚoutput_memsr#   s   `                        @r   Ú_forward_implz _EmformerAttention._forward_impl’   sL  øø€ ð �NŠN˜1ÑÔˆØ×Ò˜qÑ!Ô! I§N¢N°1Ñ$5Ô$5Ñ5¸¿ºÀQ¹¼ÑGˆð ×!Ò!¥%¤)¨]¸IÀwÐ,OÑ"PÔ"PÑQÔQˆð ×*Ò*­5¬9°d¸MÈ9Ð5UÑ+VÔ+VÑWÔW×]Ò]ÐefÐlmÐ]ÑnÔn‰
ˆˆUàÐ'Ð,<Ð,HØ*+­e¬i¸Ñ.@Ô.@×.DÒ.DÑ.FÔ.FÑ*FÈÏÊÐVWÉÌÑ*XÐ'Ý”)àÐD˜$Ÿ)š) A™,œ,Ð)DÑDÐDÔEØ$Ø˜Ÿ	š	 !™œÐ'BÑBÐDÐDÔEðñô ˆCõ ”IàÐF˜DŸIšI a™LœLÐ+FÑFÐFÔGØ$Ø˜$Ÿ)š) A™,œ,Ð)DÑDÐFÐFÔGðñô ˆEð8
ð 8
ð 8
ð 8
ð 8
à  # uÐ-ð8
ñ 8
ô 8
Ñ4ˆ˜ nõ "œI n°t´|Ñ&CÀ\×E[ÒE[Ð\]Ð_`ÑEaÔEaÑbÔbÐõ )¨°MÀ7ÈGÐUYÐ[kÑlÔlˆð ×3Ò3Ð4EÀ~ÐWcÑdÔdˆõ ”I˜o¨~Ñ>Ô>ˆ	ØŒ?Ø�”ÑØØŒN˜dœnÑ,ð
ò 
ð 
õ
 !Ð!NÑOÔOÐOØ×'Ò'¨¨1Ñ-Ô-×8Ò8Ñ:Ô:×?Ò?ÀÀ1ÀdÄnÑUÔUˆ	ð %)§M¢M°)Ñ$<Ô$<Ð!à Ÿš a™œˆØ8Ð9M¸1¸~Ñ;MÐ9MÔNÐØ/°°NÑ0BÐ0DÐ0DÔEˆØÔð 	DÝœ* [Ñ1Ô1ˆKˆKåœ+ k°sÀÐCÑCÔCˆKà# [°#°uÐ<Ð<r   c                 óX   — |                       ||||||¦  «        \  }}}	}	||dd…         fS )ac  Forward pass for training.

        B: batch size;
        D: feature dimension of each frame;
        T: number of utterance frames;
        R: number of right context frames;
        S: number of summary elements;
        M: number of memory elements.

        Args:
            utterance (torch.Tensor): utterance frames, with shape `(T, B, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid frames for i-th batch element in ``utterance``.
            right_context (torch.Tensor): right context frames, with shape `(R, B, D)`.
            summary (torch.Tensor): summary elements, with shape `(S, B, D)`.
            mems (torch.Tensor): memory elements, with shape `(M, B, D)`.
            attention_mask (torch.Tensor): attention mask for underlying attention module.

        Returns:
            (Tensor, Tensor):
                Tensor
                    output frames corresponding to utterance and right_context, with shape `(T + R, B, D)`.
                Tensor
                    updated memory elements, with shape `(M, B, D)`.
        Nr�   )r£   )
rq   r   r   r   r   r   r   Úoutputr¢   r:   s
             r   Úforwardz_EmformerAttention.forwardÛ   sB   € ðD %)×$6Ò$6°yÀ'È=ÐZaÐcgÐiwÑ$xÔ$xÑ!ˆ�˜Q Ø�{ 3 B 3Ô'Ð'Ð'r   c           
      óð  — |                      d¦  «        |                      d¦  «        z   |                      d¦  «        z   }|                      d¦  «        |                      d¦  «        z   |                      d¦  «        z   |                      d¦  «        z   }	t          j        ||	¦  «                             t          j        |j        ¬¦  «        }
d|
dd|                      d¦  «        …f<   |                      ||||||
||¬¦  «        \  }}}}||||                      d¦  «        |                      d¦  «        z   d…         ||                      d¦  «        |                      d¦  «        z   d…         fS )a½  Forward pass for inference.

        B: batch size;
        D: feature dimension of each frame;
        T: number of utterance frames;
        R: number of right context frames;
        S: number of summary elements;
        M: number of memory elements.

        Args:
            utterance (torch.Tensor): utterance frames, with shape `(T, B, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid frames for i-th batch element in ``utterance``.
            right_context (torch.Tensor): right context frames, with shape `(R, B, D)`.
            summary (torch.Tensor): summary elements, with shape `(S, B, D)`.
            mems (torch.Tensor): memory elements, with shape `(M, B, D)`.
            left_context_key (torch.Tensor): left context attention key computed from preceding invocation.
            left_context_val (torch.Tensor): left context attention value computed from preceding invocation.

        Returns:
            (Tensor, Tensor, Tensor, and Tensor):
                Tensor
                    output frames corresponding to utterance and right_context, with shape `(T + R, B, D)`.
                Tensor
                    updated memory elements, with shape `(M, B, D)`.
                Tensor
                    attention key computed for left context and utterance.
                Tensor
                    attention value computed for left context and utterance.
        r   ©r   r
   Tr�   N)r   r�   )r!   r   rP   r‡   rˆ   r
   r£   )rq   r   r   r   r   r   r   r�   Ú	query_dimÚkey_dimr   r¥   r¢   r{   r|   s                  r   Úinferz_EmformerAttention.infer   sj  € ðR "×&Ò& qÑ)Ô)¨I¯NªN¸1Ñ,=Ô,=Ñ=ÀÇÂÈQÁÄÑOˆ	Ø×$Ò$ QÑ'Ô'¨)¯.ª.¸Ñ*;Ô*;Ñ;¸d¿iºiÈ¹l¼lÑJÐM]×MbÒMbÐcdÑMeÔMeÑeˆÝœ Y°Ñ8Ô8×;Ò;Å%Ä*ÐU^ÔUeÐ;ÑfÔfˆØ-1ˆ�r˜>˜TŸYšY q™\œ\˜>Ð)Ñ*Ø*.×*<Ò*<ØØØØØØØ-Ø-ð +=ñ 	+
ô 	+
Ñ'ˆ�˜S %ð ØØ�—	’	˜!‘”˜}×1Ò1°!Ñ4Ô4Ñ4Ð6Ð6Ô7Ø�$—)’)˜A‘,”, ×!3Ò!3°AÑ!6Ô!6Ñ6Ð8Ð8Ô9ð	
ð 	
r   )r\   NFr]   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r„   r   rˆ   rh   r   ÚTensorr   r}   rŽ   r£   r¦   ÚjitÚexportr«   Ú__classcell__©rr   s   @r   r[   r[   L   sô  ø€ € € € € ð
ð 
ð  Ø,0Ø!Ø"ð[ð [àð[ð ð[ð ð	[ð
 # 5œ/ð[ð ð[ð ð[ð [ð [ð [ð [ð [ð< E¤Lð ¸¼ð ÈÈuÌ|Ð]bÔ]iÐOiÔIjð ð ð ð ðkà œ<ðkð œðkð ˜uœ|Ô,ð	kð
 
Œðkð kð kð kð6 48Ø37ðG=ð G=à”<ðG=ð ”ðG=ð ”|ð	G=ð
 ”ðG=ð ŒlðG=ð œðG=ð # 5¤<Ô0ðG=ð # 5¤<Ô0ðG=ð 
ˆuŒ|˜Uœ\¨5¬<¸¼ÐEÔ	FðG=ð G=ð G=ð G=ðR#(à”<ð#(ð ”ð#(ð ”|ð	#(ð
 ”ð#(ð Œlð#(ð œð#(ð 
ˆuŒ|˜Uœ\Ð)Ô	*ð#(ð #(ð #(ð #(ðJ „YÔð;
à”<ð;
ð ”ð;
ð ”|ð	;
ð
 ”ð;
ð Œlð;
ð  œ,ð;
ð  œ,ð;
ð 
ˆuŒ|˜Uœ\¨5¬<¸¼ÐEÔ	Fð;
ð ;
ð ;
ñ Ôð;
ð ;
ð ;
ð ;
ð ;
r   r[   c                   óÒ  ‡ — e Zd ZdZ	 	 	 	 	 	 	 d+ded	ed
ededededededee         dedefˆ fd„Z	dedee
j                 dee
j                 fd„Zdee
j                 dee
j        e
j        e
j        f         fd„Zde
j        de
j        dede
j        dee
j                 dee
j                 fd„Zde
j        d e
j        d!e
j        de
j        fd"„Zd e
j        d!e
j        dee
j        e
j        f         fd#„Zde
j        d e
j        d!e
j        dee
j        e
j        f         fd$„Zd e
j        d%e
j        d!e
j        de
j        d&ee
j                 dee
j        e
j        f         fd'„Zd e
j        d%e
j        d!e
j        de
j        deee
j                          dee
j        e
j        ee
j                 f         fd(„Zd e
j        d%e
j        d!e
j        de
j        d&e
j        dee
j        e
j        e
j        f         fd)„Ze
j        j        d e
j        d%e
j        d!e
j        deee
j                          de
j        dee
j        e
j        ee
j                 e
j        f         fd*„¦   «         Zˆ xZS ),Ú_EmformerLayera$  Emformer layer that constitutes Emformer.

    Args:
        input_dim (int): input dimension.
        num_heads (int): number of attention heads.
        ffn_dim: (int): hidden layer dimension of feedforward network.
        segment_length (int): length of each input segment.
        dropout (float, optional): dropout probability. (Default: 0.0)
        activation (str, optional): activation function to use in feedforward network.
            Must be one of ("relu", "gelu", "silu"). (Default: "relu")
        left_context_length (int, optional): length of left context. (Default: 0)
        max_memory_size (int, optional): maximum number of memory elements to use. (Default: 0)
        weight_init_gain (float or None, optional): scale factor to apply when initializing
            attention module parameters. (Default: ``None``)
        tanh_on_mem (bool, optional): if ``True``, applies tanh to memory elements. (Default: ``False``)
        negative_inf (float, optional): value to use for negative infinity in attention weights. (Default: -1e8)
    r\   r*   r   NFr]   r^   r_   Úffn_dimÚsegment_lengthr`   r(   Úleft_context_lengthÚmax_memory_sizera   rb   rc   c           
      ó†  •— t          ¦   «                              ¦   «          t          ||||	|
|¬¦  «        | _        t          j                             |¦  «        | _        t          j                             ||d¬¦  «        | _	        t          |¦  «        }t          j                             t          j                             |¦  «        t          j                             ||¦  «        |t          j                             |¦  «        t          j                             ||¦  «        t          j                             |¦  «        ¦  «        | _        t          j                             |¦  «        | _        t          j                             |¦  «        | _        || _        || _        || _        || _        |dk    | _        d S )N)r^   r_   r`   ra   rb   rc   T©Úkernel_sizeÚstrideÚ	ceil_moder   )rg   rh   r[   rŸ   r   r-   ÚDropoutr`   Ú	AvgPool1dÚ	memory_opr2   Ú
SequentialÚ	LayerNormrj   Úpos_ffÚlayer_norm_inputÚlayer_norm_outputr¹   r¸   rº   r^   Úuse_mem)rq   r^   r_   r·   r¸   r`   r(   r¹   rº   ra   rb   rc   Úactivation_modulerr   s                €r   rh   z_EmformerLayer.__init__R  se  ø€ õ 	‰Œ×ÒÑÔÐå+ØØØØ-Ø#Ø%ð
ñ 
ô 
ˆŒõ ”x×'Ò'¨Ñ0Ô0ˆŒÝœ×+Ò+¸È~ÐimÐ+ÑnÔnˆŒå2°:Ñ>Ô>ÐÝ”h×)Ò)ÝŒH×Ò˜yÑ)Ô)ÝŒH�OŠO˜I wÑ/Ô/ØÝŒH×Ò˜WÑ%Ô%ÝŒH�OŠO˜G YÑ/Ô/ÝŒH×Ò˜WÑ%Ô%ñ
ô 
ˆŒõ !&¤× 2Ò 2°9Ñ =Ô =ˆÔÝ!&¤×!3Ò!3°IÑ!>Ô!>ˆÔà#6ˆÔ Ø,ˆÔØ.ˆÔØ"ˆŒà&¨Ò*ˆŒˆˆr   r   r
   r   c                 ó  — t          j        | j        || j        |¬¦  «        }t          j        | j        || j        |¬¦  «        }t          j        | j        || j        |¬¦  «        }t          j        d|t           j        |¬¦  «        }||||gS )NrN   r   r¨   )r   rP   rº   r^   r¹   Úint32)rq   r   r
   Úempty_memoryr   r�   Úpast_lengths          r   Ú_init_statez_EmformerLayer._init_state€  s‰   € Ý”{ 4Ô#7¸ÀTÄ^Ð\bÐcÑcÔcˆÝ œ; tÔ'?ÀÈTÌ^ÐdjÐkÑkÔkÐÝ œ; tÔ'?ÀÈTÌ^ÐdjÐkÑkÔkÐÝ”k ! Zµu´{È6ÐRÑRÔRˆØÐ.Ð0@À+ÐNÐNr   Ústatec                 óp  — |d         d         d                               ¦   «         }t          | j        |¦  «        }t          | j        t	          j        || j        z  ¦  «        ¦  «        }|d         | j        |z
  d …         }|d         | j        |z
  d …         }|d         | j        |z
  d …         }|||fS )Né   r   r   rF   )r   r–   r¹   rº   r@   Úceilr¸   )rq   rÏ   rÍ   Úpast_left_context_lengthÚpast_mem_lengthÚpre_memsÚlc_keyÚlc_vals           r   Ú_unpack_statez_EmformerLayer._unpack_state‡  s¹   € Ø˜A”h˜q”k !”n×)Ò)Ñ+Ô+ˆÝ#& tÔ'?ÀÑ#MÔ#MÐ Ý˜dÔ2µD´I¸kÈDÔL_Ñ>_Ñ4`Ô4`ÑaÔaˆØ˜”8˜DÔ0°?ÑBÐDÐDÔEˆØ�q”˜$Ô2Ð5MÑMÐOÐOÔPˆØ�q”˜$Ô2Ð5MÑMÐOÐOÔPˆØ˜ Ð'Ð'r   Únext_kÚnext_vÚupdate_lengthr   c                 ól  — t          j        |d         |g¦  «        }t          j        |d         |g¦  «        }t          j        |d         |g¦  «        | j         d …         |d<   ||j        d         | j        z
  d …         |d<   ||j        d         | j        z
  d …         |d<   |d         |z   |d<   |S )Nr   rF   r   rÑ   )r   rW   rº   r   r¹   )rq   rÙ   rÚ   rÛ   r   rÏ   Únew_kÚnew_vs           r   Ú_pack_statez_EmformerLayer._pack_state�  s¼   € õ ”	˜5 œ8 VÐ,Ñ-Ô-ˆÝ”	˜5 œ8 VÐ,Ñ-Ô-ˆÝ”9˜e Aœh¨Ð-Ñ.Ô.°Ô0DÐ/DÐ/FÐ/FÔGˆˆa‰Ø˜œ Qœ¨$Ô*BÑBÐDÐDÔEˆˆa‰Ø˜œ Qœ¨$Ô*BÑBÐDÐDÔEˆˆa‰Ø˜”8˜mÑ+ˆˆa‰Øˆr   Ú	rc_outputr   r   c                 ó¸   — |                       |¦  «        t          j        ||g¦  «        z   }|                      |¦  «        |z   }|                      |¦  «        }|S r7   )r`   r   rW   rÅ   rÇ   )rq   rà   r   r   Úresults        r   Ú_process_attention_outputz(_EmformerLayer._process_attention_output   sW   € ð —’˜iÑ(Ô(­5¬9°mÀYÐ5OÑ+PÔ+PÑPˆØ—’˜VÑ$Ô$ vÑ-ˆØ×'Ò'¨Ñ/Ô/ˆØˆr   c                 óÈ   — |                       t          j        ||g¦  «        ¦  «        }||                     d¦  «        d …         |d |                     d¦  «        …         fS ©Nr   )rÆ   r   rW   r!   )rq   r   r   rÆ   s       r   Ú_apply_pre_attention_layer_normz._EmformerLayer._apply_pre_attention_layer_norm«  si   € ð  ×0Ò0µ´¸MÈ9Ð;UÑ1VÔ1VÑWÔWÐà˜]×/Ò/°Ñ2Ô2Ð4Ð4Ô5ØÐ4˜}×1Ò1°!Ñ4Ô4Ð4Ô5ð
ð 	
r   c                 ó¤   — |                       |||¦  «        }||                     d¦  «        d …         |d |                     d¦  «        …         fS rå   )rã   r!   )rq   rà   r   r   s       r   Ú_apply_post_attention_ffnz(_EmformerLayer._apply_post_attention_ffn´  sY   € ð ×2Ò2°9¸iÈÑWÔWˆ	Ø˜×+Ò+¨AÑ.Ô.Ð0Ð0Ô1°9Ð=T¸}×?QÒ?QÐRSÑ?TÔ?TÐ=TÔ3UÐUÐUr   r   r   c                 ó\  — |€t          d¦  «        ‚| j        r@|                      |                     ddd¦  «        ¦  «                             ddd¦  «        }n3t	          j        d¦  «                             |j        |j        ¬¦  «        }|  	                    ||||||¬¦  «        \  }}||fS )Nz;attention_mask must be not None when for_inference is Falser   rF   r   r¨   )r   r   r   r   r   r   )
r1   rÈ   rÂ   Úpermuter   Úemptyr‡   r   r
   rŸ   )	rq   r   r   r   r   r   r   rà   Únext_ms	            r   Ú_apply_attention_forwardz'_EmformerLayer._apply_attention_forwardº  s¼   € ð Ð!ÝÐZÑ[Ô[Ð[àŒ<ð 	XØ—n’n Y×%6Ò%6°q¸!¸QÑ%?Ô%?Ñ@Ô@×HÒHÈÈAÈqÑQÔQˆGˆGå”k !‘n”n×'Ò'¨i¬oÀiÔFVÐ'ÑWÔWˆGØ ŸNšNØØØ'ØØØ)ð +ñ 
ô 
Ñˆ	�6ð ˜&Ð Ð r   c           	      óL  — |€/|                       |                     d¦  «        |j        ¬¦  «        }|                      |¦  «        \  }}}| j        rJ|                      |                     ddd¦  «        ¦  «                             ddd¦  «        }	|	d d…         }	n3t          j        d¦  «         	                    |j
        |j        ¬¦  «        }	| j                             ||||	|||¬¦  «        \  }
}}}|                      |||                     d¦  «        ||¦  «        }|
||fS )Nr   rN   rF   r   r¨   )r   r   r   r   r   r   r�   )rÎ   r!   r
   rØ   rÈ   rÂ   rê   r   rë   r‡   r   rŸ   r«   rß   )rq   r   r   r   r   rÏ   rÕ   rÖ   r×   r   rà   rì   rÙ   rÚ   s                 r   Ú_apply_attention_inferz%_EmformerLayer._apply_attention_inferÓ  s/  € ð ˆ=Ø×$Ò$ Y§^¢^°AÑ%6Ô%6¸yÔ?OÐ$ÑPÔPˆEØ#'×#5Ò#5°eÑ#<Ô#<Ñ ˆ�&˜&ØŒ<ð 	XØ—n’n Y×%6Ò%6°q¸!¸QÑ%?Ô%?Ñ@Ô@×HÒHÈÈAÈqÑQÔQˆGØ˜b˜q˜b”kˆGˆGå”k !‘n”n×'Ò'¨i¬oÀiÔFVÐ'ÑWÔWˆGØ,0¬N×,@Ò,@ØØØ'ØØØ#Ø#ð -Añ -
ô -
Ñ)ˆ	�6˜6 6ð × Ò  ¨°·²ÀÑ1BÔ1BÀDÈ%ÑPÔPˆØ˜& %Ð'Ð'r   c                 óª   — |                       ||¦  «        \  }}|                      |||||¦  «        \  }}	|                      |||¦  «        \  }
}|
||	fS )a1  Forward pass for training.

        B: batch size;
        D: feature dimension of each frame;
        T: number of utterance frames;
        R: number of right context frames;
        M: number of memory elements.

        Args:
            utterance (torch.Tensor): utterance frames, with shape `(T, B, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid frames for i-th batch element in ``utterance``.
            right_context (torch.Tensor): right context frames, with shape `(R, B, D)`.
            mems (torch.Tensor): memory elements, with shape `(M, B, D)`.
            attention_mask (torch.Tensor): attention mask for underlying attention module.

        Returns:
            (Tensor, Tensor, Tensor):
                Tensor
                    encoded utterance frames, with shape `(T, B, D)`.
                Tensor
                    updated right context frames, with shape `(R, B, D)`.
                Tensor
                    updated memory elements, with shape `(M, B, D)`.
        )ræ   rí   rè   )rq   r   r   r   r   r   Úlayer_norm_utteranceÚlayer_norm_right_contextrà   r¢   Úoutput_utterancer¡   s               r   r¦   z_EmformerLayer.forwardï  s}   € ðH ×0Ò0°¸MÑJÔJñ	
Ø Ø$à!%×!>Ò!>Ø ØØ$ØØñ"
ô "
Ñˆ	�;ð 26×1OÒ1OÐPYÐ[dÐfsÑ1tÔ1tÑ.ÐÐ.ØÐ!5°{ÐBÐBr   c                 ó®   — |                       ||¦  «        \  }}|                      |||||¦  «        \  }}	}
|                      |||¦  «        \  }}|||
|	fS )a2  Forward pass for inference.

        B: batch size;
        D: feature dimension of each frame;
        T: number of utterance frames;
        R: number of right context frames;
        M: number of memory elements.

        Args:
            utterance (torch.Tensor): utterance frames, with shape `(T, B, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid frames for i-th batch element in ``utterance``.
            right_context (torch.Tensor): right context frames, with shape `(R, B, D)`.
            state (List[torch.Tensor] or None): list of tensors representing layer internal state
                generated in preceding invocation of ``infer``.
            mems (torch.Tensor): memory elements, with shape `(M, B, D)`.

        Returns:
            (Tensor, Tensor, List[torch.Tensor], Tensor):
                Tensor
                    encoded utterance frames, with shape `(T, B, D)`.
                Tensor
                    updated right context frames, with shape `(R, B, D)`.
                List[Tensor]
                    list of tensors representing layer internal state
                    generated in current invocation of ``infer``.
                Tensor
                    updated memory elements, with shape `(M, B, D)`.
        )ræ   rï   rè   )rq   r   r   r   rÏ   r   rñ   rò   rà   r¢   Úoutput_stateró   r¡   s                r   r«   z_EmformerLayer.infer  s~   € ðR ×0Ò0°¸MÑJÔJñ	
Ø Ø$à/3×/JÒ/JØ  'Ð+CÀTÈ5ñ0
ô 0
Ñ,ˆ	�; ð 26×1OÒ1OÐPYÐ[dÐfsÑ1tÔ1tÑ.ÐÐ.ØÐ!5°|À[ÐPÐPr   )r\   r*   r   r   NFr]   )r¬   r­   r®   r¯   r   r„   Ústrr   rˆ   rh   r   r
   r   r°   rÎ   r   rØ   rß   rã   ræ   rè   rí   rï   r¦   r±   r²   r«   r³   r´   s   @r   r¶   r¶   ?  sy  ø€ € € € € ðð ð0 Ø Ø#$Ø Ø,0Ø!Ø"ð,+ð ,+àð,+ð ð,+ð ð	,+ð
 ð,+ð ð,+ð ð,+ð !ð,+ð ð,+ð # 5œ/ð,+ð ð,+ð ð,+ð ,+ð ,+ð ,+ð ,+ð ,+ð\O cð O°8¸E¼LÔ3Ið OÈdÐSXÔS_ÔN`ð Oð Oð Oð Oð( 4¨¬Ô#5ð (¸%ÀÄÈeÌlÐ\aÔ\hÐ@hÔ:ið (ð (ð (ð (ðà”ðð ”ðð ð	ð
 Œlðð �E”LÔ!ðð 
ˆeŒlÔ	ðð ð ð ð 	à”<ð	ð ”<ð	ð ”|ð		ð
 
Œð	ð 	ð 	ð 	ð
Øœð
Ø6;´lð
à	ˆuŒ|˜Uœ\Ð)Ô	*ð
ð 
ð 
ð 
ðVØœðVØ27´,ðVØOTÌ|ðVà	ˆuŒ|˜Uœ\Ð)Ô	*ðVð Vð Vð Vð!à”<ð!ð ”ð!ð ”|ð	!ð
 Œlð!ð ! ¤Ô.ð!ð 
ˆuŒ|˜Uœ\Ð)Ô	*ð!ð !ð !ð !ð2(à”<ð(ð ”ð(ð ”|ð	(ð
 Œlð(ð ˜˜Uœ\Ô*Ô+ð(ð 
ˆuŒ|˜Uœ\¨4°´Ô+=Ð=Ô	>ð(ð (ð (ð (ð8-Cà”<ð-Cð ”ð-Cð ”|ð	-Cð
 Œlð-Cð œð-Cð 
ˆuŒ|˜Uœ\¨5¬<Ð7Ô	8ð-Cð -Cð -Cð -Cð^ „YÔð-Qà”<ð-Qð ”ð-Qð ”|ð	-Qð
 ˜˜Uœ\Ô*Ô+ð-Qð Œlð-Qð 
ˆuŒ|˜Uœ\¨4°´Ô+=¸u¼|ÐKÔ	Lð-Qð -Qð -Qñ Ôð-Qð -Qð -Qð -Qð -Qr   r¶   c                   óÎ  ‡ — e Zd Z	 	 	 ddej        j        dedededef
ˆ fd„Zdej        d	ej        fd
„Z	deded	e
e         fd„Zdej        d	ej        fd„Zdej        dej        d	eej        ej        f         fd„Zej        j        	 ddej        dej        dee
e
ej                                   d	eej        ej        e
e
ej                          f         fd„¦   «         Zˆ xZS )Ú_EmformerImplr   Úemformer_layersr¸   r¹   Úright_context_lengthrº   c                 óò   •— t          ¦   «                              ¦   «          |dk    | _        t          j                             ||d¬¦  «        | _        || _        || _        || _	        || _
        || _        d S )Nr   Tr¼   )rg   rh   rÈ   r   r-   rÁ   rÂ   rù   r¹   rú   r¸   rº   )rq   rù   r¸   r¹   rú   rº   rr   s         €r   rh   z_EmformerImpl.__init__P  s~   ø€ õ 	‰Œ×ÒÑÔÐà&¨Ò*ˆŒÝœ×+Ò+Ø&Ø!Øð ,ñ 
ô 
ˆŒð
  /ˆÔØ#6ˆÔ Ø$8ˆÔ!Ø,ˆÔØ.ˆÔÐÐr   rs   r   c                 ól  — |j         d         }t          j        || j        z
  | j        z  ¦  «        }g }t          |dz
  ¦  «        D ]6}|dz   | j        z  }|| j        z   }|                     |||…         ¦  «         Œ7|                     ||| j        z
  d …         ¦  «         t          j        |¦  «        S ©Nr   r   )	r   r@   rÒ   rú   r¸   rG   Úappendr   rW   )rq   rs   r"   Únum_segsÚright_context_blocksÚseg_idxÚstartÚends           r   Ú_gen_right_contextz _EmformerImpl._gen_right_contextf  sÃ   € ØŒK˜ŒNˆÝ”9˜a $Ô";Ñ;¸tÔ?RÑRÑSÔSˆØ!ÐÝ˜X¨™\Ñ*Ô*ð 	:ð 	:ˆGØ˜q‘[ DÔ$7Ñ7ˆEØ˜$Ô3Ñ3ˆCØ ×'Ò'¨¨e°C¨iÔ(8Ñ9Ô9Ð9Ð9Ø×#Ò# E¨!¨dÔ.GÑ*GÐ*IÐ*IÔ$JÑKÔKÐKÝŒyÐ-Ñ.Ô.Ð.r   r  Úutterance_lengthc           
      óŽ  — t          j        || j        z  ¦  «        }| j        }| j        }||z  }||z   }t          || j        z  |z
  d¦  «        }t          |dz   | j        z  |¦  «        }	| j        |z  }
| j        r8t          || j        z
  d¦  «        }|dz
  }|||z
  ||z
  |||
|z
  ||	|z
  ||	z
  g	}n|||
|z
  ||	|z
  ||	z
  g}|S rý   )	r@   rÒ   r¸   rú   r¹   r   r–   rÈ   rº   )rq   r  r  rÿ   ÚrcÚlcÚrc_startÚrc_endÚ	seg_startÚseg_endÚ	rc_lengthÚm_startÚ
mem_lengthrI   s                 r   Ú_gen_attention_mask_col_widthsz,_EmformerImpl._gen_attention_mask_col_widthsq  s  € Ý”9Ð-°Ô0CÑCÑDÔDˆØÔ&ˆØÔ%ˆØ˜R‘<ˆØ˜B‘ˆÝ˜ $Ô"5Ñ5¸Ñ:¸AÑ>Ô>ˆ	Ý�w ‘{ dÔ&9Ñ9Ð;KÑLÔLˆØÔ-°Ñ8ˆ	àŒ<ð 	Ý˜' DÔ$8Ñ8¸!Ñ<Ô<ˆGØ! A™ˆJàØ˜'Ñ!Ø˜WÑ$ØØØ˜FÑ"ØØ˜)Ñ#Ø  7Ñ*ð
ˆJˆJð ØØ˜FÑ"ØØ˜)Ñ#Ø  7Ñ*ðˆJð Ðr   c                 óV  — |                      d¦  «        }t          j        || j        z  ¦  «        }g }g }g }| j        r:d}d„ t          |¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         }	|||g}
n!d}d„ t          |¦  «        D ¦   «         }d }	||g}
t          |¦  «        D ]Á}|                      ||¦  «        }t          ||| j        |j	        ¦  «        }| 
                    |¦  «         t          ||t          | j        ||| j        z  z
  ¦  «        |j	        ¦  «        }| 
                    |¦  «         |	�,t          ||	d|j	        ¦  «        }| 
                    |¦  «         ŒÂdt          j        d„ |
D ¦   «         ¦  «        z
                       t          j        ¦  «        }|S )	Nr   é	   c                 ó   — g | ]}|d v ‘ŒS ))r   é   é   r8   ©r9   Úidxs     r   r;   z5_EmformerImpl._gen_attention_mask.<locals>.<listcomp>   s   € ÐJÐJÐJ°3˜c YÐ.ÐJÐJÐJr   c                 ó   — g | ]}|d v ‘ŒS ))r  r  r8   r  s     r   r;   z5_EmformerImpl._gen_attention_mask.<locals>.<listcomp>¢  s   € ÐDÐDÐD¨S˜3 &˜=ÐDÐDÐDr   é   c                 ó   — g | ]}|d v ‘ŒS ))r   r  r8   r  s     r   r;   z5_EmformerImpl._gen_attention_mask.<locals>.<listcomp>§  s   € ÐGÐGÐG°˜c V˜mÐGÐGÐGr   r   c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r8   )r   rW   )r9   Úmasks     r   r;   z5_EmformerImpl._gen_attention_mask.<locals>.<listcomp>Â  s    € Ð(UÐ(UÐ(U¸T­¬°4©¬Ð(UÐ(UÐ(Ur   )r!   r@   rÒ   r¸   rÈ   rG   r  rY   rú   r
   rþ   r–   r   rW   r‡   rˆ   )rq   rs   r  rÿ   Úrc_maskÚ
query_maskÚsummary_maskÚnum_colsÚrc_q_cols_maskÚs_cols_maskÚmasks_to_concatr  rI   Úrc_mask_blockÚquery_mask_blockÚsummary_mask_blockr   s                    r   Ú_gen_attention_maskz!_EmformerImpl._gen_attention_mask•  sØ  € Ø Ÿ:š: a™=œ=ÐÝ”9Ð-°Ô0CÑCÑDÔDˆàˆØˆ
ØˆàŒ<ð 	4ØˆHàJÐJ½%À¹/¼/ÐJÑJÔJˆNàDÐDµE¸(±O´OÐDÑDÔDˆKØ&¨
°LÐAˆOˆOàˆHàGÐGµu¸X±´ÐGÑGÔGˆNØˆKØ&¨
Ð3ˆOå˜X‘”ð 	8ð 	8ˆGØ×<Ò<¸WÐFVÑWÔWˆJå5Ø˜N¨DÔ,EÀuÄ|ñô ˆMð �NŠN˜=Ñ)Ô)Ð)å8ØØÝØÔ'Ø$ w°Ô1DÑ'DÑDñô ð ”ñ ô  Ðð ×ÒÐ.Ñ/Ô/Ð/àÐ&Ý%>¸zÈ;ÐXYÐ[`Ô[gÑ%hÔ%hÐ"Ø×#Ò#Ð$6Ñ7Ô7Ð7øà�eœiÐ(UÐ(UÀ_Ð(UÑ(UÔ(UÑVÔVÑV×ZÒZÕ[`Ô[eÑfÔfˆØÐr   r   c                 ó@  — |                      ddd¦  «        }|                      |¦  «        }|d|                     d¦  «        | j        z
  …         }|                      |¦  «        }| j        rG|                      |                      ddd¦  «        ¦  «                              ddd¦  «        dd…         n2t          j        d¦  «         	                    |j
        |j        ¬¦  «        }|}| j        D ]} ||||||¦  «        \  }}}Œ|                      ddd¦  «        |fS )aG  Forward pass for training and non-streaming inference.

        B: batch size;
        T: max number of input frames in batch;
        D: feature dimension of each frame.

        Args:
            input (torch.Tensor): utterance frames right-padded with right context frames, with
                shape `(B, T + right_context_length, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid utterance frames for i-th batch element in ``input``.

        Returns:
            (Tensor, Tensor):
                Tensor
                    output frames, with shape `(B, T, D)`.
                Tensor
                    output lengths, with shape `(B,)` and i-th element representing
                    number of valid frames for i-th batch element in output frames.
        r   r   rF   Nr�   r¨   )rê   r  r!   rú   r'  rÈ   rÂ   r   rë   r‡   r   r
   rù   )	rq   rs   r   r   r   r   r   r¥   Úlayers	            r   r¦   z_EmformerImpl.forwardÅ  s+  € ð* —’˜a  AÑ&Ô&ˆØ×/Ò/°Ñ6Ô6ˆØÐE˜EŸJšJ q™MœM¨DÔ,EÑEÐEÔFˆ	Ø×1Ò1°)Ñ<Ô<ˆð Œ|ðKˆD�NŠN˜9×,Ò,¨Q°°1Ñ5Ô5Ñ6Ô6×>Ò>¸qÀ!ÀQÑGÔGÈÈÈÔLÐLå”˜Q‘”×"Ò"¨¬¸U¼\Ð"ÑJÔJð 	ð
 ˆØÔ)ð 	fð 	fˆEØ*/¨%°¸ÀÐPTÐVdÑ*eÔ*eÑ'ˆF�M 4 4Ø�~Š~˜a  AÑ&Ô&¨Ð/Ð/r   NÚstatesc                 ób  — |                      d¦  «        | j        | j        z   k    r6t          d| j        | j        z   › d|                      d¦  «        › d�¦  «        ‚|                     ddd¦  «        }|                      d¦  «        | j        z
  }||d…         }|d|…         }t          j        || j        z
  d¬¦  «        }| j        r?|                      |                     ddd¦  «        ¦  «                             ddd¦  «        n2t          j	        d¦  «         
                    |j        |j        ¬	¦  «        }|}	g }
t          | j        ¦  «        D ]B\  }}|                     |	|||€dn||         |¦  «        \  }	}}}|
                     |¦  «         ŒC|	                     ddd¦  «        ||
fS )
a±  Forward pass for streaming inference.

        B: batch size;
        D: feature dimension of each frame.

        Args:
            input (torch.Tensor): utterance frames right-padded with right context frames, with
                shape `(B, segment_length + right_context_length, D)`.
            lengths (torch.Tensor): with shape `(B,)` and i-th element representing
                number of valid frames for i-th batch element in ``input``.
            states (List[List[torch.Tensor]] or None, optional): list of lists of tensors
                representing internal state generated in preceding invocation of ``infer``. (Default: ``None``)

        Returns:
            (Tensor, Tensor, List[List[Tensor]]):
                Tensor
                    output frames, with shape `(B, segment_length, D)`.
                Tensor
                    output lengths, with shape `(B,)` and i-th element representing
                    number of valid frames for i-th batch element in output frames.
                List[List[Tensor]]
                    output states; list of lists of tensors representing internal state
                    generated in current invocation of ``infer``.
        r   zIPer configured segment_length and right_context_length, expected size of z# for dimension 1 of input, but got ú.r   rF   N)r–   r¨   )r!   r¸   rú   r1   rê   r   rš   rÈ   rÂ   rë   r‡   r   r
   Ú	enumeraterù   r«   rþ   )rq   rs   r   r*  Úright_context_start_idxr   r   Úoutput_lengthsr   r¥   Úoutput_statesrC   r)  rõ   s                 r   r«   z_EmformerImpl.inferè  sÞ  € ð> �:Š:�a‰=Œ=˜DÔ/°$Ô2KÑKÒKÐKÝð.Ø&*Ô&9¸DÔ<UÑ&Uð.ð .à"ŸZšZ¨™]œ]ð.ð .ð .ñô ð ð
 —’˜a  AÑ&Ô&ˆØ"'§*¢*¨Q¡-¤-°$Ô2KÑ"KÐØÐ5Ð6Ð6Ô7ˆØÐ2Ð2Ð2Ô3ˆ	Ýœ W¨tÔ/HÑ%HÈaÐPÑPÔPˆð Œ|ðKˆD�NŠN˜9×,Ò,¨Q°°1Ñ5Ô5Ñ6Ô6×>Ò>¸qÀ!ÀQÑGÔGÐGå”˜Q‘”×"Ò"¨¬¸U¼\Ð"ÑJÔJð 	ð
 ˆØ24ˆÝ )¨$Ô*>Ñ ?Ô ?ð 	/ð 	/ÑˆI�uØ8=¿ºØØØØ˜��¨F°9Ô,=Øñ9ô 9Ñ5ˆF�M <°ð × Ò  Ñ.Ô.Ð.Ð.à�~Š~˜a  AÑ&Ô&¨¸ÐEÐEr   )r   r   r   r7   )r¬   r­   r®   r   r-   Ú
ModuleListr   rh   r°   r  r   r  r'  r   r¦   r±   r²   r   r«   r³   r´   s   @r   rø   rø   O  sÒ  ø€ € € € € ð
 $%Ø$%Ø ð/ð /àœÔ,ð/ð ð/ð !ð	/ð
 "ð/ð ð/ð /ð /ð /ð /ð /ð,	/¨¬ð 	/¸¼ð 	/ð 	/ð 	/ð 	/ð"°cð "ÈSð "ÐUYÐZ]ÔU^ð "ð "ð "ð "ðH.¨¬ð .¸%¼,ð .ð .ð .ð .ð`!0˜Uœ\ð !0°E´Lð !0ÀUÈ5Ì<ÐY^ÔYeÐKeÔEfð !0ð !0ð !0ð !0ðF „YÔð
 6:ð	:Fð :FàŒ|ð:Fð ”ð:Fð ˜˜d 5¤<Ô0Ô1Ô2ð	:Fð
 
ˆuŒ|˜Uœ\¨4°°U´\Ô0BÔ+CÐCÔ	Dð:Fð :Fð :Fñ Ôð:Fð :Fð :Fð :Fð :Fr   rø   c                   óv   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dded	ed
ededededededededee         dedefˆ fd„Z	ˆ xZ
S )r   a_  Emformer architecture introduced in
    *Emformer: Efficient Memory Transformer Based Acoustic Model for Low Latency Streaming Speech Recognition*
    :cite:`shi2021emformer`.

    See Also:
        * :func:`~torchaudio.models.emformer_rnnt_model`,
          :func:`~torchaudio.models.emformer_rnnt_base`: factory functions.
        * :class:`torchaudio.pipelines.RNNTBundle`: ASR pipelines with pretrained model.

    Args:
        input_dim (int): input dimension.
        num_heads (int): number of attention heads in each Emformer layer.
        ffn_dim (int): hidden layer dimension of each Emformer layer's feedforward network.
        num_layers (int): number of Emformer layers to instantiate.
        segment_length (int): length of each input segment.
        dropout (float, optional): dropout probability. (Default: 0.0)
        activation (str, optional): activation function to use in each Emformer layer's
            feedforward network. Must be one of ("relu", "gelu", "silu"). (Default: "relu")
        left_context_length (int, optional): length of left context. (Default: 0)
        right_context_length (int, optional): length of right context. (Default: 0)
        max_memory_size (int, optional): maximum number of memory elements to use. (Default: 0)
        weight_init_scale_strategy (str or None, optional): per-layer weight initialization scaling
            strategy. Must be one of ("depthwise", "constant", ``None``). (Default: "depthwise")
        tanh_on_mem (bool, optional): if ``True``, applies tanh to memory elements. (Default: ``False``)
        negative_inf (float, optional): value to use for negative infinity in attention weights. (Default: -1e8)

    Examples:
        >>> emformer = Emformer(512, 8, 2048, 20, 4, right_context_length=1)
        >>> input = torch.rand(128, 400, 512)  # batch, num_frames, feature_dim
        >>> lengths = torch.randint(1, 200, (128,))  # batch
        >>> output, lengths = emformer(input, lengths)
        >>> input = torch.rand(128, 5, 512)
        >>> lengths = torch.ones(128) * 5
        >>> output, lengths, states = emformer.infer(input, lengths, None)
    r\   r*   r   r<   Fr]   r^   r_   r·   r4   r¸   r`   r(   r¹   rú   rº   r3   rb   rc   c                 ó  •‡‡‡‡‡‡‡‡
‡‡‡— t          ||¦  «        Št          j                             ˆˆˆˆˆˆ
ˆˆˆˆˆfd„t	          |¦  «        D ¦   «         ¦  «        }t          ¦   «                              |‰‰|	‰
¬¦  «         d S )Nc                 óP   •— g | ]"}t          ‰‰	‰‰
‰‰‰‰‰|         ‰‰¬ ¦  «        ‘Œ#S ))r`   r(   r¹   rº   ra   rb   rc   )r¶   )r9   rC   r(   r`   r·   r^   r¹   rº   rc   r_   r¸   rb   Úweight_init_gainss     €€€€€€€€€€€r   r;   z%Emformer.__init__.<locals>.<listcomp>]  s`   ø€ ð ð ð ð õ ØØØØ"Ø#Ø)Ø(;Ø$3Ø%6°yÔ%AØ +Ø!-ðñ ô ðð ð r   )r¹   rú   rº   )rH   r   r-   r1  rG   rg   rh   )rq   r^   r_   r·   r4   r¸   r`   r(   r¹   rú   rº   r3   rb   rc   rù   r5  rr   s    ``` ```` ` `` @€r   rh   zEmformer.__init__K  sÖ   øøøøøøøøøøøø€ õ  3Ð3MÈzÑZÔZÐÝœ(×-Ò-ðð ð ð ð ð ð ð ð ð ð ð ð ð õ "' zÑ!2Ô!2ðñ ô ñ
ô 
ˆõ$ 	‰Œ×ÒØØØ 3Ø!5Ø+ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   )r\   r*   r   r   r   r<   Fr]   )r¬   r­   r®   r¯   r   r„   rö   r   rˆ   rh   r³   r´   s   @r   r   r   &  së   ø€ € € € € ð"ð "ðV Ø Ø#$Ø$%Ø Ø4?Ø!Ø"ð)
ð )
àð)
ð ð)
ð ð	)
ð
 ð)
ð ð)
ð ð)
ð ð)
ð !ð)
ð "ð)
ð ð)
ð %-¨S¤Mð)
ð ð)
ð ð)
ð )
ð )
ð )
ð )
ð )
ð )
ð )
ð )
ð )
r   r7   )r@   Útypingr   r   r   r   Ú__all__r°   r   r'   rö   r-   ÚModuler2   r   r„   rH   rˆ   r
   rY   r[   r¶   rø   r   r8   r   r   ú<module>r9     s…  ðØ €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à €€€ð ˆ,€ð e¤lð °u´|ð ð ð ð ð 04ðð ØŒ|ðà”<ðð Œ\ðð Œ\ð	ð
 Œ,ðð ˜uœ|Ô,ðð ˆeŒlÔðð ð ð ð(A sð A¨u¬x¬ð Að Að Að Aðg°xÀ´}ð gÐRUð gÐZ^Ð_gÐhmÔ_nÔZoð gð gð gð gð(Ø�S”	ð(Ø%)¨$¤Zð(Ø;>ð(ØHMÌð(à
„\ð(ð (ð (ð (ðp
ð p
ð p
ð p
ð p
˜œœñ p
ô p
ð p
ðfMQð MQð MQð MQð MQ�U”X”_ñ MQô MQð MQð`TFð TFð TFð TFð TF�E”H”Oñ TFô TFð TFðnN
ð N
ð N
ð N
ð N
ˆ}ñ N
ô N
ð N
ð N
ð N
r   