321 int32_t best_cluster;
322 int32_t new_centre = 0;
327 int32_t cluster_count;
329 if (buckets_ ==
nullptr || max_clusters < 1)
331 centres =
new float[max_clusters + 1];
332 for (cluster_count = 1; cluster_count <= max_clusters
333 && clusters[cluster_count].buckets_ !=
nullptr 334 && clusters[cluster_count].total_count_ > 0;
336 centres[cluster_count] =
337 static_cast<float>(clusters[cluster_count].
ile(0.5));
338 new_centre = clusters[cluster_count].
mode();
339 for (entry = new_centre - 1; centres[cluster_count] - entry < lower
340 && entry >= rangemin_
345 clusters[cluster_count].
add(entry,
count);
349 for (entry = new_centre + 1; entry - centres[cluster_count] < lower
355 clusters[cluster_count].
add(entry,
count);
362 if (cluster_count == 0) {
363 clusters[0].
set_range(rangemin_, rangemax_);
368 for (entry = 0; entry < rangemax_ - rangemin_; entry++) {
369 count = buckets_[entry] - clusters[0].buckets_[entry];
372 min_dist =
static_cast<float>(INT32_MAX);
375 dist = entry + rangemin_ - centres[
cluster];
379 if (dist < min_dist) {
385 && (best_cluster == 0
386 || entry + rangemin_ > centres[best_cluster] * multiple
387 || entry + rangemin_ < centres[best_cluster] / multiple)) {
388 if (
count > new_mode) {
390 new_centre = entry + rangemin_;
396 if (new_mode > 0 && cluster_count < max_clusters) {
399 if (!clusters[cluster_count].
set_range(rangemin_, rangemax_)) {
403 centres[cluster_count] =
static_cast<float>(new_centre);
404 clusters[cluster_count].
add(new_centre, new_mode);
405 clusters[0].
add(new_centre, new_mode);
406 for (entry = new_centre - 1; centres[cluster_count] - entry < lower
407 && entry >= rangemin_
411 clusters[cluster_count].
add(entry,
count);
415 for (entry = new_centre + 1; entry - centres[cluster_count] < lower
420 clusters[cluster_count].
add(entry,
count);
424 centres[cluster_count] =
425 static_cast<float>(clusters[cluster_count].
ile(0.5));
427 }
while (new_cluster && cluster_count < max_clusters);
429 return cluster_count;
void add(int32_t value, int32_t count)
int32_t cluster(float lower, float upper, float multiple, int32_t max_clusters, STATS *clusters)
double ile(double frac) const
int32_t pile_count(int32_t value) const
bool set_range(int32_t min_bucket_value, int32_t max_bucket_value_plus_1)