
    {-j/!                     $   d dl Z d dlZd dlZd dlZddlmZ ddlmZ d Z	d Z
d Z G d	 d
e j                  Z G d de          Z G d de          Z G d dee j                  Z G d de          Z G d de          ZeeegZeegZdS )    N   )cal_kl_threshold   )utilsc                 h    t          t          j        t          j        |                               S N)floatpaddlemaxabs)tensors    l/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/quantization/imperative/ptq_quantizer.pyabs_max_valuer      s$    FJv..//000    c                    t          | t                    rt          |t                    sJ | g k    rt          |           t          |          k    sJ t          t          |                     D ]}t	          | |                   t	          ||                   k    sJ t          | |         t                    r t          | |         ||                   ||<   kt          ||         | |                   ||<   |S )z8
    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%:%::::
byy3xx3s88####s3xx 	- 	-AA<<4A<<////#a&$'' -(QQ88ASVSV,,AJr   c                    t          |           }|dk    r||fS |dk    rdt          j        t          j        |                               d          d|f|          \  }}|                    t          j                  }||fS ||k    rit          j        t          j        |                               d          d|f|          \  }}|                    t          j                  }||z  }||fS |||z  z  }t          t          j
        |||z  z                      }	||z  |	z  }t          j        ||          }
t          j        ||	z  t          j                  }|
|d||z  <   t          j        |t          j                  |	dz
  d|	         }t          j        |t          j                  }|dd         |dd<   ||z
  |z  }|                    t          j                  }t          j        t          j        |                               d          d|f|          \  }}|                    t          j                  }||z  }||fS )	         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<   .   sh   
 F##G#~~;&&	s		lJv$$U++Aw<d
 
 
! ??2:..  	J		lJv$$U++Az?
 
 
! ??2:..K8## $"67	di4)3C(DEEFF"_4;>>$"8LLL2@a$../	-rzBBBa2?2
 !hRZ@@@"/""5ABB%(;;}L#**2:66lJv$$U++Aw<d
 
 
! ??2:..L   r   c                   d     e Zd ZdZd fd	Zej        d             Zej        d             Z xZ	S )BaseQuantizerz3
    Base quantizer for activation and weight.
       c                     t                                                       t          |t                    sJ |dk    r|dk    sJ || _        g | _        g | _        d S )Nr      )super__init__r   r(   
quant_bitsabs_max_vals
thresholdsselfrD   	__class__s     r   rC   zBaseQuantizer.__init__d   sb    *c*****A~~*"2"2"22$r   c                     d S r    )rH   layertensorss      r   sample_datazBaseQuantizer.sample_datan       r   c                     d S r   rK   rH   s    r   cal_thresholdszBaseQuantizer.cal_thresholdsr   rO   r   r?   )
__name__
__module____qualname____doc__rC   abcabstractmethodrN   rR   __classcell__rI   s   @r   r>   r>   _   s               	   	      r   r>   )	metaclassc                   0     e Zd ZdZd fd	Zd Zd Z xZS )AbsmaxQuantizerz'
    Per-tensor abs max quantizer.
    r?   c                 J    t                                          |           d S r   rB   rC   rG   s     r   rC   zAbsmaxQuantizer.__init__|   !    $$$$$r   c                     t          |t                    sJ d |D             }t          | j        |          | _        d S )Nc                 ,    g | ]}t          |          S rK   r   .0ts     r   
<listcomp>z/AbsmaxQuantizer.sample_data.<locals>.<listcomp>   s     :::Qa((:::r   )r   tupler   rE   )rH   rL   rM   rE   s       r   rN   zAbsmaxQuantizer.sample_data   sF    '5)))))::':::+D,=|LLr   c                     | j         | _        d S r   rE   rF   rQ   s    r   rR   zAbsmaxQuantizer.cal_thresholds       +r   rS   rT   rU   rV   rW   rC   rN   rR   rZ   r[   s   @r   r^   r^   w   sh         % % % % % %M M M, , , , , , ,r   r^   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )PerChannelAbsmaxQuantizerz(
    Per channel abs max quantizer.
    r?   c                 J    t                                          |           d S r   r`   rG   s     r   rC   z"PerChannelAbsmaxQuantizer.__init__   ra   r   c                    t          |t          j        j                  sJ t          |t                    sJ g }t          |          D ]\  }t          |t	          t          j                            r<fdt          j	        d                   D             }|
                    |           hfdt          j	        d                   D             }|
                    |           t          | j        |          | _        d S )Nc                 B    g | ]}t          d d |f                   S r   rd   rf   r   r   s     r   rh   z9PerChannelAbsmaxQuantizer.sample_data.<locals>.<listcomp>   s:          45M&A,//     r   r   c                 :    g | ]}t          |                   S rK   rd   rs   s     r   rh   z9PerChannelAbsmaxQuantizer.sample_data.<locals>.<listcomp>   s2          12M&),,     r   r   )r   r
   nnLayerri   	enumerater   spec_channel_axis_layersr   shapeappendr   rE   )rH   rL   rM   abs_max_vals_listidxrE   r   s         @r   rN   z%PerChannelAbsmaxQuantizer.sample_data   s0   %11111'5)))))$W-- 
	7 
	7KC%u'E!F!FGG 	7       9>v|A9O9O      "((6666       6;FLO6L6L      "((6666+0
 
r   c                     | j         | _        d S r   rk   rQ   s    r   rR   z(PerChannelAbsmaxQuantizer.cal_thresholds   rl   r   rS   rm   r[   s   @r   ro   ro      se         % % % % % %
 
 
*, , , , , , ,r   ro   c                   J     e Zd ZdZd fd	Zd Zej        d             Z xZ	S )	BaseHistQuantizerr   r?      @   c                 t    t                                          |           || _        || _        g | _        d S r   )rB   rC   r   r1   histsrH   rD   r   r1   rI   s       r   rC   zBaseHistQuantizer.__init__   s5    $$$	*


r   c                 P   t          |t                    sJ | j        g k    rd |D             }|| _        t          |          D ]\  }}||         dk    r| j                            d            ,t          j        t          j	        |          
                    d          d||         f| j                  \  }}|                    t          j                  }| j                            |           d S t          | j                  t          |          k    sJ t          | j                  t          |          k    sJ t          |          D ]O\  }}t          || j        |         | j        |         | j        | j                  \  }}	|| j        |<   |	| j        |<   Pd S )Nc                 ,    g | ]}t          |          S rK   rd   re   s     r   rh   z1BaseHistQuantizer.sample_data.<locals>.<listcomp>   s     >>>M!,,>>>r   r   Fr   )r   ri   rE   rw   r   rz   r#   r$   r
   r   r%   r   r&   r'   r   r<   r1   )
rH   rL   rM   rE   r|   r   histr4   new_abs_maxr3   s
             r   rN   zBaseHistQuantizer.sample_data   s   '5)))))"">>g>>>L ,D(11 
, 
,V$++J%%d++++ l
6**0077"L$56!Y  GD!
  ;;rz22DJ%%d++++
, 
, t())S\\9999tz??c'll2222(11 	+ 	+V(@%c*JsOI&) )%X *5!#&"*
3	+ 	+r   c                     d S r   rK   rQ   s    r   rR   z BaseHistQuantizer.cal_thresholds   rO   r   r?   r   r   )
rT   rU   rV   rW   rC   rN   rX   rY   rR   rZ   r[   s   @r   r   r      sq        G     + + +B 	      r   r   c                   ,     e Zd ZdZ	 d fd	Zd Z xZS )	HistQuantizerr   r?   r   r   wJ?c                 \    t                                          |||           || _        d S r   )rB   rC   hist_percent)rH   rD   r   r1   r   rI   s        r   rC   zHistQuantizer.__init__   s/     	T=999(r   c                 >   d }t          t          | j                            D ]w}| j        |         &| j                            | j        |                    5 || j        |         | j        |         | j                  }| j                            |           xd S )Nc                    |j         dk    r|dk     sJ |t          j        |t          j                  z  }t          j        |          }t          j        ||k              d         }t          |dz
  | |j        d         z  z            S )Nr   g      ?r    r   g      ?)ndimr#   sumr.   r-   argwherer	   ry   )abs_maxr   percentr9   indexs        r   _helperz-HistQuantizer.cal_thresholds.<locals>._helper   s}    9>>gmmm3"&RZ8888DIdOOMK 899!<E%#+'DJqM*ABCCCr   )r   r   r   rF   rz   rE   r   )rH   r   r|   	thresholds       r   rR   zHistQuantizer.cal_thresholds   s    	D 	D 	D TZ)) 	2 	2Cz#&&&t'8'=>>>>#G%c*DJsOT=N 	 &&y1111	2 	2r   )r?   r   r   r   rT   rU   rV   rW   rC   rR   rZ   r[   s   @r   r   r      sX        G GN) ) ) ) ) )2 2 2 2 2 2 2r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )KLQuantizerr   r?   r   r   c                 N    t                                          |||           d S r   r`   r   s       r   rC   zKLQuantizer.__init__   s%    T=99999r   c                 h   t          t          | j                            D ]}| j        |         &| j                            | j        |                    5| j        |         }| j        |         }||j        d         z  }t          ||| j                  }| j                            |           d S )Nr   )	r   r   r   rF   rz   rE   ry   r   rD   )rH   r|   r   abs_max_valr5   r   s         r   rR   zKLQuantizer.cal_thresholds   s    TZ)) 	2 	2Cz#&&&t'8'=>>>>z#"/4'$*Q-7	,T9doNN	&&y1111	2 	2r   r   r   r[   s   @r   r   r      sQ        G: : : : : :	2 	2 	2 	2 	2 	2 	2r   r   )rX   r)   r%   r#   r
   $static.quantization.cal_kl_thresholdr    r   r   r   r<   ABCMetar>   r^   ro   r   r   r   SUPPORT_ACT_QUANTIZERSSUPPORT_WT_QUANTIZERSrK   r   r   <module>r      s   


       D D D D D D      1 1 1   .! .! .!b    ck    0, , , , ,m , , ,$, , , , , , , ,B- - - - - - - - -`2 2 2 2 2% 2 2 262 2 2 2 2# 2 2 2$ *=+F (*CD   r   