#include "rngutil.h" Interval *new_interval(size_t n_int) { Interval *x = malloc(sizeof(Interval)); x->n_interval = n_int; x->indexed = calloc(n_int, sizeof(size_t)); return x; } void free_interval(Interval *x) { free(x->indexed); free(x); } void intervalizing(Interval *interval, size_t n, float *samples /* samples must be sorted */) { float lo = samples[0]; float hi = samples[n - 1]; float dx = (hi - lo) / interval->n_interval; float curr = lo + dx; size_t i = 0; size_t ind = 0; while (i < n) { if (samples[i] < curr) { i++; } else { if (ind == interval->n_interval - 1) { interval->indexed[ind] = n; } else { interval->indexed[ind] = i; } ind++; curr = lo + (ind + 1) * dx; } } if (interval->indexed[interval->n_interval - 1] != n) { interval->indexed[interval->n_interval - 1] = n; } } void print_histogram(Interval *interval, size_t n, float *samples) { size_t n_interval = interval->n_interval; size_t prev_cum_count = 0; const int MAX_STARS = 80; double avg_count = (double) n / (double) n_interval; double scale_max = avg_count * 4; printf("------------------------------------------------------\n"); printf("# Histogram (n_samples: %zu, avg_bin: %.2f) #\n", n, avg_count); printf("# (scale ref.: %.2f count = %d stars) #\n", scale_max, MAX_STARS); printf("# min: %6.2f, max: %6.2f\n", samples[0], samples[n - 1]); size_t i, j; for (i = 0; i < n_interval; i++) { size_t current_cumulative_count = interval->indexed[i]; size_t individual_count = current_cumulative_count - prev_cum_count; if (current_cumulative_count < prev_cum_count) { printf("!\n"); individual_count = 0; } int num_stars = (int) (((double) individual_count / scale_max) * MAX_STARS); if (num_stars > MAX_STARS) { num_stars = MAX_STARS; } printf("Bin %3zu: [%8zu](%5.2f%%) | ", i, individual_count, (double) individual_count / (double) n * 100.0); for (j = 0; j < num_stars; j++) { printf("*"); } if (num_stars == MAX_STARS && (double) individual_count > scale_max) { printf("+"); } printf("\n"); prev_cum_count = current_cumulative_count; } printf("------------------------------------------------------\n"); }