U
    U?h                     @   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                       s$   e Zd Zdd Z fddZ  ZS )QLinearWherec                 C   s   dS )NT )selfr   r   Z/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/quantization/operators/where.pyshould_quantize	   s    zQLinearWhere.should_quantizec              	      sb  | j }|jdkst| jjs2| j j|g7  _d S | j|jd \}}}}}| j|ddg\}}}}	|rt|d kr~t	 
 S |jd t }
|jr|jd nd}t|jd |
||tj}|| jj|jd < i }|jD ]}|t| qt|d< |jd |d |d |d |d |d |d ||g	}tjjd||
g|f|}| j j|	7  _| j j|g7  _d S )	NWherer   r   r   Z_quant domainr   )nodeop_typeAssertionError	quantizerforce_quantize_no_input_checkZ	new_nodesZ_get_quantization_paramsoutputZquantize_activationsuperquantizer   namer   r   ZInputZquantized_value_map	attributeupdater   r   inputonnxhelperZ	make_node)r   r   Z
data_foundZoutput_scale_nameZoutput_zp_name_Zq_input_namesZzero_point_namesZscale_namesZnodesZqlinear_outputZqlinear_output_nameZq_outputkwargsr   Zqlwhere_inputsZqlwhere_node	__class__r   r   r      sl    

   zQLinearWhere.quantize)__name__
__module____qualname__r   r   __classcell__r   r   r#   r   r      s   r   c                   @   s   e Zd Zdd ZdS )QDQWherec                 C   s   | j }|jdkst| jjr| j|jd s@| j|jd  | j|jd sd| j|jd  | js|j	D ]}| j| qpnB| j|jd r| j|jd r| js|j	D ]}| j| qd S )Nr   r   r   )
r   r   r   r   r   Zis_tensor_quantizedr   Zquantize_activation_tensorZdisable_qdq_for_node_outputr   )r   r   r   r   r   r   r   F   s$    

zQDQWhere.quantizeN)r%   r&   r'   r   r   r   r   r   r)   E   s   r)   )r   Zquant_utilsr   r   r   r   r   Zbase_operatorr	   Zqdq_base_operatorr
   r   r)   r   r   r   r   <module>   s
   =