o
    ²3IhJ  ã                   @   s`   d dl Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
 G dd„ deƒZG d	d
„ d
e
ƒZdS )é    Né   )ÚTENSOR_NAME_QUANT_SUFFIXÚQuantizedValueÚQuantizedValueTypeÚattribute_to_kwargÚ	ms_domainé   )ÚQuantOperatorBase)ÚQDQOperatorBasec                       s4   e Zd Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚQLinearActivationc                    ó   t ƒ  ||¡ d S ©N©ÚsuperÚ__init__©ÚselfÚonnx_quantizerÚ	onnx_node©Ú	__class__© úm/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/onnxruntime/quantization/operators/activation.pyr   	   ó   zQLinearActivation.__init__c                    sj   | j }|jdks|jdksJ ‚|jd | jjvs| jjr!tƒ  ¡ S | jj|jd  }|| jj|jd < d S )NÚReluÚClipr   )	ÚnodeÚop_typeÚinputÚ	quantizerÚquantized_value_mapÚis_activation_symmetricr   ÚquantizeÚoutput)r   r   Úquantized_valuer   r   r   ÚQuantizeClipRelu   s   
z"QLinearActivation.QuantizeClipReluc                    s~  | j }|jdks|jdkr|  ¡  d S d}|jdko%|| jjv o%| jj| }|r*dnd }|r0dnd }| j |jd ||¡\}}}}	}	| j |dg¡\}
}}}|rT|
d u rYtƒ  	¡ S |jd t
 }d}|jrj|jd }i }|jD ]	}| t|ƒ¡ qot|d	< |
d |d |d ||g}tjjd
|j ||g|fi |¤Ž}t|jd |||tjƒ}|| jj|jd < | |¡ | j j|7  _d S )Nr   r   zextra.Sigmoid.nnapiÚSigmoidg      p?r   Ú Ú_quantÚdomainÚQLinear)r   r   r%   r   Úextra_optionsÚ_get_quantization_paramsr#   Úquantize_activationr   r"   r   ÚnameÚ	attributeÚupdater   r   ÚonnxÚhelperÚ	make_noder   r   ÚInputr    ÚappendÚ	new_nodes)r   r   Únnapi_sigmoid_optionÚsigmoid_nnapi_modeÚ	use_scaleÚuse_zeropointÚ
data_foundÚoutput_scale_nameÚoutput_zp_nameÚ_Úquantized_input_namesÚzero_point_namesÚscale_namesÚnodesÚqlinear_activation_outputÚqlinear_activation_nameÚkwargsr/   Úqlinear_activation_inputsÚqlinear_activation_nodeÚq_outputr   r   r   r"      sv   

ÿ
ý
úû


ûüû	û
zQLinearActivation.quantize)Ú__name__Ú
__module__Ú__qualname__r   r%   r"   Ú__classcell__r   r   r   r   r      s    r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚQDQRemovableActivationc                    r   r   r   r   r   r   r   r   c   r   zQDQRemovableActivation.__init__c                 C   sˆ   | j }| j |jd ¡sd S | jjs+| jjs+| j |jd |jd ¡r+| j | j ¡ n	| j 	|jd ¡ | j
sB| j 	|jd ¡ d S d S )Nr   )r   r   Úis_tensor_quantizedr   r!   Úqdq_keep_removable_activationsÚtry_replacing_upstream_outputr#   Úremove_nodeÚquantize_activation_tensorÚdisable_qdq_for_node_output)r   r   r   r   r   r"   f   s   ÿþýÿzQDQRemovableActivation.quantize)rI   rJ   rK   r   r"   rL   r   r   r   r   rM   b   s    rM   )r1   Úquant_utilsr   r   r   r   r   Úbase_operatorr	   Úqdq_base_operatorr
   r   rM   r   r   r   r   Ú<module>   s    Z