+
    G-jFÀ  ã                   óÈ   € ^ RI t ^ RIt^ RIt^ RIt^ RIHt ^RIHtH	t	 ^RI
Ht ^RIHt ^RIHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHt ^RI H!t!  ! R R	]4      t"R# )
é    N)Úonnx_pb)ÚBaseQuantizerÚQuantizationParams)Ú
TensorData)Ú	ONNXModel)ÚTENSOR_NAME_QUANT_SUFFIXÚQuantizationModeÚQuantizedValueÚQuantizedValueTypeÚ__producer__Ú__version__Úadd_infer_metadataÚattribute_to_kwargÚcompute_scale_zpÚcompute_scale_zp_float8Úfind_by_nameÚget_qmin_qmax_for_qTypeÚget_qrange_for_qTypeÚ	ms_domainÚquantize_onnx_initializerÚ&save_and_reload_model_with_shape_inferÚtensor_proto_to_array)ÚCreateOpQuantizerc                   ó  a € ] tR t^&t o R"R ltR tR tR tR tR t	R t
R	 tR#R
 ltR tR tR tR tR$R ltR%R ltR tR"R ltV 3R lR ltV 3R lR ltR&R ltR tR#R ltR'R ltR(R ltR)R ltR*R ltR tR tR  t R!t!V t"R# )+ÚONNXQuantizerNc                ór  € \         P                  ! V VVVVVVV	V
VV4       V'       Eg   V P                  P                  4        \	        V P                  P                  4      pVP
                  P                   Uu/ uF  qÝP                  VbK  	  upV n        V P                  P                  VP
                  P                   Uu/ uF  qîP                  VbK  	  up4       V P                  P                  VP
                  P                   Uu/ uF  qÿP                  VbK  	  up4       \        V4      V n        W@n        WPn        V P                  ^
8„  V n        RV P"                  9   ;'       d    V P"                  R,          V n        . V n        RV n        / V n        V P*                  P                  VP
                  P                   Uu/ uF  qîP                  ^bK  	  up4       V P*                  P                  VP
                  P                   Uu/ uF  qÿP                  ^bK  	  up4       V P                  P                  P
                  P,                   F<  pV P*                  P                  \.        P1                  VP                  ^4      4       K>  	  V P                  \2        9  d   \5        RV P                   24      hV P7                  4       V n        RV n        RV n        RV n        RV n         / V n!        V P                  PE                  4       V n#        R# u upi u upi u upi u upi u upi )	é
   ÚMatMulConstBOnlyÚ/zunsupported quantization mode Úfixed_quantization_range_uint8Úfixed_quantization_range_int8Ú
fixed_zeroÚfixed_zero_zpN)$r   Ú__init__ÚmodelÚreplace_gemm_with_matmulr   ÚgraphÚ
value_infoÚnameÚvalue_infosÚupdateÚoutputÚinputr   ÚmodeÚstaticÚopset_versionÚfuse_dynamic_quantÚextra_optionsÚq_matmul_const_b_onlyÚ	new_nodesÚgraph_scopeÚtensor_namesÚnodeÚdictÚfromkeysr	   Ú
ValueErrorÚcalculate_quantization_paramsÚquantization_paramsÚfixed_qrange_uint8_nameÚfixed_qrange_int8_nameÚfixed_zero_nameÚfixed_zero_zp_nameÚquantized_value_mapÚget_non_initializer_inputsÚgenerated_value_names)Úselfr%   Úper_channelÚreduce_ranger.   r/   Úweight_qTypeÚactivation_qTypeÚtensors_rangeÚnodes_to_quantizeÚnodes_to_excludeÚop_types_to_quantizer2   ÚviÚotÚitr7   s   &&&&&&&&&&&&&    Úx/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/quantization/onnx_quantizer.pyr$   ÚONNXQuantizer.__init__'   s—  € ô 	×ÒØØØØØØØØØØ Øô	
÷ ˆvØ�J‰J×/Ñ/Ô1ä:¸4¿:¹:×;KÑ;KÓLˆEØ6;·k±k×6LÒ6LÓMÑ6L°§¡¨¢Ñ6LÑMˆDÔØ×Ñ×#Ñ#¸5¿;¹;×;MÒ;MÓ$NÑ;M°R§W¡W¨b¢[Ñ;MÑ$NÔOØ×Ñ×#Ñ#¸5¿;¹;×;LÒ;LÓ$MÑ;L°R§W¡W¨b¢[Ñ;LÑ$MÔNÜ" 5Ó)ˆDŒJàŒ	ØŒØ"&×"4Ñ"4°rÑ"9ˆÔà%7¸4×;MÑ;MÑ%M×%xÐ%xÐRV×RdÑRdÐewÕRxˆÔ"àˆŒØˆÔØˆÔØ×Ñ× Ñ °u·{±{×7IÒ7IÓ!JÑ7I°§'¡'¨1¢*Ñ7IÑ!JÔKØ×Ñ× Ñ °u·{±{×7HÒ7HÓ!IÑ7H°§'¡'¨1¢*Ñ7HÑ!IÔJØ—J‘J×$Ñ$×*Ñ*×/Ô/ˆDØ×Ñ×$Ñ$¤T§]¡]°4·;±;ÀÓ%BÖCñ 0ð �9‰9Ô,Ô,ÜÐ=¸d¿i¹i¸[ÐIÓJÐJà#'×#EÑ#EÓ#GˆÔ ð (HˆÔ$Ø&EˆÔ#à+ˆÔà"1ˆÔð $&ˆÔ ð &*§Z¡Z×%JÑ%JÓ%LˆÖ"ùòK  NùÚ$NùÚ$Mùò "KùÚ!Is   Á;L ÃL%ÄL*ÇL/ÈL4c                ó8  € \         P                  P                  VRV P                  P                  P                  R7      p\        V4       \        VV P                  V P                  V P                  V P                  V P                  V P                  V P                  V P                  V P                  V P                   V P"                  4      pWn        V P&                   V R2Vn        VP)                  4        VP                  P                  P*                  # )zž
generate submodel for the subgraph, so that we re-utilize current quantization implementation.
quantize the submodel
update subgraph and set it back to node
úonnx-quantizer)Úproducer_nameÚopset_importsr   )ÚonnxÚhelperÚ
make_modelr%   Úopset_importr   r   rE   rF   r.   r/   rG   rH   rI   rJ   rK   rL   r2   Úparentr5   Úquantize_modelr'   )rD   ÚsubgraphÚ	graph_keyÚwarped_modelÚsub_quantizers   &&&  rP   Úquantize_subgraphÚONNXQuantizer.quantize_subgraphp   sò   € ô —{‘{×-Ñ-ØØ*ØŸ*™*×*Ñ*×7Ñ7ð .ó 
ˆô
 	˜<Ô(Ü%ØØ×ÑØ×ÑØ�I‰IØ�K‰KØ×ÑØ×!Ñ!Ø×ÑØ×"Ñ"Ø×!Ñ!Ø×%Ñ%Ø×Ñó
ˆð  $ÔØ'+×'7Ñ'7Ð&8¸¸À1Ð$EˆÔ!Ø×$Ñ$Ô&Ø×"Ñ"×(Ñ(×.Ñ.Ð.ó    c                óh  € VP                    Uu. uFY  pVP                  \        P                  P                  8X  g,   VP                  \        P                  P
                  8X  g   KW  VNK[  	  pp\        V4      ^ 8X  d   V# VP                  '       d   VP                  M#VP                   R\        V P                  4       2p/ pVP                    EF  pVP                  \        P                  P                  8X  d9   VP                  V P                  VP                  V RVP                   24      /pM•VP                  \        P                  P
                  8X  db   . pVP                   F@  pVP                  V P                  VV RVP                   R\        V4       24      .4       KB  	  VP                  V/pM\        V4      pVP                  V4       EK  	  \        P                   P"                  ! VP                  VP$                  VP&                  3RVP                  /VB # u upi )zd
Check subgraph, if any, quantize it and replace it.
return new_nodes added for quantizing subgraph
Ú_node_count_Ú:r)   )Ú	attributeÚtyperV   ÚAttributeProtoÚGRAPHÚGRAPHSÚlenr)   Úop_typer4   r`   ÚgÚgraphsÚextendr   r+   rW   Ú	make_noder-   r,   )	rD   r7   ÚattrÚgraph_attrsÚ	node_nameÚkwargsÚkvÚvaluer\   s	   &&       rP   Úquantize_node_with_sub_graphÚ*ONNXQuantizer.quantize_node_with_sub_graph�   sÂ  € ð Ÿšó
á&�Ø�y‰yœD×/Ñ/×5Ñ5Ô5¸¿¹Äd×FYÑFY×F`ÑF`Ñ9`÷ ˆDÙ&ð 	ð 
ô
 ˆ{Ó˜qÔ ØˆKØ!%§§ �D—I’I°4·<±<°.ÀÌSÐQU×Q_ÑQ_ÓM`ÐLaÐ0bˆ	ØˆØ—N•NˆDØ�y‰yœD×/Ñ/×5Ñ5Ô5Ø—i‘i ×!7Ñ!7¸¿¹À9À+ÈQÈtÏyÉyÈkÐ@ZÓ![Ð\‘Ø—‘œd×1Ñ1×8Ñ8Ô8Ø�Ø $§¤�HØ—L‘Là ×2Ñ2Ø (Ø#, +¨Q¨t¯y©y¨k¸¼3¸u»:¸,Ð Góðöñ !,ð —i‘i Ð'‘ä'¨Ó-�Ø�M‰M˜"×ñ# #ô$ �{‰{×$Ò$ T§\¡\°4·:±:¸t¿{¹{ÑeÐQU×QZÑQZÐeÐ^dÑeÐeùò7
s   �AH/Á(H/c                óÊ   € \         ;QJ d4    R V P                  P                  4        4       F  '       g   K   R# 	  R# ! R V P                  P                  4        4       4      # )zA
Detect if model already has QuantizeLinear or DequantizeLinear.
c              3   ól   "  € T F*  qP                   R 8H  ;'       g    VP                   R8H  x € K,  	  R# 5i)ÚQuantizeLinearÚDequantizeLinearN)rl   )Ú.0r7   s   & rP   Ú	<genexpr>Ú.ONNXQuantizer.has_QDQ_nodes.<locals>.<genexpr>µ   s2   é € ð 
Ù_qÐW[�L‰LÐ,Ñ,×RÐR°·±Ð@RÑ0RÔRÓ_qùs   ‚4œ4TF)Úanyr%   Únodes)rD   s   &rP   Úhas_QDQ_nodesÚONNXQuantizer.has_QDQ_nodes±   s]   € ÷ ‹sñ 
Ø_c×_iÑ_i×_oÑ_oÔ_qó
�sŒsð 	
Šsð 	
ˆsñ 
Ø_c×_iÑ_i×_oÑ_oÔ_qó
ó 
ð 	
rb   c                ó¦   € \        WP                  P                  4       4      e   R# V P                  e   V P                  P	                  V4      # R# )NTF)r   r%   ÚinitializerrZ   Úfind_initializer_in_path)rD   Úinitializer_names   &&rP   r†   Ú&ONNXQuantizer.find_initializer_in_path¹   sA   € ÜÐ(¯*©*×*@Ñ*@Ó*BÓCÒOÙØ�;‰;Ò"Ø—;‘;×7Ñ7Ð8HÓIÐIÙrb   c                óª   € V P                   P                  V4       V F1  pVP                   F  pV P                  P	                  V4       K   	  K3  	  R # ©N)r4   ro   r,   rC   Úadd)rD   r�   r7   Úoutput_names   &&  rP   Úadd_new_nodesÚONNXQuantizer.add_new_nodesÀ   s@   € Ø�‰×Ñ˜eÔ$ÛˆDØ#Ÿ{œ{�Ø×*Ñ*×.Ñ.¨{Ö;ó  +ó rb   c                óâ  € V P                  4       '       d   \        P                  ! R 4       V P                  P	                  4        F»  pV P
                  '       d   V P                  V4      p\        V P                  4      p\        W4      pVP                  4        \        V\        V P                  4      4       FB  pV P                  V,          P                   F  pV P                  P                  V4       K   	  KD  	  K½  	  V P                  4        V P                  P!                  4       P#                  R4       V P                  P!                  4       P$                  P'                  V P                  4       V P(                  fH   V P                  P+                  4       w  rg\        V4      ^ 8”  d   \-        R\/        V4      ,           4      h\0        V P                  P                  n        \4        V P                  P                  n        V P                  P                  P8                   Uu. uF  qˆP:                  \<        8X  g   K  VNK  	  p	pV	'       gv   V P                   Uu. uF  qP:                  R8X  g   K  VNK  	  p
pV
'       dA   V P                  P                  P8                  P                  4       p^Vn        \<        Vn        V P                  P                  # u upi u upi )z‹Please check if the model is already quantized. Note you don't need to quantize a QAT model. OnnxRuntime support to run QAT model directly.r7   z0Invalid model with unknown initializers/tensors.zcom.microsoft) r‚   ÚloggingÚwarningr%   r�   Úenable_subgraph_quantizationrw   rk   r4   r   ÚquantizeÚranger,   rC   r‹   Ú_dequantize_outputsr'   Ú
ClearFieldr7   ro   rZ   Úclean_initializersÚRuntimeErrorÚstrr   rT   r   Úproducer_versionrY   Údomainr   Úversion)rD   r7   Únumber_of_existing_new_nodesÚop_quantizerÚirŒ   Ú_Úinitializers_not_foundÚopsetÚms_opsetÚms_nodess   &          rP   r[   ÚONNXQuantizer.quantize_modelÆ   s!  € Ø×Ñ×ÒÜ�OŠOðnôð
 —J‘J×$Ñ$Ö&ˆDà×0×0Ð0Ø×8Ñ8¸Ó>�ä+.¨t¯~©~Ó+>Ð(Ü,¨TÓ8ˆLØ×!Ñ!Ô#ÜÐ7¼¸T¿^¹^Ó9LÖM�Ø#'§>¡>°!Õ#4×#;Ô#;�KØ×.Ñ.×2Ñ2°;Ö?ó $<ó Nñ 'ð 	× Ñ Ô"ð 	�
‰
×ÑÓ×%Ñ% fÔ-Ø�
‰
×ÑÓ×Ñ×&Ñ& t§~¡~Ô6ð �;‰;ÒØ(,¯
©
×(EÑ(EÓ(GÑ%ˆAÜÐ)Ó*¨QÔ.Ü"Ð#UÔX[Ð\rÓXsÕ#sÓtÐtä)5ˆ�
‰
×ÑÔ&Ü,7ˆ�
‰
×ÑÔ)à'+§z¡z×'7Ñ'7×'DÒ'DÓbÑ'D˜eÏÉÔXaÑHa—E�EÑ'DˆÐbßØ)-¯ªÓZ© ¿;¹;È/Ñ;YŸ˜©ˆHÐZßØŸ
™
×(Ñ(×5Ñ5×9Ñ9Ó;�Ø !�”Ü(�”à�z‰z×ÑÐùò cùâZs   È1K'ÉK'É*K,ÊK,c                ó¼   € R V P                   9   d=   \        P                  ! RVV P                   R ,          4       V P                   R ,          # \        RV: R24      h)ÚDefaultTensorTypezDget_tensor_type returns DefaultTensorType for tensor name %r, use %dz)Unable to find data type for weight_name=a7  . shape_inference failed to return a type probably this node is from a different domain or using an input produced by such an operator. This may happen if you quantize a model already quantized. You may use extra_options `DefaultTensorType` to indicate the default weight type, usually `onnx.TensorProto.FLOAT`.)r2   r�   Úinfor˜   ©rD   Útensor_names   &&rP   Ú_get_default_tensor_typeÚ&ONNXQuantizer._get_default_tensor_typeó   sf   € Ø $×"4Ñ"4Ô4Ü�LŠLØVØØ×"Ñ"Ð#6Õ7ôð
 ×%Ñ%Ð&9Õ:Ð:ÜØ7¸±ð GIð Jó
ð 	
rb   c                ó$  € \        WP                  P                  4       4      pVe   VP                  # WP                  9   d“   V P                  V,          pVP
                  P                  R4      '       d_   V'       d7   VP
                  P                  P                  ^ 8X  d   V P                  V4      # VP
                  P                  P                  # V P                  '       d   V P                  f   V'       d   V P                  V4      # R # V P                  P                  V4      pVe   V# V P                  '       d4   V P                  '       d"   V P                  P                  V4      pVe   V# V'       d   V P                  V4      # R # )NÚtensor_type)r   r%   r…   Ú	data_typer*   rg   ÚHasFieldr®   Ú	elem_typer«   r’   rZ   Úis_valid_quantize_weightÚget_tensor_type)rD   rª   Ú	mandatoryÚweightrM   ÚotypeÚress   &&&    rP   r³   ÚONNXQuantizer.get_tensor_type  s1  € Ü˜k¯:©:×+AÑ+AÓ+CÓDˆØÒØ×#Ñ#Ð#Ø×*Ñ*Ô*Ø×!Ñ! +Õ.ˆBØ�w‰w×Ñ ×.Ò.ß §¡×!4Ñ!4×!>Ñ!>À!Ô!CØ×8Ñ8¸ÓEÐEØ—w‘w×*Ñ*×4Ñ4Ð4Ø×1×1Ð1°t·{±{Ò7JßØ×4Ñ4°[ÓAÐAÙØ—‘×4Ñ4°[ÓAˆØÒØˆLØ×,×,Ð,°··°Ø—+‘+×-Ñ-¨kÓ:ˆCØŠØ�
ßØ×0Ñ0°Ó=Ð=Ùrb   c                ó˜  € V P                  V4      '       d   V P                  V4      # WP                  9   d¸   V P                  V,          pVP                  P	                  R 4      '       dZ   VP                  P
                  P                  \        P                  P                  \        P                  P                  39   d   R# \        P                  ! RV: RVP                   R24       R# V P                  '       d.   V P                  '       d   V P                  P                  V4      # \        P                  ! RV: R24       R# )r®   Tz<Inference failed or unsupported type to quantize for tensor z
, type is Ú.Fz%Failed to infer data type of tensor: zS. Please add data type info for this tensor if your model has customized operators.)Úis_input_a_initializerr²   r*   rg   r°   r®   r±   Ú
onnx_protoÚTensorProtoÚFLOATÚFLOAT16r�   r‘   r’   rZ   Úis_float_tensor)rD   rª   rM   s   && rP   rÀ   ÚONNXQuantizer.is_float_tensor  s  € Ø×&Ñ& {×3Ò3Ø×0Ñ0°Ó=Ð=à×*Ñ*Ô*Ø×!Ñ! +Õ.ˆBØ�w‰w×Ñ ×.Ò.°2·7±7×3FÑ3F×3PÑ3PÜ×&Ñ&×,Ñ,Ü×&Ñ&×.Ñ.ðUô 4ñ Ü�OŠOØNÈ{ÉoÐ]gÐhj×hoÑhoÐgpÐpqÐrôñ à×,×,Ð,°··°Ø—;‘;×.Ñ.¨{Ó;Ð;ä�ŠØ3°K±?ð C6ð 7ô	
ñ rb   c                óä   € V\         P                  P                  8X  d   V P                  WV4      # V\         P                  P                  8X  d   V P                  WV4      # \        RV R24      h)a\  
Create nodes for dynamic quantization of input and add them to nodes_list.
    parameter input_name: Name of the input.
    parameter nodes_list: new nodes are appended to this list.
    parameter qType: type to quantize to.
    parameter initial_type: type to quantize from
    return: scale_name, zero_point_name, scale_shape, zero_point_shape.
zUnexpected value for qType=rº   )r¼   r½   ÚINT8Ú+_get_dynamic_input_quantization_params_int8ÚUINT8Ú,_get_dynamic_input_quantization_params_uint8r:   )rD   Ú
input_nameÚ
nodes_listÚqTypeÚinitial_types   &&&&&rP   Ú&_get_dynamic_input_quantization_paramsÚ4ONNXQuantizer._get_dynamic_input_quantization_params6  si   € ð ”J×*Ñ*×/Ñ/Ô/Ø×CÑCÀJÐ\hÓiÐiØ”J×*Ñ*×0Ñ0Ô0Ø×DÑDÀZÐ]iÓjÐjÜÐ6°u°g¸QÐ?Ó@Ð@rb   c                óž  € \         P                  P                  pVR,           pVR,           p\        P                  P                  RV.VR,           .V^ R7      pVP                  V4       VR,           p\        P                  P                  RV.VR,           .V^ R7      p	VP                  V	4       VR,           p
\        P                  P                  R	VP                  ^ ,          .V
R,           .V
4      pVP                  V4       VR,           p\        P                  P                  R	V	P                  ^ ,          .VR,           .V4      pVP                  V4       VR
,           p\        P                  P                  RVP                  ^ ,          VP                  ^ ,          .VR,           .V4      pVP                  V4       \        P                  P                  V P                  V. \        V4      R,          .4      pV P                  P                  V4       VR,           p\        P                  P                  RVP                  ^ ,          V P                  .V.V4      pVP                  V4       \        P                  P                  V P                  V. ^ .4      pV P                  P                  V4       WPP                  . . 3# )aJ  
Create nodes for dynamic quantization of input to int8 and add them to nodes_list
    parameter input_name: Name of the input.
    parameter nodes_list: new nodes are appended to this list.
    parameter initial_type: initial weight type (FLOAT or FLOAT16)
    return: scale_name, zero_point_name, scale_shape, zero_point_shape.
Ú_scaleÚ
_ReduceMinÚ	ReduceMinú:0©ÚkeepdimsÚ
_ReduceMaxÚ	ReduceMaxÚ_AbsÚAbsÚ_Abs_MaxÚMaxç       @Ú	scale_DivÚDiv)r¼   r½   rÃ   rV   rW   rp   Úappendr,   Úmake_tensorr>   r   r%   Úadd_initializerr@   )rD   rÇ   rÈ   rÊ   rÉ   Úinput_scale_nameÚreduce_min_nameÚreduce_min_nodeÚreduce_max_nameÚreduce_max_nodeÚreduce_min_abs_nameÚreduce_min_abs_nodeÚreduce_max_abs_nameÚreduce_max_abs_nodeÚabs_max_nameÚabs_max_nodeÚinitializer_divÚscale_div_nameÚscale_div_nodeÚinitializer_zps   &&&&                rP   rÄ   Ú9ONNXQuantizer._get_dynamic_input_quantization_params_int8E  s¦  € ô ×&Ñ&×+Ñ+ˆð &¨Õ0Ðà$ |Õ3ˆÜŸ+™+×/Ñ/ØØˆLØ˜tÕ#Ð$ØØð 0ó 
ˆð 	×Ñ˜/Ô*à$ |Õ3ˆÜŸ+™+×/Ñ/ØØˆLØ˜tÕ#Ð$ØØð 0ó 
ˆð 	×Ñ˜/Ô*ð .°Õ6ÐÜ"Ÿk™k×3Ñ3ØØ×#Ñ# AÕ&Ð'Ø  4Õ'Ð(Øó	
Ðð 	×ÑÐ-Ô.à-°Õ6ÐÜ"Ÿk™k×3Ñ3ØØ×#Ñ# AÕ&Ð'Ø  4Õ'Ð(Øó	
Ðð 	×ÑÐ-Ô.à! JÕ.ˆÜ—{‘{×,Ñ,ØØ ×'Ñ'¨Õ*Ð,?×,FÑ,FÀqÕ,IÐJØ˜DÕ Ð!Øó	
ˆð 	×Ñ˜,Ô'äŸ+™+×1Ñ1Ø×'Ñ'ØØÜ! %Ó(¨3Õ.Ð/ó	
ˆð 	�
‰
×"Ñ" ?Ô3Ø# kÕ1ˆÜŸ™×.Ñ.ØØ× Ñ  Õ# T×%@Ñ%@ÐAØÐØó	
ˆð 	×Ñ˜.Ô)ô Ÿ™×0Ñ0°×1HÑ1HÈ%ÐQSÐVWÐUXÓYˆØ�
‰
×"Ñ" >Ô2à×!8Ñ!8¸"¸bÐ@Ð@rb   c                óÔ  € \         P                  P                  pVR,           pVR,           pVR,           p\        P                  P                  RV.VR,           .V^ R7      pVP                  V4       VR,           p	\        P                  P                  RV.V	R,           .V	^ R7      p
VP                  V
4       \        P                  P                  V P                  V. \        V4      .4      pV P                  P                  V4       \        P                  P                  V P                  V. R	.4      pV P                  P                  V4       VR
,           p\        P                  P                  RV
P                  ^ ,          VP                  ^ ,          .VR,           .V4      pVP                  V4       VR,           p\        P                  P                  RVP                  ^ ,          V P                  .V.V4      pVP                  V4       VR,           p\        P                  P                  RV P                  VP                  ^ ,          .VR,           .V4      pVP                  V4       VR,           p\        P                  P                  RVP                  ^ ,          V.VR,           .V4      pVP                  V4       VR,           p\        P                  P                  RVP                  VR,           .V4      pVP                  V4       VR,           p\        P                  P                  RVP                  V.VVR7      pVP                  V4       WV. . 3# )aK  
Create nodes for dynamic quantization of input to uint8 and add them to nodes_list
    parameter input_name: Name of the input.
    parameter nodes_list: new nodes are appended to this list.
    parameter initial_type: initial weight type (FLAOT or FLOAT16)
    return: scale_name, zero_point_name, scale_shape, zero_point_shape.
rÎ   Ú_zero_pointrÏ   rÐ   rÑ   rÒ   rÔ   rÕ   ç        Ú
_scale_SubÚSubÚ
_scale_DivrÜ   Ú_zero_point_SubÚ_zero_point_DivÚ_zero_point_FloorÚFloorÚ_zero_point_CastÚCast)Úto)r¼   r½   rÅ   rV   rW   rp   rÝ   rÞ   r=   r   r%   rß   r?   r,   )rD   rÇ   rÈ   rÊ   rÉ   rà   Úinput_zp_namerá   râ   rã   rä   Úinitializer_qrangeÚinitializer_qvalueÚscale_sub_nameÚscale_sub_noderì   rí   Úzp_sub_nameÚzp_sub_nodeÚzp_div_nameÚzp_div_nodeÚzp_floor_nameÚzp_floor_nodeÚzp_cast_nameÚzp_cast_nodes   &&&&                     rP   rÆ   Ú:ONNXQuantizer._get_dynamic_input_quantization_params_uint8™  s4  € ô ×&Ñ&×,Ñ,ˆà%¨Õ0ÐØ" ]Õ2ˆà$ |Õ3ˆÜŸ+™+×/Ñ/ØØˆLØ˜tÕ#Ð$ØØð 0ó 
ˆð 	×Ñ˜/Ô*à$ |Õ3ˆÜŸ+™+×/Ñ/ØØˆLØ˜tÕ#Ð$ØØð 0ó 
ˆð 	×Ñ˜/Ô*ô "Ÿ[™[×4Ñ4Ø×(Ñ(ØØÜ! %Ó(Ð)ó	
Ðð 	�
‰
×"Ñ"Ð#5Ô6Ü!Ÿ[™[×4Ñ4°T×5IÑ5IÈ<ÐY[Ð^aÐ]bÓcÐØ�
‰
×"Ñ"Ð#5Ô6ð $ lÕ2ˆÜŸ™×.Ñ.ØØ×#Ñ# AÕ&¨×(>Ñ(>¸qÕ(AÐBØ˜dÕ"Ð#Øó	
ˆð 	×Ñ˜.Ô)à# lÕ2ˆÜŸ™×.Ñ.ØØ×"Ñ" 1Õ% t×'CÑ'CÐDØÐØó	
ˆð 	×Ñ˜.Ô)ð !Ð#4Õ4ˆÜ—k‘k×+Ñ+ØØ×!Ñ! ?×#9Ñ#9¸!Õ#<Ð=Ø˜4ÕÐ Øó	
ˆð 	×Ñ˜+Ô&à Ð#4Õ4ˆÜ—k‘k×+Ñ+ØØ×Ñ Õ"Ð$4Ð5Ø˜4ÕÐ Øó	
ˆð 	×Ñ˜+Ô&à"Ð%8Õ8ˆÜŸ™×-Ñ-¨g°{×7IÑ7IÈMÐ\`ÕL`ÐKaÐcpÓqˆØ×Ñ˜-Ô(à!Ð$6Õ6ˆÜ—{‘{×,Ñ,¨V°]×5IÑ5IÈMÈ?Ð\hÐmrÐ,ÓsˆØ×Ñ˜,Ô'à°°BÐ6Ð6rb   c                óò  € V P                   pVe   VEf}   V P                  e   WP                  9  d   \        P                  ! RV R24       R# V P                  V,          p\	        V\
        4      '       g   \        R\        V4       RV: R24      hVe   \        V4      ^8w  d   \        RV RV 24      h\        P                  ! VR,          .4      p\        VR	,          R
4      '       d7   VR	,          P                  \        P                  \        P                  39  d#   \        R\        VR	,          4       RV: 24      h\        P                  ! VR	,          .4      pVP                  \        P                   8w  g   Q hVR,          pM�\        P                  ! V.4      p\        P                  ! V.4      pV P                  V,          pR	V9   d%   VR	,          P                  pVP#                  V4      pVP                  \        P                   8w  g   Q h. p	VR,           p
. pVR,           p\$        P&                  P)                  W¤W–P+                  4       P-                  4       4      pV P.                  P1                  V4       VP                  \        P                  8X  d   \2        P4                  P6                  pMVVP                  \        P                  8X  d   \2        P4                  P8                  pM\        RVP                   RV: 24      h\$        P&                  P)                  WÎW·P;                  R4      P-                  4       4      pV P.                  P1                  V4       RWÊW¹3# )a4  
Create initializers and inputs in the graph for zero point and scale of output.
Zero point and scale values are obtained from self.quantization_params if specified.
    parameter param_name: Name of the quantization parameter.
    return: result, scale_name, zero_point_name, scale_shape, zero_point_shape.
z$Quantization parameters for tensor:"z" not specifiedúUnexpected type ú for rº   zbQuantization parameters should contain zero point, scale, quant type. Specified values for output z: Ú
zero_pointÚscaleÚdtypez and param_name=Ú
quant_typerñ   rÎ   zUnexpected dtype=z for param_name=T)FÚ r  r  r  )éÿÿÿÿ)rH   r<   r�   r¨   Ú
isinstancer   Ú	TypeErrorrg   rk   r:   ÚnpÚarrayÚhasattrr  Úfloat32Úfloat16Úfloat64ÚastyperV   rW   rÞ   ÚravelÚtolistr%   rß   r¼   r½   r¾   r¿   Úreshape)rD   Ú
param_nameÚ	use_scaleÚuse_zeropointÚzero_point_typeÚparamsÚzero_point_valuesÚscale_valuesr  Úzero_point_shapeÚzero_point_nameÚscale_shapeÚ
scale_nameÚinit_zpÚ
scale_typeÚ
init_scales   &&&&            rP   Ú_get_quantization_paramsÚ&ONNXQuantizer._get_quantization_params÷  sí  € ð ×/Ñ/ˆàÒ Ó 5Ø×'Ñ'Ò/°:×E]ÑE]Ô3]Ü—’ÐCÀJÀ<ÈÐ_Ô`Ø,Ð,à×-Ñ-¨jÕ9ˆFÜ˜fÔ&8×9Ò9ÜÐ"2´4¸³<°.ÀÀjÁ^ÐSTÐ UÓVÐVØŠ~¤ V£°Ô!1Ü ð3Ø3=°,¸bÀÀðJóð ô
 !#§¢¨&°Õ*>Ð)?Ó @ÐÜ˜6 '�?¨G×4Ò4¸¸w½×8MÑ8MÔVX×V`ÑV`Ôbd×blÑblÐUmÔ8mÜ Ð#3´D¸À½Ó4IÐ3JÐJZÐ[eÑZhÐ!iÓjÐjÜŸ8š8 V¨G¥_Ð$5Ó6ˆLØ×%Ñ%¬¯©Ô3Ð3Ð3Ø$ \Õ2‰Oä "§¢¨-¨Ó 9ÐÜŸ8š8 Y KÓ0ˆLØ×-Ñ-¨jÕ9ˆFØ˜&Ô Ø˜w�×-Ñ-�Ø+×2Ñ2°5Ó9�Ø×%Ñ%¬¯©Ô3Ð3Ð3àÐØ$ }Õ4ˆØˆØ (Õ*ˆ
ô —+‘+×)Ñ)ØÐ.>×@WÑ@WÓ@Y×@`Ñ@`Ó@bó
ˆð 	�
‰
×"Ñ" 7Ô+Ø×Ñ¤§¡Ô+Ü#×/Ñ/×5Ñ5‰JØ×Ñ¤2§:¡:Ô-Ü#×/Ñ/×7Ñ7‰JäÐ0°×1CÑ1CÐ0DÐDTÐU_ÑTbÐcÓdÐdÜ—[‘[×,Ñ,¨ZÀ[×RfÑRfÐglÓRm×RtÑRtÓRvÓwˆ
Ø�
‰
×"Ñ" :Ô.à�Z°+ÐOÐOrb   c           	     óú  € VP                   V,          pVR8w  g   Q R4       hV\        ,           pVR,           p	Ve
   Ve   RYErËp
MV P                  V4      w  r«p p. pV
'       d'   \        P                  P                  RW{V.V.V	4      pMÒV P                  '       d   R# V P                  '       dX   V\        P                  P                  8X  d9   VR,           pVR,           p\        P                  P                  R	V.W‹V.V	4      pMUVf   Q R
V: RV RV RV 24       hV P                  W~W6R7      w  pppp\        P                  P                  RW{V.V.V	4      p\        WxW¼V4      V P                  V&   . VOVN# )ar  
Given an input for a node (which is not a initializer), this function

- add nodes to compute zero point and scale for this input if they don't exist.
- add new QuantizeLinear node to quantize the input.

:param node: node being quantized in NodeProto format.
:param input_index: index of input in node.input.
:param qType: type to quantize to.
:param given_scale_name: if those inputs need to be quanitzed using this scale tensor.
:param given_zp_name: if those inputs to be quantized using this zeropoint tensor.
:param initial_type: type of the weight to quantize
:return: List of newly created nodes in NodeProto format.
r  z*Cannot access undefined variable in graph.Ú_QuantizeLinearNTr{   rÎ   rñ   ÚDynamicQuantizeLinearzCCannot quantize input without knowing the initial type, input_name=z, input_index=z, qType=z, node=©rÊ   )r-   r   r.  rV   rW   rp   r/   r1   r¼   r½   rÅ   rË   r
   rA   )rD   r7   Úinput_indexrÉ   Úgiven_scale_nameÚgiven_zp_namerÊ   rÇ   rŒ   Úql_node_nameÚ
data_foundr*  Úzp_namer    r�   Úqlinear_noder)  Úzp_shapes   &&&&&&&           rP   Ú_get_quantize_input_nodesÚ'ONNXQuantizer._get_quantize_input_nodes2  s½  € ð" —Z‘Z Õ,ˆ
Ø˜RÔÐMÐ!MÓMÐØ Ô#;Õ;ˆØ!Ð$5Õ5ˆàÒ(¨}Ò/HØ/3Ð5E GˆJ Gà48×4QÑ4QÐR\Ó4]Ñ1ˆJ G¨Q°àˆßÜŸ;™;×0Ñ0Ø Ø¨Ð1Ø�Øó	‰Lð �{�{ˆ{Ùð ×&×&Ð&¨5´J×4JÑ4J×4PÑ4PÔ+PØ'¨(Õ2�
Ø$ }Õ4�Ü#Ÿ{™{×4Ñ4Ø+Ø�LØ ¨gÐ6Ø ó	 ‘ð $Ò/ð ð"Ø",¡¨~¸k¸]È(ÐSXÐRYÐY`ÐaeÐ`fðhóÐ/ð ×?Ñ?À
ÐSXÐ?ÓtñØØØØä#Ÿ{™{×4Ñ4Ø$Ø¨WÐ5Ø �MØ ó	 �ô 0>¸jÐWaÐlqÓ/rˆ× Ñ  Ñ,Ø%�Ð%˜Ð%Ð%rb   c                óž   € WP                   9   d   V P                   V,          # V P                  e   V P                  P                  V4      # R # rŠ   )rA   rZ   Úfind_quantized_value)rD   rÇ   s   &&rP   r?  Ú"ONNXQuantizer.find_quantized_valuex  sA   € Ø×1Ñ1Ô1Ø×+Ñ+¨JÕ7Ð7Ø�;‰;Ò"Ø—;‘;×3Ñ3°JÓ?Ð?Ùrb   c
                óf  € \         P                  ! V4      p
VRV
,          ,          V,          p\         P                  ! VP                  4       \         P                  R7      p\         P                  ! VP                  4       \         P                  R7      pWÍ,          pWë8  dŒ   VR8”  d…   W¾,          pWß,          pV	f;   \
        P                  ! RV RV RV R24       R\         P                  ! VVR7      3# \
        P                  ! R	V	 R
V RV RV R2	4       RVP                  V4      3# RV3# )zHAdjust a single weight scale to ensure the int32 bias does not overflow.rÚ   ©r  rò   zIncreasing scale for weight `z` by the ratio z to ensure bias `z` has a valid scale.TzIncreased scale[z] for weight `z` by ratio F)r  Úabsr  Úitemr  r�   r¨   r  )rD   Úbias_valÚinput_scaleÚweight_scaleÚweight_scale_dtypeÚweight_nameÚ	bias_nameÚqrangeÚmultiplicative_epsilonÚidxÚabsmaxÚbias_smallest_valid_scaleÚinput_scale_fp64Úweight_scale_fp64Úbias_candidate_scaleÚratioÚ	new_scales   &&&&&&&&&&       rP   Ú$adjust_single_weight_scale_if_neededÚ2ONNXQuantizer.adjust_single_weight_scale_if_needed  s/  € ô —’˜Ó!ˆØ$:¸cÀF½lÕ$KÈfÕ$TÐ!äŸ8š8 K×$4Ñ$4Ó$6¼b¿j¹jÔIÐÜŸHšH \×%6Ñ%6Ó%8ÄÇ
Á
ÔKÐØ/ÕCÐà Ô<ÐCWÐZ]ÔC]Ø-ÕDˆEØ)Õ1ˆIØŠ{Ü—’Ø3°K°=ÀÐPUÈwð W$Ø$- ;Ð.BðDôð œRŸXšX iÐ7IÔJÐJÐJä—’Ø& s e¨>¸+¸ÀkÐRWÐQXð Y'Ø'0 kÐ1EðGôð ˜Y×-Ñ-Ð.@ÓAÐAÐAØ�lÐ"Ð"rb   c                ó²   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RS[P                  RS[RS[S[S[ P                  R,          3,          /# )é   rF  rG  rI  Úbias_tpÚis_per_channelÚreturnN)r  Úndarrayr™   rV   r½   ÚboolÚtuple)ÚformatÚ__classdict__s   "€rP   Ú__annotate__ÚONNXQuantizer.__annotate__¤  sh   ø€ ÷ 6%ñ 6%á—Z‘Zð6%ñ —j‘jð6%ñ ð	6%ñ
 ×!Ñ!ð6%ñ ð6%ñ 
‰t‘R—Z‘Z $Õ&Ð&Õ	'ñ6%rb   c                óÌ  € VP                   '       g   R# \        V4      p\        P                  ! \        P                  4      pRp\        P
                  ! VP                  \        P                  R7      \        P
                  ! VP                  ^,           \        P                  R7      ,
          p	VP                  p
RpV'       Eg   \        P                  ! VP                  4       \        P
                  ! ^ \        P                  R7      4      p\        P                  ! VP                  4       \        P
                  ! ^ \        P                  R7      4      p\        P                  ! \        P                  ! V4      \        P                  ! V4      4      pV P                  VVVV
VVP                  V	V4      w  ppV'       d   TpRpW²3# VP                  '       d„   \!        VP                  4      ^8X  dj   \#        VP                  ^ ,          4       FI  pV P                  VV,          VVV,          V
VVP                  V	VVR7	      w  ppV'       g   KB  VVV&   RpKK  	  W²3# )zOChecks if the bias scale is too small and increases the weight scale if needed.Fgq¬‹Ûh ð?rB  T)rM  )FN)Úsizer   r  ÚiinfoÚint32r  Úmaxr  Úminr  ÚminimumÚmaximumrC  rU  r)   Úshaperk   r”   )rD   rF  rG  rI  rY  rZ  Úbias_float_dataÚ
int32_inforL  rK  rH  ÚupdatedÚrminÚrmaxrN  ÚchangedrT  rŸ   s   &&&&&&            rP   Ú#_adjust_weight_scale_for_int32_biasÚ1ONNXQuantizer._adjust_weight_scale_for_int32_bias¤  sß  € ð × × Ð ØÐä/°Ó8ˆÜ—X’XœbŸh™hÓ'ˆ
Ø!'ÐÜ—’˜*Ÿ.™.´·
±
Ô;¼b¿hºhÀzÇ~Á~ÐXYÕGYÔac×akÑakÔ>lÕlˆØ)×/Ñ/ÐØˆçˆ~Ü—:’:˜o×1Ñ1Ó3´R·X²X¸aÄrÇzÁzÔ5RÓSˆDÜ—:’:˜o×1Ñ1Ó3´R·X²X¸aÄrÇzÁzÔ5RÓSˆDÜ—Z’Z¤§¢ t£¬b¯fªf°T«lÓ;ˆFØ!%×!JÑ!JØØØØ"ØØ—‘ØØ&ó	"ÑˆG�Y÷ Ø(�Ø�ð$ Ð$Ð$ð# ××Ð¤C¨×(:Ñ(:Ó$;¸qÔ$@Ü˜<×-Ñ-¨aÕ0Ö1�Ø%)×%NÑ%NØ# AÕ&ØØ  •OØ&ØØ—L‘LØØ*Øð &Oó 
&Ñ"�˜÷ ‘7Ø&/�L ‘OØ"’Gñ 2ð  Ð$Ð$rb   c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# )rX  rI  rT  r[  N)r™   r  r\  )r_  r`  s   "€rP   ra  rb  Ü  s&   ø€ ÷ $1ñ $1©cð $1¹b¿j¹jð $1ÈTñ $1rb   c           	     óJ  € WP                   9  d   R# V P                   V,          p\        WP                  P                  4       4      p\        VP                  V P                  P                  4       4      p\        VP
                  V P                  P                  4       4      p\        VP                  V P                  P                  4       4      pVe   Ve	   Ve   Vf   R# V P                  P                  V4       V P                  P                  V4       \        P                  P                  V4      pVP                  p	\        P                  ! V\        P                  P                  VP                   4      R7      p
\        P                  P#                  V
P%                  VP&                  4      VP                  4      pV P                  P)                  V4       \+        VV P,                  VV
V	VP                  R7      pV P                  P)                  V4       R# )zCRe-quantizes the given weight initializer using the provided scale.NrB  )Úquant_weight_name)rA   r   r%   r…   r*  r9  Úq_nameÚremove_initializerrV   Únumpy_helperÚto_arrayÚaxisr  ÚasarrayrW   Útensor_dtype_to_np_dtyper¯   Ú
from_arrayr  Údimsrß   r   rG   )rD   rI  rT  ÚqvÚ	weight_tpÚ
scale_initÚzp_initÚq_weight_initÚweight_zero_pointr{  Úscale_npÚnew_scale_initÚnew_q_weights   &&&          rP   Ú_requantize_weightÚ ONNXQuantizer._requantize_weightÜ  s�  € ð ×6Ñ6Ô6Ùà×%Ñ% kÕ2ˆä  ¯j©j×.DÑ.DÓ.FÓGˆ	Ü! "§-¡-°·±×1GÑ1GÓ1IÓJˆ
Ü˜rŸz™z¨4¯:©:×+AÑ+AÓ+CÓDˆÜ$ R§Y¡Y°·
±
×0FÑ0FÓ0HÓIˆàÒ 
Ò 2°g²oÈÒI^Ùà�
‰
×%Ñ% jÔ1Ø�
‰
×%Ñ% mÔ4ä ×-Ñ-×6Ñ6°wÓ?ÐØ�w‰wˆô —:’:˜i¬t¯{©{×/SÑ/SÐT]×TgÑTgÓ/hÔiˆÜ×*Ñ*×5Ñ5°h×6FÑ6FÀzÇÁÓ6WÐY[×YfÑYfÓgˆØ�
‰
×"Ñ" >Ô2ô 1ØØ×ÑØØØØ Ÿi™iô
ˆð 	�
‰
×"Ñ" <Ö0rb   c                ó2  € WP                   9   d   V P                   V,          P                  # V P                   V,          P                  p\        WPP                  P                  4       4      p\        V4      pW P                   9   d   V P                   V,          P                  pM6W P                  9   d   V P                  V4      w  r˜  p	M\        RV R24      h\        W€P                  P                  4       4      p
\        V
4      pV P                   V,          P                  p\        WÀP                  P                  4       4      pVe    \        P                  P                  V4      MRpV P                  pVeª   VP                  '       d˜   VP!                  4       '       g‚   V P"                  \$        P&                  P(                  39   dX   \        WP                  P                  4       4      pV P+                  VVVVV4      w  ppV'       d   V P-                  VV4       TpV P/                  WWt4      w  ppppppWP                   9  g   Q h\1        TTTT\2        P4                  VP                  ^8”  d   ^ MRVVR7      pVV P                   V&   V# )zM
Quantized the bias. Zero Point == 0 and Scale == Input_Scale * Weight_Scale
z	Expected z5 to be in quantized value map for static quantizationN)Ú	node_typeÚ
node_qtype)rA   rw  r*  r   r%   r…   r   r<   r.  r:   r9  rV   ry  rz  rE   rd  r€   rG   r¼   r½   rÃ   rr  r‰  Úquantize_bias_static_implr
   r   ÚInitializer)rD   rJ  rÇ   rI  ÚbetaÚweight_scale_nameÚweight_initializerrG  rà   r    Úinputscale_initializerrF  Úweight_zp_nameÚweight_zp_initr…  rZ  Úbias_initializerÚ
did_updateÚnew_weight_scaleÚquantized_bias_nameÚquantized_bias_scale_nameÚquantized_bias_zp_nameÚbias_scale_datarŒ  r�  Úquantized_values   &&&&&                     rP   Úquantize_bias_staticÚ"ONNXQuantizer.quantize_bias_static  sb  € ð ×0Ñ0Ô0Ø×+Ñ+¨IÕ6×=Ñ=Ð=ð !×4Ñ4°[ÕA×LÑLÐÜ)Ð*;¿Z¹Z×=SÑ=SÓ=UÓVÐÜ,Ð-?Ó@ˆð ×1Ñ1Ô1Ø#×7Ñ7¸
ÕC×NÑNÑØ×3Ñ3Ô3Ø+/×+HÑ+HÈÓ+TÑ(ˆA  A¡qä˜y¨¨Ð4iÐjÓkÐkä!-Ð.>Ç
Á
×@VÑ@VÓ@XÓ!YÐÜ+Ð,BÓCˆð ×1Ñ1°+Õ>×FÑFˆÜ% n·j±j×6LÑ6LÓ6NÓOˆØJXÒJdœD×-Ñ-×6Ñ6°~ÔFÐjnÐØ×)Ñ)ˆàÒ)Ø!×&×&Ð&Ø%×)Ñ)×+Ò+Ø×!Ñ!¤j×&<Ñ&<×&AÑ&AÐ%CÔCä+¨I·z±z×7MÑ7MÓ7OÓPÐØ+/×+SÑ+SØØØØ Øó,Ñ(ˆJÐ(÷ Ø×'Ñ'¨Ð5EÔFØ/�ð ×*Ñ*¨9À<ÓVñ	
ØØ%Ø"ØØØð × 8Ñ 8Ô8Ð8Ð8Ü(ØØØ%Ø"Ü×*Ñ*Ø ×%Ñ%¨Ô)‰A¨tØØ!ô	
ˆð />ˆ× Ñ  Ñ+à"Ð"rb   c                óv   € WP                   9   ;'       g%    WP                  9   ;'       g    WP                  9   # )za
only check for value info and newly generated tensor names, initializers are checked separately
)r*   r6   rC   r©   s   &&rP   Úcontains_tensorÚONNXQuantizer.contains_tensorJ  sA   € ð
 ×,Ñ,Ñ,÷ ;ð ;Ø×0Ñ0Ñ0÷;ð ;à×9Ñ9Ñ9ð	
rb   c           
     ó2   € V P                  VVR R R RVR7      # )F©r7   ÚindicesÚinitializer_use_weight_qTyperF   Úop_level_per_channelr{  Úfrom_subgraphr  ©Ú_ONNXQuantizer__quantize_inputs)rD   r7   r¥  r¨  s   &&&&rP   Úquantize_activationÚ!ONNXQuantizer.quantize_activationT  s/   € Ø×%Ñ%ØØØ).ØØ!&ØØ'ð &ó 
ð 	
rb   c           
     ó2   € V P                  VVR VVVVR7      # )Tr¤  r©  )rD   r7   r¥  rF   r§  r{  r¨  s   &&&&&&&rP   Úquantize_weightÚONNXQuantizer.quantize_weighta  s1   € ð ×%Ñ%ØØØ)-Ø%Ø!5ØØ'ð &ó 
ð 	
rb   c                ó¦	  € . p. p	. p
. pV EF¿  pVP                   V,          pWÐP                  9   dg   V P                  V,          pVP                  VP                  4       V	P                  VP                  4       V
P                  VP
                  4       K�  V'       g6   V
P                  R4       VP                  R4       V	P                  R4       KÊ  \        WÐP                  P                  4       4      pVeÇ   V P                  '       dJ   V'       dB   T P                  VP                  V'       d   V P                  MV P                  VV4      w  pppM5T P                  TV'       d   V P                  MV P                  V4      w  pppV
P                  V4       V	P                  V4       VP                  V4       EK·  V P                  V4      '       EdX   V P                  P!                  VR,           V P"                  V P                  P%                  4       4      pVEf1   VP                   V,          pVV P&                  9   dƒ   V P&                  V,          pVP)                  R4      '       g   Q RV R24       hVP*                  P)                  R4      '       g   Q RV R24       hVP*                  P,                  P.                  pM0VV P0                  9   g   Q RV: R	24       hV P0                  V,          pV P3                  WV P                  VR
7      pVf   Ru # V'       d   V P5                  V4       MVP7                  V4       VR,          pVP8                  R8X  dc   V
P7                  VP:                  4       VP                  VP                   ^,          4       V	P                  VP                   ^,          4       EK½  V
P                  VP:                  ^ ,          4       VP                  VP:                  ^,          4       V	P                  VP:                  ^,          4       EK&  V P<                  et   V P<                  P?                  VV.VVVVRR7      w  ppppV
P                  V^ ,          4       VP                  V^ ,          4       V	P                  V^ ,          4       EK§  \A        RV RV PB                   24      h	  W©W‹3# )aC  
Given a node, this function quantizes the inputs as follows:
    - If input is an initializer, quantize the initializer data, replace old initializer
      with new initializer
    - Else, add QuantizeLinear nodes to perform quantization
    parameter node: node being quantized in NodeProto format.
    parameter indices: input indices to quantize.
    return: (List of quantized input names,
             List of zero point names used for input quantization,
             List of scale names used for input quantization,
             List of new QuantizeLinear nodes created)
r  r1  rg   zvalue_info=z has no type.r®   z is not a tensor.zshape inference failed for zF and attribute 'tensor_names' does not have any value for this tensor.r3  r{   T)r¦  rF   r§  r{  r¨  z!Invalid tensor name to quantize: z @graph scope)NNNNr  )"r-   rA   rÝ   r*  r9  rw  r   r%   r…   rE   Úquantize_weight_per_channelr)   rG   rH   Úquantize_initializerr¡  Úfind_node_by_namer4   r'   r*   r°   rg   r®   r±   r6   r<  r�   ro   rl   r,   rZ   rª  r:   r5   )rD   r7   r¥  r¦  rF   r§  r{  r¨  Úscale_namesÚzero_point_namesÚquantized_input_namesr�   r4  Ú
node_inputr�  r…   Úq_weight_namer9  r*  r:  rÇ   r(   rÊ   Úquantize_input_nodesÚparent_quantized_input_namesÚparent_zero_point_namesÚparent_scale_namesr    s   &&&&&&&&                    rP   Ú__quantize_inputsÚONNXQuantizer.__quantize_inputst  s_  € ð. ˆØÐØ "ÐØˆä"ˆKØŸ™ KÕ0ˆJð ×5Ñ5Ô5Ø"&×":Ñ":¸:Õ"F�Ø×"Ñ" ?×#=Ñ#=Ô>Ø ×'Ñ'¨×(?Ñ(?Ô@Ø%×,Ñ,¨_×-CÑ-CÔDÙçØ%×,Ñ,¨RÔ0Ø×"Ñ" 2Ô&Ø ×'Ñ'¨Ô+Ùä& z·:±:×3IÑ3IÓ3KÓLˆKØÒ&Ø×#×#Ð#×(<ð
 ×8Ñ8Ø#×(Ñ(ß-I˜×)Ò)Èt×OdÑOdØØ$ó	ñ	Ø%ØÙ"ð :>×9RÑ9RØ#ß-I˜×)Ò)Èt×OdÑOdØ$ó:Ñ6�M 7¨Jð &×,Ñ,¨]Ô;Ø ×'Ñ'¨Ô0Ø×"Ñ" :×.Ø×%Ñ% j×1Ó1à#Ÿz™z×;Ñ;ØÐ!2Õ2°D·N±NÀDÇJÁJ×DTÑDTÓDVó �ð  Ó'Ø!%§¡¨KÕ!8�JØ! T×%5Ñ%5Ô5Ø%)×%5Ñ%5°jÕ%A˜
Ø)×2Ñ2°6×:Ò:Ðc¸kÈ*ÈÐUbÐ<cÓcÐ:Ø)Ÿ™×7Ñ7¸×FÒFÐsÈ+ÐV`ÐUaÐarÐHsÓsÐFØ'1§¡×'BÑ'B×'LÑ'L™ð  *¨T×->Ñ->Ô>ð Ø9¸*¹ð H+ð ,óÐ>ð
 (,×'8Ñ'8¸Õ'D˜Ø+/×+IÑ+IØ¨4×+@Ñ+@È|ð ,Jó ,Ð(ð ,Ò3Ø7Ò7ß$Ø×*Ñ*Ð+?Õ@àŸ™Ð%9Ô:Ø#7¸Õ#;�Là×'Ñ'Ð+;Ô;Ø)×0Ñ0°×1DÑ1DÔEØ×&Ñ& |×'9Ñ'9¸!Õ'<Ô=Ø$×+Ñ+¨L×,>Ñ,>¸qÕ,A×Bà)×0Ñ0°×1DÑ1DÀQÕ1GÔHØ×&Ñ& |×':Ñ':¸1Õ'=Ô>Ø$×+Ñ+¨L×,?Ñ,?ÀÕ,B×CØ—‘Ò(ð —K‘K×1Ñ1ØØ �MØ1MØ!-Ø)=ØØ"&ð 2ó ñØ0Ø+Ø&Øð &×,Ñ,Ð-IÈ!Õ-LÔMØ×"Ñ"Ð#5°aÕ#8Ô9Ø ×'Ñ'Ð(?ÀÕ(B×Cô !Ð#DÀZÀLÐP]Ð^b×^nÑ^nÐ]oÐ!pÓqÐqñG #ðJ %¸ÐJÐJrb   c                ój  € VP                   V P                  9   dA   V P                  VP                   ,          pVP                  VP                  VP                  3# V P                  WW44      w  rgp\        VP                   VVV\        P                  R4      pWPP                  VP                   &   WgV3# )aj  
:param weight: TensorProto initializer
:param qType: type to quantize to
:param keep_float_weight: Whether to quantize the weight. In some cases, we only want to qunatize scale and zero point.
                          If keep_float_weight is False, quantize the weight, or don't quantize the weight.
:return: quantized weight name, zero point name, scale name
N)	r)   rA   rw  r9  r*  Úquantize_initializer_implr
   r   r�  )	rD   rµ   rÉ   rF   Úkeep_float_weightr�  r¸  r9  r*  s	   &&&&&    rP   r²  Ú"ONNXQuantizer.quantize_initializer÷  s³   € ð �;‰;˜$×2Ñ2Ô2Ø"×6Ñ6°v·{±{ÕCˆOà×&Ñ&Ø×'Ñ'Ø×*Ñ*ðð ð .2×-KÑ-KØ˜<ó.
Ñ*ˆ 
ô
 )Ø�K‰KØØØÜ×*Ñ*Øó
ˆð 1@× Ñ  §¡Ñ-Ø zÐ1Ð1rb   c                ó  € WP                   9   d7   V P                   V,          pVP                  VP                  VP                  3# V P	                  WW4V4      w  rxp	\        VVV	V\        P                  R 4      pW`P                   V&   WxV	3# rŠ   )rA   rw  r9  r*  Ú quantize_weight_per_channel_implr
   r   r�  )
rD   rI  rG   Úchannel_axisrF   rÁ  r�  r¸  r9  r*  s
   &&&&&&    rP   r±  Ú)ONNXQuantizer.quantize_weight_per_channel  s¤   € ð ×2Ñ2Ô2Ø"×6Ñ6°{ÕCˆOà×&Ñ&Ø×'Ñ'Ø×*Ñ*ðð ð .2×-RÑ-RØ |ÐCTó.
Ñ*ˆ 
ô )ØØØØÜ×*Ñ*Øó
ˆð 1@× Ñ  Ñ-à zÐ1Ð1rb   c                ó&  € WP                   9   Ed€   WP                  9  Edo   V P                   V,          p\        VP                  V P                  P                  4       4      pV P                  P                  P                  R8w  g*   V P                  P                  P                  R8X  d9   Ve5   Ve1   \        P                  P                  V4      P                  ^8X  g   Q hVR,           pV P                  P                  W@P                  V P                  P                  4       4      pVfH   VP                  VP                  VP                  .p\        P                   P#                  RWa.V4      pV# WP$                  ^ ,          8X  g   Q hR# )a~  
Given a value (input/output) which is quantized, add a DequantizeLinear node to dequantize
it back to float32 or float16
    parameter value_name: value to dequantize
    parameter new_nodes_list: List of new nodes created before processing current node
    return: None if there is already a DequantizeLinear node that dequantizes it
            A DequantizeLinear node otherwise
rS   NÚ_DequantizeLinearr|   )rA   rC   r   r*  r%   r…   rT   rV   ry  rz  rd  r³  r4   r'   rw  r9  rW   rp   r,   )rD   Ú
value_namer�  r‚  Údqlinear_nameÚdqlinear_nodeÚdqlinear_inputsÚdequantize_nodes   &&      rP   Ú_dequantize_valueÚONNXQuantizer._dequantize_value8  sR  € ð ×2Ñ2Õ2¸×KeÑKeÕ9eØ"×6Ñ6°zÕBˆOô & o×&@Ñ&@À$Ç*Á*×BXÑBXÓBZÓ[ˆJð �z‰z×Ñ×-Ñ-Ð1AÔAØ—
‘
× Ñ ×.Ñ.Ð2BÔBÀzÒG]ð "Ò)¬T×->Ñ->×-GÑ-GÈ
Ó-S×-XÑ-XÐ\]Ô-]Ð]Ð]à&Ð)<Õ<ˆMØ ŸJ™J×8Ñ8¸ÏÉÐX\×XbÑXb×XhÑXhÓXjÓkˆMØÒ$à#×*Ñ*Ø#×.Ñ.Ø#×+Ñ+ð#�ô
 #'§+¡+×"7Ñ"7Ø&¨¸À}ó#�ð 'Ð&ð "×%9Ñ%9¸!Õ%<Ô<Ð<Ð<Ùrb   c                óÔ   € V P                   P                  4       P                   F?  pV P                  VP                  4      pVf   K$  V P
                  P                  V4       KA  	  R# )z£
Dequantize output if it is quantized
    parameter new_nodes_list: List of new nodes created before processing current node
    return: List of new nodes created
N)r%   r'   r,   rÎ  r)   r4   rÝ   )rD   r,   rÍ  s   &  rP   r•   Ú!ONNXQuantizer._dequantize_outputs_  sM   € ð —j‘j×&Ñ&Ó(×/Ô/ˆFØ"×4Ñ4°V·[±[ÓAˆOØÔ*Ø—‘×%Ñ% oÖ6ó 0rb   c           	     ó–  € V P                   f   R # V P                  4        / pV P                    EF•  pV P                   V,          p\        V\        4      '       g   \	        R\        V4       RV: R24      hV P                  P                  V/ R7      pV P                  pRV9   d   VR,          P                  pRV9   d   RV9   d   VR,          VR,          rvMÚV\        P                  P                  8X  d    \        WSP                  ^,          4      w  rgMœVP                  RVP                   ^ ,          4      pVP                  R	VP                   ^,          4      p	VP                  R
V P"                  4      p
VP                  RR4      p\%        W[V
R7      w  rÍ\'        W‰WÍW P(                  4      w  rg\+        WgVR7      W&   EK˜  	  V# )Nr  r  rº   )Údefault_valr  r  r  ro  rp  Ú	symmetricrF   F)rF   rÔ  )r  r  r  )rI   Úadjust_tensor_rangesr  r   r  rg   Útensor_quant_overridesÚget_per_tensor_overridesrH   r®   rV   r½   ÚFLOAT8E4M3FNr   Úavg_stdÚgetÚrange_valueÚis_activation_symmetricr   r   Úmin_real_ranger   )rD   r<   rª   ÚtdÚquant_overridesr  Úzeror  ro  rp  rÔ  rF   ÚqminÚqmaxs   &             rP   r;   Ú+ONNXQuantizer.calculate_quantization_paramsk  s˜  € Ø×ÑÒ%Ùà×!Ñ!Ô#à ÐØ×-Õ-ˆKØ×#Ñ# KÕ0ˆBÜ˜b¤*×-Ò-ÜÐ"2´4¸³8°*¸EÀ+ÁÐPQÐ RÓSÐSà"×9Ñ9×RÑRÐS^ÐlnÐRÓoˆOà×.Ñ.ˆJØ˜Ô.Ø,¨\Õ:×FÑF�
à˜/Ô)¨l¸oÔ.MØ-¨lÕ;¸_ÈWÕ=U‘eØœt×/Ñ/×<Ñ<Ô<Ü5°jÇ*Á*ÈQÅ-ÓP‘��eà&×*Ñ*¨6°2·>±>À!Õ3DÓE�Ø&×*Ñ*¨6°2·>±>À!Õ3DÓE�Ø+×/Ñ/°¸T×=YÑ=YÓZ�	Ø.×2Ñ2°>À5ÓI�Ü4°ZÐfoÔp‘
�Ü.¨t¸4Ày×ReÑReÓf‘�ä/AÈTÐkuÔ/vÐÔ,ñ/ .ð2 #Ð"rb   )r>   r=   r?   r@   r1   rC   r5   r.   r%   r4   r3   r<   rA   r/   r6   r*   rŠ   )F)NN)NNN)g      ð?)FFr  F)TFFr  F)FF)TF)#Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r$   r`   rw   r‚   r†   r�   r[   r«   r³   rÀ   rË   rÄ   rÆ   r.  r<  r?  rU  rr  r‰  rž  r¡  r«  r®  rª  r²  r±  rÎ  r•   r;   Ú__static_attributes__Ú__classdictcell__)r`  s   @rP   r   r   &   sÀ   ø‡ € ôFMòR/ò> fòD
òò<ò+ òZ
ô"ò2ò2AòRAòh\7ô|9PôvD&òLô##÷J6%ð 6%÷p$1ð $1ôLF#òP
ô	
ô
ô&AKôF2ôB2ò@%òN
7÷ #ð  #rb   r   )#r�   Únumpyr  rV   Úonnx.numpy_helperr   r¼   Úbase_quantizerr   r   Ú	calibrater   Ú
onnx_modelr   Úquant_utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úregistryr   r   © rb   rP   Ú<module>rò     sK   ðó ã Û Û Ý &ç =Ý !Ý !÷÷ ÷ ÷ õ õ& (ôe#�Mö e#rb   