Ë
    ÝÍ:jý  ã                   óX   — 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
y)	é    N)Úonnx_pbé   )Ú	QuantTypeÚattribute_to_kwargÚ	ms_domainé   )ÚQuantOperatorBasec                   ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )Ú	LSTMQuantc                 ó&   •— t         ‰| �  ||«       y )N)ÚsuperÚ__init__)ÚselfÚonnx_quantizerÚ	onnx_nodeÚ	__class__s      €ú|/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/quantization/operators/lstm.pyr   zLSTMQuant.__init__   s   ø€ Ü‰Ñ˜¨Õ3ó    c                 óX  •— | j                   }|j                  dk(  sJ ‚| j                  j                  |j                  d   «      r(| j                  j                  |j                  d   «      st
        ‰| �  «        y| j                  j                  }|j                  |j                  d   «      }|j                  |j                  d   «      }t        |j                  «      dk7  st        |j                  «      dk7  rt
        ‰| �  «        y|j                  \  }}}|j                  \  }}	}
| j                  j                  «       r>|j                  d= |j                  d= ||z  |j                  d<   ||	z  |j                  d<   | j                  j                  |j                  d   t        j                  j                  d«      }| j                  j                  |j                  d   t        j                  j                  d«      }|j                  |d   «      }|j                  |d   «      }t         j"                  j%                  |«      }t         j"                  j%                  |«      }t'        j(                  ||||f«      }t'        j(                  |||	|
f«      }t'        j*                  |d«      }t'        j*                  |d«      }t         j"                  j-                  ||d   «      }t         j"                  j-                  ||d   «      }|j/                  ||g«       |j1                  |«       |j1                  |«       |j                  |d   «      }|j                  |d   «      }|j                  |d   «      }|j                  |d   «      }| j                  j                  «       rD||g|j                  dd ||	g|j                  dd ||g|j                  dd ||	g|j                  dd g }t        |j                  «      }|j3                  |j                  d   g«       |j3                  |d   |d   g«       |j3                  |dkD  r|j                  d   ndg«       |j3                  |d	kD  r|j                  d	   ndg«       |j3                  |d
kD  r|j                  d
   ndg«       |j3                  |dkD  r|j                  d   ndg«       |j3                  |dkD  r|j                  d   ndg«       |j3                  |d   |d   |d   |d   g«       i }|j4                  D ],  }|j6                  dk(  rŒ|j9                  t;        |«      «       Œ. t<        |d<   |j6                  sdn|j6                  dz   }t!        j>                  j@                  d||jB                  |fi |¤Ž}| j                  jD                  jG                  |«       | j                  jI                  |j                  d   «      }|�&| j                  jD                  jG                  |«       yy)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   sb  ø€ ð �y‰yˆØ�|‰|˜vÒ%Ð%Ð%à�~‰~×6Ñ6°t·z±zÀ!±}ÔEÈTÏ^É^×MtÑMtØ�J‰J�q‰MôN
ô ‰GÑÔØà—‘×$Ñ$ˆØ×!Ñ! $§*¡*¨Q¡-Ó0ˆØ×!Ñ! $§*¡*¨Q¡-Ó0ˆäˆq�v‰v‹;˜!Òœs 1§6¡6›{¨aÒ/Ü‰GÑÔØà56·V±VÑ2ˆ�O \Ø67·f±fÑ3ˆ�O ]à�>‰>×(Ñ(Ô*Ø—‘�q�	Ø—‘�q�	Ø! OÑ3ˆA�F‰F�1‰IØ! OÑ3ˆA�F‰F�1‰Ià#'§>¡>×#MÑ#MØ�J‰J�q‰MÜ×"Ñ"×'Ñ'Øó$
Ð ð
 (,§~¡~×'QÑ'QØ�J‰J�q‰MÜ×"Ñ"×'Ñ'Øó(
Ð$ð ×.Ñ.Ð/GÈÑ/JÓKˆØ×.Ñ.Ð/KÈAÑ/NÓOˆä×)Ñ)×2Ñ2°>ÓBˆÜ×)Ñ)×2Ñ2°>ÓBˆäŸ™ m°iÀÐR^Ð5_Ó`ˆÜŸ™ m°iÀÐR_Ð5`ÓaˆäŸ™¨°yÓAˆÜŸ™¨°yÓAˆä ×-Ñ-×8Ñ8¸ÐH`ÐabÑHcÓdÐÜ ×-Ñ-×8Ñ8¸ÐHdÐefÑHgÓhÐà×!Ñ! >°>Ð"BÔCØ×ÑÐ/Ô0Ø×ÑÐ/Ô0à×*Ñ*Ð+CÀAÑ+FÓGˆ
Ø×*Ñ*Ð+GÈÑ+JÓKˆ
Ø×-Ñ-Ð.FÀqÑ.IÓJˆØ×-Ñ-Ð.JÈ1Ñ.MÓNˆà�>‰>×(Ñ(Ô*Ø"+¨_Ð!=ˆJ�O‰O™AÐØ"+¨_Ð!=ˆJ�O‰O™AÐØ%.°Ð$@ˆM×Ñ™qÐ!Ø%.°Ð$@ˆM×Ñ™qÐ!àˆÜ˜Ÿ
™
“Oˆ	Ø�‰�t—z‘z !‘}�oÔ&Ø�‰Ð/°Ñ2Ð4PÐQRÑ4SÐTÔUØ�‰¨	°Aª�t—z‘z !’}¸2Ð>Ô?Ø�‰¨	°Aª�t—z‘z !’}¸2Ð>Ô?Ø�‰¨	°Aª�t—z‘z !’}¸2Ð>Ô?Ø�‰¨	°Aª�t—z‘z !’}¸2Ð>Ô?Ø�‰¨	°Aª�t—z‘z !’}¸2Ð>Ô?Ø�‰à(¨Ñ+Ø(¨Ñ+Ø,¨QÑ/Ø,¨QÑ/ð	ô	
ð ˆØŸ™ò 	9ˆIØ�~‰~ Ò)ØØ�M‰MÔ,¨YÓ7Õ8ð	9ô %ˆˆxÑà$(§I¢I™"°4·9±9¸xÑ3GˆÜŸ+™+×/Ñ/Ð0EÀvÈtÏ{É{Ð\kÑvÐouÑvˆØ�‰× Ñ ×'Ñ'¨Ô8àŸ.™.×:Ñ:¸4¿:¹:Àa¹=ÓIˆØÐ&Ø�N‰N×$Ñ$×+Ñ+¨OÕ<ð 'r   )Ú__name__Ú
__module__Ú__qualname__r   r&   Ú__classcell__)r   s   @r   r   r      s   ø„ ô4÷h=ð h=r   r   )r3   r0   r   r-   Úquant_utilsr   r   r   Úbase_operatorr	   r   © r   r   ú<module>rd      s+   ðÛ Û Ý &ç BÑ BÝ ,ðô
l=Ð!õ l=r   