o
    #j                     @   sP   d dl Z d dlZd dlZddlmZ eee jddZdd Z	dd	 Z
d
d ZdS )    N   )
get_loggerz&%(asctime)s-%(levelname)s: %(message)s)fmtc           
      C   s   dgt | }tt |t |  }d}|}tt | D ]J}||| d}|| }||kr1d}n
| | || d  }t||D ]}	||	 dkrJdn|||	< q@||7 }||7 }|d t | d kret |}q|S )z
    Expand hist bins.
    r   g           )lenintrangecount)
Zquantized_binsZreference_binsZexpanded_quantized_binsnum_merged_binsj_startj_endidxZ
zero_countZavg_bin_eleZidx1 r   l/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/static/quantization/cal_kl_threshold.pyexpand_quantized_bins   s*   
r   c           	      C   s   t | t |ks
J d}d}tt | D ]@}| | }|| }|dkr+|d7 }|d7 }q|dkr>tdt| d t|  ||t||  7 }||t||  7 }q|| | S )z 
    Calculate the entropy.
    r   zFatal error!, idx = z qindex = 0! p_idx = )r   r   _loggererrorstrmathlog)	reference_distr_PP_sumcandidate_distr_QQ_sumZtmp_sum1Ztmp_sum2r   Zp_idxZq_idxr   r   r   safe_entropy7   s,   
r   c                 C   s  | j dksJ | jd }t|d d }d|d  d }tt|  }d}d}d}	t||D ]}
| d|
  }t| |
d }||
d  dkrLq1||
d   |7  < |dd }| d|
  }t|
| }dg| }d}|}t|D ]}t||| ||< ||7 }||7 }|d |d kr|
}qwt	||}t|}t
||||}|	s|}|
}d}	q1||k r|}|
}q1	 q1|dkr|dkr| | dkr|d8 }q	 |}|d | S )z
    Using the KL-divergenc method to get the more precise threshold.

    Args:
        hist(List): The hist of the tensor.
        bin_width(float): The bin width for the hist.
        bits(int): The quantization bits.
    r   r   g      ?r   FNT)ndimshaper   npsumarrayZravelr   tolistr   r   )histZ	bin_widthbitsZ	hist_binsZstarting_iterZquant_ranger   Zmin_kl_divergenceZmin_kl_indexZ	kl_initedir   Zoutliers_countZreference_distr_binsr   r
   Zcandidate_distr_Q_quantizedr   r   r   r   Zkl_divergencer   r   r   cal_kl_thresholdQ   sh   	


r$   )loggingr   numpyr   Z
log_helperr   __name__INFOr   r   r   r$   r   r   r   r   <module>   s   