U
    U?hJ                     @   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                    s   t  || d S Nsuper__init__selfZonnx_quantizerZ	onnx_node	__class__ _/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/quantization/operators/activation.pyr   	   s    zQLinearActivation.__init__c                    sj   | j }|jdks|jdkst|jd | jjks8| jjrBt  S | jj|jd  }|| jj|j	d < d S )NReluClipr   )
nodeop_typeAssertionErrorinput	quantizerquantized_value_mapis_activation_symmetricr   quantizeoutput)r   r   Zquantized_valuer   r   r   QuantizeClipRelu   s    
z"QLinearActivation.QuantizeClipReluc                    sz  | j }|jdks|jdkr&|   d S d}|jdkoJ|| jjkoJ| jj| }|rTdnd }|r`dnd }| j|jd ||\}}}}	}	| j|dg\}
}}}|r|
d krt 	 S |jd t
 }d}|jr|jd }i }|jD ]}|t| qt|d	< |
d |d |d ||g}tjjd
|j ||g|f|}t|jd |||tj}|| jj|jd < || | j j|7  _d S )Nr   r   zextra.Sigmoid.nnapiZSigmoidg      p?r    Z_quantdomainZQLinear)r   r   r!   r   Zextra_optionsZ_get_quantization_paramsr    Zquantize_activationr   r   r   name	attributeupdater   r   onnxhelperZ	make_noder   r   ZInputr   appendZ	new_nodes)r   r   Znnapi_sigmoid_optionZsigmoid_nnapi_modeZ	use_scaleZuse_zeropointZ
data_foundZoutput_scale_nameZoutput_zp_name_Zquantized_input_namesZzero_point_namesZscale_namesZnodesZqlinear_activation_outputZqlinear_activation_namekwargsr%   Zqlinear_activation_inputsZqlinear_activation_nodeZ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                    s   t  || d S r   r   r   r   r   r   r   c   s    zQDQRemovableActivation.__init__c                 C   s   | j }| j|jd sd S | jjsV| jjsV| j|jd |jd rV| j| j  n| j	|jd  | j
s| j	|jd  d S )Nr   )r   r   Zis_tensor_quantizedr   r   Zqdq_keep_removable_activationsZtry_replacing_upstream_outputr    remove_nodeZquantize_activation_tensorZdisable_qdq_for_node_output)r   r   r   r   r   r   f   s    zQDQRemovableActivation.quantize)r,   r-   r.   r   r   r/   r   r   r   r   r0   b   s   r0   )r'   Zquant_utilsr   r   r   r   r   Zbase_operatorr	   Zqdq_base_operatorr
   r   r0   r   r   r   r   <module>   s
   Z