§
    kŠtj–  ã                   óP   — d dl Z d dlZ e j        e¦  «        Z G d„ d¦  «        ZdS )é    Nc                   ó  — e Zd Z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 modelFÚ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        úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/past_helper.pyÚ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Ð1ó    c                 ó   — g }g }t          | ¦  «        D ]g\  }}t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|\  }}}}|                     ||g¦  «         |                     ||g¦  «         Œh||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Ú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_crossz*PastKeyValuesHelper.group_by_self_or_cross"   s»   € ð ˆØˆÝ#,Ð-?Ñ#@Ô#@ð 		Kð 		KÑˆB�Ý�Ñ'Ô'¨1Ò,Ð,Ð,Ð.hÕRUÐVeÑRfÔRfÐ.hÐ.hÑ,Ô,Ð,ð  ñØ Ø"Ø!Ø#à×ÒÐ!1Ð3EÐ FÑGÔGÐGØ× Ò Ð"3Ð5HÐ!IÑJÔJÐJÐJØ˜]Ð*Ð*r   c                 óˆ   ‡ ‡— t          ‰ ¦  «        d‰z  k    sJ ‚t          ˆˆ f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   ó�   •K  — | ]@}‰d |z           ‰d |z  dz            ‰d ‰z  d |z  z            ‰d ‰z  d |z  z   dz            gV — ŒAdS )é   é   N© )Ú.0r   r   Úpasts     €€r   ú	<genexpr>z5PastKeyValuesHelper.group_by_layer.<locals>.<genexpr>>   s„   øè è € ð 
ð 
ð ð �Q˜‘U”Ø�Q˜‘U˜Q‘Y”Ø�Q˜‘^ a¨!¡eÑ+Ô,Ø�Q˜‘^ a¨!¡eÑ+¨aÑ/Ô0ð	ð
ð 
ð 
ð 
ð 
ð 
r   )r   Útupler   )r.   r   s   ``r   Úgroup_by_layerz"PastKeyValuesHelper.group_by_layer7   sh   øø€ õ �4‰yŒy˜A 
™NÒ*Ð*Ð*Ð*Ýð 
ð 
ð 
ð 
ð 
õ ˜:Ñ&Ô&ð
ñ 
ô 
ñ 
ô 
ð 	
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.
        r,   r*   r   r+   )r   r   )r2   Úpast_tuplesÚhalf_idxr   Úidxs        r   Úback_group_by_layerz'PastKeyValuesHelper.back_group_by_layerH   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 ]g\  }}t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚|\  }}}}	|                     ||g¦  «         |                     ||	g¦  «         Œh|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   r   )
r   r8   r   r    Ú_r"   r#   r$   r%   r&   s
             r   Úgroup_by_self_and_crossz+PastKeyValuesHelper.group_by_self_and_crossf   sÊ   € ð$ ,.ˆØ,.ˆÝ"+Ð,>Ñ"?Ô"?ð 	Kð 	KÑˆAˆÝ�Ñ'Ô'¨1Ò,Ð,Ð,Ð.hÕRUÐVeÑRfÔRfÐ.hÐ.hÑ,Ô,Ð,Ø[jÑXÐÐ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 r,   r,   ©r-   Ú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 r,   r,   r@   s     €r   rC   z7PastKeyValuesHelper.get_input_names.<locals>.<listcomp>”   s   ø€ ÐUÐUÐU¨˜& 1™*ÐUÐUÐUr   Ú
key_cross_Úvalue_cross_)r   r   r   )r2   ÚencoderÚnamesr   r   rB   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__ÚstaticmethodÚboolr   r'   r1   r0   ÚtorchÚTensorr7   r;   rK   r,   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   )ÚloggingrR   Ú	getLoggerrL   Úloggerr   r,   r   r   ú<module>rW      sg   ðð €€€à €€€à	ˆÔ	˜8Ñ	$Ô	$€ðGð Gð Gð Gð Gñ Gô Gð Gð Gð Gr   