o
    /ѹg                     @   sR   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 de	Z
dS )	    N)onnx_pb   )	QuantTypeattribute_to_kwarg	ms_domain   )QuantOperatorBasec                       s(   e Zd Z fddZ fddZ  ZS )	LSTMQuantc                    s   t  || d S )N)super__init__)selfZonnx_quantizerZ	onnx_node	__class__ k/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/onnxruntime/quantization/operators/lstm.pyr      s   zLSTMQuant.__init__c                    s  | 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sEt	|j
dkrLt   dS |j
\}}}|j
\}}	}
| j rs|j
d= |j
d= || |j
d< ||	 |j
d< | j|jd tjjd}| j|jd tjjd}||d }||d }tj|}tj|}t||||f}t|||	|
f}t|d}t|d}tj||d }tj||d }|||g || || ||d }||d }||d }||d }| j r.||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rU|jd ndg ||d	kre|jd	 ndg ||d
kru|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 ]}|jdkrq|t| qt|d< |jsdn|jd }tjj d||j!|fi |}| jj"#| | j$|jd }|dur| 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.
        ZLSTMr   r   N   r   )r   r   r                ZlayoutdomainZ_quantZDynamicQuantizeLSTM)%nodeZop_typeZ	quantizerZis_valid_quantize_weightinputr
   quantizemodelZget_initializerlendimsZis_per_channelZquantize_weight_per_channel
onnx_protoZTensorProtoZINT8onnxZnumpy_helperZto_arraynumpyZreshapeZ	transposeZ
from_arrayZremove_initializersZadd_initializerextend	attributenameupdater   r   helperZ	make_nodeoutputZ	new_nodesappendZ_dequantize_value)r   r   r   WRZ	W_num_dirZW_4_hidden_sizeZW_input_sizeZ	R_num_dirZR_4_hidden_sizeZR_hidden_sizeZquant_input_weight_tupleZquant_recurrent_weight_tupleZW_quant_weightZR_quant_weightZW_quant_arrayZR_quant_arrayZW_quant_tranposedZR_quant_tranposedZ
W_quant_zpZ
R_quant_zpZW_quant_scaleZR_quant_scaleinputsZ	input_lenkwargsr"   Zquant_lstm_nameZquant_lstm_nodeZdequantize_noder   r   r   r      s   





     	

zLSTMQuant.quantize)__name__
__module____qualname__r   r   __classcell__r   r   r   r   r	      s    r	   )r    r   r   r   Zquant_utilsr   r   r   Zbase_operatorr   r	   r   r   r   r   <module>   s    