
    fPi                     P    d dl Z d dlZ e j        e          Z G d d          ZdS )    Nc                      e Zd ZdZeddefd            Zed             Zed             Zede	e	e
j                          fd            Zedd	e	e
j                 d
efd            Zedde	e	e
j                          fd            ZdS )PastKeyValuesHelperzEHelper functions to process past key values for encoder-decoder modelFpresentc                     g }g }t          |           D ]T}|                    |r
d| d| gn	d| d| g           |                    |r
d| d| gn	d| d| g           U||z   S )	Npresent_key_self_present_value_self_past_key_self_past_value_self_present_key_cross_present_value_cross_past_key_cross_past_value_cross_)rangeextend)
num_layersr   past_self_namespast_cross_namesis        x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/past_helper.pyget_past_namesz"PastKeyValuesHelper.get_past_names   s    z"" 
	 
	A""D(Q((*C*C*CDD*q**,Bq,B,BC  
 ##F)a))+E!+E+EFF+++-D-D-DE   
 !111    c                     g }g }t          |           D ]g\  }}t          |          dk    sJ dt          |                       |\  }}}}|                    ||g           |                    ||g           h||fS )a  Split present state from grouped by layer to grouped by self/cross attention.
        Before: (past_key_self_0, past_value_self_0, past_key_cross_0, past_value_cross_0), (past_key_self_1, past_value_self_1, past_key_cross_1, past_value_cross_1), ...
        After: (past_key_self_0, past_value_self_0, past_key_self_1, past_value_self_1, ...), (past_key_cross_0, past_value_cross_0, past_key_cross_1, past_value_cross_1, ...)

           !Expected to have four items. Got 	enumeratelenr   )	present_key_valuespresent_selfpresent_cross_ipresent_layer_ipresent_key_selfpresent_value_selfpresent_key_crosspresent_value_crosss	            r   group_by_self_or_crossz*PastKeyValuesHelper.group_by_self_or_cross"   s     #,-?#@#@ 		K 		KB''1,,,.hRUVeRfRf.h.h,,,   "!#!13E FGGG  "35H!IJJJJ]**r   c                      t                     dz  k    sJ t           fdt                    D                       S )a  Reorder past state from grouped by self/cross attention to grouped by layer.
        Before: past_key_self_0, past_value_self_0, past_key_self_1, past_value_self_1, ..., past_key_cross_0, past_value_cross_0, past_key_cross_1, past_value_cross_1, ...
        After: (past_key_self_0, past_value_self_0, past_key_cross_0, past_value_cross_0), (past_key_self_1, past_value_self_1, past_key_cross_1, past_value_cross_1),
        r   c              3      K   | ]@}d |z           d |z  dz            d z  d |z  z            d z  d |z  z   dz            gV  AdS )      N ).0r   r   pasts     r   	<genexpr>z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>>   s       
 
  QUQUQYQ^a!e+,Q^a!e+a/0	
 
 
 
 
 
r   )r   tupler   )r.   r   s   ``r   group_by_layerz"PastKeyValuesHelper.group_by_layer7   sh     4yyA
N**** 
 
 
 
 
 :&&
 
 
 
 
 	
r   past_key_valuesc                     d}t          |           dz  }t          t          |           dz            D ]5}d|z  }|| |         | |dz            | ||z            | ||z   dz            ffz  }6|S )a  Categorize present_key_values from self and cross attention to layer by layer.

        Reorder past state from grouped by self/cross attention to grouped by layer.
        Before: past_key_self_0, past_value_self_0, past_key_self_1, past_value_self_1, ...,
                past_key_cross_0, past_value_cross_0, past_key_cross_1, past_value_cross_1, ...
        After: (past_key_self_0, past_value_self_0, past_key_cross_0, past_value_cross_0),
                (past_key_self_1, past_value_self_1, past_key_cross_1, past_value_cross_1),

        Args:
            present_key_values: From past_key_values of a model (group by self and cross attention)

        Returns:
            past_tuples: present key and values grouped by layer.
        r,   r*   r   r+   )r   r   )r2   past_tupleshalf_idxr   idxs        r   back_group_by_layerz'PastKeyValuesHelper.back_group_by_layerH   s      ''1,s?++q011 		 		Aa%C#C(#C!G,#HsN3#HsNQ$67	 KK r   r   concatc                    g }g }t          |           D ]g\  }}t          |          dk    sJ dt          |                       |\  }}}}	|                    ||g           |                    ||	g           h|r||z   S ||fS )a  Categorize present_key_values into self and cross attention.

        Split present state from grouped by layer to grouped by self/cross attention.
        Before: (past_key_self_0, past_value_self_0, past_key_cross_0, past_value_cross_0),
                (past_key_self_1, past_value_self_1, past_key_cross_1, past_value_cross_1), ...
        After: (past_key_self_0, past_value_self_0, past_key_self_1, past_value_self_1, ...),
                (past_key_cross_0, past_value_cross_0, past_key_cross_1, past_value_cross_1, ...)

        Args:
            present_key_values: From past_key_values of a model (group by layer)
            concat: If concat self attention with cross attention key/value to return

        Returns:
            present_self (Tuple[torch.Tensor]): present key and values from self attention
            present_cross (Tuple[torch.Tensor]): present key and values from cross attention
        r   r   r   )
r   r8   r   r    _r"   r#   r$   r%   r&   s
             r   group_by_self_and_crossz+PastKeyValuesHelper.group_by_self_and_crossf   s    $ ,.,."+,>"?"? 	K 	KA''1,,,.hRUVeRfRf.h.h,,,[jX02CEX!13E FGGG  "35H!IJJJJ 	/-//..r   Tc                 J   g }|rt          |           dz  nt          |           }|sdndt          |          D ]+}|                    fdd| d| fD                        ,t          |          D ]+}|                    fdd| d	| fD                        ,|S )
zProcess input names of model wrapper.

        Args:
            past_key_values: Consider `self` and `cross` past_key_values

        Returns:
            names (List[string]): input names
        r   past_present_c                     g | ]}|z   S r,   r,   r-   sprefixs     r   
<listcomp>z7PastKeyValuesHelper.get_input_names.<locals>.<listcomp>   s    SSS&1*SSSr   	key_self_value_self_c                     g | ]}|z   S r,   r,   r@   s     r   rC   z7PastKeyValuesHelper.get_input_names.<locals>.<listcomp>   s    UUU&1*UUUr   
key_cross_value_cross_)r   r   r   )r2   encodernamesr   r   rB   s        @r   get_input_namesz#PastKeyValuesHelper.get_input_names   s     29SS))Q..s??S?S
 '7Zz"" 	U 	UALLSSSS1@Qa@Q@Q.RSSSTTTTz"" 	W 	WALLUUUU/?A/?/?ASPQASAS.TUUUVVVVr   N)F)T)__name__
__module____qualname____doc__staticmethodboolr   r'   r1   r0   torchTensorr7   r;   rK   r,   r   r   r   r      s        OO2 2D 2 2 2 \2  + + \+( 
 
 \
  U53F-G    \: / /E%,4G /QU / / / \/:  uU\/B)C    \  r   r   )loggingrR   	getLoggerrL   loggerr   r,   r   r   <module>rW      sg     		8	$	$G G G G G G G G G Gr   