U
    T?h                     @   s<   d dl Z d dlmZmZ d dlZe eZG dd dZdS )    N)ListTuplec                   @   s   e Zd ZdZededddZedd Zedd	 Zee	e	e
j  d
ddZede	e
j edddZede	e	e
j  d
ddZdS )PastKeyValuesHelperzEHelper functions to process past key values for encoder-decoder modelF)presentc                 C   s   g }g }t | D ]h}||r0d| d| gnd| d| g ||rbd| d| gnd| d| g q|| S )	NZpresent_key_self_Zpresent_value_self_Zpast_key_self_Zpast_value_self_Zpresent_key_cross_Zpresent_value_cross_Zpast_key_cross_Zpast_value_cross_)rangeextend)
num_layersr   Zpast_self_namesZpast_cross_namesi r
   `/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/models/t5/past_helper.pyget_past_names   s    z"PastKeyValuesHelper.get_past_namesc           	      C   sh   g }g }t | D ]N\}}t|dks6tdt| |\}}}}|||g |||g q||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lenAssertionErrorr   )	present_key_valuespresent_selfpresent_crossZ_ipresent_layer_ipresent_key_selfpresent_value_selfpresent_key_crosspresent_value_crossr
   r
   r   group_by_self_or_cross#   s    z*PastKeyValuesHelper.group_by_self_or_crossc                    s0   t d  kstt fd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   sR   | ]J}d |  d | d  d   d |   d   d |  d  gV  qdS )      Nr
   ).0r	   r   pastr
   r   	<genexpr>?   s   
z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>)r   r   tupler   )r    r   r
   r   r   group_by_layer8   s    z"PastKeyValuesHelper.group_by_layer)past_key_valuesc                 C   sd   d}t | d }tt | d D ]>}d| }|| | | |d  | ||  | || d  ff7 }q |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   )r$   Zpast_tuplesZhalf_idxr	   idxr
   r
   r   back_group_by_layerI   s    

z'PastKeyValuesHelper.back_group_by_layer)r   concatc           
      C   sx   g }g }t | D ]N\}}t|dks6tdt| |\}}}}	|||g |||	g q|rl|| S ||fS d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   Nr   )
r   r'   r   r   _r   r   r   r   r   r
   r
   r   group_by_self_and_crossg   s    z+PastKeyValuesHelper.group_by_self_and_crossTc                    s   g }|rt | d nt | }|s$dnd t|D ],}| fddd| d| fD  q0t|D ],}| fddd	| d
| fD  qf|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   Zpast_Zpresent_c                    s   g | ]} | qS r
   r
   r   sprefixr
   r   
<listcomp>   s     z7PastKeyValuesHelper.get_input_names.<locals>.<listcomp>Z	key_self_Zvalue_self_c                    s   g | ]} | qS r
   r
   r*   r,   r
   r   r.      s     Z
key_cross_Zvalue_cross_)r   r   r   )r$   encodernamesr   r	   r
   r,   r   get_input_names   s    
**z#PastKeyValuesHelper.get_input_namesN)F)F)T)__name__
__module____qualname____doc__staticmethodboolr   r   r#   r   torchZTensorr&   r)   r1   r
   r
   r
   r   r      s   

r   )	loggingtypingr   r   r8   	getLoggerr2   loggerr   r
   r
   r
   r   <module>   s   
