§
    Øjl  ã                   óx   — 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dS )é    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dS )Ú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    ú™/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/onnxruntime/transformers/past_helper.pyÚ_unpack_layerz!PastKeyValuesHelper._unpack_layer   ss   € åˆ}ÑÔ Ò"Ð"Ø  Ô# ]°1Ô%5°}ÀQÔ7GÈÐWXÔIYÐYÐYÝ�=Ñ!Ô! QÒ&Ð&Ð&Ð(gÕSVÐWdÑSeÔSeÐ(gÐ(gÑ&Ô&Ð&ØÐó    FÚ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        r   Úget_past_namesz"PastKeyValuesHelper.get_past_names   så   € àˆØÐÝ�zÑ"Ô"ð 
	ð 
	ˆAØ×"Ò"àðDÐ( QÐ(Ð(Ð*CÀÐ*CÐ*CÐDÐDà* qÐ*Ð*Ð,B¸qÐ,BÐ,BÐCñô ð ð
 ×#Ò#àðFÐ) aÐ)Ð)Ð+EÀ!Ð+EÐ+EÐFÐFà+¨Ð+Ð+Ð-DÀÐ-DÐ-DÐEñô ð ð ð
 Ð!1Ñ1Ð1r   c                 óÖ   — g }g }t          | ¦  «        D ]R\  }}t                               |¦  «        \  }}}}|                     ||g¦  «         |                     ||g¦  «         ŒS||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ð 	KÑˆB�õ $×1Ò1°/ÑBÔBñØ Ø"Ø!Ø#à×ÒÐ!1Ð3EÐ FÑGÔGÐGØ× Ò Ð"3Ð5HÐ!IÑJÔJÐJÐJØ˜]Ð*Ð*r   c                 ón  ‡ ‡— t          ‰ ¦  «        d‰z  k    sJ ‚t          ˆˆ fd„t          ‰¦  «        D ¦   «         ¦  «        }t          j        t
          ¦  «        t          j        d¦  «        k    rBt          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  — | ]@}‰d |z           ‰d |z  dz            ‰d ‰z  d |z  z            ‰d ‰z  d |z  z   dz            gV — ŒAdS )é   r
   N© )Ú.0r!   r   Úpasts     €€r   ú	<genexpr>z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>G   s„   øè è € ð 
ð 
ð ð �Q˜‘U”Ø�Q˜‘U˜Q‘Y”Ø�Q˜‘^ a¨!¡eÑ+Ô,Ø�Q˜‘^ a¨!¡eÑ+¨aÑ/Ô0ð	ð
ð 
ð 
ð 
ð 
ð 
r   z5.0c              3   ó6   K  — | ]}|d          |d         fV — ŒdS )r   r
   Nr3   ©r4   Úlayers     r   r6   z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>Q   s/   è è € Ð/YÐ/YÈ°°q´¸5À¼8Ð0DÐ/YÐ/YÐ/YÐ/YÐ/YÐ/Yr   c              3   ó6   K  — | ]}|d          |d         fV — ŒdS )r2   r   Nr3   r8   s     r   r6   z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>R   s/   è è € Ð0ZÐ0ZÈ%°%¸´(¸EÀ!¼HÐ1EÐ0ZÐ0ZÐ0ZÐ0ZÐ0ZÐ0Zr   )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Œy˜A 
™NÒ*Ð*Ð*Ð*Ýð 
ð 
ð 
ð 
ð 
õ ˜:Ñ&Ô&ð
ñ 
ô 
ñ 
ô 
ˆõ Œ:Õ*Ñ+Ô+­r¬z¸%Ñ/@Ô/@Ò@Ð@Ý#/Ð/YÐ/YÐRXÐ/YÑ/YÔ/YÑ#YÔ#YÐ Ý$0Ð0ZÐ0ZÐSYÐ0ZÑ0ZÔ0ZÑ$ZÔ$ZÐ!Ý&Ð';Ð=RÑSÔSÐSØˆ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.
        r3   r2   r   r
   )r   r   )rC   Úpast_tuplesÚhalf_idxr!   Úidxs        r   Úback_group_by_layerz'PastKeyValuesHelper.back_group_by_layerV   s—   € ð  ˆÝ�Ñ'Ô'¨1Ñ,ˆÝ•s˜?Ñ+Ô+¨qÑ0Ñ1Ô1ð 		ð 		ˆAØ�a‘%ˆCØà# CÔ(Ø# C¨!¡GÔ,Ø# H¨s¡NÔ3Ø# H¨s¡N°QÑ$6Ô7ð	ðñ ˆKˆKð Ðr   r&   Úconcatc                 óä   — g }g }t          | ¦  «        D ]R\  }}t                               |¦  «        \  }}}}	|                     ||g¦  «         |                     ||	g¦  «         ŒS|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&   rI   r'   r(   Ú_r*   r+   r,   r-   r.   s
             r   Úgroup_by_self_and_crossz+PastKeyValuesHelper.group_by_self_and_crosst   s©   € ð$ ,.ˆØ,.ˆÝ"+Ð,>Ñ"?Ô"?ð 	Kð 	KÑˆAˆå#×1Ò1°/ÑBÔBñ YÐÐ0Ð2CÐEXð ×ÒÐ!1Ð3EÐ FÑGÔGÐGØ× Ò Ð"3Ð5HÐ!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 )
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_c                 ó   •— g | ]}‰|z   ‘ŒS r3   r3   ©r4   Ú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 r3   r3   rQ   s     €r   rT   z7PastKeyValuesHelper.get_input_names.<locals>.<listcomp>£   s   ø€ ÐUÐUÐU¨˜& 1™*ÐUÐUÐUr   Ú
key_cross_Úvalue_cross_)r   r   r   )rC   ÚencoderÚnamesr   r!   rS   s        @r   Úget_input_namesz#PastKeyValuesHelper.get_input_names“   só   ø€ ð ˆØ29ÐS•S˜Ñ)Ô)¨QÑ.Ð.½sÀ?Ñ?SÔ?Sˆ
Ø 'Ð7��¨ZˆÝ�zÑ"Ô"ð 	Uð 	UˆAØ�LŠLÐSÐSÐSÐS¨¸1¨¨Ð@QÈaÐ@QÐ@QÐ.RÐSÑSÔSÑTÔTÐTÐTÝ�zÑ"Ô"ð 	Wð 	WˆAØ�LŠLÐUÐUÐUÐUÐ/?¸AÐ/?Ð/?ÐASÐPQÐASÐASÐ.TÐUÑUÔUÑVÔVÐVÐVØˆr   N)F)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   Úboolr"   r/   rB   r;   ÚtorchÚTensorrH   rL   r\   r3   r   r   r   r      s;  € € € € € ØOÐOàðð ñ „\ðð ð2ð 2¨Dð 2ð 2ð 2ñ „\ð2ð  ð+ð +ñ „\ð+ð& ðð ñ „\ðð* ð¨U°5¸¼Ô3FÔ-Gð ð ð ñ „\ðð: ð/ð /°E¸%¼,Ô4Gð /ÐQUð /ð /ð /ñ „\ð/ð< ðð ¨¨u°U´\Ô/BÔ)Cð ð ð ñ „\ðð ð r   r   )ÚloggingÚpackaging.versionÚversionr<   rc   Útransformersr   r>   Útransformers.cache_utilsr   r   Ú	getLoggerr]   Úloggerr   r3   r   r   ú<module>rl      s£   ðð €€€à Ð Ð Ð Ð Ð Ø €€€Ø <Ð <Ð <Ð <Ð <Ð <Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fà	ˆÔ	˜8Ñ	$Ô	$€ðSð Sð Sð Sð Sñ Sô Sð Sð Sð Sr   