+
    G-j{Ð  ã                   ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIt^ RIt^ RIHtHtHtHt ^ RIt^RIHtHtHt R R ltR(R	 R
 llt ! R R4      t ! R R4      t ! R R]4      t ! R R] P8                  R7      t ! R R4      t ! R R]4      t ! R R]4      t  ! R R] 4      t! ! R R] 4      t" ! R R] 4      t# ! R  R!] P8                  R7      t$ ! R" R#]$4      t%RR$]PL                  R%R/ 3R& R' llt'R# ))é    N)ÚSequence)ÚEnum)ÚPath)Ú
ModelProtoÚTensorProtoÚhelperÚnumpy_helper)Ú
apply_plotÚload_model_with_shape_inferÚsmooth_distributionc                óx   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  /# )é   ÚpkÚqkÚreturn)ÚnpÚndarray)Úformats   "Ús/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/quantization/calibrate.pyÚ__annotate__r      s-   € ÷ ñ ”—‘ð ¤§¡ð ´·
±
ñ ó    c                ó@  € \         P                  ! V P                  V P                  R7      pV R,          \         P                  ! V R,          VR,          ,          4      ,          VR&   V ^ 8H  V^ 8¬  ,          p^ W#&   V ^ 8„  V^ 8„  ,          p\         P
                  W$( &   V# )z…
See https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.rel_entr.html#scipy.special.rel_entr.
Python implementation.
©Údtype:NNN)r   ÚemptyÚshaper   ÚlogÚinf)r   r   ÚresÚc2Úc1s   &&   r   Úrel_entrr"      s€   € ô
 �(Š(�2—8‘8 2§8¡8Ô
,€CØ��U”R—V’V˜B˜q�E B q¥E�MÓ*Õ*€Cˆ�FØ
�‰'�b˜A‘gÕ	€BØ€C�GØ
ˆq‰&�R˜!‘VÕ	€BÜ�v‰v€Cˆ�HØ€Jr   c          
      óž   € V ^8„  d   QhR\         P                  R\         P                  R\        R,          R\        R\         P                  /# )r   r   r   ÚbaseNÚaxisr   )r   r   ÚfloatÚint)r   s   "r   r   r   '   sJ   € ÷ ñ Ü
�
‰
ðä
�
‰
ðô �$�,ðô ð	ô
 ‡Z�Zñr   c                óŒ  € Ve   V^ 8”  g   Q R4       hVf   Q R4       h\         P                  ! V 4      P                  \         P                  4      p RV ,          \         P                  ! WRR7      ,          p \         P                  ! V4      P                  \         P                  4      p\         P
                  ! W4      w  rRV,          \         P                  ! WRR7      ,          p\        W4      p\         P                  ! WCR7      pVe   V\         P                  ! V4      ,          pVP                  V P                  4      # )z¹
Simplifeied version of entropy.
Source: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.entropy.html.
This avoids taking a dependency on scipy just for this function.
z0base={base} must be a positive number or `None`.z
qk is Noneç      ð?T)r%   Úkeepdims©r%   )	r   ÚasarrayÚastypeÚfloat32ÚsumÚbroadcast_arraysr"   r   r   )r   r   r$   r%   ÚvecÚss   &&&&  r   Úentropyr3   '   sé   € ð Š<˜4 !œ8ÐWÐ%WÓWÐ#ØŠ>Ð'˜<Ó'ˆ>ä	�Š�B‹×	Ñ	œrŸz™zÓ	*€BØ	ˆr�”B—F’F˜2°4Ô8Õ	8€Bä	�Š�B‹×	Ñ	œrŸz™zÓ	*€BÜ× Ò  Ó(�F€BØ	ˆr�”B—F’F˜2°4Ô8Õ	8€BÜ
�2Ó
€Cä
�ŠˆsÔ€AØÒØ	ŒR�VŠV�D‹\ÕˆØ�8‰8�B—H‘HÓÐr   c                   ót   a € ] tR t^Ct o ]! . RO4      t]! . RO4      tR t]R 4       t	]R 4       t
R tRtV tR# )	Ú
TensorDatac                ó  € \        VP                  4       4      V n        VP                  4        FÔ  w  r#V\        P
                  9  d"   \        R V: R\        P
                   R24      hV\        P                  9   dy   \        VR4      '       g   \        R\        V4       RV: 24      hVP                  \        P                  \        P                  39  d   \        RVP                   RV: 24      h\        WV4       KÖ  	  R# )zUnexpected value z not in Ú.r   úUnexpected type z for k=zUnexpected dtype N)ÚlistÚkeysÚ_attrsÚitemsr5   Ú_allowedÚ
ValueErrorÚ_floatsÚhasattrÚtyper   r   Úfloat16r.   Úsetattr)ÚselfÚkwargsÚkÚvs   &,  r   Ú__init__ÚTensorData.__init__G   sÏ   € Ü˜6Ÿ;™;›=Ó)ˆŒØ—L‘L–N‰DˆAØœ
×+Ñ+Ô+Ü Ð#4°Q±E¸Ä*×BUÑBUÐAVÐVWÐ!XÓYÐYØ”J×&Ñ&Ô&Ü˜q '×*Ò*Ü$Ð'7¼¸Q»°yÀÈÁuÐ%MÓNÐNØ—7‘7¤2§:¡:¬r¯z©zÐ":Ô:Ü$Ð'8¸¿¹¸	ÀÈÉÐ%NÓOÐOÜ�D˜QÖó #r   c                óª   € \        V R 4      '       d   \        V R4      '       g   \        R\        V 4       R24      hV P                  V P                  3# )ÚlowestÚhighestz0Attributes 'lowest' and/or 'highest' missing in r7   )r@   ÚAttributeErrorÚdirrK   rL   ©rD   s   &r   Úrange_valueÚTensorData.range_valueS   sL   € ä�t˜X×&Ò&¬g°d¸I×.FÒ.FÜ Ð#SÔTWÐX\ÓT]ÐS^Ð^_Ð!`ÓaÐaØ—‘˜TŸ\™\Ð*Ð*r   c                óª   € \        V R 4      '       d   \        V R4      '       g   \        R\        V 4       R24      hV P                  V P                  3# )ÚavgÚstdz)Attributes 'avg' and/or 'std' missing in r7   )r@   rM   rN   rS   rT   rO   s   &r   Úavg_stdÚTensorData.avg_stdY   sI   € ä�t˜U×#Ò#¬7°4¸×+?Ò+?Ü Ð#LÌSÐQUËYÈKÐWXÐ!YÓZÐZØ—‘˜$Ÿ(™(Ð#Ð#r   c                óŠ   € V P                    Uu/ uF  q\        W4      bK  	  ppV P                  P                  VR &   V# u upi )ÚCLS)r;   ÚgetattrÚ	__class__Ú__name__)rD   rF   Údatas   &  r   Úto_dictÚTensorData.to_dict_   s?   € à-1¯[ª[Ó9©[¨”7˜4Ó#Ò#©[ˆÐ9Ø—n‘n×-Ñ-ˆˆU‰Øˆùò :s   �A )r;   N)rS   rT   rK   rL   ÚhistÚ
hist_edgesÚbins)rS   rT   rK   rL   r`   )r[   Ú
__module__Ú__qualname__Ú__firstlineno__Ú	frozensetr=   r?   rH   ÚpropertyrP   rU   r]   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r5   r5   C   sR   ø‡ € ÙÒZÓ[€HÙÒIÓJ€Gò
 ð ñ+ó ð+ð
 ñ$ó ð$÷
ð r   r5   c                   ób   a € ] tR t^ft o V 3R lR ltR tR tR tR tR t	R t
R	 tR
 tRtV tR# )ÚTensorsDatac                óF   <€ V ^8„  d   QhRS[ S[S[S[,          3,          /# )r   r\   )ÚdictÚstrr5   Útuple)r   rj   s   "€r   r   ÚTensorsData.__annotate__g   s#   ø€ ÷ ñ ±±c¹:ÉÕ;MÐ6MÕ1Nñ r   c           
     óÆ  € Wn         / V n        VP                  4        EF>  w  r4\        V\        4      '       g   \        R \        V4       R24      h\        V\        4      '       d¹   V\        P                  8X  d;   \        V4      ^8X  d+   \        V^ ,          V^,          R7      V P                  V&   K™  \        V4      ^8X  d;   \        V^ ,          V^,          V^,          V^,          R7      V P                  V&   Kã  \        RVR R\        V4       RV R24      h\        V\        4      '       g   \        R\        V4       R24      hW@P                  V&   EKA  	  R	# )
zKeys must be strings not r7   ©rK   rL   )rK   rL   r_   ra   zUnexpected tuple for Úrz	, it has z elements: zValues must be TensorData not N)Úcalibration_methodr\   r<   Ú
isinstancero   Ú	TypeErrorrA   rp   ÚCalibrationMethodÚMinMaxÚlenr5   )rD   ru   r\   rF   rG   s   &&&  r   rH   ÚTensorsData.__init__g   s"  € Ø"4ÔØˆŒ	Ø—J‘J—L‰DˆAÜ˜a¤×%Ò%ÜÐ";¼DÀ»G¸9ÀAÐ FÓGÐGÜ˜!œU×#Ò#Ø%Ô):×)AÑ)AÔAÄcÈ!ÃfÐPQÄkÜ#-°Q°qµTÀ1ÀQÅ4Ô#H�D—I‘I˜a‘LÙÜ�q“6˜Q”;Ü#-°Q°qµTÀ1ÀQÅ4ÈaÐPQÍdÐYZÐ[\ÕY]Ô#^�D—I‘I˜a‘LÙÜÐ"7¸¸!°u¸IÄcÈ!ÃfÀXÈ[ÐYZÐX[Ð[\Ð ]Ó^Ð^Ü˜a¤×,Ò,ÜÐ"@ÄÀaÃÀ	ÈÐ KÓLÐLØ�I‰I�aŒLó !r   c              #  ó:   "  € V P                    R j  x€L
  R #  L5i©N©r\   rO   s   &r   Ú__iter__ÚTensorsData.__iter__y   s   é € Ø—9‘9×Ôùs   ‚’“c                ó   € WP                   9   # r}   r~   ©rD   Úkeys   &&r   Ú__contains__ÚTensorsData.__contains__|   s   € Ø—i‘iÑÐr   c                ó(   € V P                   V,          # r}   r~   r‚   s   &&r   Ú__getitem__ÚTensorsData.__getitem__   s   € Ø�y‰y˜�~Ðr   c                ób   € WP                   9  d   \        R V: R24      hW P                   V&   R# )z)Only an existing tensor can be modified, z is not.N)r\   ÚRuntimeError)rD   rƒ   Úvalues   &&&r   Ú__setitem__ÚTensorsData.__setitem__‚   s-   € Ø—i‘iÔÜÐ!JÈ3É'ÐQYÐZÓ[Ð[Ø�	‰	�#‹r   c                ó6   € V P                   P                  4       # r}   )r\   r:   rO   s   &r   r:   ÚTensorsData.keys‡   s   € Ø�y‰y�~‰~ÓÐr   c                ó6   € V P                   P                  4       # r}   )r\   ÚvaluesrO   s   &r   r‘   ÚTensorsData.valuesŠ   s   € Ø�y‰y×ÑÓ!Ð!r   c                ó6   € V P                   P                  4       # r}   )r\   r<   rO   s   &r   r<   ÚTensorsData.items�   s   € Ø�y‰y�‰Ó Ð r   c                óf   € R V P                   P                  RV P                  RV P                  /pV# )rX   r\   ru   )rZ   r[   r\   ru   )rD   r\   s   & r   r]   ÚTensorsData.to_dict�   s5   € ð �4—>‘>×*Ñ*Ø�D—I‘IØ  $×"9Ñ"9ð
ˆð
 ˆr   )ru   r\   N)r[   rb   rc   rd   rH   r   r„   r‡   rŒ   r:   r‘   r<   r]   rg   rh   ri   s   @r   rl   rl   f   s<   ø‡ € ÷ð ò$ò òòò
 ò"ò!÷ð r   rl   c                   ó&   € ] tR t^št^ t^t^t^tRtR# )rx   © N)	r[   rb   rc   rd   ry   ÚEntropyÚ
PercentileÚDistributionrg   r˜   r   r   rx   rx   š   s   † Ø€FØ€GØ€JØ„Lr   rx   c                   ó„   a € ] tR t^¡t o ]R 4       t]P                  V 3R lR l4       tR t	R t
R tV 3R lR ltR	tV tR
# )ÚCalibrationDataReaderc                óp   € \        VR 4      ;'       d    \        VP                  4      ;'       g    \        # )Úget_next)r@   ÚcallablerŸ   ÚNotImplemented)ÚclsÚsubclasss   &&r   Ú__subclasshook__Ú&CalibrationDataReader.__subclasshook__¢   s+   € ä˜ *Ó-×MÐM´(¸8×;LÑ;LÓ2M×`Ð`ÔR`Ð`r   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   )rn   )r   rj   s   "€r   r   Ú"CalibrationDataReader.__annotate__§   s   ø€ ÷ "ñ "™$ñ "r   c                ó   € \         h)z9generate the input data dict for ONNXinferenceSession run©ÚNotImplementedErrorrO   s   &r   rŸ   ÚCalibrationDataReader.get_next¦   s
   € ô "Ð!r   c                ó   € V # r}   r˜   rO   s   &r   r   ÚCalibrationDataReader.__iter__«   s   € Øˆr   c                ó:   € V P                  4       pVf   \        hV# r}   )rŸ   ÚStopIteration)rD   Úresults   & r   Ú__next__ÚCalibrationDataReader.__next__®   s   € Ø—‘“ˆØŠ>ÜÐØˆr   c                ó   € \         hr}   rª   rO   s   &r   Ú__len__ÚCalibrationDataReader.__len__´   ó   € Ü!Ð!r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   Ústart_indexÚ	end_index)r'   )r   rj   s   "€r   r   r¨   ·   s   ø€ ÷ "ñ "¡Sð "±Sñ "r   c                ó   € \         hr}   rª   )rD   r¹   rº   s   &&&r   Ú	set_rangeÚCalibrationDataReader.set_range·   r·   r   r˜   N)r[   rb   rc   rd   Úclassmethodr¤   ÚabcÚabstractmethodrŸ   r   r²   rµ   r¼   rg   rh   ri   s   @r   r�   r�   ¡   sL   ø‡ € Øñaó ðað 	×Ñ÷"ó ð"òòò"÷"ö "r   r�   )Ú	metaclassc                   óŒ   a € ] tR t^»t o RV 3R lR lltR.3R ltR tV 3R lR ltR	 tR
 t	V 3R lR lt
V 3R lR ltRtV tR# )ÚCalibraterBaseNc                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# ©r   Ú
model_pathÚop_types_to_calibrateN©ro   r   r   )r   rj   s   "€r   r   ÚCalibraterBase.__annotate__¼   s,   ø€ ÷  <ñ  <á™$•Jð <ñ  (©�}¨tÕ3ñ <r   c                ó2  € \        V\        4      '       d   \        \        V4      4      V n        M2\        V\        4      '       d   \        V4      V n        M\        R4      hW n        W0n        W@n        WPn	        W`n
        RV n        RV n        R.V n        R# )aä  
:param model_path: ONNX model to calibrate. It should be a model file path
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param symmetric: make range of tensor symmetric (central point is 0).
:param use_external_data_format: use external data format to store model which size is >= 2Gb.
:param per_channel: whether to compute ranges per each channel.
z model_path should be model path.NÚCPUExecutionProvider)rv   ro   r   r   Úmodelr>   rÇ   Úaugmented_model_pathÚ	symmetricÚuse_external_data_formatÚper_channelÚaugment_modelÚinfer_sessionÚexecution_providers)rD   rÆ   rÇ   rÍ   rÎ   rÏ   rÐ   s   &&&&&&&r   rH   ÚCalibraterBase.__init__¼   s   € ô" �j¤#×&Ò&Ü4´T¸*Ó5EÓFˆD�JÜ˜
¤D×)Ò)Ü4°ZÓ@ˆD�JäÐ?Ó@Ð@à%:Ô"Ø$8Ô!Ø"ŒØ(@Ô%Ø&Ôà!ˆÔØ!ˆÔØ$:Ð#;ˆÖ r   rË   c                ó2   € Wn         V P                  4        R# )zj
reset the execution providers to execute the collect_data. It triggers to re-creating inference session.
N)rÓ   Úcreate_inference_session)rD   rÓ   s   &&r   Úset_execution_providersÚ&CalibraterBase.set_execution_providersÞ   s   € ð $7Ô Ø×%Ñ%Ö'r   c                óÒ   € \         P                  ! 4       p\         P                  P                  Vn        \         P
                  ! V P                  VV P                  R7      V n        R# )z)
create an OnnxRuntime InferenceSession.
)Úsess_optionsÚ	providersN)	ÚonnxruntimeÚSessionOptionsÚGraphOptimizationLevelÚORT_DISABLE_ALLÚgraph_optimization_levelÚInferenceSessionrÍ   rÓ   rÒ   )rD   rÚ   s   & r   rÖ   Ú'CalibraterBase.create_inference_sessionå   sN   € ô #×1Ò1Ó3ˆÜ0;×0RÑ0R×0bÑ0bˆÔ-Ü(×9Ò9Ø×%Ñ%Ø%Ø×.Ñ.ô
ˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# )r   rÌ   )r   )r   rj   s   "€r   r   rÉ   ñ   s   ø€ ÷ 1ñ 1±ñ 1r   c                ó  € VP                   P                   Uu/ uF  q"P                  VbK  	  ppTP                  VP                   P                   Uu/ uF  qDP                  VbK  	  up4       TP                  VP                   P
                   Uu/ uF  qUP                  VbK  	  up4       VP                   P                   Uu0 uF  qfP                  kK  	  pp\        4       p\        P                  \        P                  0p	VP                   P                   F×  p
V P                  '       d   V
P                  V P                  9   g   K2  \        P                  ! V
P
                  V
P                  4       Fv  pW³9   g   K  W;,          pVP                   P#                  R4      '       g   K6  VP                   P$                  P&                  V	9   g   K]  W·9  g   Ke  VP)                  V4       Kx  	  KÙ  	  Wƒ3# u upi u upi u upi u upi )z¡
select input/output tensors of candidate nodes to calibrate.
returns:
    tensors (set): set of tensor name.
    value_infos (dict): tensor name to value info.
Útensor_type)ÚgraphÚ
value_infoÚnameÚupdateÚoutputÚinputÚinitializerÚsetr   ÚFLOATÚFLOAT16ÚnoderÇ   Úop_typeÚ	itertoolsÚchainrA   ÚHasFieldrå   Ú	elem_typeÚadd)rD   rÌ   ÚviÚvalue_infosÚotÚitÚinitrì   Útensors_to_calibrateÚtensor_type_to_calibraterð   Útensor_names   &&          r   Úselect_tensors_to_calibrateÚ*CalibraterBase.select_tensors_to_calibrateñ   s‚  € ð .3¯[©[×-CÒ-CÓDÑ-C r—w‘w ’{Ñ-CˆÐDØ×Ñ°%·+±+×2DÒ2DÓEÑ2D¨BŸG™G RšKÑ2DÑEÔFØ×Ñ°%·+±+×2CÒ2CÓDÑ2C¨BŸG™G RšKÑ2CÑDÔEØ-2¯[©[×-DÒ-DÓEÑ-D T—y”yÑ-DˆÐEä"›uÐÜ$/×$5Ñ$5´{×7JÑ7JÐ#KÐ à—K‘K×$Ô$ˆDØ×-×-Ð-°·±À×A[ÑA[Ö1[Ü#,§?¢?°4·:±:¸t¿{¹{Ö#K�KØ"Ö1Ø(Õ5˜àŸG™G×,Ñ,¨]×;Ô;Ø!#§¡×!4Ñ!4×!>Ñ!>ÐBZÖ!ZØ!,Ö!?à0×4Ñ4°[ÖAó $Lñ %ð $Ð0Ð0ùò) EùÚEùÚDùÚEs   ™G:ÁG?ÂHÃH	c                ó   € V P                   # )z@
return: augmented onnx model. Call after calling augment_graph
)rÌ   rO   s   &r   Úget_augment_modelÚ CalibraterBase.get_augment_model  s   € ð �z‰zÐr   c                ó   € \         h)zÏ
abstract method: augment the input model to prepare for collecting data. It will:
    1. augment the model to be able to collect desired statistics data
    2. save augmented model to augmented_model_paths
rª   rO   s   &r   Úaugment_graphÚCalibraterBase.augment_graph  s
   € ô "Ð!r   c                ó    <€ V ^8„  d   QhRS[ /# ©r   Údata_reader©r�   )r   rj   s   "€r   r   rÉ     s   ø€ ÷ "ñ "Ñ(=ñ "r   c                ó   € \         h)zp
abstract method: collect the tensors that will be used for range computation. It can be called multiple times.
rª   )rD   r	  s   &&r   Úcollect_dataÚCalibraterBase.collect_data  ó
   € ô "Ð!r   c                ó    <€ V ^8„  d   QhRS[ /# r§   ©rl   )r   rj   s   "€r   r   rÉ   "  s   ø€ ÷ "ñ "™kñ "r   c                ó   € \         h)zU
abstract method: compute data based on the calibration method stored in TensorsData
rª   rO   s   &r   Úcompute_dataÚCalibraterBase.compute_data"  r  r   )	rÑ   rÍ   rÓ   rÒ   rÌ   rÇ   rÐ   rÎ   rÏ   )Núaugmented_model.onnxFFF)r[   rb   rc   rd   rH   r×   rÖ   rÿ   r  r  r  r  rg   rh   ri   s   @r   rÃ   rÃ   »   sK   ø‡ € ÷ <ò  <ðD <RÐ:Rô (ò

÷1ð 1ò:ò"÷"ð "÷"ö "r   rÃ   c                   óx   a a€ ] tR tRt oRV3R lV 3R llltR tR tV3R lR ltR tV3R	 lR
 lt	Rt
VtV ;t# )ÚMinMaxCalibrateri)  c                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# rÅ   rÈ   )r   rj   s   "€r   r   ÚMinMaxCalibrater.__annotate__*  s0   ø€ ÷ 'Añ 'Aá™$•Jð'Añ  (©�}¨tÕ3ñ'Ar   c
           	     ó–  <€ \         SV `  VVVVVV	R7       . V n        RV n        \	        V P
                  P                  P                  4      V n        V P
                  P                  P                   U
u0 uF  qªP                  kK  	  up
V n
        W`n        V'       d   V^ 8  g   V^8”  d   \        R4      hWpn        W€n        R# u up
i )a'  
:param model_path: ONNX model to calibrate. It is a model path
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param symmetric: make range of tensor symmetric (central point is 0).
:param use_external_data_format: use external data format to store model which size is >= 2Gb
:param moving_average: compute the moving average of the minimum and maximum values instead of the global minimum and maximum.
:param averaging_constant: constant smoothing factor to use when computing the moving average.
:param max_intermediate_outputs: maximum number of intermediate outputs before an intermediate range is computed.
:param per_channel: whether to compute ranges per each channel.
)rÇ   rÍ   rÎ   rÏ   rÐ   Nz;Invalid averaging constant, which should not be < 0 or > 1.)ÚsuperrH   Úintermediate_outputsÚcalibrate_tensors_rangerz   rÌ   ræ   rê   Únum_model_outputsrè   Úmodel_original_outputsÚmoving_averager>   Úaveraging_constantÚmax_intermediate_outputs)rD   rÆ   rÇ   rÍ   rÎ   rÏ   r  r   r!  rÐ   rê   rZ   s   &&&&&&&&&& €r   rH   ÚMinMaxCalibrater.__init__*  sº   ø€ ô. 	‰ÑØØ"7Ø!5ØØ%=Ø#ð 	ô 	
ð %'ˆÔ!Ø'+ˆÔ$Ü!$ T§Z¡Z×%5Ñ%5×%<Ñ%<Ó!=ˆÔØAEÇÁ×AQÑAQ×AXÒAXÓ&YÑAX°v§{¤{ÑAXÑ&YˆÔ#Ø,ÔßÐ1°AÔ5Ð9KÈaÔ9OÜÐZÓ[Ð[Ø"4ÔØ(@Ö%ùò 'Zs   Á5Cc                ó"  a aaa€ S P                  S P                  4      w  r\        \        P                  ! 4       4      o\
        P                  ! \        P                  ! R	.\        P                  R7      S4      pS P                  P                  P                  P                  V4       R oV 3R loVVVV 3R lpV F  pV! VR4       V! VR4       K  	  \        P                  ! S P                  S P                  S P                   R7       R# )
z¹
Adds ReduceMin and ReduceMax nodes to all quantization_candidates op type nodes in
model and ensures their outputs are stored as part of the graph output
:return: augmented ONNX model
r   c                 óÀ   € VP                    F@  p\        P                  P                  WP                  4      '       g   K4  VP
                  u # 	  \        R V  R24      h)z&Model does not contain a version for 'z'.)Úopset_importÚonnxÚdefsÚhasÚdomainÚversionrŠ   )rñ   rÌ   r%  s   && r   Úget_op_versionÚ6MinMaxCalibrater.augment_graph.<locals>.get_op_version^  sO   € Ø %× 2Ô 2�Ü—9‘9—=‘= ×*=Ñ*=×>Ô>Ø'×/Ñ/Ò/ñ !3ô Ð!GÈÀyÐPRÐSÓTÐTr   c                 óT  <a € \        V 3R  l\        SP                  P                  P                  4       4       \        SP                  P                  P                  4      4      pV F;  pSP                  P                  P                  P                  W#4       V^,          pK=  	  R# )c              3   óR   <"  € T F  w  rSVP                   9   g   K  Vx € K  	  R # 5ir}   )rë   )Ú.0ÚiÚxrþ   s   &  €r   Ú	<genexpr>ÚGMinMaxCalibrater.augment_graph.<locals>.insert_nodes.<locals>.<genexpr>f  s%   øé € ÐZÑ?‘t�qÀ;ÐRS×RYÑRYÑCY—’Ó?ùs   ƒ'�
'N)ÚnextÚ	enumeraterÌ   ræ   rð   rz   Úinsert)rþ   Ú	new_nodesÚindexrð   rD   s   f&  €r   Úinsert_nodesÚ4MinMaxCalibrater.augment_graph.<locals>.insert_nodesd  sx   ù€ ÜÜZœy¨¯©×)9Ñ)9×)>Ñ)>Ô?ÓZÔ\_Ð`d×`jÑ`j×`pÑ`p×`uÑ`uÓ\vóˆEó "�Ø—
‘
× Ñ ×%Ñ%×,Ñ,¨UÔ9Ø˜•
’ó "r   c                 ó,  <€ ^pV R,           V,           pVR,           p\         P                  P                  W.V.W#R7      p\         P                  P                  RVS.V.VR7      pSP                  P                  P
                   Uu/ uF  qwP                  VbK  	  ppTP                  SP                  P                  P                   U	u/ uF  q™P                  V	bK  	  up	4       TP                  SP                  P                  P                   U
u/ uF  qªP                  V
bK  	  up
4       W9   d(   W€,          P                  P                  P                  pM\        RV : R24      hSP                  '       Ed5   \        W€,          P                  P                  P                   P"                  4      p^ .\%        ^V4      OpS! VSP                  4      ^8  d2   VP&                  P)                  \        P*                  ! RV4      4       M£\-        \.        P0                  ! 4       4      p\2        P4                  ! \6        P8                  ! V\6        P:                  R	7      V4      pVP                  P)                  V4       SP                  P                  P<                  P)                  V4       S! WV.4       SP                  P                  P                  P)                  \        P>                  ! W;R
.4      4       R
# u upi u up	i u up
i )é   Ú_Ú_Reshape)r*   rè   ÚReshape)ÚinputsÚoutputsrè   z'Unable to guess tensor type for tensor zE, running shape inference before quantization may resolve this issue.Úaxesr   N) r&  r   Ú	make_noderÌ   ræ   rç   rè   ré   rê   rë   rA   rå   rõ   r>   rÐ   rz   r   ÚdimÚrangeÚ	attributeÚappendÚmake_attributero   ÚuuidÚuuid4r	   Ú
from_arrayr   ÚarrayÚint64rì   Úmake_tensor_value_info)rþ   Úreduce_op_namer*   Úreduce_outputÚintermediate_outputÚreduce_nodeÚreshape_noder÷   rø   Úor0  Ú	onnx_typeÚtensor_rankÚreduced_axesÚreduce_axes_nameÚreduce_axesr+  r9  Úreshape_shape_namerD   s   &&              €€€€r   Úadd_reduce_min_maxÚ:MinMaxCalibrater.augment_graph.<locals>.add_reduce_min_maxl  s€  ø€ ð ˆHð (¨#Õ-°Õ>ˆMØ"/°*Õ"<ÐÜŸ+™+×/Ñ/Ø Ð0CÐ/DÈxð 0ó ˆKô  Ÿ;™;×0Ñ0ØØ+Ð-?Ð@Ø&˜Ø(ð	 1ó ˆLð 26·±×1AÑ1A×1LÒ1LÓMÑ1L¨2Ÿ7™7 Bš;Ñ1LˆKÐMØ×Ñ°4·:±:×3CÑ3C×3JÒ3JÓKÑ3J¨a§¡¨¢	Ñ3JÑKÔLØ×Ñ°4·:±:×3CÑ3C×3IÒ3IÓJÑ3I¨a§¡¨¢	Ñ3IÑJÔKØÔ)Ø'Õ4×9Ñ9×EÑE×OÑO‘	ä Ø=¸k¹_ð MZð Zóð ð ××ÑÜ! +Õ":×"?Ñ"?×"KÑ"K×"QÑ"Q×"UÑ"UÓV�Ø !Ð:¤E¨!¨[Ó$9Ð:�á! .°$·*±*Ó=ÀÔBØ×)Ñ)×0Ñ0´×1FÒ1FÀvÈ|Ó1\Õ]ä'*¬4¯:ª:«<Ó'8Ð$Ü".×"9Ò"9¼"¿(º(À<ÔWY×W_ÑW_Ô:`ÐbrÓ"s�KØ×%Ñ%×,Ñ,Ð-=Ô>Ø—J‘J×$Ñ$×0Ñ0×7Ñ7¸ÔDá˜°LÐ&AÔBØ�J‰J×Ñ×#Ñ#×*Ñ*¬6×+HÒ+HÈÐdhÐciÓ+jÖkùò3 NùÚKùÚJs   Â	LÃLÄLÚ	ReduceMinÚ	ReduceMax©Úsave_as_external_dataNéÿÿÿÿ)rÿ   rÌ   ro   rI  rJ  r	   rK  r   rL  rM  ræ   rì   rG  r&  ÚsaverÍ   rÏ   )	rD   Útensorsr=  Úreshape_shaper[  Útensorr+  r9  rZ  s	   f     @@@r   r  ÚMinMaxCalibrater.augment_graphS  sÍ   û€ ð ×5Ñ5°d·j±jÓA‰
ˆÜ ¤§¢£Ó.ÐÜ$×/Ò/´·²¸"¸ÄRÇXÁXÔ0NÐPbÓcˆØ�
‰
×Ñ×$Ñ$×+Ñ+¨MÔ:ò	Uõ	÷,	lð ,	ló\ ˆFÙ˜v {Ô3Ù˜v {Ö3ñ ô 	�	Š	Ø�J‰JØ×%Ñ%Ø"&×"?Ñ"?÷	
r   c                ó   € . V n         R # r}   ©r  rO   s   &r   Úclear_collected_dataÚ%MinMaxCalibrater.clear_collected_data¤  ó
   € Ø$&ˆÖ!r   c                ó    <€ V ^8„  d   QhRS[ /# r  r
  )r   rj   s   "€r   r   r  §  s   ø€ ÷ $ñ $Ñ(=ñ $r   c           	     óì  €  VP                  4       pV'       g   MÒV P                  P                  \        V P                  P                  4       V P                  P                  RV4      RR7       UUu. uF$  w  r4VP                  V P                  9  d   TMRNK&  	  upp4       V P                  f   K´  \        V P                  4      V P                  8X  g   KÚ  V P                  4        Kì  \        V P                  4      ^ 8X  d   V P                  f   \        R4      hV P                  4       p\        V\         4      '       g   \#        R\%        V4       R24      hV P                  4        R# u uppi )TNF©ÚstrictúNo data is collected.z+compute_data must return a TensorsData not r7   )rŸ   r  rG  ÚziprÒ   Úget_outputsÚrunrè   r  r!  rz   ri  r  r>   r  rv   rl   rw   rA   )rD   r	  r@  Úsess_or‹   Úts   &&    r   r  ÚMinMaxCalibrater.collect_data§  s;  € ØØ ×)Ñ)Ó+ˆFßØØ×%Ñ%×,Ñ,ô *-Ø×*Ñ*×6Ñ6Ó8¸$×:LÑ:L×:PÑ:PÐQUÐW]Ó:^Ðglõ*ôñ*™˜ð $Ÿ[™[°×0KÑ0KÔK‘EÐQUÒUñ*òôð ×-Ñ-Ô9Ü˜×1Ñ1Ó2°d×6SÑ6SÖSà×)Ñ)Ö+äˆt×(Ñ(Ó)¨QÔ.°4×3OÑ3OÒ3WÜÐ4Ó5Ð5à×ÑÓˆÜ˜!œ[×)Ò)ÜÐIÌ$ÈqË'ÈÐRSÐTÓUÐUØ×!Ñ!Ö#ùó's   Á3*E0
c                óâ  € V'       g   V# VP                  4        EFO  w  r4\        V\        4      '       d(   VP                  ^ ,          pVP                  ^,          pMVw  rV\        W#,          \        4      '       d4   W#,          P                  ^ ,          pW#,          P                  ^,          pM
W#,          w  rxV P                  '       d@   WPP
                  Wu,
          ,          ,           p	W`P
                  W†,
          ,          ,           p
M\        WW4      p	\        Wh4      p
\        V\        4      '       g   \        W#,          \        4      '       d   \        WšR7      W#&   EKJ  Wš3W#&   EKR  	  V# )r   rs   )r<   rv   r5   rP   r  r   ÚminÚmax)rD   Ú	old_rangeÚ	new_rangerƒ   r‹   Úold_minÚold_maxÚnew_minÚnew_maxÚ	min_valueÚ	max_values   &&&        r   Úmerge_rangeÚMinMaxCalibrater.merge_rangeÂ  s  € ßØÐà#Ÿ/™/×+‰JˆCä˜%¤×,Ò,Ø×+Ñ+¨AÕ.�Ø×+Ñ+¨AÕ.‘à#(Ñ �ä˜)�.¬*×5Ò5Ø#�.×4Ñ4°QÕ7�Ø#�.×4Ñ4°QÕ7‘à#,¥>Ñ �à×"×"Ð"Ø#×&=Ñ&=ÀÕARÕ&SÕS�	Ø#×&=Ñ&=ÀÕARÕ&SÕS‘	ä Ó1�	Ü Ó1�	ô ˜%¤×,Ò,´
¸9½>Ì:×0VÒ0VÜ!+°9Ô!P�	”à"+Ð!7�	”ñ3 ,ð6 Ðr   c                ó    <€ V ^8„  d   QhRS[ /# r§   r  )r   rj   s   "€r   r   r  ã  s   ø€ ÷ 3,ñ 3,™kñ 3,r   c                ó®  € \        V P                  4      ^ 8X  d   V P                  # \        \        V P                  ^ ,          4      4       Uu. uF-  qP                  P                  4       V,          P                  NK/  	  ppV P                   Uu. uF  p\        \        W#RR7      4      NK  	  pp/ pV F=  pVP                  4        F&  w  rxVP                  V. 4      P                  V4       K(  	  K?  	  W P                  R p	\        ^ \        V	4      ^4       Uu. uF!  qV,          P                  R4      ^ ,          NK#  	  p
pV Uu/ uF  qV P                  9  g   K  WV,          bK   	  pp. p\        ^ \        V	4      ^4       EF6  pV P                  '       dS   \         P"                  ! W¹V,          ,          ^ R7      p\         P"                  ! W¹V^,           ,          ,          ^ R7      pMQ\         P$                  ! W¹V,          ,          ^ R7      p\         P&                  ! W¹V^,           ,          ,          ^ R7      pV P(                  '       dZ   \         P&                  ! \         P*                  ! V4      \         P*                  ! V4      .^ R7      pVP                  V) V34       EK$  VP                  WÞ34       EK9  	  \-        \.        P0                  \        \        W¬RR7      4      4      pV P                  '       d.   V P3                  V P                  V4      V n        V P                  # VV n        V P                  # u upi u upi u upi u upi )zt
Compute the min-max range of tensor
:return: dictionary mapping: {added node names: (ReduceMin, ReduceMax) pairs }
Frn  Nr=  r+   )rz   r  r  rE  rÒ   rr  rè   rn   rq  r<   Ú
setdefaultrG  r  Ú
rpartitionr  r  r   ÚnanmeanÚnanminÚnanmaxrÎ   Úabsrl   rx   ry   r‚  )rD   r0  Úoutput_namesrQ  Úoutput_dicts_listÚmerged_output_dictÚdrF   rG   Úadded_output_namesÚcalibrate_tensor_namesÚmerged_added_output_dictÚpairsÚmin_value_arrayÚmax_value_arrayÚmax_absolute_valueÚnew_calibrate_tensors_ranges   &                r   r  ÚMinMaxCalibrater.compute_dataã  sñ  € ô ˆt×(Ñ(Ó)¨QÔ.Ø×/Ñ/Ð/äJOÔPSÐTX×TmÑTmÐnoÕTpÓPqÔJrÓsÑJrÀQ×*Ñ*×6Ñ6Ó8¸Õ;×@Ô@ÑJrˆÐsð (,×'@Ò'@ó
á'@Ð#ô ”�\¸uÔEÖFÙ'@ð 	ð 
ð
  ÐÛ"ˆAØŸ™ž	‘�Ø"×-Ñ-¨a°Ó4×;Ñ;¸AÖ>ó "ñ #ð *×*@Ñ*@Ð*BÐCÐä>CÀAÄsÐK]ÓG^Ð`aÔ>bó"
Ù>b¸˜qÕ!×,Ñ,¨SÓ1°!×4Ð4Ñ>bð 	ð "
ñ
 /Aó$
Ù.@¨ÈT×MhÑMhÑDhÔ$ˆA !Õ$Ò$Ñ.@ð 	!ð $
ð ˆÜ�qœ#Ð0Ó1°1×5ˆAØ×"×"Ð"Ü"$§*¢*Ð-EÐYZÕF[Õ-\ÐcdÔ"e�Ü"$§*¢*Ð-EÐYZÐ]^ÕY^ÕF_Õ-`ÐghÔ"i‘ä"$§)¢)Ð,DÐXYÕEZÕ,[ÐbcÔ"d�Ü"$§)¢)Ð,DÐXYÐ\]ÕX]ÕE^Õ,_ÐfgÔ"h�à�~�~ˆ~Ü%'§Y¢Y´·²°Ó0GÌÏÊÐP_ÓI`Ð/aÐhiÔ%jÐ"Ø—‘Ð1Ð1Ð3EÐF×Gà—‘˜oÐ?×@ñ 6ô '2Ü×$Ñ$¤d¬3Ð/EÐUZÔ+[Ó&\ó'
Ð#ð ×'×'Ð'Ø+/×+;Ñ+;¸D×<XÑ<XÐZuÓ+vˆDÔ(ð ×+Ñ+Ð+ð ,GˆDÔ(à×+Ñ+Ð+ùòU tùò
ùò"
ùò$
s   Á3MÂMÄ'MÅ
MÅ!M)r   r  r  r!  r  r  r  )Nr  FFFç{®Gáz„?NF)r[   rb   rc   rd   rH   r  ri  r  r‚  r  rg   rh   Ú__classcell__©rZ   rj   s   @@r   r  r  )  s=   ù‡ € ÷'Aõ 'AòRO
òb'÷$ð $ò6÷B3,÷ 3,ð 3,r   r  c                   ór   a a€ ] tR tRt oRV3R lV 3R llltR tR tV3R lR ltV3R lR	 ltR
t	Vt
V ;t# )ÚHistogramCalibrateri  c                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# rÅ   rÈ   )r   rj   s   "€r   r   Ú HistogramCalibrater.__annotate__  s,   ø€ ÷ *!ñ *!á™$•Jð*!ñ  (©�}¨tÕ3ñ*!r   c                ó†  <€ \         SV `  VVVVVR7       . V n        RV n        \	        V P
                  P                  P                  4      V n        V P
                  P                  P                   Uu0 uF  q»P                  kK  	  upV n
        RV n        WPn        Wpn        W€n        W�n        RV n        W n        R# u upi )aå  
:param model_path: ONNX model to calibrate. It is a model path.
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param use_external_data_format: use external data format to store model which size is >= 2Gb
:param method: A string. One of ['entropy', 'percentile'].
:param symmetric: make range of tensor symmetric (central point is 0).
:param num_bins: number of bins to create a new histogram for collecting tensor values.
:param num_quantized_bins: number of quantized bins. Default 128.
:param percentile: A float number between [0, 100]. Default 99.99.
:param scenario: see :class:`DistributionCalibrater`
)rÇ   rÍ   rÎ   rÏ   N)r  rH   r  r  rz   rÌ   ræ   rê   r  rè   r  Ú	collectorÚmethodÚnum_binsÚnum_quantized_binsÚ
percentilerü   Úscenario)rD   rÆ   rÇ   rÍ   rÏ   r¢  rÎ   r£  r¤  r¥  r¦  rê   rZ   s   &&&&&&&&&&& €r   rH   ÚHistogramCalibrater.__init__  s¯   ø€ ô2 	‰ÑØØ"7Ø!5ØØ%=ð 	ô 	
ð %'ˆÔ!Ø'+ˆÔ$Ü!$ T§Z¡Z×%5Ñ%5×%<Ñ%<Ó!=ˆÔØAEÇÁ×AQÑAQ×AXÒAXÓ&YÑAX°v§{¤{ÑAXÑ&YˆÔ#ØˆŒØŒØ ŒØ"4ÔØ$ŒØ$(ˆÔ!Ø Žùò 'Zs   Á4B>c                ón  € V P                  V P                  4      w  V n        pV P                   FJ  pW P                  9  g   K  V P                  P                  P
                  P                  W,          4       KL  	  \        P                  ! V P                  V P                  V P                  R7       R# )zk
make all quantization_candidates op type nodes as part of the graph output.
:return: augmented ONNX model
r_  N)rÿ   rÌ   rü   r  ræ   rê   rG  r&  rb  rÍ   rÏ   )rD   rø   re  s   &  r   r  Ú!HistogramCalibrater.augment_graphF  s‡   € ð
 26×1QÑ1QÐRV×R\ÑR\Ó1]Ñ.ˆÔ! ;Ø×/Ô/ˆFØ×8Ñ8Ö8Ø—
‘
× Ñ ×'Ñ'×.Ñ.¨{Õ/BÖCñ 0ô 	�	Š	Ø�J‰JØ×%Ñ%Ø"&×"?Ñ"?÷	
r   c                ó   € . V n         R # r}   rh  rO   s   &r   ri  Ú(HistogramCalibrater.clear_collected_dataV  rk  r   c                ó    <€ V ^8„  d   QhRS[ /# r  r
  )r   rj   s   "€r   r   rŸ  Y  s   ø€ ÷ 2$ñ 2$Ñ(=ñ 2$r   c                óú  € V P                   P                  4        Uu0 uF  q"P                  kK  	  ppV P                   P                  4        Uu. uF  q"P                  NK  	  pp VP	                  4       pV'       g   M”V P                   P                  RV4      p. p\        V4       FJ  w  r‰WH,          V9   d(   VP                  \        P                  ! V	4      4       K9  VP                  V	4       KL  	  V P                  P                  V4       K®  \        V P                  4      ^ 8X  d   \        R4      hV P                   U
u. uF  p
\        \        WJRR7      4      NK  	  pp
/ pV F=  pVP                  4        F&  w  rïVP                  V. 4      P                  V4       K(  	  K?  	  V Uu/ uF   pVV P                   9   g   K  VVV,          bK"  	  ppV P"                  '       gS   \%        V P&                  V P(                  V P*                  V P,                  V P.                  V P0                  R7      V n        V P"                  P3                  V4       V P5                  4        R# u upi u upi u up
i u upi )zi
Entropy Calibrator collects operators' tensors as well as generates tensor histogram for each operator.
Nrp  Frn  )r¢  rÎ   r£  r¤  r¥  r¦  )rÒ   Ú
get_inputsrè   rr  rŸ   rs  r5  rG  Úcopyr  rz   r>   rn   rq  r<   r†  rü   r¡  ÚHistogramCollectorr¢  rÎ   r£  r¤  r¥  r¦  Úcollectri  )rD   r	  Únode_argÚinput_names_setrŒ  r@  rA  Úfixed_outputsÚoutput_indexrê   rQ  r�  Úmerged_dictr�  rF   rG   r0  Úclean_merged_dicts   &&                r   r  Ú HistogramCalibrater.collect_dataY  s  € ð :>×9KÑ9K×9VÑ9VÔ9XÓYÑ9X¨XŸ=œ=Ñ9XˆÐYØ6:×6HÑ6H×6TÑ6TÔ6VÓWÑ6V¨(ŸœÑ6VˆÐWàØ ×)Ñ)Ó+ˆFßØØ×(Ñ(×,Ñ,¨T°6Ó:ˆGð ˆMÜ(1°'Ö(:Ñ$�ØÕ-°Ô@Ø!×(Ñ(¬¯ª°6Ó):Ö;à!×(Ñ(¨Ö0ñ	 );ð ×%Ñ%×,Ñ,¨]Ö;äˆt×(Ñ(Ó)¨QÔ.ÜÐ4Ó5Ð5ð (,×'@Ò'@ó
á'@Ð#ô ”�\¸uÔEÖFÙ'@ð 	ð 
ð
 ˆÛ"ˆAØŸ™ž	‘�Ø×&Ñ& q¨"Ó-×4Ñ4°QÖ7ó "ñ #ñ 9DÓf¹°1ÀqÈD×LeÑLeÑGeÔ.˜Q ¨A¥Ò.¹ÐÐfà�~�~ˆ~Ü/Ø—{‘{ØŸ.™.ØŸ™Ø#'×#:Ñ#:ØŸ?™?ØŸ™ôˆDŒNð 	�‰×ÑÐ0Ô1à×!Ñ!Ö#ùò] ZùÚWùò,
ùò gs   �I)ÁI.ÅI3Æ0I8ÇI8c                ó    <€ V ^8„  d   QhRS[ /# r§   r  )r   rj   s   "€r   r   rŸ  �  s   ø€ ÷ Lñ L™kñ Lr   c                óœ  € V P                   '       g   \        R4      h\        V \        4      '       d   \        P
                  pMf\        V \        4      '       d   \        P                  pM?\        V \        4      '       d   \        P                  pM\        R\        V 4       R24      h\        WP                   P                  4       4      # )zh
Compute the min-max range of tensor
:return: dictionary mapping: {tensor name: (min value, max value)}
z9No collector created and can't generate calibration data.zUnknown calibrater z". This method must be overwritten.)r¡  r>   rv   ÚEntropyCalibraterrx   r™   ÚPercentileCalibraterrš   ÚDistributionCalibraterr›   rw   rA   rl   Úcompute_collection_result)rD   Úcals   & r   r  Ú HistogramCalibrater.compute_data�  s–   € ð
 �~�~ˆ~ÜÐXÓYÐYä�dÔ-×.Ò.Ü#×+Ñ+‰CÜ˜Ô2×3Ò3Ü#×.Ñ.‰CÜ˜Ô4×5Ò5Ü#×0Ñ0‰CäÐ1´$°t³*°Ð=_Ð`ÓaÐaÜ˜3§¡× HÑ HÓ JÓKÐKr   )r  r¡  r  r¢  r  r£  r  r¤  r¥  r¦  rü   )	Nr  Fr¥  Fé€   é   ç-²�ïÿX@Úsame)r[   rb   rc   rd   rH   r  ri  r  r  rg   rh   rš  r›  s   @@r   r�  r�    s7   ù‡ € ÷*!õ *!òX
ò '÷2$ð 2$÷hL÷ Lð Lr   r�  c                   óB   a a€ ] tR tRt oRV3R lV 3R llltRtVtV ;t# )r»  i   c                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# rÅ   rÈ   )r   rj   s   "€r   r   ÚEntropyCalibrater.__annotate__¡  ó,   ø€ ÷ 
ñ 
á™$•Jð
ñ  (©�}¨tÕ3ñ
r   c	                ó6   <€ \         S	V `  VVVVVVVVR7       R# )a|  
:param model_path: ONNX model to calibrate. It is a model path
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param use_external_data_format: use external data format to store model which size is >= 2Gb
:param method: A string. One of ['entropy', 'percentile', 'distribution'].
:param symmetric: make range of tensor symmetric (central point is 0).
:param num_bins: number of bins to create a new histogram for collecting tensor values.
:param num_quantized_bins: number of quantized bins. Default 128.
)r¢  rÎ   r£  r¤  N©r  rH   )
rD   rÆ   rÇ   rÍ   rÏ   r¢  rÎ   r£  r¤  rZ   s
   &&&&&&&&&€r   rH   ÚEntropyCalibrater.__init__¡  s/   ø€ ô* 	‰ÑØØ!Ø Ø$ØØØØ1ð 	ö 		
r   r˜   )Nr  Fr3   FrÁ  rÁ  ©r[   rb   rc   rd   rH   rg   rh   rš  r›  s   @@r   r»  r»     ó   ù‡ € ÷
÷ 
õ 
r   r»  c                   óB   a a€ ] tR tRt oRV3R lV 3R llltRtVtV ;t# )r¼  iÂ  c                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# rÅ   rÈ   )r   rj   s   "€r   r   Ú!PercentileCalibrater.__annotate__Ã  rÈ  r   c	                ó6   <€ \         S	V `  VVVVVVVVR7       R# )ag  
:param model_path: ONNX model to calibrate. It is a model path
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param use_external_data_format: use external data format to store model which size is >= 2Gb
:param method: A string. One of ['entropy', 'percentile', 'distribution'].
:param symmetric: make range of tensor symmetric (central point is 0).
:param num_quantized_bins: number of quantized bins. Default 128.
:param percentile: A float number between [0, 100]. Default 99.99.
)r¢  rÎ   r£  r¥  NrÊ  )
rD   rÆ   rÇ   rÍ   rÏ   r¢  rÎ   r£  r¥  rZ   s
   &&&&&&&&&€r   rH   ÚPercentileCalibrater.__init__Ã  s/   ø€ ô* 	‰ÑØØ!Ø Ø$ØØØØ!ð 	ö 		
r   r˜   )Nr  Fr¥  FrÂ  rÃ  rÌ  r›  s   @@r   r¼  r¼  Â  rÍ  r   r¼  c                   óB   a a€ ] tR tRt oRV3R lV 3R llltRtVtV ;t# )r½  iä  c                óT   <€ V ^8„  d   QhRS[ S[,          RS[S[ ,          R,          /# rÅ   rÈ   )r   rj   s   "€r   r   Ú#DistributionCalibrater.__annotate__å  s,   ø€ ÷ 
ñ 
á™$•Jð
ñ  (©�}¨tÕ3ñ
r   c           
     ó4   <€ \         SV `  VVVVVVVR7       R# )a,  
:param model_path: ONNX model to calibrate. It is a model path
:param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors.
:param augmented_model_path: save augmented model to this path.
:param use_external_data_format: use external data format to store model which size is >= 2Gb
:param method: A string. One of ['entropy', 'percentile', 'distribution'].
:param symmetric: make range of tensor symmetric (central point is 0).
:param num_bins: number of bins to create a new histogram for collecting tensor values.
:param scenario: for float 8 only, if `scenario="same"`,
    the algorithm weights and float 8 follow the same distribution,
    if `scenario="p3"`, it assumes the weights follow
    a gaussian law and float 8 ~ X^3 where X is a gaussian law
)r¢  r£  r¦  NrÊ  )	rD   rÆ   rÇ   rÍ   rÏ   r¢  r£  r¦  rZ   s	   &&&&&&&&€r   rH   ÚDistributionCalibrater.__init__å  s,   ø€ ô. 	‰ÑØØ!Ø Ø$ØØØð 	ö 	
r   r˜   )Nr  FÚdistributionrÁ  rÄ  rÌ  r›  s   @@r   r½  r½  ä  s   ù‡ € ÷
÷ 
õ 
r   r½  c                   ól   a € ] tR tRt o Rt]P                  R 4       t]P                  R 4       tRt	V t
R# )ÚCalibrationDataCollectori  zD
Base class for collecting data for calibration-based quantization.
c                ó   € \         h)zk
Generate informative data based on given data.
    name_to_arr : dict
        tensor name to NDArray data
rª   ©rD   Úname_to_arrs   &&r   r±  Ú CalibrationDataCollector.collect  s
   € ô "Ð!r   c                ó   € \         h)z/
Get the optimal result among collection data.
rª   rO   s   &r   r¾  Ú2CalibrationDataCollector.compute_collection_result  s
   € ô
 "Ð!r   r˜   N)r[   rb   rc   rd   Ú__doc__r¿   rÀ   r±  r¾  rg   rh   ri   s   @r   rÚ  rÚ    s>   ø‡ € ñð 	×Ññ"ó ð"ð 	×Ññ"ó ö"r   rÚ  c                   óz   a € ] tR tRt o RtR tR tR tR tR t	R t
R	 tR
 tR t]RR l4       tR tR tRtV tR# )r°  i  aL  
Collecting histogram for each tensor. Percentile and Entropy method are supported.

ref: https://github.com//apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py
ref: https://docs.nvidia.com/deeplearning/tensorrt/pytorch-quantization-toolkit/docs/_modules/
             pytorch_quantization/calib/histogram.html
c                ó\   € / V n         Wn        W n        W0n        W@n        WPn        W`n        R # r}   )Úhistogram_dictr¢  rÎ   r£  r¤  r¥  r¦  )rD   r¢  rÎ   r£  r¤  r¥  r¦  s   &&&&&&&r   rH   ÚHistogramCollector.__init__&  s)   € Ø ˆÔØŒØ"ŒØ ŒØ"4ÔØ$ŒØ Žr   c                ó   € V P                   # r}   )rä  rO   s   &r   Úget_histogram_dictÚ%HistogramCollector.get_histogram_dict/  s   € Ø×"Ñ"Ð"r   c                óü   € \        R 4       V P                  R9   d   V P                  V4      # V P                  R8X  d5   V P                  '       d   V P	                  V4      # V P                  V4      # \        R4      h)z/Collecting tensor data and making histogram ...r¥  úDOnly 'entropy', 'percentile' or 'distribution' methods are supported>   r3   rØ  )Úprintr¢  Úcollect_valuerÎ   Úcollect_absolute_valuer>   rÜ  s   &&r   r±  ÚHistogramCollector.collect2  sn   € ÜÐ?Ô@ð �;‰;Ð5Ô5Ø×%Ñ% kÓ2Ð2Ø�[‰[˜LÔ(Ø�~�~ˆ~Ø×2Ñ2°;Ó?Ð?à×)Ñ)¨+Ó6Ð6äÐcÓdÐdr   c                ó   € VP                  4        EF³  w  r#\        V\        4      '       d�   V F:  p\        V\        P                  4      '       d   K%  Q R\        V4       RV: 24       h	  V Uu0 uF  qUP                  kK  	  pp\        V4      ^8X  g   Q RV RV: 24       h\        P                  ! V4      pM=\        V\        P                  4      '       g   \        R\        V4       RV: 24      hTpVP                  4       pVP                  ^ 8”  d.   \        P                  ! V4      p\        P                  ! V4      p	MD\        P                  ! ^ VP                  R7      p\        P                  ! ^ VP                  R7      p	\        P                  ! V4      pW P                   9  dy   \        P"                  ! WpP$                  R7      w  r«VP'                  VP                  4      pVP                  \        P(                  8w  g   Q R4       hW«W‰3V P                   V&   EK  V P                   V,          pV^,          pV^,          p\+        VR4      '       g   Q R\        V4       24       h\+        VR4      '       g   Q R\        V4       24       hV^ ,          pV^,          p\        P                  ! V4      pVVR
,          8”  d]   V^,          V^ ,          ,
          p\        P,                  ! VR
,          V,           VV,           V4      p\        P.                  ! VV34      p\        P"                  ! VVR7      w  r«VP'                  VP                  4      pV
R	\        V4      ;;; V,          uuu% VP                  \        P(                  8w  g   Q R4       hW«\1        WØ4      \3        Wé4      3V P                   V&   EK¶  	  R	# u upi )z%
Collect histogram on absolute value
r8   z for tensor=z6The calibration expects only one element type but got r   )ra   zMonly float32 or float16 is supported, every constant must be explicitly typedr   z'old_min should be a numpy array but is Nra  )r<   rv   r9   r   r   rA   r   rz   r,   r>   ÚflattenÚsizer‰  rŠ  rL  Úabsoluterä  Ú	histogramr£  r-   Úfloat64r@   ÚarangeÚhstackrx  ry  )rD   rÝ  re  Údata_arrÚarrÚaÚdtypesÚdata_arr_npr€  r�  r_   r`   Úold_histogramr|  r}  Úold_histÚold_hist_edgesÚ	temp_amaxÚwidthÚnew_bin_edgess   &&                  r   rí  Ú)HistogramCollector.collect_absolute_valueA  sE  € ð !,× 1Ñ 1× 3ÑˆFÜ˜(¤D×)Ò)Û#�CÜ% c¬2¯:©:×6Ô6ÐlÐ:JÌ4ÐPSË9È+ÐUaÐbhÑakÐ8lÓlÐ6ñ $á+3Ó4©8 aŸ'œ'©8�Ð4Ü˜6“{ aÔ'ð ØLÈVÈHÐT`ÐagÑ`jÐkóÐ'ô !Ÿjšj¨Ó2‘Ü ¬"¯*©*×5Ò5Ü Ð#3´D¸³NÐ3CÀ<ÐPVÉzÐ!ZÓ[Ð[à&�Ø%×-Ñ-Ó/ˆKØ×Ñ !Ô#ÜŸIšI kÓ2�	ÜŸIšI kÓ2‘	äŸHšH Q¨k×.?Ñ.?Ô@�	ÜŸHšH Q¨k×.?Ñ.?Ô@�	äŸ+š+ kÓ2ˆKà×0Ñ0Ô0ä#%§<¢<°Ç-Á-Ô#PÑ �Ø'×.Ñ.¨{×/@Ñ/@ÓA�
Ø"×(Ñ(¬B¯J©JÔ6ð ØcóÐ6ð 04ÀÐ.V�×#Ñ# FÔ+à $× 3Ñ 3°FÕ ;�Ø'¨Õ*�Ø'¨Õ*�Ü˜w¨×0Ò0ÐkÐ4[Ô\`ÐahÓ\iÐ[jÐ2kÓkÐ0Ü˜w¨×0Ò0ÐkÐ4[Ô\`ÐahÓ\iÐ[jÐ2kÓkÐ0Ø(¨Õ+�Ø!.¨qÕ!1�ÜŸIšI kÓ2�	Ø˜~¨bÕ1Ô1à*¨1Õ-°¸qÕ0AÕA�Eä$&§I¢I¨n¸RÕ.@À5Õ.HÈ)ÐV[ÕJ[Ð]bÓ$c�MÜ%'§Y¢Y°ÀÐ/NÓ%O�NÜ#%§<¢<°À.Ô#QÑ �Ø'×.Ñ.¨{×/@Ñ/@ÓA�
Ø�_”s˜8“}Ó%¨Õ1Ó%Ø"×(Ñ(¬B¯J©JÔ6ð ØcóÐ6ð 04ÄÀWÓAXÔZ]Ð^eÓZqÐ.r�×#Ñ# FÔ+ói !4ùò 5s   Á1Oc           	     ó
  € VP                  4        EFm  w  r#\        P                  ! V4      pVP                  4       pVP                  ^ 8”  d.   \        P
                  ! V4      p\        P                  ! V4      pMD\        P                  ! ^ VP                  R7      p\        P                  ! ^ VP                  R7      p\        P                  ! \        \        V4      \        V4      4      VP                  R7      pW P                  9   d7   V P                  V,          pV P                  WsWEV4      V P                  V&   EK2  \        P                  ! W0P                  V) V3R7      w  r‰VV	VVV3V P                  V&   EKp  	  R# )z!
Collect histogram on real value
r   ©rE  N)r<   r   r,   rð  rñ  r‰  rŠ  rL  r   ry  r‹  rä  Úmerge_histogramró  r£  )
rD   rÝ  re  r÷  r€  r�  Ú	thresholdrü  r_   r`   s
   &&        r   rì  Ú HistogramCollector.collect_value{  s+  € ð !,× 1Ñ 1× 3ÑˆFÜ—z’z (Ó+ˆHØ×'Ñ'Ó)ˆHà�}‰}˜qÔ ÜŸIšI hÓ/�	ÜŸIšI hÓ/‘	äŸHšH Q¨h¯n©nÔ=�	ÜŸHšH Q¨h¯n©nÔ=�	äŸš¤¤S¨£^´S¸³^Ó!DÈHÏNÉNÔ[ˆIà×,Ñ,Ô,Ø $× 3Ñ 3°FÕ ;�Ø.2×.BÑ.BØ!¨YÀ9ó/�×#Ñ# FÔ+ô $&§<¢<°¿-¹-ÐQZÐPZÐ\eÐOfÔ#gÑ �àØØØØð/�×#Ñ# FÔ+ó) !4r   c                óh  € Vw  rgr‰p
WZ8:  dG   \         P                  ! V\        V4      V
) V
3R 7      w  r¼W¶,           V\        Wƒ4      \	        W”4      V
3# V
^ 8X  d1   \         P                  ! V\        V4      V) V3R 7      w  rÞWÖ,          pM‘\        V4      p^V
,          V,          p\        WZ,
          V,          ^,           4      pV^V,          ,           pVV,          V
,           p\         P                  ! VVV) V3R 7      w  rÞVVVV,
          ;;; V,          uuu% VV\        Wƒ4      \	        W”4      V3# )r  )r   ró  rz   rx  ry  r'   )rD   rü  r÷  r~  r  Únew_thresholdrý  rþ  r|  r}  Úold_thresholdÚnew_histr=  r_   r`   Úold_num_binsÚ
old_strideÚhalf_increased_binsÚnew_num_binss   &&&&&&             r   r  Ú"HistogramCollector.merge_histogram›  s:  € ØFSÑCˆ 7°]àÔ)ÜŸ,š, x´°X³ÈÀ~ÐWdÐFeÔf‰KˆHàÕ#ØÜ�GÓ%Ü�GÓ%Øðð ð  Ô!Ü#%§<¢<°¼#¸h»-ÐQ^ÐP^Ð`mÐOnÔ#oÑ �ØÕ ‘ä" 8›}�Ø Õ.°Õ=�
Ü&)¨=Õ+HÈZÕ*WÐZ[Õ*[Ó&\Ð#Ø+¨aÐ2EÕ.EÕE�Ø 3°jÕ @À=Õ P�Ü#%§<¢<°¸,ÐP]È~Ð_lÐNmÔ#nÑ �ØÐ(¨<Ð:MÕ+MÓNÐRZÕZÓNàØÜ�GÓ%Ü�GÓ%Øðð r   c                ó€  € V P                   '       d   \        V P                   4      ^ 8X  d   \        R4      h\        RV P                  : R24       V P                  R8X  d   V P                  4       # V P                  R8X  d   V P                  4       # V P                  R8X  d   V P                  4       # \        R4      h)r   z=Histogram has not been collected. Please run collect() first.z0Finding optimal threshold for each tensor using z algorithm ...r3   r¥  rØ  rê  )rä  rz   r>   rë  r¢  Úcompute_entropyÚcompute_percentileÚcompute_distributionrO   s   &r   r¾  Ú,HistogramCollector.compute_collection_result»  sŸ   € Ø×"×"Ð"¤c¨$×*=Ñ*=Ó&>À!Ô&CÜÐ\Ó]Ð]ÜÐ@ÀÇÁÁÈ~Ð^Ô_à�;‰;˜)Ô#Ø×'Ñ'Ó)Ð)Ø�[‰[˜LÔ(Ø×*Ñ*Ó,Ð,Ø�[‰[˜NÔ*Ø×,Ñ,Ó.Ð.äÐcÓdÐdr   c                óZ  € V P                   ^ 8  g   V P                   ^d8”  d   \        R4      hV P                  pV P                   p/ p\        R\	        V4       24       \        RV P
                   24       \        RRV,
           RV R24       VP                  4        EF  w  rEV^ ,          pV^,          pVP                  4       p\        P                  ! Wh,          4      p	V P                  '       dr   \        P                  ! W’R,          4      p
\        P                  ! Wz,          VP                  R7      ) \        P                  ! Wz,          VP                  R7      3W4&   M–RV,
          R	,          p\        P                  ! V	R
V,
          4      p
\        P                  ! W›4      p\        P                  ! W|,          VP                  R7      \        P                  ! Wz,          VP                  R7      3W4&   V^,          pV^,          pW4,          ^ ,          V8  d   WÓV,          ^,          3W4&   W4,          ^,          V8”  d   W4,          ^ ,          V3W4&   . W4,          OVR,          O5W4&   \        P                  P!                  RR4      R9   g   EKû  \#        Wg4       EK	  	  V# )r   z<Invalid percentile. Must be in range 0 <= percentile <= 100.úNumber of tensors : úNumber of histogram bins : zPercentile : (g      Y@Ú,Ú)r   g      i@r)   ºNr   NÚQUANTIZATION_DEBUGÚ0©r<  Ú1)r¥  r>   rä  rë  rz   r£  r<   r/   r   ÚcumsumrÎ   ÚsearchsortedrL  r   ÚosÚenvironÚgetr
   )rD   rä  r¥  Úthresholds_dictre  ró  r_   r`   ÚtotalÚcdfÚ	idx_rightÚpercent_to_cut_one_sideÚidx_leftr€  r�  s   &              r   r  Ú%HistogramCollector.compute_percentileÉ  s.  € Ø�?‰?˜QÔ $§/¡/°CÔ"7ÜÐ[Ó\Ð\à×,Ñ,ˆØ—_‘_ˆ
àˆäÐ$¤S¨Ó%8Ð$9Ð:Ô;ÜÐ+¨D¯M©M¨?Ð;Ô<Ü�˜u zÕ1Ð2°!°J°<¸qÐAÔBà!/×!5Ñ!5×!7ÑˆFØ˜Q•<ˆDØ" 1�ˆJØ—H‘H“JˆEÜ—)’)˜D�LÓ)ˆCØ�~�~ˆ~ÜŸOšO¨C¸eÕ1CÓD�	ô —X’X˜jÕ3¸:×;KÑ;KÔLÐLÜ—H’H˜ZÕ2¸*×:JÑ:JÔKð+�Ò'ð
 ,1°:Õ+=ÀÕ*FÐ'ÜŸOšO¨C°Ð7NÕ1NÓO�	ÜŸ?š?¨3ÓH�ä—H’H˜ZÕ1¸×9IÑ9IÔJÜ—H’H˜ZÕ2¸*×:JÑ:JÔKð+�Ñ'ð " !�ˆIØ! !�ˆIØÕ& qÕ)¨IÔ5Ø+4ÀfÕ6MÈaÕ6PÐ*Q�Ñ'ØÕ& qÕ)¨IÔ5Ø+:Õ+BÀ1Õ+EÀyÐ*Q�Ñ'Ø&K¨Õ(?Ð&KÀ$ÀrÅ(Ñ&KˆOÑ#ä�z‰z�~‰~Ð2°CÓ8¸H×DÜ˜4×,ñ; "8ð> Ðr   c                óÈ  € V P                   pV P                  p/ p\        R \        V4       24       \        RV P                   R24       \        RV P                   24       VP                  4        Fk  w  rEV P                  WR4      pWcV&   . VOVR,          O5W4&   \        P                  P                  RR4      R9   g   KQ  \        V^ ,          V^,          4       Km  	  V# )r  r  z: (The number may increase depends on the data it collects)zNumber of quantized bins : r  r  r  r  )rä  r¤  rë  rz   r£  r<   Úget_entropy_thresholdr"  r#  r$  r
   )rD   rä  r¤  r%  re  ró  Úoptimal_thresholds   &      r   r  Ú"HistogramCollector.compute_entropy÷  sÜ   € Ø×,Ñ,ˆØ!×4Ñ4ÐàˆäÐ$¤S¨Ó%8Ð$9Ð:Ô;ÜÐ+¨D¯M©M¨?Ð:tÐuÔvÜÐ+¨D×,CÑ,CÐ+DÐEÔFà!/×!5Ñ!5Ö!7ÑˆFØ $× :Ñ :¸9Ó YÐØ&7˜FÑ#Ø&JÐ(9Ð&J¸IÀb½MÑ&JˆOÑ#ô �z‰z�~‰~Ð2°CÓ8¸HÖDÜ˜9 Q�<¨°1­Ö6ñ "8ð Ðr   c                óê  € V^ 8:  d   \        RV R24      hVRR VR,          ,           R,          pV^8X  dµ   W,          P                  4       V P                  4       ,          pW^,          ,          P                  4       V P                  4       ,          V^,          ,
          R,          p\        P                  ! WAP                  R7      \        P                  ! WQP                  R7      3# \        V4      V8X  dÓ   \        V4      ^,          ^8X  d¼   WV,          ,          P                  4       V P                  4       ,          pWV,          V,
          ^,          ,          P                  4       V P                  4       ,          R,          p\        P                  ! WAP                  R7      \        P                  ! WQP                  R7      3# \        P                  ! V4      V,          p^V\        P                  ! V4      &   ^V\        P                  ! V4      &   \        P                  ! V4      V,          V,          pW,          P                  4       V P                  4       ,          pW^,          ,          P                  4       V P                  4       ,          V^,          ,
          R,          p\        P                  ! WAP                  R7      \        P                  ! WQP                  R7      3# )r   zpower=z <= 0 is invalid.N:r<  NNg      à?r   ra  )	r>   r/   r   rL  r   r'   r‹  ÚisnanÚisinf)r_   r`   Úpowerr‘   rS   rT   Úfacts   &&&    r   Ú_avg_stdÚHistogramCollector._avg_std  s  € à�AŒ:Ü˜v e WÐ,=Ð>Ó?Ð?Ø˜S˜b�/ J¨r¥NÕ2°cÕ9ˆØ�AŒ:Ø•=×%Ñ%Ó'¨$¯(©(«*Õ4ˆCØ 1�9Õ$×)Ñ)Ó+¨d¯h©h«jÕ8¸3À½6ÕAÀcÕIˆCÜ—8’8˜C×'7Ñ'7Ô8¼"¿(º(À3×N^ÑN^Ô:_Ð_Ð_Üˆu‹:˜Ô¤3 u£:°¥>°QÔ#6Ø %�-Õ'×,Ñ,Ó.°·±³Õ;ˆCØ E�M¨CÕ/°AÕ5Õ5×:Ñ:Ó<¸t¿x¹x»zÕIÈcÕQˆCÜ—8’8˜C×'7Ñ'7Ô8¼"¿(º(À3×N^ÑN^Ô:_Ð_Ð_ä�vŠv�f‹~ Õ&ˆØ ˆŒR�XŠX�d‹^ÑØ ˆŒR�XŠX�d‹^ÑÜ—’˜“ 5Õ(¨4Õ/ˆØ�}×!Ñ!Ó# d§h¡h£jÕ0ˆØ˜q•yÕ ×%Ñ%Ó'¨$¯(©(«*Õ4°s¸AµvÕ=À#ÕEˆÜ�xŠx˜×#3Ñ#3Ô4´b·h²h¸s×JZÑJZÔ6[Ð[Ð[r   c           
     óÄ  € V P                   R 8  d   \        R4      hV P                  p/ p\        R\	        V4       24       \        RV P                    24       \        RV P
                  : R24       VP                  4        EFW  w  r4V^ ,          pV^,          pVP                  \        P                  8w  g   Q hV P
                  R8X  d   V P                  WV^R7      w  rxM2V P
                  R8X  d   V P                  WVRR7      w  rxM\        R	4      hVP                  \        P                  8w  g   Q hVP                  \        P                  8w  g   Q hVP                  \        P                  8w  g   Q h\        VVVVVP                  4       VP                  4       R
7      W#&   \        P                  P!                  RR4      R9   g   EKL  \#        WV4       EKZ  	  V# )i   z3Invalid num_bins. Must be in range 512 <= num_bins.r  r  zScenario : r  rÄ  )r3  Úp3z,Invalid scenario. Must be in {'same', 'p3'}.)rS   rT   r_   r`   rK   rL   r  r  gUUUUUUÕ?r  )r£  r>   rä  rë  rz   r¦  r<   r   r   rô  r5  r5   rx  ry  r"  r#  r$  r
   )	rD   rä  r%  re  ró  r_   r`   Úavg_coefÚstd_coefs	   &        r   r  Ú'HistogramCollector.compute_distribution"  s—  € Ø�=‰=˜3ÔÜÐRÓSÐSà×,Ñ,ˆØˆäÐ$¤S¨Ó%8Ð$9Ð:Ô;ÜÐ+¨D¯M©M¨?Ð;Ô<Ü�˜DŸM™MÑ,¨AÐ.Ô/à!/×!5Ñ!5×!7ÑˆFØ˜Q•<ˆDØ" 1�ˆJà×#Ñ#¤r§z¡zÔ1Ð1Ð1Ø�}‰} Ô&Ø%)§]¡]°4È1 ]Ó%MÑ"�˜(Ø—‘ $Ô&Ø%)§]¡]°4È9 ]Ó%UÑ"�˜(ä Ð!OÓPÐPØ—>‘>¤R§Z¡ZÔ/Ð/Ð/Ø—>‘>¤R§Z¡ZÔ/Ð/Ð/Ø×#Ñ#¤r§z¡zÔ1Ð1Ð1Ü&0ØØØØ%Ø!—~‘~Ó'Ø"Ÿ™Ó(ô'ˆOÑ#ô �z‰z�~‰~Ð2°CÓ8¸H×DÜ˜4×,ñ3 "8ð6 Ðr   c           	     ó†  € V^ ,          pV^,          pVP                   pV^,          pV^,          pV^,          P                  p\        P                  ! Wg,
          ^,           4      p	\	        V	P                   4       U
u. uF3  p
\        P
                  ! ^ VR7      \        P
                  ! ^ VR7      3NK5  	  pp
\	        Wv^,           ^4       EFR  p
Wj,
          p\        Wj,           ^,           V4      pWL,          WM,          3WºV,
          &   \        P                  ! W<V 4      pVP                  4       p\        VRV 4      p\        W=R 4      pV^ ;;,          V,          uu&   VR;;,          V,          uu&   V^ 8g  P                  \        P                  4      p\        P                  ! V\        P                  R7      pVP                   V,          p\	        V4       F&  pVV,          pVV,           p\        VVV 4      VV&   K(  	  VR;;,          \        WâV,          R 4      ,          uu&   \        P                  ! VP                   \        P                  R7      p\	        V4       F?  pVV,          pVV,           p\        VVV 4      pV^ 8w  g   K,  VV,          V,          VVV% KA  	  \        V4      p\        V4      pVe   Vf(   \        P
                  ! \        P                  VR7      pM"\        P
                  ! \        VV4      VR7      pVWšV,
          &   EKU  	  \        P                  ! V	4      pVV,          pV^,          pV^,          pV^ ,          V8  d   VV^,          3pV^,          V8”  d   V^ ,          V3p\!        V^ ,          R4      '       g   Q h\!        V^,          R4      '       g   Q hV# u up
i )a&  Given a dataset, find the optimal threshold for quantizing it.
The reference distribution is `q`, and the candidate distribution is `p`.
`q` is a truncated version of the original distribution.
Ref: http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf
r   Nr   ra  )rñ  r   r   ÚzerosrE  rL  rx  r¯  Údeepcopyr/   r-   rM  r   r   r3   Úargminr@   )rD   ró  r¤  r_   r`   r£  Úzero_bin_indexÚnum_half_quantized_binr   Úkl_divergencer0  Ú
thresholdsr¹   rº   Úsliced_distributionÚpÚleft_outliers_countÚright_outliers_countÚnonzerosÚquantized_binsÚnum_merged_binsr8  ÚstartÚendÚqÚnormÚdivÚmin_kl_divergence_idxr.  r€  r�  s   &&&                            r   r-  Ú(HistogramCollector.get_entropy_thresholdJ  sU  € ð ˜�|ˆØ˜q•\ˆ
Ø—9‘9ˆØ! Q�ˆØ!3°qÕ!8Ðà˜!•×"Ñ"ˆÜŸš Õ!HÈ1Õ!LÓMˆÜTYÐZg×ZlÑZlÔTmÓnÑTmÈq”r—x’x ¨Ô/´·²¸!À5Ô1IÓJÑTmˆ
Ðnô  Ð-ÀÕ/AÀ1×EˆAØ(Õ,ˆKÜ˜NÕ.°Õ2°HÓ=ˆIà6@Õ6MÈzÕOdÐ5eˆJÐ1Õ1Ñ2ä"&§-¢-°ÀÐ0KÓ"LÐð $×(Ñ(Ó*ˆAÜ"% d¨<¨KÐ&8Ó"9ÐÜ#& t¨JÐ'7Ó#8Ð Øˆa�DÐ'Õ'‹DØˆb�EÐ)Õ)‹Eð ˜Q™—‘¤r§x¡xÓ0ˆHô  ŸXšXÐ&8ÄÇÁÔIˆNØ1×6Ñ6Ð:LÕLˆOô Ð1Ö2�Ø Õ/�Ø˜oÕ-�Ü(+Ð,?ÀÀcÐ,JÓ(K�˜uÓ%ñ 3ð ˜2×¤#Ð&9ÈÕ:^Ð:`Ð&aÓ"bÕbÓô —’˜Ÿ™¤r§x¡xÔ0ˆAÜÐ1Ö2�Ø Õ/�Ø˜oÕ-�ä˜8 E¨#Ð.Ó/�Ø˜1–9Ø#1°%Õ#8¸4Õ#?�A�e˜C’Lñ 3ô $ AÓ&ˆAÜ# AÓ&ˆAØŠy˜AšIÜ—h’hœrŸv™v¨UÔ3‘ä—h’hœw q¨!›}°EÔ:�Ø8;ˆMÐ4Õ4Ô5ñ] Fô` !#§	¢	¨-Ó 8ÐØ&Ð'<Õ=ÐØ˜a•Lˆ	Ø˜a•Lˆ	Ø˜QÕ )Ô+Ø!*Ð,=¸aÕ,@Ð AÐØ˜QÕ )Ô+Ø!2°1Õ!5°yÐ AÐÜÐ(¨Õ+¨W×5Ò5Ð5Ð5ÜÐ(¨Õ+¨W×5Ò5Ð5Ð5Ø Ð ùòU os   Á>9N>)rä  r¢  r£  r¤  r¥  r¦  rÎ   N)r<  )r[   rb   rc   rd   rá  rH   rç  r±  rí  rì  r  r¾  r  r  Ústaticmethodr5  r  r-  rg   rh   ri   s   @r   r°  r°    sf   ø‡ € ñò!ò#òeò8sòtò@ò@eò,ò\ð* ó\ó ð\ò*&÷PX!ð X!r   r°  r  Fc                ój   € V ^8„  d   QhR\         \        ,          R\        \         ,          R,          /# )r   rÌ   rÇ   NrÈ   )r   s   "r   r   r   ¥  s1   € ÷ NKñ NKÜ”�:ðNKä#¤C�=¨4Õ/ñNKr   c                 ó¨  € R pV\         P                  8X  dq   VP                  RR4      pVP                  RR4      p	VP                  RR4      p
VP                  RR 4      pVP                  RR4      p\        V VVVVV	V
VVR7	      pEMV\         P                  8X  dJ   VP                  R	^€4      pVP                  R
^€4      pVP                  RR4      p\        V VVVVVVR7      pM¨V\         P                  8X  dJ   VP                  R	R4      pVP                  RR4      pVP                  RR4      p\        V VVVVVVR7      pMJV\         P                  8X  d6   VP                  R	R4      pVP                  RR4      p\        V VVVVVR7      pV'       d1   VP                  4        V'       d   WWn        VP                  4        V# \        RV 24      h)NrÎ   Fr  r   r™  r!  rÐ   )rÏ   rÎ   r  r   r!  rÐ   r£  r¤  )rÏ   rÎ   r£  r¤  rÂ  r¥  rÃ  T)rÏ   rÎ   r£  r¥  r¦  rÄ  )rÏ   r£  r¦  zUnsupported calibration method )rx   ry   r$  r  r™   r»  rš   r¼  r›   r½  r  rÓ   rÖ   r>   )rÌ   rÇ   rÍ   Úcalibrate_methodrÏ   rÛ   Úextra_optionsÚ
calibratorrÎ   r  r   r!  rÐ   r£  r¤  r¥  r¦  s   &&&&&&&          r   Úcreate_calibratorrX  ¥  sý  € ð €JØÔ,×3Ñ3Ô3à!×%Ñ% k°5Ó9ˆ	Ø&×*Ñ*Ð+;¸UÓCˆØ*×.Ñ.Ð/CÀTÓJÐØ#0×#4Ñ#4Ð5OÐQUÓ#VÐ Ø#×'Ñ'¨°uÓ=ˆÜ%ØØ!Ø Ø%=ØØ)Ø1Ø%=Ø#ô

Š
ð 
Ô.×6Ñ6Ô	6à ×$Ñ$ Z°Ó5ˆØ*×.Ñ.Ð/CÀSÓIÐØ!×%Ñ% k°5Ó9ˆ	Ü&ØØ!Ø Ø%=ØØØ1ô
‰
ð 
Ô.×9Ñ9Ô	9à ×$Ñ$ Z°Ó6ˆØ"×&Ñ& |°VÓ<ˆ
Ø!×%Ñ% k°4Ó8ˆ	Ü)ØØ!Ø Ø%=ØØØ!ô
‰
ð 
Ô.×;Ñ;Ô	;à ×$Ñ$ Z°Ó6ˆØ ×$Ñ$ Z°Ó8ˆä+ØØ!Ø Ø%=ØØô
ˆ
÷ Ø× Ñ Ô"ßØ-6Ô*Ø×+Ñ+Ô-ØÐä
Ð6Ð7GÐ6HÐIÓ
JÐJr   )Nr   )(r¿   r¯  rò   r"  rI  Úcollections.abcr   Úenumr   Úpathlibr   Únumpyr   r&  r   r   r   r	   rÜ   Úquant_utilsr
   r   r   r"   r3   r5   rl   rx   ÚABCMetar�   rÃ   r  r�  r»  r¼  r½  rÚ  r°  ry   rX  r˜   r   r   Ú<module>r_     s  ðó Û Û Û 	Û Ý $Ý Ý ã Û ß >Ó >ã ç UÑ Uõ÷÷8 ñ  ÷F1ñ 1ôh˜ô ô" c§k¡kõ "÷4k"ñ k"ô\m,�~ô m,ô`DL˜.ô DLôN
Ð+ô 
ôD
Ð.ô 
ôD 
Ð0ô  
ôF"¨¯©õ "ô,E!Ð1ô E!ðT 37Ø/Ø&×-Ñ-Ø"ØØ÷NKñ NKr   