10#define HistogramType FN(Histogram)
16 uint32_t idx1, uint32_t idx2,
size_t max_num_pairs,
HistogramPair* pairs,
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)(tmp, &
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;
72 uint32_t* cluster_size,
79 size_t max_num_pairs)
CODE({
80 double cost_diff_threshold = 0.0;
81 size_t min_cluster_size = 1;
88 for (idx1 = 0; idx1 < num_clusters; ++idx1) {
90 for (idx2 = idx1 + 1; idx2 < num_clusters; ++idx2) {
92 clusters[idx2], max_num_pairs, &pairs[0], &num_pairs);
97 while (num_clusters > min_cluster_size) {
101 if (pairs[0].cost_diff >= cost_diff_threshold) {
102 cost_diff_threshold = 1e99;
103 min_cluster_size = max_clusters;
107 best_idx1 = pairs[0].idx1;
108 best_idx2 = pairs[0].idx2;
109 FN(HistogramAddHistogram)(&
out[best_idx1], &
out[best_idx2]);
110 out[best_idx1].bit_cost_ = pairs[0].cost_combo;
111 cluster_size[best_idx1] += cluster_size[best_idx2];
112 for (
i = 0;
i < symbols_size; ++
i) {
113 if (symbols[
i] == best_idx2) {
114 symbols[
i] = best_idx1;
117 for (
i = 0;
i < num_clusters; ++
i) {
118 if (clusters[
i] == best_idx2) {
119 memmove(&clusters[
i], &clusters[
i + 1],
120 (num_clusters -
i - 1) *
sizeof(clusters[0]));
127 size_t copy_to_idx = 0;
128 for (
i = 0;
i < num_pairs; ++
i) {
130 if (p->
idx1 == best_idx1 || p->
idx2 == best_idx1 ||
131 p->
idx1 == best_idx2 || p->
idx2 == best_idx2) {
135 if (HistogramPairIsLess(&pairs[0], p)) {
139 pairs[copy_to_idx] = front;
141 pairs[copy_to_idx] = *p;
145 num_pairs = copy_to_idx;
149 for (
i = 0;
i < num_clusters; ++
i) {
151 clusters[
i], max_num_pairs, &pairs[0], &num_pairs);
161 if (histogram->total_count_ == 0) {
165 FN(HistogramAddHistogram)(tmp, candidate);
175 size_t in_size,
const uint32_t* clusters,
size_t num_clusters,
179 uint32_t best_out =
i == 0 ? symbols[0] : symbols[
i - 1];
183 for (j = 0; j < num_clusters; ++j) {
184 const double cur_bits =
186 if (cur_bits < best_bits) {
187 best_bits = cur_bits;
188 best_out = clusters[j];
191 symbols[
i] = best_out;
195 for (
i = 0;
i < num_clusters; ++
i) {
196 FN(HistogramClear)(&
out[clusters[
i]]);
199 FN(HistogramAddHistogram)(&
out[symbols[
i]], &
in[
i]);
216 uint32_t* new_index =
BROTLI_ALLOC(m, uint32_t, length);
221 for (
i = 0;
i < length; ++
i) {
222 new_index[
i] = kInvalidIndex;
225 for (
i = 0;
i < length; ++
i) {
226 if (new_index[symbols[
i]] == kInvalidIndex) {
227 new_index[symbols[
i]] = next_index;
236 for (
i = 0;
i < length; ++
i) {
237 if (new_index[symbols[
i]] == next_index) {
238 tmp[next_index] =
out[symbols[
i]];
241 symbols[
i] = new_index[symbols[
i]];
244 for (
i = 0;
i < next_index; ++
i) {
254 uint32_t* histogram_symbols)
CODE({
257 size_t num_clusters = 0;
258 const size_t max_input_histograms = 64;
259 size_t pairs_capacity = max_input_histograms * max_input_histograms / 2;
278 histogram_symbols[
i] = (uint32_t)
i;
281 for (
i = 0;
i <
in_size;
i += max_input_histograms) {
282 size_t num_to_combine =
284 size_t num_new_clusters;
286 for (j = 0; j < num_to_combine; ++j) {
287 clusters[num_clusters + j] = (uint32_t)(
i + j);
291 &histogram_symbols[
i],
292 &clusters[num_clusters], pairs,
293 num_to_combine, num_to_combine,
294 max_histograms, pairs_capacity);
295 num_clusters += num_new_clusters;
302 64 * num_clusters, (num_clusters / 2) * num_clusters);
309 histogram_symbols, clusters,
311 max_histograms, max_num_pairs);
317 out, tmp, 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