327 int32_t best_cluster;
328 int32_t new_centre = 0;
333 int32_t cluster_count;
335 if (buckets_ == NULL || max_clusters < 1)
337 centres =
new float[max_clusters + 1];
338 for (cluster_count = 1; cluster_count <= max_clusters
339 && clusters[cluster_count].buckets_ != NULL
340 && clusters[cluster_count].total_count_ > 0;
342 centres[cluster_count] =
343 static_cast<float>(clusters[cluster_count].
ile(0.5));
344 new_centre = clusters[cluster_count].
mode();
345 for (entry = new_centre - 1; centres[cluster_count] - entry < lower
346 && entry >= rangemin_
351 clusters[cluster_count].
add(entry, count);
352 clusters[0].
add (entry, count);
355 for (entry = new_centre + 1; entry - centres[cluster_count] < lower
361 clusters[cluster_count].
add(entry, count);
362 clusters[0].
add(entry, count);
368 if (cluster_count == 0) {
369 clusters[0].
set_range(rangemin_, rangemax_);
374 for (entry = 0; entry < rangemax_ - rangemin_; entry++) {
375 count = buckets_[entry] - clusters[0].buckets_[entry];
378 min_dist =
static_cast<float>(INT32_MAX);
380 for (cluster = 1; cluster <= cluster_count; cluster++) {
381 dist = entry + rangemin_ - centres[
cluster];
385 if (dist < min_dist) {
391 && (best_cluster == 0
392 || entry + rangemin_ > centres[best_cluster] * multiple
393 || entry + rangemin_ < centres[best_cluster] / multiple)) {
394 if (count > new_mode) {
396 new_centre = entry + rangemin_;
402 if (new_mode > 0 && cluster_count < max_clusters) {
405 if (!clusters[cluster_count].
set_range(rangemin_, rangemax_)) {
409 centres[cluster_count] =
static_cast<float>(new_centre);
410 clusters[cluster_count].
add(new_centre, new_mode);
411 clusters[0].
add(new_centre, new_mode);
412 for (entry = new_centre - 1; centres[cluster_count] - entry < lower
413 && entry >= rangemin_
417 clusters[cluster_count].
add(entry, count);
418 clusters[0].
add(entry, count);
421 for (entry = new_centre + 1; entry - centres[cluster_count] < lower
426 clusters[cluster_count].
add(entry, count);
427 clusters[0].
add (entry, count);
430 centres[cluster_count] =
431 static_cast<float>(clusters[cluster_count].
ile(0.5));
433 }
while (new_cluster && cluster_count < max_clusters);
435 return cluster_count;
int32_t cluster(float lower, float upper, float multiple, int32_t max_clusters, STATS *clusters)
int32_t pile_count(int32_t value) const
double ile(double frac) const
void add(int32_t value, int32_t count)
bool set_range(int32_t min_bucket_value, int32_t max_bucket_value_plus_1)