o
    ic                     @  s   d dl mZ d dlmZ d dlZ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 )    )annotations)AnyN   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwargquantize_nparray   )QuantOperatorBase)QDQOperatorBasec                      s(   e Zd Z fddZ fddZ  ZS )QPadc                      t  || d S Nsuper__init__selfZonnx_quantizerZ	onnx_node	__class__ `/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/quantization/operators/pad.pyr         zQPad.__init__c                   s  | j }|jdks
J | jjdk s|jd | jjvr t   d S | jj|jd  }i }|jD ]}t	|}|
| q.d|vsE|d dkrt|jdkr|jd dkr| jj|j}| jj|j}|d u sk|d u rrt   d S | jj|jd }|d urtj|}	|	jdkr|	 n|	d }
tj|}|jdkr| n|d }tj|}t| jj|||
}|jd t }tj||}| jj| | jj| ||jd< nC| jj|d| jj|j|j|jd}| jj| |d jd |jd< n t|jdkr
|j |j n|jd dksJ |j|jd< t!|jd |jd t |j|jt"j#}|| jj|jd < |j$|jd< |j$|jd< | j j|g7  _d S )	NPad   r   mode   constantr    )Zinitial_type)%nodeop_type	quantizeropset_versioninputZquantized_value_mapr   quantize	attributer   updatelenmodelZget_initializerZzp_nameZ
scale_nameonnxZnumpy_helperZto_arrayndimitemr	   Zactivation_qTyper   Z
from_arrayZremove_initializerZadd_initializerZ_get_quantize_input_nodesZ	data_typeZ	new_nodesextendoutputappendr   r   ZInputZq_name)r   r   Zquantized_input_valuekwargsr%   kvZ	zp_tensorZscale_tensorZpadding_constant_initializerZzp_arrayZzp_valueZscale_arrayZscale_valueZpadding_constant_arrayZ quantized_padding_constant_arrayZquantized_padding_constant_nameZ&quantized_padding_constant_initializerZpad_value_qnodesZquantized_output_valuer   r   r   r$      s~   


zQPad.quantize)__name__
__module____qualname__r   r$   __classcell__r   r   r   r   r      s    r   c                      s8   e Zd Z fddZdddZdd
dZdd Z  ZS )QDQPadc                   r   r   r   r   r   r   r   r   r   r   zQDQPad.__init__
attrs_dictdict[str, Any]returnnp.ndarray | Nonec                 C  s   d}| j j| jjd }|du rdS tj|j}| j j	dk r-t
j|dd|d}|S t| jjdkrH| jjd rH| j j| jjd }|S t
jd|d}|S )z
        Returns the Pad's constant padding value. Returns `None` if the padding value is
        not constant (i.e., comes from a dynamic input).
        Nr   r   value)dtype   r   )r!   r(   Zget_tensor_typer   r#   r)   helperZtensor_dtype_to_np_dtypeZ	elem_typer"   nparraygetr'   Zget_constant_value)r   r6   Z	const_valZonnx_tensor_typeZnp_dtyper   r   r   _get_pad_const_valu   s   zQDQPad._get_pad_const_valboolc                 C  s|   i }| j jD ]}t|}|| q|dd}|dv rdS |dkr<| |}|dur<|jtjtj	fv r<t
| dkS dS )zf
        Returns true if Pad's output should use the same quantization parameters as input[0]
        r   r   )s   reflects   edges   wrapTNr   F)r   r%   r   r&   r@   rA   r;   r>   Zfloat32Zfloat16floatr+   )r   r6   r%   r0   Zpad_modeZpad_valr   r   r   %_should_quantize_output_same_as_input   s   
z,QDQPad._should_quantize_output_same_as_inputc                 C  s   | j jdksJ | j jD ]
}|r| j| q| js>|  r2| j| j jd | j jd | j j	 d S | j| j jd  d S d S )Nr   r   )
r   r    r#   r!   Zquantize_activation_tensorZdisable_qdq_for_node_outputrD   Zquantize_output_same_as_inputr-   name)r   Z
input_namer   r   r   r$      s   (zQDQPad.quantize)r6   r7   r8   r9   )r8   rB   )r1   r2   r3   r   rA   rD   r$   r4   r   r   r   r   r5   q   s
    

r5   )
__future__r   typingr   numpyr>   r)   Zquant_utilsr   r   r   r   r	   Zbase_operatorr   Zqdq_base_operatorr   r   r5   r   r   r   r   <module>   s   Z