o
    ;ήc                     @   s$   d dl Z e eZG dd dZdS )    Nc                   @   s<   e Zd ZdZeddefddZedd Zedd	 Zd
S )PastKeyValuesHelperzEHelper functions to process past key values for encoder-decoder modelFpresentc                 C   s   g }g }t | D ]4}||rd| d| gn	d| d| g ||r1d| d| gn	d| d| g q|| 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i r   U/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/models/t5/past_helper.pyget_past_names   s   z"PastKeyValuesHelper.get_past_namesc           	      C   sh   g }g }t | D ]'\}}t|dksJ 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, ...)

           z!Expected to have four items. Got )	enumeratelenr   )	present_key_valuespresent_selfpresent_crossr   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
J 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   sT    | ]%}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   tupler   )r%   r   r   r$   r   group_by_layer5   s   z"PastKeyValuesHelper.group_by_layerN)F)	__name__
__module____qualname____doc__staticmethodboolr   r    r(   r   r   r   r   r      s    
r   )logging	getLoggerr)   loggerr   r   r   r   r   <module>   s   
