o
    3Ih                     @   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__)selfonnx_quantizer	onnx_node	__class__ g/home/air/sanwanet/gpt-api/venv/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.
        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kwargsr7   quant_lstm_namequant_lstm_nodedequantize_noder   r   r   r#      s   





     	

zLSTMQuant.quantize)__name__
__module____qualname__r   r#   __classcell__r   r   r   r   r	      s    r	   )r0   r-   r   r*   quant_utilsr   r   r   base_operatorr   r	   r   r   r   r   <module>   s    