
    `i                     X    S SK r S SKrSSKJr  SSKJrJrJr  S SK Jr	    " S S\5      r
g)	    N   )QuantOperatorBase   )attribute_to_kwarg	ms_domain	QuantType)onnx_pbc                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )	LSTMQuant   c                 $   > [         TU ]  X5        g )N)super__init__)selfonnx_quantizer	onnx_node	__class__s      l/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/quantization/operators/lstm.pyr   LSTMQuant.__init__   s    3    c                 n  > U R                   nUR                  S:X  d   eU R                  R                  UR                  S   5      (       a-  U R                  R                  UR                  S   5      (       d  [
        TU ]  5         gU R                  R                  nUR                  UR                  S   5      nUR                  UR                  S   5      n[        UR                  5      S:w  d  [        UR                  5      S:w  a  [
        TU ]  5         gUR                  u  pVnUR                  u  pn
U R                  R                  5       (       a<  UR                  S	 UR                  S	 XV-  UR                  S'   X-  UR                  S'   U R                  R                  UR                  S   [        R                  R                  S5      nU R                  R                  UR                  S   [        R                  R                  S5      nUR                  US   5      nUR                  US   5      n[         R"                  R%                  U5      n[         R"                  R%                  U5      n[&        R(                  " XXg45      n[&        R(                  " UXU
45      n[&        R*                  " US5      n[&        R*                  " US5      n[         R"                  R-                  XS   5      n[         R"                  R-                  UUS   5      nUR/                  X/5        UR1                  U5        UR1                  U5        UR                  US   5      nUR                  US   5      nUR                  US   5      nUR                  US   5      nU R                  R                  5       (       a@  XV/UR                  SS& X/UR                  SS& XV/UR                  SS& X/UR                  SS& / n[        UR                  5      nUR3                  UR                  S   /5        UR3                  US   US   /5        UR3                  US:  a  UR                  S   OS/5        UR3                  US	:  a  UR                  S	   OS/5        UR3                  US
:  a  UR                  S
   OS/5        UR3                  US:  a  UR                  S   OS/5        UR3                  US:  a  UR                  S   OS/5        UR3                  US   US   US   US   /5        0 nUR4                   H  nUR7                  [9        U5      5        M     [:        US'   UR<                  S:X  a  SOUR<                  S-   n[         R>                  R@                  " SUURB                  U40 UD6nU R                  RD                  RG                  U5        U R                  RI                  UR                  S   5      nUb&  U R                  RD                  RG                  U5        gg)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                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updater   r   name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'   LSTMQuant.quantize   s@    yy&'&77

1FF~~>>tzz!}MMG$$!!$**Q-0!!$**Q-0K1AFFq 0G56VV2\67ff3]>>((**q	q	!3AFF1I!3AFF1I#'>>#M#MdjjYZmNXNdNdNiNikl$n '+~~'Q'QRVR\R\]^R_R\RhRhRmRmop(r$ ../G/JK../KA/NO))22>B))22>Bm5_`miR_5`ayAyA --88abHcd --88HdefHgh!!>"BC/0/0**+CA+FG
**+G+JK
--.Fq.IJ--.J1.MN>>((**"+!=JOOA"+!=JOOA%.$@Mq!%.$@Mq!

O	tzz!}o&/24PQR4STU	Atzz!}2>?	Atzz!}2>?	Atzz!}2>?	Atzz!}2>?	Atzz!}2>?$Q')A!)DFbcdFe(+
 	
 IMM,Y78 ($x $		R"TYY5I++//0Evt{{\kvouv  ''8..::4::a=I&NN$$++O< 'r    )__name__
__module____qualname____firstlineno__r   r'   __static_attributes____classcell__)r   s   @r   r   r      s    4[= [=r   r   )r1   r4   base_operatorr   quant_utilsr   r   r   r	   r.   r   r_   r   r   <module>rh      s+      , B B &
_=! _=r   