10#define HistogramType FN(Histogram)
17 size_t* num_pairs)
CODE({
32 p.
cost_diff = 0.5 * ClusterCostDiff(cluster_size[idx1], cluster_size[idx2]);
36 if (
out[idx1].total_count_ == 0) {
39 }
else if (
out[idx2].total_count_ == 0) {
43 double threshold = *num_pairs == 0 ? 1e99 :
47 FN(HistogramAddHistogram)(&combo, &
out[idx2]);
49 if (cost_combo < threshold - p.
cost_diff) {
56 if (*num_pairs > 0 && HistogramPairIsLess(&pairs[0], &p)) {
58 if (*num_pairs < max_num_pairs) {
59 pairs[*num_pairs] = pairs[0];
63 }
else if (*num_pairs < max_num_pairs) {
64 pairs[*num_pairs] = p;
71 uint32_t* cluster_size,
78 size_t max_num_pairs)
CODE({
79 double cost_diff_threshold = 0.0;
80 size_t min_cluster_size = 1;
87 for (idx1 = 0; idx1 < num_clusters; ++idx1) {
89 for (idx2 = idx1 + 1; idx2 < num_clusters; ++idx2) {
91 clusters[idx2], max_num_pairs, &pairs[0], &num_pairs);
96 while (num_clusters > min_cluster_size) {
100 if (pairs[0].cost_diff >= cost_diff_threshold) {
101 cost_diff_threshold = 1e99;
102 min_cluster_size = max_clusters;
106 best_idx1 = pairs[0].idx1;
107 best_idx2 = pairs[0].idx2;
108 FN(HistogramAddHistogram)(&
out[best_idx1], &
out[best_idx2]);
109 out[best_idx1].bit_cost_ = pairs[0].cost_combo;
110 cluster_size[best_idx1] += cluster_size[best_idx2];
111 for (
i = 0;
i < symbols_size; ++
i) {
112 if (symbols[
i] == best_idx2) {
113 symbols[
i] = best_idx1;
116 for (
i = 0;
i < num_clusters; ++
i) {
117 if (clusters[
i] == best_idx2) {
118 memmove(&clusters[
i], &clusters[
i + 1],
119 (num_clusters -
i - 1) *
sizeof(clusters[0]));
126 size_t copy_to_idx = 0;
127 for (
i = 0;
i < num_pairs; ++
i) {
129 if (p->
idx1 == best_idx1 || p->
idx2 == best_idx1 ||
130 p->
idx1 == best_idx2 || p->
idx2 == best_idx2) {
134 if (HistogramPairIsLess(&pairs[0], p)) {
138 pairs[copy_to_idx] = front;
140 pairs[copy_to_idx] = *p;
144 num_pairs = copy_to_idx;
148 for (
i = 0;
i < num_clusters; ++
i) {
150 max_num_pairs, &pairs[0], &num_pairs);
159 if (histogram->total_count_ == 0) {
163 FN(HistogramAddHistogram)(&tmp, candidate);
173 size_t in_size,
const uint32_t* clusters,
size_t num_clusters,
177 uint32_t best_out =
i == 0 ? symbols[0] : symbols[
i - 1];
181 for (j = 0; j < num_clusters; ++j) {
182 const double cur_bits =
184 if (cur_bits < best_bits) {
185 best_bits = cur_bits;
186 best_out = clusters[j];
189 symbols[
i] = best_out;
193 for (
i = 0;
i < num_clusters; ++
i) {
194 FN(HistogramClear)(&
out[clusters[
i]]);
197 FN(HistogramAddHistogram)(&
out[symbols[
i]], &
in[
i]);
214 uint32_t* new_index =
BROTLI_ALLOC(m, uint32_t, length);
219 for (
i = 0;
i < length; ++
i) {
220 new_index[
i] = kInvalidIndex;
223 for (
i = 0;
i < length; ++
i) {
224 if (new_index[symbols[
i]] == kInvalidIndex) {
225 new_index[symbols[
i]] = next_index;
234 for (
i = 0;
i < length; ++
i) {
235 if (new_index[symbols[
i]] == next_index) {
236 tmp[next_index] =
out[symbols[
i]];
239 symbols[
i] = new_index[symbols[
i]];
242 for (
i = 0;
i < next_index; ++
i) {
252 uint32_t* histogram_symbols)
CODE({
255 size_t num_clusters = 0;
256 const size_t max_input_histograms = 64;
257 size_t pairs_capacity = max_input_histograms * max_input_histograms / 2;
274 histogram_symbols[
i] = (uint32_t)
i;
277 for (
i = 0;
i <
in_size;
i += max_input_histograms) {
278 size_t num_to_combine =
280 size_t num_new_clusters;
282 for (j = 0; j < num_to_combine; ++j) {
283 clusters[num_clusters + j] = (uint32_t)(
i + j);
287 &histogram_symbols[
i],
288 &clusters[num_clusters], pairs,
289 num_to_combine, num_to_combine,
290 max_histograms, pairs_capacity);
291 num_clusters += num_new_clusters;
298 64 * num_clusters, (num_clusters / 2) * num_clusters);
305 histogram_symbols, clusters,
307 max_histograms, max_num_pairs);
313 out, histogram_symbols);
#define FN(X)
Definition backward_references.c:51
double FN BrotliPopulationCost(const HistogramType *histogram)
Definition bit_cost_inc.h:12
#define CODE(X)
Definition cluster.c:38
BROTLI_INTERNAL void FN BrotliClusterHistograms(MemoryManager *m, const HistogramType *in, const size_t in_size, size_t max_histograms, HistogramType *out, size_t *out_size, uint32_t *histogram_symbols) CODE(
Definition cluster_inc.h:249
BROTLI_INTERNAL size_t FN BrotliHistogramCombine(HistogramType *out, uint32_t *cluster_size, uint32_t *symbols, uint32_t *clusters, HistogramPair *pairs, size_t num_clusters, size_t symbols_size, size_t max_clusters, size_t max_num_pairs) CODE(
Definition cluster_inc.h:70
#define HistogramType
Definition cluster_inc.h:10
BROTLI_INTERNAL size_t FN BrotliHistogramReindex(MemoryManager *m, HistogramType *out, uint32_t *symbols, size_t length) CODE(
Definition cluster_inc.h:211
BROTLI_INTERNAL void FN BrotliHistogramRemap(const HistogramType *in, size_t in_size, const uint32_t *clusters, size_t num_clusters, HistogramType *out, uint32_t *symbols) CODE(
Definition cluster_inc.h:172
BROTLI_INTERNAL double FN BrotliHistogramBitCostDistance(const HistogramType *histogram, const HistogramType *candidate) CODE(
Definition cluster_inc.h:157
BROTLI_INTERNAL void FN BrotliCompareAndPushToQueue(const HistogramType *out, const uint32_t *cluster_size, uint32_t idx1, uint32_t idx2, size_t max_num_pairs, HistogramPair *pairs, size_t *num_pairs) CODE(
Definition cluster_inc.h:14
#define BROTLI_ALLOC(M, T, N)
Definition memory.h:44
#define BROTLI_FREE(M, P)
Definition memory.h:48
#define BROTLI_ENSURE_CAPACITY(M, T, A, C, R)
Definition memory.h:81
#define BROTLI_IS_OOM(M)
Definition memory.h:54
#define BROTLI_IS_NULL(A)
Definition memory.h:68
uint32_t idx1
Definition cluster.h:22
double cost_diff
Definition cluster.h:25
double cost_combo
Definition cluster.h:24
uint32_t idx2
Definition cluster.h:23
#define BROTLI_UINT32_MAX
Definition types.h:59
#define BROTLI_TRUE
Definition types.h:51
#define BROTLI_FALSE
Definition types.h:53
#define BROTLI_BOOL
Definition types.h:49
const lzma_allocator const uint8_t size_t in_size
Definition block.h:527
const lzma_allocator const uint8_t * in
Definition block.h:527
const lzma_allocator const uint8_t size_t uint8_t * out
Definition block.h:528
lzma_index ** i
Definition index.h:629