90 lines
2.5 KiB
C
90 lines
2.5 KiB
C
#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");
|
|
} |