
    h                     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)onnx_pb   )	QuantTypeattribute_to_kwarg	ms_domain   )QuantOperatorBasec                   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      a/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/operators/lstm.pyr   LSTMQuant.__init__   s    3    c                   > 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R6                  S:X  a  M  UR9                  [;        U5      5        M1     [<        US'   UR6                  (       d  SOUR6                  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                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(   LSTMQuant.quantize   sP    yy||v%%%~~66tzz!}EET^^MtMtJJqMN
 N
 G$$!!$**Q-0!!$**Q-0qvv;!s166{a/G56VV2\67ff3]>>((**q	q	!3AFF1I!3AFF1I#'>>#M#MJJqM""''$
 
 (,~~'Q'QJJqM""''(
$ ../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/,Q/		
 I~~)MM,Y78 ( %x$(II"499x3G++//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h= h=r   r   )r5   r2   r   r/   quant_utilsr   r   r   base_operatorr	   r   r`   r   r   <module>ri      s+      & B B ,
l=! l=r   