o
    3Ihc                     @  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__selfonnx_quantizer	onnx_node	__class__ f/home/air/sanwanet/gpt-api/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    )initial_type)%nodeop_type	quantizeropset_versioninputquantized_value_mapr   quantize	attributer   updatelenmodelget_initializerzp_name
scale_nameonnxnumpy_helperto_arrayndimitemr	   activation_qTyper   
from_arrayremove_initializeradd_initializer_get_quantize_input_nodes	data_type	new_nodesextendoutputappendr   r   Inputq_name)r   r"   quantized_input_valuekwargsr)   kv	zp_tensorscale_tensorpadding_constant_initializerzp_arrayzp_valuescale_arrayscale_valuepadding_constant_array quantized_padding_constant_arrayquantized_padding_constant_name&quantized_padding_constant_initializerpad_value_qnodes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,   get_tensor_typer"   r&   r0   helpertensor_dtype_to_np_dtype	elem_typer%   nparraygetr+   get_constant_value)r   rV   	const_valonnx_tensor_type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*   rc   rh   r[   ra   float32float16floatr4   )r   rV   r)   rC   pad_mode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$   quantize_activation_tensordisable_qdq_for_node_outputro   quantize_output_same_as_inputr=   name)r   
input_namer   r   r   r(      s   (zQDQPad.quantize)rV   rW   rX   rY   )rX   ri   )rQ   rR   rS   r   rh   ro   r(   rT   r   r   r   r   rU   q   s
    

rU   )
__future__r   typingr   numpyra   r0   quant_utilsr   r   r   r   r	   base_operatorr   qdq_base_operatorr   r   rU   r   r   r   r   <module>   s   Z