
    gc                        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y)    )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                &    t         |   ||       y Nsuper__init__selfonnx_quantizer	onnx_node	__class__s      [/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/quantization/operators/pad.pyr   zQPad.__init__       3    c                	   | j                   }|j                  dk(  sJ | j                  j                  dk  s%|j                  d   | j                  j
                  vrt        |           y | j                  j
                  |j                  d      }i }|j                  D ]  }t        |      }|j                  |         d|vs	|d   dk(  r-t        |j                        dkD  r|j                  d   dk7  r| j                  j                  j                  |j                        }| j                  j                  j                  |j                        }||t        |           y | j                  j                  j                  |j                  d         }|Xt         j"                  j%                  |      }	|	j&                  dk(  r|	j)                         n|	d   }
t         j"                  j%                  |      }|j&                  dk(  r|j)                         n|d   }t         j"                  j%                  |      }t+        | j                  j,                  |||
      }|j                  d   t.        z   }t         j"                  j1                  ||      }| j                  j                  j3                  |       | j                  j                  j5                  |       ||j                  d<   n| j                  j7                  |d| j                  j,                  |j                  |j                  |j8                        }| j                  j:                  j=                  |       |d   j>                  d   |j                  d<   nkt        |j                        dk(  r&|j                  jA                  |j                         n-|j                  d   dk(  sJ |j                  |j                  d<   tC        |j>                  d   |j>                  d   t.        z   |j                  |j                  tD        jF                        }|| j                  j
                  |j>                  d   <   |jH                  |j                  d<   |jH                  |j>                  d<   | j                  xj:                  |gz  c_        y )	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   yy||u$$$ NN((2-4::a=HjHj3jG $ B B4::a= QI#I.BMM" ( 6&>[#@4::"tzz!}': NN00@@AVA^A^_	#~~33CCDYDdDde$(<G$&/3~~/C/C/S/STXT^T^_`Ta/b,/;#0099)DH2:--12Dx}}(ST+H"&"3"3"<"<\"JK8C8H8HA8M+"2"2"4S^_`SaK-1->->-G-GHd-e*7G77.# 	84 7;jjmF^6^3=A=N=N=Y=Y87>:
 NN((;;<XYNN((889_`$CDJJqM (,~~'O'O77-88-55%1%;%; (P ($ NN,,334DE$4Q$7$>$>q$ADJJqM tzz?a'JJ%%&;&C&CD  ::a=B...$9$A$ADJJqM "0KKNKKN55!,,!))$$"
 >T**4;;q>:-44

1/66A  TF* r   )__name__
__module____qualname__r   r*   __classcell__r   s   @r   r   r      s    4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                &    t         |   ||       y r   r   r   s      r   r   zQDQPad.__init__r   r   r   c                ~   d}| j                   j                  j                  | j                  j                  d         }|yt
        j                  j                  |j                        }| j                   j                  dk  r)t        j                  |j                  dd      |      }|S t        | j                  j                        dk\  rW| j                  j                  d   r>| j                   j                  j                  | j                  j                  d         }|S 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   
attrs_dict	const_valonnx_tensor_typenp_dtypes        r   _get_pad_const_valzQDQPad._get_pad_const_valu   s    
 	>>//??		PQ@RS#;;778H8R8RS>>''",!;8LI  !Q&499??1+=,,??		PQ@RSI  (3Ir   c                d   i }| j                   j                  D ]  }t        |      }|j                  |         |j	                  dd      }|dv ry|dk(  r[| j                  |      }|H|j                  t        j                  t        j                  fv rt        |j                               dk(  S y)zf
        Returns true if Pad's output should use the same quantization parameters as input[0]
        r    r!   )s   reflects   edges   wrapTr   F)r$   r+   r	   r,   re   rk   r]   rc   float32float16floatr6   )r   rg   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55  {"--j9G"w}}RZZ8P'PW\\^,11r   c                
   | j                   j                  dk(  sJ | j                   j                  D ]   }|s| j                  j	                  |       " | j
                  s| j                         r`| j                  j                  | j                   j                  d   | j                   j                  d   | j                   j                         y | j                  j	                  | j                   j                  d          y y )Nr   r   )
r$   r%   r(   r&   quantize_activation_tensordisable_qdq_for_node_outputrr   quantize_output_same_as_inputr?   name)r   
input_names     r   r*   zQDQPad.quantize   s    yy  E)))))//J99*E * //99;<<TYY=M=Ma=PRVR[R[RaRabcRdfjfofoftftu99$)):J:J1:MN	 0r   )rg   zdict[str, Any]returnznp.ndarray | None)ry   bool)rS   rT   rU   r   rk   rr   r*   rV   rW   s   @r   rY   rY   q   s    4(0Or   rY   )
__future__r   typingr   numpyrc   r2   quant_utilsr   r   r   r	   r
   base_operatorr   qdq_base_operatorr   r   rY    r   r   <module>r      sC   
 #     - .W+ W+t;O_ ;Or   