§
    kŠtjý  ã                   ó`   — d dl Z d dlZd dlmZ ddlmZmZmZ ddlm	Z	 	  G d„ de	¦  «        Z
dS )	é    N)Úonnx_pbé   )Ú	QuantTypeÚattribute_to_kwargÚ	ms_domainé   )ÚQuantOperatorBasec                   ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )Ú	LSTMQuantc                 óL   •— t          ¦   «                              ||¦  «         d S )N)ÚsuperÚ__init__)ÚselfÚonnx_quantizerÚ	onnx_nodeÚ	__class__s      €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/operators/lstm.pyr   zLSTMQuant.__init__   s#   ø€ Ý‰Œ×Ò˜¨Ñ3Ô3Ð3Ð3Ð3ó    c                 óh  •— | j         }|j        dk    sJ ‚| j                             |j        d         ¦  «        r%| j                             |j        d         ¦  «        s"t          ¦   «                              ¦   «          dS | j        j        }|                     |j        d         ¦  «        }|                     |j        d         ¦  «        }t          |j
        ¦  «        dk    st          |j
        ¦  «        dk    r"t          ¦   «                              ¦   «          dS |j
        \  }}}|j
        \  }}	}
| j                             ¦   «         r*|j
        d= |j
        d= ||z  |j
        d<   ||	z  |j
        d<   | j                             |j        d         t          j        j        d¦  «        }| j                             |j        d         t          j        j        d¦  «        }|                     |d         ¦  «        }|                     |d         ¦  «        }t           j                             |¦  «        }t           j                             |¦  «        }t'          j        ||||f¦  «        }t'          j        |||	|
f¦  «        }t'          j        |d¦  «        }t'          j        |d¦  «        }t           j                             ||d         ¦  «        }t           j                             ||d         ¦  «        }|                     ||g¦  «         |                     |¦  «         |                     |¦  «         |                     |d         ¦  «        }|                     |d         ¦  «        }|                     |d         ¦  «        }|                     |d         ¦  «        }| j                             ¦   «         r8||g|j
        dd…<   ||	g|j
        dd…<   ||g|j
        dd…<   ||	g|j
        dd…<   g }t          |j        ¦  «        }|                     |j        d         g¦  «         |                     |d         |d         g¦  «         |                     |dk    r|j        d         ndg¦  «         |                     |d	k    r|j        d	         ndg¦  «         |                     |d
k    r|j        d
         ndg¦  «         |                     |dk    r|j        d         ndg¦  «         |                     |dk    r|j        d         ndg¦  «         |                     |d         |d         |d         |d         g¦  «         i }|j        D ]0}|j        dk    rŒ|                     t;          |¦  «        ¦  «         Œ1t<          |d<   |j        sdn	|j        dz   }t!          j        j         d||j!        |fi |¤Ž}| j        j"         #                    |¦  «         | j         $                    |j        d         ¦  «        }|�!| j        j"         #                    |¦  «         dS dS )zä
        parameter node: LSTM node.
        parameter new_nodes_list: List of new nodes created before processing this node.
        return: a list of nodes in topological order that represents quantized Attention node.
        ÚLSTMr   r   Né   r   )r   r   r   Ú é   é   é   é   ÚlayoutÚdomainÚ_quantÚDynamicQuantizeLSTM)%ÚnodeÚop_typeÚ	quantizerÚis_valid_quantize_weightÚinputr   ÚquantizeÚmodelÚget_initializerÚlenÚdimsÚis_per_channelÚquantize_weight_per_channelÚ
onnx_protoÚTensorProtoÚINT8ÚonnxÚnumpy_helperÚto_arrayÚnumpyÚreshapeÚ	transposeÚ
from_arrayÚremove_initializersÚadd_initializerÚextendÚ	attributeÚnameÚupdater   r   ÚhelperÚ	make_nodeÚoutputÚ	new_nodesÚappendÚ_dequantize_value)r   r!   r'   ÚWÚRÚ	W_num_dirÚW_4_hidden_sizeÚW_input_sizeÚ	R_num_dirÚR_4_hidden_sizeÚR_hidden_sizeÚquant_input_weight_tupleÚquant_recurrent_weight_tupleÚW_quant_weightÚR_quant_weightÚW_quant_arrayÚR_quant_arrayÚW_quant_tranposedÚR_quant_tranposedÚ
W_quant_zpÚ
R_quant_zpÚW_quant_scaleÚR_quant_scaleÚinputsÚ	input_lenÚkwargsr:   Úquant_lstm_nameÚquant_lstm_nodeÚdequantize_noder   s                                 €r   r&   zLSTMQuant.quantize   sý  ø€ ð ŒyˆØŒ|˜vÒ%Ð%Ð%Ð%àŒ~×6Ò6°t´zÀ!´}ÑEÔEð 	ÈTÌ^×MtÒMtØŒJ�qŒMñN
ô N
ð 	õ ‰GŒG×ÒÑÔÐØˆFà”Ô$ˆØ×!Ò! $¤*¨Q¤-Ñ0Ô0ˆØ×!Ò! $¤*¨Q¤-Ñ0Ô0ˆåˆqŒv‰;Œ;˜!ÒÐ�s 1¤6™{œ{¨aÒ/Ð/Ý‰GŒG×ÒÑÔÐØˆFà56´VÑ2ˆ�O \Ø67´fÑ3ˆ�O ]àŒ>×(Ò(Ñ*Ô*ð 	4Ø”�q�	Ø”�q�	Ø! OÑ3ˆAŒF�1‰IØ! OÑ3ˆAŒF�1‰Ià#'¤>×#MÒ#MØŒJ�qŒMÝÔ"Ô'Øñ$
ô $
Ð ð
 (,¤~×'QÒ'QØŒJ�qŒMÝÔ"Ô'Øñ(
ô (
Ð$ð ×.Ò.Ð/GÈÔ/JÑKÔKˆØ×.Ò.Ð/KÈAÔ/NÑOÔOˆåÔ)×2Ò2°>ÑBÔBˆÝÔ)×2Ò2°>ÑBÔBˆåœ m°iÀÐR^Ð5_Ñ`Ô`ˆÝœ m°iÀÐR_Ð5`ÑaÔaˆåœ¨°yÑAÔAˆÝœ¨°yÑAÔAˆå Ô-×8Ò8¸ÐH`ÐabÔHcÑdÔdÐÝ Ô-×8Ò8¸ÐHdÐefÔHgÑhÔhÐà×!Ò! >°>Ð"BÑCÔCÐCØ×ÒÐ/Ñ0Ô0Ð0Ø×ÒÐ/Ñ0Ô0Ð0à×*Ò*Ð+CÀAÔ+FÑGÔGˆ
Ø×*Ò*Ð+GÈÔ+JÑKÔKˆ
Ø×-Ò-Ð.FÀqÔ.IÑJÔJˆØ×-Ò-Ð.JÈ1Ô.MÑNÔNˆàŒ>×(Ò(Ñ*Ô*ð 	AØ"+¨_Ð!=ˆJŒO˜A˜A˜AÑØ"+¨_Ð!=ˆJŒO˜A˜A˜AÑØ%.°Ð$@ˆMÔ˜q˜q˜qÑ!Ø%.°Ð$@ˆMÔ˜q˜q˜qÑ!àˆÝ˜œ
‘O”Oˆ	Ø�Š�t”z !”}�oÑ&Ô&Ð&Ø�ŠÐ/°Ô2Ð4PÐQRÔ4SÐTÑUÔUÐUØ�Š¨	°Aª¨�t”z !”}�}¸2Ð>Ñ?Ô?Ð?Ø�Š¨	°Aª¨�t”z !”}�}¸2Ð>Ñ?Ô?Ð?Ø�Š¨	°Aª¨�t”z !”}�}¸2Ð>Ñ?Ô?Ð?Ø�Š¨	°Aª¨�t”z !”}�}¸2Ð>Ñ?Ô?Ð?Ø�Š¨	°Aª¨�t”z !”}�}¸2Ð>Ñ?Ô?Ð?Ø�Šà(¨Ô+Ø(¨Ô+Ø,¨QÔ/Ø,¨QÔ/ð	ñ	
ô 	
ð 	
ð ˆØœð 	9ð 	9ˆIØŒ~ Ò)Ð)ØØ�MŠMÕ,¨YÑ7Ô7Ñ8Ô8Ð8Ð8Ý$ˆˆxÑà$(¤IÐG˜"˜"°4´9¸xÑ3GˆÝœ+Ô/Ð0EÀvÈtÌ{Ð\kÐvÐvÐouÐvÐvˆØŒÔ ×'Ò'¨Ñ8Ô8Ð8àœ.×:Ò:¸4¼:Àa¼=ÑIÔIˆØÐ&ØŒNÔ$×+Ò+¨OÑ<Ô<Ð<Ð<Ð<ð 'Ð&r   )Ú__name__Ú
__module__Ú__qualname__r   r&   Ú__classcell__)r   s   @r   r   r      sZ   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðh=ð h=ð h=ð h=ð h=ð h=ð h=ð h=ð h=r   r   )r3   r0   r   r-   Úquant_utilsr   r   r   Úbase_operatorr	   r   © r   r   ú<module>rd      s�   ðØ €€€Ø €€€Ø &Ð &Ð &Ð &Ð &Ð &à BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð
l=ð l=ð l=ð l=ð l=Ð!ñ l=ô l=ð l=ð l=ð l=r   