
    g                     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      \/var/www/openai/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   sY    yy||v%%%~~66tzz!}ET^^MtMtJJqMN
 G$$!!$**Q-0!!$**Q-0qvv;!s166{a/G56VV2O\67ff3O]>>((*q	q	!O3AFF1I!O3AFF1I#'>>#M#MJJqM:1166$
  (,~~'Q'QJJqM:1166(
$ ../G/JK../KA/NO))22>B))22>BmiR^5_`miR_5`ayAyA --88H`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__r   r&   __classcell__)r   s   @r   r   r      s    4d= d=r   r   )r3   r0   r   r-   quant_utilsr   r   r   base_operatorr	   r    r   r   <module>rd      s+      & B B ,
h=! h=r   