
    {-j                     b    d dl Z d dlZd dlZddlmZ  eee j        d          Zd Z	d Z
d ZdS )	    N   )
get_loggerz&%(asctime)s-%(levelname)s: %(message)s)fmtc                    dgt          |          z  }t          t          |          t          |           z            }d}|}t          t          |                     D ]}|||                             d          }||z
  }||k    rd}n| |         ||z
  dz   z  }t          ||          D ]}	||	         dk    rdn|||	<   ||z  }||z  }|dz   t          |           dz
  k    rt          |          }|S )z
    Expand hist bins.
    r   g           )lenintrangecount)
quantized_binsreference_binsexpanded_quantized_binsnum_merged_binsj_startj_endidx
zero_countavg_bin_eleidx1s
             k/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/static/quantization/cal_kl_threshold.pyexpand_quantized_binsr      s;     !cC$7$77#n--N0C0CCDDOGES(()) ( (#GEM288;;
'/((KK(-*,s2K '5)) 	 	D#D)Q..K $D)) 	?" !GN++a///''E""    c                    t          |           t          |          k    sJ d}d}t          t          |                     D ]}| |         }||         }|dk    r|dz  }|dz  }#|dk    r=t                              dt	          |          z   dz   t	          |          z              ||t          j        ||z            z  z  }||t          j        ||z            z  z  }||z
  |z  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_sumtmp_sum1tmp_sum2r   p_idxq_idxs	            r   safe_entropyr'   7   s     !!S):%;%;;;;;HHS*++,, : :!#&!#&A::MHMHHzz*#hh-. %jj!   %%-!8!899H%%-!8!899HHx5((r   c                    | j         dk    sJ | j        d         }t          |dz
  dz            }d|dz
  z  dz
  }t          j        t          j        |                                                     }d}d}d}	t          ||          D ]&}
| d|
                                         }t	          | |
d                   }||
dz
           dk    rF||
dz
  xx         |z  cc<   |dd         }| d|
                                         }t          |
|z            }dg|z  }d}|}t          |          D ]4}t	          |||                   ||<   ||z  }||z  }|dz   |dz
  k    r|
}5t          ||          }t	          |          }t          ||||          }|	s|}|
}d}	||k     r|}|
}&(|dk    r|dk    r| |         dk    r|dz  }	 |}|dz   |z  S )z
    Using the KL-divergence 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arrayravelr
   tolistr   r'   )hist	bin_widthbits	hist_binsstarting_iterquant_ranger    min_kl_divergencemin_kl_index	kl_initedir   outliers_countreference_distr_binsr!   r   candidate_distr_Q_quantizedr   r   r   r"   kl_divergences                         r   cal_kl_thresholdr>   Q   sp    9>>>>
1IQ#-..Mq/A%KF28D>>''))**ELI=),, # # 1I,,..T!""XQU#q((!a%   N2   03 1I,,..a+o..'(cK&7#%% 	 	C/2!'%-00 0', &G_$EaK!O++1')=
 
 %&&$u&7
 
  	 -LII... -LLqaM"a''"$3)++r   )loggingr   numpyr+   
log_helperr   __name__INFOr   r   r'   r>    r   r   <module>rE      s          # # # # # #
*gl H  
# # #8) ) )4?, ?, ?, ?, ?,r   