Ë
    cQêjl  ã                   ót   — d dl Z d dlmZ d dlZd dlmZ d dlm	Z	m
Z
  e j                  e«      Z G d„ d«      Zy)é    N)Ú__version__)ÚDynamicCacheÚEncoderDecoderCachec                   óü   — e Zd ZdZe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y)ÚPastKeyValuesHelperzEHelper functions to process past key values for encoder-decoder modelc                 óˆ   — t        | «      dk(  r| d   | d   | d   | d   fS t        | «      dk(  sJ dt        | «      › �«       ‚| S )Né   r   é   é   é   z(Expected to have four or six items. Got )Úlen)Úpresent_layers    úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/past_helper.pyÚ_unpack_layerz!PastKeyValuesHelper._unpack_layer   sa   € äˆ}Ó Ò"Ø  Ñ# ]°1Ñ%5°}ÀQÑ7GÈÐWXÑIYÐYÐYÜ�=Ó! QÒ&ÐgÐ*RÔSVÐWdÓSeÐRfÐ(gÓgÐ&ØÐó    Úpresentc                 óÈ   — g }g }t        | «      D ]L  }|j                  |r
d|› �d|› �gn	d|› �d|› �g«       |j                  |r
d|› �d|› �gn	d|› �d|› �g«       ŒN ||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        r   Úget_past_namesz"PastKeyValuesHelper.get_past_names   s³   € àˆØÐÜ�zÓ"ò 
	ˆAØ×"Ñ"áð % Q CÐ(Ð,?À¸sÐ*CÑDà& q cÐ*Ð.>¸q¸cÐ,BÐCôð
 ×#Ñ#áð & a SÐ)Ð-AÀ!ÀÐ+EÑFà'¨ sÐ+Ð/@ÀÀÐ-DÐEõð
	ð Ð!1Ñ1Ð1r   c                 ó¸   — g }g }t        | «      D ]E  \  }}t        j                  |«      \  }}}}|j                  ||g«       |j                  ||g«       ŒG ||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, ...)

        ©Ú	enumerater   r   r   )	Ú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ÑˆB�ô $×1Ñ1°/ÓBñØ Ø"Ø!Ø#à×ÑÐ!1Ð3EÐ FÔGØ× Ñ Ð"3Ð5HÐ!IÕJð	Kð ˜]Ð*Ð*r   c                 ó*  ‡ ‡— t        ‰ «      d‰z  k(  sJ ‚t        ˆˆ fd„t        ‰«      D «       «      }t        j                  t
        «      t        j                  d«      k\  r0t        d„ |D «       «      }t        d„ |D «       «      }t        ||«      S |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  — | ]4  }‰d |z     ‰d |z  dz      ‰d ‰z  d |z  z      ‰d ‰z  d |z  z   dz      g–— Œ6 y­w)é   r
   N© )Ú.0r!   r   Úpasts     €€r   ú	<genexpr>z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>G   sf   øè ø€ ò 
ð ð �Q˜‘U‘Ø�Q˜‘U˜Q‘Y‘Ø�Q˜‘^ a¨!¡eÑ+Ñ,Ø�Q˜‘^ a¨!¡eÑ+¨aÑ/Ñ0ô	ñ
ùs   ƒ:=z5.0c              3   ó0   K  — | ]  }|d    |d   f–— Œ y­w)r   r
   Nr3   ©r4   Úlayers     r   r6   z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>Q   s   è ø€ Ò/YÈ°°q±¸5À¹8Ô0DÑ/Yùó   ‚c              3   ó0   K  — | ]  }|d    |d   f–— Œ y­w)r2   r   Nr3   r8   s     r   r6   z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>R   s   è ø€ Ò0ZÈ%°%¸±(¸EÀ!¹HÔ1EÑ0Zùr:   )r   Útupler   ÚpvÚVersionÚtransformers_versionr   r   )r5   r   ÚlayersÚself_attention_cacheÚcross_attention_caches   ``   r   Úgroup_by_layerz"PastKeyValuesHelper.group_by_layer@   sŽ   ù€ ô �4‹y˜A 
™NÒ*Ð*Ð*Üô 
ô ˜:Ó&ô
ó 
ˆô �:‰:Ô*Ó+¬r¯z©z¸%Ó/@Ò@Ü#/Ñ/YÐRXÔ/YÓ#YÐ Ü$0Ñ0ZÐSYÔ0ZÓ$ZÐ!Ü&Ð';Ð=RÓSÐSØˆr   Úpast_key_valuesc                 ó¬   — d}t        | «      dz  }t        t        | «      dz  «      D ])  }d|z  }|| |   | |dz      | ||z      | ||z   dz      ffz  }Œ+ |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.
        r3   r2   r   r
   )r   r   )rD   Úpast_tuplesÚhalf_idxr!   Úidxs        r   Úback_group_by_layerz'PastKeyValuesHelper.back_group_by_layerV   sŒ   € ð  ˆÜ�Ó'¨1Ñ,ˆÜ”s˜?Ó+¨qÑ0Ó1ò 		ˆAØ�a‘%ˆCØà# CÑ(Ø# C¨!¡GÑ,Ø# H¨s¡NÑ3Ø# H¨s¡N°QÑ$6Ñ7ð	ðñ ‰Kð		ð Ðr   r&   Úconcatc                 óÆ   — g }g }t        | «      D ]E  \  }}t        j                  |«      \  }}}}	|j                  ||g«       |j                  ||	g«       ŒG |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&   rJ   r'   r(   Ú_r*   r+   r,   r-   r.   s
             r   Úgroup_by_self_and_crossz+PastKeyValuesHelper.group_by_self_and_crosst   s‘   € ð$ ,.ˆØ,.ˆÜ"+Ð,>Ó"?ò 	KÑˆAˆä#×1Ñ1°/ÓBñ YÐÐ0Ð2CÐEXð ×ÑÐ!1Ð3EÐ FÔGØ× Ñ Ð"3Ð5HÐ!IÕJð	Kñ Ø -Ñ/Ð/à Ð.Ð.r   c                 óH  — g }|rt        | «      dz  n
t        | «      }|sdnd}t        |«      D ],  }|j                  d|› �d|› �fD �cg c]  }||z   ‘Œ	 c}«       Œ. t        |«      D ],  }|j                  d|› �d|› �fD �cg c]  }||z   ‘Œ	 c}«       Œ. |S c c}w c c}w )zÆProcess 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   )rD   ÚencoderÚnamesr   Úprefixr!   Úss          r   Úget_input_namesz#PastKeyValuesHelper.get_input_names“   sÀ   € ð ˆÙ29”S˜Ó)¨QÒ.¼sÀ?Ó?Sˆ
Ù '‘¨ZˆÜ�zÓ"ò 	UˆAØ�L‰L°¸1¸#¨À+ÈaÈSÐ@QÐ.RÖS¨˜& 1›*ÒSÕTð	Uä�zÓ"ò 	WˆAØ�L‰L°¸A¸3Ð/?À<ÐPQÈsÐASÐ.TÖU¨˜& 1›*ÒUÕVð	Wàˆùò TùâUs   Á	B
ÂB
N)F)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   Úboolr"   r/   rC   r<   ÚtorchÚTensorrI   rM   rY   r3   r   r   r   r      sØ   „ ÙOàñó ðð ñ2¨Dò 2ó ð2ð  ñ+ó ð+ð& ñó ðð* ð¨U°5¸¿¹Ñ3FÑ-Gò ó ðð: ñ/°E¸%¿,¹,Ñ4Gð /ÐQUò /ó ð/ð< ñ¨¨u°U·\±\Ñ/BÑ)Cò ó ñr   r   )ÚloggingÚpackaging.versionÚversionr=   r`   Útransformersr   r?   Útransformers.cache_utilsr   r   Ú	getLoggerrZ   Úloggerr   r3   r   r   ú<module>ri      s4   ðó å Û Ý <ß Fà	ˆ×	Ñ	˜8Ó	$€÷Sò Sr   