o
    #j<!                     @   s   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d Z	dd	 Z
d
d ZG dd de jdZG dd deZG dd deZG dd dee jdZG dd deZG dd deZeeegZeegZdS )    N   )cal_kl_threshold   )utilsc                 C   s   t tt| S N)floatpaddlemaxabstensor r   m/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/quantization/imperative/ptq_quantizer.pyabs_max_value      r   c                 C   s   t | tr
t |tsJ | g krVt| t|ksJ tt| D ]5}t| | t|| ks0J t | | trCt| | || ||< q || | | k rO| | n|| ||< q |S )z8
    Merge the max element one by one in two lists.
    )
isinstancelistlenrangetypemerge_max_value)oldnewir   r   r   r      s   &r   c                 C   s  t | }|dkr||fS |dkr,tjt| dd|f|d\}}|tj}||fS ||krPtjt| dd|f|d\}}|tj}||7 }||fS |||  }tt	
|||  }	|| |	 }t||}
tj||	 tjd}|
|d|| < tj|tjd|	d d|	 }tj|tjd}|dd |dd< || | }|tj}tjt| dd|f|d\}}|tj}||7 }||fS )	         Fr   r   binsZdtyper   N)r   np	histogramr   r
   numpyastypefloat32intmathceilrepeatZzeroscumsumfloat64)r   Z
origin_maxZorigin_histr   upsample_binsZnew_maxnew_hist_	bin_widthZdownsampe_binsZupsampled_histZexpanded_histcumsumed_histZshift_cumsumed_histZsampled_histr   r   r   combine_abs_max_and_hist.   sF   


r0   c                       s>   e Zd ZdZd	 fdd	Zejdd Zejdd Z  Z	S )
BaseQuantizerz3
    Base quantizer for activation and weight.
       c                    sB   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selfr6   	__class__r   r   r5   d   s   

zBaseQuantizer.__init__c                 C      d S r   r   )r:   layertensorsr   r   r   sample_datan      zBaseQuantizer.sample_datac                 C   r=   r   r   r:   r   r   r   cal_thresholdsr   rA   zBaseQuantizer.cal_thresholdsr2   )
__name__
__module____qualname____doc__r5   abcabstractmethodr@   rC   __classcell__r   r   r;   r   r1   _   s    

r1   )	metaclassc                       2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
AbsmaxQuantizerz'
    Per-tensor abs max quantizer.
    r2   c                       t  | d S r   r4   r5   r9   r;   r   r   r5   |      zAbsmaxQuantizer.__init__c                 C   s.   t |tsJ dd |D }t| j|| _d S )Nc                 S      g | ]}t |qS r   r   .0tr   r   r   
<listcomp>       z/AbsmaxQuantizer.sample_data.<locals>.<listcomp>)r   tupler   r7   )r:   r>   r?   r7   r   r   r   r@      s   zAbsmaxQuantizer.sample_datac                 C      | j | _d S r   r7   r8   rB   r   r   r   rC         zAbsmaxQuantizer.cal_thresholdsrD   rE   rF   rG   rH   r5   r@   rC   rK   r   r   r;   r   rN   w   s
    rN   c                       rM   )
PerChannelAbsmaxQuantizerz(
    Per channel abs max quantizer.
    r2   c                    rO   r   rP   r9   r;   r   r   r5      rQ   z"PerChannelAbsmaxQuantizer.__init__c                    s   t |tjjs	J t |tsJ g }t|D ]3\} t |ttjr6 fddt j	d D }|
| q fddt j	d D }|
| qt| j|| _d S )Nc                    s    g | ]}t  d d |f qS r   rS   rU   r   r   r   r   rW      s    z9PerChannelAbsmaxQuantizer.sample_data.<locals>.<listcomp>r   c                    s   g | ]}t  | qS r   rS   r_   r   r   r   rW      s    r   )r   r   nnZLayerrY   	enumerater   Zspec_channel_axis_layersr   shapeappendr   r7   )r:   r>   r?   Zabs_max_vals_listidxr7   r   r   r   r@      s    


z%PerChannelAbsmaxQuantizer.sample_datac                 C   rZ   r   r[   rB   r   r   r   rC      r\   z(PerChannelAbsmaxQuantizer.cal_thresholdsrD   r]   r   r   r;   r   r^      s
    r^   c                       s8   e Zd ZdZd fdd	Zdd Zejd	d
 Z  Z	S )BaseHistQuantizerr   r2      @   c                    s"   t  | || _|| _g | _d S r   )r4   r5   r   r+   histsr:   r6   r   r+   r;   r   r   r5      s   
zBaseHistQuantizer.__init__c           
      C   s  t |tsJ | jg krOdd |D }|| _t|D ]2\}}|| dkr+| jd  qtjt	|
dd|| f| jd\}}|tj}| j| qd S t| jt|ksZJ t| jt|kseJ t|D ] \}}t|| j| | j| | j| j\}}	|| j|< |	| j|< qid S )Nc                 S   rR   r   rS   rT   r   r   r   rW      rX   z1BaseHistQuantizer.sample_data.<locals>.<listcomp>r   Fr   )r   rY   r7   ra   rh   rc   r    r!   r   r
   r"   r   r#   r$   r   r0   r+   )
r:   r>   r?   r7   rd   r   histr-   Znew_abs_maxr,   r   r   r   r@      s8   



zBaseHistQuantizer.sample_datac                 C   r=   r   r   rB   r   r   r   rC      rA   z BaseHistQuantizer.cal_thresholdsr2   rf   rg   )
rE   rF   rG   rH   r5   r@   rI   rJ   rC   rK   r   r   r;   r   re      s    !re   c                       s,   e Zd ZdZ	d
 fdd	Zdd	 Z  ZS )HistQuantizerr   r2   rf   rg   wJ?c                    s   t  ||| || _d S r   )r4   r5   hist_percent)r:   r6   r   r+   rn   r;   r   r   r5      s   
zHistQuantizer.__init__c                 C   sh   dd }t t| jD ]&}| j| d u r| j| j|  q|| j| | j| | j}| j| qd S )Nc                 S   s`   |j dkr	|dk sJ |tj|tjd }t|}t||kd }t|d | |jd   S )Nr   g      ?r   r   g      ?)ndimr    sumr*   r)   Zargwherer   rb   )Zabs_maxrj   percentr/   indexr   r   r   _helper   s
   
z-HistQuantizer.cal_thresholds.<locals>._helper)r   r   rh   r8   rc   r7   rn   )r:   rs   rd   	thresholdr   r   r   rC      s   zHistQuantizer.cal_thresholds)r2   rf   rg   rm   rE   rF   rG   rH   r5   rC   rK   r   r   r;   r   rl      s
    rl   c                       s*   e Zd ZdZd	 fdd	Zdd Z  ZS )
KLQuantizerr   r2   rf   rg   c                    s   t  ||| d S r   rP   ri   r;   r   r   r5      r   zKLQuantizer.__init__c                 C   sv   t t| jD ]1}| j| d u r| j| j|  q| j| }| j| }||jd  }t||| j}| j| qd S )Nr   )	r   r   rh   r8   rc   r7   rb   r   r6   )r:   rd   rj   Zabs_max_valr.   rt   r   r   r   rC      s   

zKLQuantizer.cal_thresholdsrk   ru   r   r   r;   r   rv      s    rv   )rI   r&   r"   r    r   Z$static.quantization.cal_kl_thresholdr    r   r   r   r0   ABCMetar1   rN   r^   re   rl   rv   ZSUPPORT_ACT_QUANTIZERSZSUPPORT_WT_QUANTIZERSr   r   r   r   <module>   s"   1!0
