35 assert(histogram.getNumSamples() > 0);
36 assert(rescaledHistogram.getNumSamples() > 0);
38 using namespace internal;
39 using namespace utils;
46 auto getRescaledFrequency = [&renormedView](
source_T sourceSymbol) -> value_type {
47 if (sourceSymbol >= renormedView.getMin() && sourceSymbol <= renormedView.getMax()) {
48 return renormedView[sourceSymbol];
50 return static_cast<value_type
>(0);
54 double_t expectedCodewordLength = 0;
55 value_type trueIncompressibleFrequency = 0;
59 double_t reciprocalNumSamples = 1.0 / histogram.getNumSamples();
60 double_t reciprocalNumSamplesRescaled = 1.0 / rescaledHistogram.getNumSamples();
63 for (value_type sourceSymbol = histogramView.getMin(); sourceSymbol <= histogramView.getMax(); ++sourceSymbol) {
65 const value_type frequency = histogramView[sourceSymbol];
67 const value_type rescaledFrequency = getRescaledFrequency(sourceSymbol);
68 const double_t trueProbability =
static_cast<double_t
>(frequency) * reciprocalNumSamples;
70 if (rescaledFrequency) {
71 const double_t rescaledProbability =
static_cast<double_t
>(rescaledFrequency) * reciprocalNumSamplesRescaled;
72 expectedCodewordLength -= trueProbability * fastlog2(rescaledProbability);
74 trueIncompressibleFrequency += frequency;
80 const double_t trueIncompressibleProbability =
static_cast<double_t
>(trueIncompressibleFrequency) * reciprocalNumSamples;
81 if (trueIncompressibleProbability) {
83 expectedCodewordLength -= trueIncompressibleProbability * fastlog2(rescaledProbability);
84 expectedCodewordLength += trueIncompressibleProbability * fastlog2(numBitsForNSymbols(renormedView.size()));
87 return expectedCodewordLength;