
    i                     T    S SK r S SKJs  Jr  S SK Jr   " S S\R
                  5      rg)    N)nnc                   @   ^  \ rS rSrSrSSU 4S jjjrS rS rSrU =r	$ )		ASRJoiner   z
ASR joiner implementation following the code in https://fburl.com/code/ierfau7c
Have a local implementation has the benefit that we don't need pull in the
heavy dependencies and wait for a few minutes to run tests.
c                    > [         TU ]  5         XX4U4u  U l        U l        U l        U l        U l        [        R                  " [        R                  " 5       [        R                  " US5      5      U l        g)z
B: source batch size
H: number of hypotheses for beam search
T: source sequence length
U: target sequence length
D: encoding (some sort of embedding?) dimension
i   N)super__init__BHTUDr   
SequentialReLULinearmodule)selfr
   r   r   r   r   	__class__s         _/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/exir/tests/asr_joiner.pyr	   ASRJoiner.__init__   sY     	12qQ. mmGGIIIa
    c                    UR                   S   UR                   S   -  nUR                   S   n[        R                  " U5      R                  SS5      R	                  SU5      R                  S5      R                  5       R                  UR                  S9n[        R                  " USUS9R                  5       n[        R                  " USUR                  UR                  S9S9nUR                  SS9R                  5       nUR                  SS9R                  5       nX-   n[        R                  " U R                  U5      SS9n	XU4$ )z
One simplification we make here is we assume src_encodings and tgt_encodings
are not None. In the originally implementation, either can be None.
r      )device)dimindex   )r   )shapetorcharangeviewrepeatlongtor   index_select
contiguous	unsqueezeFlog_softmaxr   )
r   src_encodingssrc_lengthstgt_encodingstgt_lengthsr   r
   	new_orderjoint_encodingsoutputs
             r   forwardASRJoiner.forward)   s9   
 "m&9&9!&<<"\\!_!!"a(//15::2>TVR}++R, 	 **q	

*, 	
 ((Qill+:L:Ll&M

 &//A/6AAC &//A/6AAC (7t{{?;DK//r   c                 |   [         R                  " U R                  U R                  U R                  5      [         R
                  " SSU R                  45      [         R                  " U R                  U R                  -  U R                  U R                  5      [         R
                  " SSU R                  45      4$ )Nr   
   )r    randr
   r   r   randintr   r   )r   s    r   get_random_inputsASRJoiner.get_random_inputsL   sx    JJtvvtvvtvv.MM!R$&&+JJtvv7MM!R$&&+	
 	
r   )r
   r   r   r   r   r   )r   r5   r   r   i   )returnN)
__name__
__module____qualname____firstlineno____doc__r	   r2   r8   __static_attributes____classcell__)r   s   @r   r   r      s"    
 
,!0F
 
r   r   )r    torch.nn.functionalr   
functionalr)   Moduler    r   r   <module>rF      s%       F
		 F
r   