
    h                     L    S SK r S SKr\ R                  " \5      r " S S5      rg)    Nc                      \ rS rSrSr\SS\4S jj5       r\S 5       r\S 5       r	\S\
\
\R                        4S j5       r\SS	\
\R                     S
\4S jj5       r\SS\
\
\R                        4S jj5       rSrg)PastKeyValuesHelper   zEHelper functions to process past key values for encoder-decoder modelpresentc                     / n/ n[        U 5       HW  nUR                  U(       a
  SU 3SU 3/O	SU 3SU 3/5        UR                  U(       a
  SU 3SU 3/O	SU 3SU 3/5        MY     X#-   $ )	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        ^/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/past_helper.pyget_past_names"PastKeyValuesHelper.get_past_names   s    z"A"" %QC(,?s*CD&qc*.>qc,BC
 ## &aS)-A!+EF's+/@-DE # 11    c                     / n/ n[        U 5       HR  u  p4[        U5      S:X  d   S[        U5       35       eUu  nnnnUR                  XV/5        UR                  Xx/5        MT     X4$ )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_cross*PastKeyValuesHelper.group_by_self_or_cross"   s     #,-?#@B'1,h0QRUVeRfQg.hh,   "!#!1 FG  "3!IJ $A **r   c                 l   ^ ^ [        T 5      ST-  :X  d   e[        UU 4S j[        T5       5       5      $ )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      >#    U  H5  nTS U-     TS U-  S-      TS T-  S U-  -      TS T-  S U-  -   S-      /v   M7     g7f)      N ).0r   r   pasts     r   	<genexpr>5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>>   sg      
 ' QUQUQYQ^a!e+,Q^a!e+a/0	 's   =A )r   tupler   )r1   r   s   ``r   group_by_layer"PastKeyValuesHelper.group_by_layer7   s<     4yA
N*** 
 :&
 
 	
r   past_key_valuesc                     Sn[        U 5      S-  n[        [        U 5      S-  5       H&  nSU-  nUX   XS-      XU-      XU-   S-      44-  nM(     U$ )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   )r7   past_tupleshalf_idxr   idxs        r   back_group_by_layer'PastKeyValuesHelper.back_group_by_layerH   s      '1,s?+q01Aa%C#(#!G,#sN3#sNQ$67	 K 2 r   r    concatc                     / n/ n[        U 5       HP  u  pE[        U5      S:X  d   S[        U5       35       eUu  pgpUR                  Xg/5        UR                  X/5        MR     U(       a  X#-   $ X#4$ )a8  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    r>   r!   r"   _r$   r%   r&   r'   r(   s
             r   group_by_self_and_cross+PastKeyValuesHelper.group_by_self_and_crossf   s    $ ,.,."+,>"?A'1,h0QRUVeRfQg.hh,[jX2C!1 FG  "3!IJ	 #@
 //..r   c                 l   / nU(       a  [        U 5      S-  O
[        U 5      nU(       d  SOSn[        U5       H/  nUR                  SU 3SU 34 Vs/ s H  odU-   PM	     sn5        M1     [        U5       H/  nUR                  SU 3SU 34 Vs/ s H  odU-   PM	     sn5        M1     U$ s  snf s  snf )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_	key_self_value_self_
key_cross_value_cross_)r   r   r   )r7   encodernamesr   prefixr   ss          r   get_input_names#PastKeyValuesHelper.get_input_names   s     29S)Q.s??S
 'Zz"ALL1#+aS@Q.RS.R1*.RST #z"ALLA3/?<PQsAS.TU.T1*.TUV # TUs   B,
B1
r/   N)F)T)__name__
__module____qualname____firstlineno____doc__staticmethodboolr   r)   r5   r4   torchTensorr<   rA   rN   __static_attributes__r/   r   r   r   r      s    O2D 2 2  + +( 
 
  U53F-G  : /E%,,4G /QU / /: uU\\/B)C  r   r   )loggingrW   	getLoggerrP   loggerr   r/   r   r   <module>r]      s)     			8	$G Gr   