
    ёi/!                        S SK r S SKrS SKrS SKrSSKJr  SSKJr  S r	S r
S r " S	 S
\ R                  S9r " S S\5      r " S S\5      r " S S\\ R                  S9r " S S\5      r " S S\5      r\\\/r\\/rg)    N   )cal_kl_threshold   )utilsc                 h    [        [        R                  " [        R                  " U 5      5      5      $ N)floatpaddlemaxabs)tensors    l/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/quantization/imperative/ptq_quantizer.pyabs_max_valuer      s    FJJv./00    c                    [        U [        5      (       a  [        U[        5      (       d   eU / :w  a  [        U 5      [        U5      :X  d   e[        [        U 5      5       H^  n[	        X   5      [	        X   5      :X  d   e[        X   [        5      (       a  [        X   X   5      X'   ML  [        X   X   5      X'   M`     U$ )z0
Merge the max element one by one in two lists.
)
isinstancelistlenrangetypemerge_max_valuer   )oldnewis      r   r   r      s     c4  ZT%:%:::
by3x3s8###s3xA<4<///#&$''(8SVSV, ! Jr   c                 j   [        U 5      nUS:X  a  X4$ US:X  a_  [        R                  " [        R                  " U 5      R                  S5      SU4US9u  pgUR                  [        R                  5      nXV4$ XQ::  ac  [        R                  " [        R                  " U 5      R                  S5      SU4US9u  pgUR                  [        R                  5      nXb-  nX4$ XU-  -  n[        [        R                  " XSU-  -  5      5      n	X8-  U	-  n[        R                  " X$5      n
[        R                  " X9-  [        R                  S9nXSX4-  & [        R                  " U[        R                  S9U	S-
  SU	2   n[        R                  " U[        R                  S9nUSS USS& X-
  U-  nUR                  [        R                  5      n[        R                  " [        R                  " U 5      R                  S5      SU4US9u  pgUR                  [        R                  5      nXn-  nXV4$ )	         Fr   r   binsdtyper   N)r   np	histogramr
   r   numpyastypefloat32intmathceilrepeatzeroscumsumfloat64)r   
origin_maxorigin_histr   upsample_binsnew_maxnew_hist_	bin_widthdownsample_binsupsampled_histexpanded_histcumsumed_histshift_cumsumed_histsampled_hists                  r   combine_abs_max_and_histr<   .   s   
 F#G#~&&	s	llJJv$$U+Aw<d
 ??2::.  		llJJv$$U+Az?
 ??2::.## "67	dii)3C(DEF"_4;>$"8L2@a$./		-rzzBa2?2
 !hhRZZ@"/""5AB%;}L#**2::6llJJv$$U+Aw<d
 ??2::.   r   c                   x   ^  \ rS rSrSrSU 4S jjr\R                  S 5       r\R                  S 5       r	Sr
U =r$ )BaseQuantizer_   z+
Base quantizer for activation and weight.
c                    > [         TU ]  5         [        U[        5      (       d   eUS:  a  US::  d   eXl        / U l        / U l        g )Nr      )super__init__r   r(   
quant_bitsabs_max_vals
thresholdsselfrD   	__class__s     r   rC   BaseQuantizer.__init__d   sI    *c****A~*"222$r   c                     g r    )rH   layertensorss      r   sample_dataBaseQuantizer.sample_datan       r   c                     g r   rL   rH   s    r   cal_thresholdsBaseQuantizer.cal_thresholdsr   rQ   r   )rE   rD   rF      )__name__
__module____qualname____firstlineno____doc__rC   abcabstractmethodrO   rT   __static_attributes____classcell__rI   s   @r   r>   r>   _   sA     	  	 r   r>   )	metaclassc                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )AbsmaxQuantizerw   z
Per-tensor abs max quantizer.
c                 $   > [         TU ]  U5        g r   rB   rC   rG   s     r   rC   AbsmaxQuantizer.__init__|       $r   c                     [        U[        5      (       d   eU Vs/ s H  n[        U5      PM     nn[        U R                  U5      U l        g s  snf r   )r   tupler   r   rE   )rH   rM   rN   trE   s        r   rO   AbsmaxQuantizer.sample_data   sH    '5))))29:'Qa(':+D,=,=|L ;s   Ac                 &    U R                   U l        g r   rE   rF   rS   s    r   rT   AbsmaxQuantizer.cal_thresholds       ++r   ro   rV   
rX   rY   rZ   r[   r\   rC   rO   rT   r_   r`   ra   s   @r   rd   rd   w   s    %M, ,r   rd   c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )PerChannelAbsmaxQuantizer   z 
Per channel abs max quantizer.
c                 $   > [         TU ]  U5        g r   rg   rG   s     r   rC   "PerChannelAbsmaxQuantizer.__init__   ri   r   c           	      l   [        U[        R                  R                  5      (       d   e[        U[        5      (       d   e/ n[        U5       H  u  pE[        U[	        [        R                  5      5      (       aK  [        UR                  S   5       Vs/ s H  n[        US S 2U4   5      PM     nnUR                  U5        Mx  [        UR                  S   5       Vs/ s H  n[        XV   5      PM     nnUR                  U5        M     [        U R                  U5      U l        g s  snf s  snf )Nr   r   )r   r
   nnLayerrk   	enumerater   spec_channel_axis_layersr   shaper   appendr   rE   )rH   rM   rN   abs_max_vals_listidxr   r   rE   s           r   rO   %PerChannelAbsmaxQuantizer.sample_data   s   %1111'5))))$W-KC%u'E'E!FGG9>v||A9O 9OAM&A,/9O    "((6 7<FLLO6L 6LM&),6L    "((6 . ,0
 
 s   D,"D1c                 &    U R                   U l        g r   ro   rS   s    r   rT   (PerChannelAbsmaxQuantizer.cal_thresholds   rq   r   ro   rV   rr   ra   s   @r   rt   rt      s    %
*, ,r   rt   c                   Z   ^  \ rS rSrSrSU 4S jjrS r\R                  S 5       r	Sr
U =r$ )BaseHistQuantizer   r   c                 J   > [         TU ]  U5        X l        X0l        / U l        g r   )rB   rC   r   r1   histsrH   rD   r   r1   rI   s       r   rC   BaseHistQuantizer.__init__   s"    $	*
r   c                    [        U[        5      (       d   eU R                  / :X  a  U Vs/ s H  n[        U5      PM     nnX@l        [	        U5       H  u  pVXE   S:X  a  U R
                  R                  S 5        M*  [        R                  " [        R                  " U5      R                  S5      SXE   4U R                  S9u  pxUR                  [        R                  5      nU R
                  R                  U5        M     g [        U R                  5      [        U5      :X  d   e[        U R
                  5      [        U5      :X  d   e[	        U5       H`  u  pV[!        UU R                  U   U R
                  U   U R                  U R"                  5      u  pXR                  U'   XR
                  U'   Mb     g s  snf )Nr   Fr   )r   rk   rE   r   r{   r   r~   r#   r$   r
   r   r%   r   r&   r'   r   r<   r1   )rH   rM   rN   rl   rE   r   r   histr4   new_abs_maxr3   s              r   rO   BaseHistQuantizer.sample_data   sr   '5))))"6=>gM!,gL> ,(1$+JJ%%d+ ll

6*007"L$56!YYGD
  ;;rzz2DJJ%%d+  2 t(()S\999tzz?c'l222(1(@%%c*JJsOII&&)% *5!!#&"*

3  2% ?s   F>c                     g r   rL   rS   s    r   rT    BaseHistQuantizer.cal_thresholds   rQ   r   )rE   r   r   r1   rW      @   )rX   rY   rZ   r[   r\   rC   rO   r]   r^   rT   r_   r`   ra   s   @r   r   r      s+    +B 	 r   r   c                   8   ^  \ rS rSrSr SU 4S jjrS rSrU =r$ )HistQuantizer   r   c                 2   > [         TU ]  XU5        X@l        g r   )rB   rC   hist_percent)rH   rD   r   r1   r   rI   s        r   rC   HistQuantizer.__init__   s     	=9(r   c                 Z   S n[        [        U R                  5      5       H  nU R                  U   c*  U R                  R	                  U R
                  U   5        M=  U" U R
                  U   U R                  U   U R                  5      nU R                  R	                  U5        M     g )Nc                     UR                   S:X  a  US:  d   eU[        R                  " U[        R                  S9-  n[        R                  " U5      n[        R
                  " X2:  5      S   n[        US-
  XR                  S   -  -  5      $ )Nr   g      ?r    r   g      ?)ndimr#   sumr.   r-   argwherer	   r}   )abs_maxr   percentr9   indexs        r   _helper-HistQuantizer.cal_thresholds.<locals>._helper   st    99>gm33"&&RZZ88DIIdOMKK 89!<E%#+'JJqM*ABCCr   )r   r   r   rF   r~   rE   r   )rH   r   r   	thresholds       r   rT   HistQuantizer.cal_thresholds   s    	D TZZ)Czz#&&&t'8'8'=>#%%c*DJJsOT=N=N	 &&y1 *r   )r   )rW   r   r   gwJ?	rX   rY   rZ   r[   r\   rC   rT   r_   r`   ra   s   @r   r   r      s     GN)2 2r   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )KLQuantizer   r   c                 &   > [         TU ]  XU5        g r   rg   r   s       r   rC   KLQuantizer.__init__   s    =9r   c                    [        [        U R                  5      5       H  nU R                  U   c*  U R                  R	                  U R
                  U   5        M=  U R                  U   nU R
                  U   nX2R                  S   -  n[        X$U R                  5      nU R                  R	                  U5        M     g )Nr   )	r   r   r   rF   r~   rE   r}   r   rD   )rH   r   r   abs_max_valr5   r   s         r   rT   KLQuantizer.cal_thresholds   s    TZZ)Czz#&&&t'8'8'=>zz#"//4'**Q-7	,TdooN	&&y1 *r   rL   r   r   ra   s   @r   r   r      s    :	2 	2r   r   )r]   r)   r%   r#   r
   $static.quantization.cal_kl_thresholdr   r   r   r   r   r<   ABCMetar>   rd   rt   r   r   r   SUPPORT_ACT_QUANTIZERSSUPPORT_WT_QUANTIZERSrL   r   r   <module>r      s        D 1 .!bckk 0,m ,$, ,B- -`2% 262# 2$ *=+F (*CD r   