o
    ;Î®c  ã                   @   sl   d dl Z d dl m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)Úonnx_pbé   )Ú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__© úT/tmp/pip-target-vg8gfxp4/lib/python/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dkrl|jd }i }|jD ]	}| t|ƒ¡ qqt|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Úkwargsr0   Ú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   d   r   zQDQRemovableActivation.__init__c                 C   s€   | j }| j |jd ¡sd S | jjs'| j |jd |jd ¡r'| j | j ¡ n	| j |jd ¡ | j	s>| j |jd ¡ d S d S )Nr   )
r   r    Úis_tensor_quantizedr   r"   Útry_replacing_upstream_outputr$   Úremove_nodeÚquantize_activation_tensorÚdisable_qdq_for_node_output)r   r   r   r   r   r#   g   s   ÿÿzQDQRemovableActivation.quantize)rJ   rK   rL   r   r#   rM   r   r   r   r   rN   c   s    rN   )r2   r   Ú
onnx_protoÚquant_utilsr   r   r   r   r   Úbase_operatorr
   Úqdq_base_operatorr   r   rN   r   r   r   r   Ú<module>   s    Z