344 int32_t best_cluster;
345 int32_t new_centre = 0;
350 int32_t cluster_count;
352 if (buckets_ ==
nullptr || max_clusters < 1) {
355 centres =
new float[max_clusters + 1];
356 for (cluster_count = 1;
357 cluster_count <= max_clusters && clusters[cluster_count].buckets_ !=
nullptr &&
358 clusters[cluster_count].total_count_ > 0;
360 centres[cluster_count] =
static_cast<float>(clusters[cluster_count].ile(0.5));
361 new_centre = clusters[cluster_count].mode();
362 for (entry = new_centre - 1; centres[cluster_count] - entry < lower && entry >= rangemin_ &&
365 count =
pile_count(entry) - clusters[0].pile_count(entry);
367 clusters[cluster_count].add(entry, count);
368 clusters[0].add(entry, count);
371 for (entry = new_centre + 1; entry - centres[cluster_count] < lower && entry < rangemax_ &&
374 count =
pile_count(entry) - clusters[0].pile_count(entry);
376 clusters[cluster_count].add(entry, count);
377 clusters[0].add(entry, count);
383 if (cluster_count == 0) {
384 clusters[0].set_range(rangemin_, rangemax_);
389 for (entry = 0; entry < rangemax_ - rangemin_; entry++) {
390 count = buckets_[entry] - clusters[0].buckets_[entry];
393 min_dist =
static_cast<float>(INT32_MAX);
396 dist = entry + rangemin_ - centres[
cluster];
401 if (dist < min_dist) {
407 && (best_cluster == 0 || entry + rangemin_ > centres[best_cluster] * multiple ||
408 entry + rangemin_ < centres[best_cluster] / multiple)) {
409 if (count > new_mode) {
411 new_centre = entry + rangemin_;
417 if (new_mode > 0 && cluster_count < max_clusters) {
420 if (!clusters[cluster_count].
set_range(rangemin_, rangemax_)) {
424 centres[cluster_count] =
static_cast<float>(new_centre);
425 clusters[cluster_count].add(new_centre, new_mode);
426 clusters[0].add(new_centre, new_mode);
427 for (entry = new_centre - 1; centres[cluster_count] - entry < lower && entry >= rangemin_ &&
430 count =
pile_count(entry) - clusters[0].pile_count(entry);
432 clusters[cluster_count].add(entry, count);
433 clusters[0].add(entry, count);
436 for (entry = new_centre + 1; entry - centres[cluster_count] < lower && entry < rangemax_ &&
439 count =
pile_count(entry) - clusters[0].pile_count(entry);
441 clusters[cluster_count].add(entry, count);
442 clusters[0].add(entry, count);
445 centres[cluster_count] =
static_cast<float>(clusters[cluster_count].ile(0.5));
447 }
while (new_cluster && cluster_count < max_clusters);
449 return cluster_count;
int32_t pile_count(int32_t value) const
bool set_range(int32_t min_bucket_value, int32_t max_bucket_value_plus_1)
int32_t cluster(float lower, float upper, float multiple, int32_t max_clusters, STATS *clusters)