
     Ngc                        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
e          Z G d de          ZdS )    )annotations)AnyN   )TENSOR_NAME_QUANT_SUFFIXQuantizedValueQuantizedValueTypeattribute_to_kwargquantize_nparray   )QuantOperatorBase)QDQOperatorBasec                  (     e Zd Z fdZ fdZ xZS )QPadc                L    t                                          ||           d S Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      b/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/quantization/operators/pad.pyr   zQPad.__init__   #    33333    c                Z   | 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          |          }|
                    |           'd|vs|d         dk    rt          |j                  dk    rf|j        d         dk    rT| j        j                            |j                  }| j        j                            |j                  }||"t                                                       d S | j        j                            |j        d                   }|Et           j                            |          }	|	j        dk    r|	                                n|	d         }
t           j                            |          }|j        dk    r|                                n|d         }t           j                            |          }t+          | j        j        |||
          }|j        d         t.          z   }t           j                            ||          }| j        j                            |           | j        j                            |           ||j        d<   n| j                            |d| j        j        |j        |j        |j                  }| j        j                            |           |d         j        d         |j        d<   nZt          |j                  dk    r |j                             |j                   n"|j        d         dk    sJ |j        |j        d<   tC          |j        d         |j        d         t.          z   |j        |j        tD          j#                  }|| j        j        |j        d         <   |j$        |j        d<   |j$        |j        d<   | j        xj        |gz  c_        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   s                      r   r*   zQPad.quantize   s   y|u$$$$ N(2--4:a=Hj3j3jGGF $ B4:a= Q 	 	I#I..BMM"6&>[#@#@4:""tz!}':': N0@@AVA^__	#~3CCDYDdee$(<GG$$&&&F/3~/C/S/STXT^_`Ta/b/b,/;#099)DDH2:-12D2Dx}}(ST+H"&"3"<"<\"J"JK8C8HA8M8M+"2"2"4"4"4S^_`SaK-1->-G-GHd-e-e*7G7.# 	8 84 7;jmF^6^3=A=N=Y=Y87> >:
 N(;;<XYYYN(889_```$CDJqMM (,~'O'O7-8-5%1%; (P ( ($ N,334DEEE$4Q$7$>q$ADJqMM tz??a''J%%&;&CDDDD  :a=B....$9$ADJqM "0KNKN55!,!)$"
 "
 >T*4;q>:-4
1/6A  TF*    r   )__name__
__module____qualname__r   r*   __classcell__r   s   @r   r   r      sZ        4 4 4 4 4S+ S+ S+ S+ S+ S+ S+ S+ S+r   r   c                  4     e Zd Z fdZd
dZddZd	 Z xZS )QDQPadc                L    t                                          ||           d S r   r   r   s      r   r   zQDQPad.__init__r   r   r   
attrs_dictdict[str, Any]returnnp.ndarray | Nonec                   d}| j         j                            | j        j        d                   }|dS t
          j                            |j                  }| j         j	        dk     r+t          j        |                    dd          |          }nut          | j        j                  dk    rB| j        j        d         r0| j         j                            | j        j        d                   }nt          j        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(   r2   helpertensor_dtype_to_np_dtype	elem_typer'   nparraygetr-   get_constant_value)r   r[   	const_valonnx_tensor_typenp_dtypes        r   _get_pad_const_valzQDQPad._get_pad_const_valu   s    
 	>/??	PQ@RSS#4;778H8RSS>'",,!;!;8LLLII!!Q&&49?1+=&,??	PQ@RSSII(333Ir   boolc                j   i }| j         j        D ]&}t          |          }|                    |           '|                    dd          }|dv rdS |dk    r[|                     |          }|D|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,   ri   rn   ra   rg   float32float16floatr6   )r   r[   r+   rE   pad_modepad_vals         r   %_should_quantize_output_same_as_inputz,QDQPad._should_quantize_output_same_as_input   s     
, 	" 	"I#I..Bb!!!!>>&+66555 4 {""--j99G"w}RZ8P'P'PW\\^^,,11ur   c                   | j         j        dk    sJ | j         j        D ]}|r| j                            |           | j        s|                                 rH| 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_outputrv   quantize_output_same_as_inputr?   name)r   
input_names     r   r*   zQDQPad.quantize   s    y E)))))/ 	F 	FJ F99*EEE/ 	O99;; O<<TY=Ma=PRVR[RabcRdfjfoftuuuuu99$):J1:MNNNNN		O 	Or   )r[   r\   r]   r^   )r]   ro   )rS   rT   rU   r   rn   rv   r*   rV   rW   s   @r   rY   rY   q   sv        4 4 4 4 4   (   0O O O O O O Or   rY   )
__future__r   typingr   numpyrg   r2   quant_utilsr   r   r   r	   r
   base_operatorr   qdq_base_operatorr   r   rY    r   r   <module>r      s  
 # " " " " "                         - , , , , , . . . . . .W+ W+ W+ W+ W+ W+ W+ W+t;O ;O ;O ;O ;O_ ;O ;O ;O ;O ;Or   