summaryrefslogtreecommitdiff
path: root/performance-tests/SCTP/hist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'performance-tests/SCTP/hist.cpp')
-rw-r--r--performance-tests/SCTP/hist.cpp304
1 files changed, 304 insertions, 0 deletions
diff --git a/performance-tests/SCTP/hist.cpp b/performance-tests/SCTP/hist.cpp
new file mode 100644
index 00000000000..fbac95d1a98
--- /dev/null
+++ b/performance-tests/SCTP/hist.cpp
@@ -0,0 +1,304 @@
+// $Id$
+
+/* Replacement for CSIM histogram created by Alex Carobus 7/20/98
+ #include <std/disclaimer.h>
+ */
+/*
+//
+// Update history:
+//
+// [99.10.18] jcohen
+// version 1.3
+// added optional fields to header
+// to use: add_field("key","value",histogram);
+// or: add_field_n("key",45,histogram);
+//
+// [99.01.08] jcohen
+// version 1.2
+// histogram includes skew and kurtosis
+// call enable_skew(h) to enable skew and kurtosis on histogram h
+//
+// [98.07.29] jcohen
+// added add_histogram function
+// added version 1.1 display, added num_bins display
+// added read_hist
+//
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <float.h>
+#include <string.h>
+#include <math.h>
+#include "hist.h"
+
+hist_t *head_hist, *tail_hist;
+
+hist_t *histogram(char *name, unsigned int num_bins, double first,
+ double last) {
+ hist_t *hist;
+ if ((hist = (hist_t *)malloc(sizeof(hist_t))) == NULL) {
+ fprintf(stderr, "unable to allocate memory for histogram : %s", name);
+ exit(-1);
+ }
+ if ((hist->hs = (unsigned int *)malloc(sizeof(unsigned int) * (num_bins+2))) == NULL){
+ fprintf(stderr, "unable to allocate memory for histogram : %s", name);
+ exit(-1);
+ }
+ memset(hist->hs, 0, sizeof(unsigned int) * (num_bins+2));
+ hist->name = name;
+ hist->num_bins = num_bins;
+ hist->first = first;
+ hist->last = last;
+ hist->num_points = 0;
+ hist->max_num_outer = hist->num_outer = 0;
+ hist->sum = 0.0;
+ hist->sum2 = 0.0;
+ hist->sum3 = 0.0;
+ hist->sum4 = 0.0;
+ hist->max = DBL_MIN;
+ hist->min = DBL_MAX;
+ hist->outer = NULL;
+ hist->next = NULL;
+ hist->skew = 0;
+ hist->firstoptheader = NULL;
+ if(head_hist == NULL)
+ head_hist = tail_hist = hist;
+ else {
+ tail_hist->next = hist;
+ tail_hist = tail_hist->next;
+ }
+ return hist;
+}
+
+
+void set_outer(unsigned int max_num_outer, hist_t *hist) {
+ hist->outer = (double *)realloc(hist->outer,sizeof(double) * max_num_outer);
+ hist->max_num_outer = max_num_outer;
+}
+
+
+void enable_skew(hist_t *hist) {
+ hist->skew = 1;
+}
+
+
+void add_field(char *key, char *value, hist_t *hist) {
+ struct optheader *nextoptheader, *trace;
+
+ /* create and prepare nextoptheader */
+ nextoptheader = (struct optheader *) malloc(sizeof(struct optheader));
+ nextoptheader->key = (char *) malloc(strlen(key)+1);
+ nextoptheader->value = (char *) malloc(strlen(value)+1);
+ nextoptheader->next = NULL;
+ strcpy(nextoptheader->key,key);
+ strcpy(nextoptheader->value,value);
+
+ /* tack nextoptheader onto end of optheader list */
+ if (hist->firstoptheader == NULL) {
+ hist->firstoptheader = nextoptheader;
+ } else {
+ trace = hist->firstoptheader;
+ while (trace->next != NULL) {
+ trace = trace->next;
+ }
+ trace->next = nextoptheader;
+ }
+}
+
+
+void add_field_n(char *key, int value, hist_t *hist) {
+ char textvalue[40];
+
+ sprintf(textvalue,"%d",value);
+ add_field(key,textvalue,hist);
+}
+
+
+void record(double point, hist_t *hist) {
+ unsigned int bin;
+ double incsum;
+ if (point < hist->min) hist->min = point;
+ if (point > hist->max) hist->max = point;
+ if (point < hist->first) {
+ bin = 0;
+ if (hist->max_num_outer > hist->num_outer)
+ hist->outer[hist->num_outer++] = point;
+ }
+ else if (point >= hist->last) {
+ bin = hist->num_bins+1;
+ if (hist->max_num_outer > hist->num_outer)
+ hist->outer[hist->num_outer++] = point;
+ }
+ else
+ bin = (unsigned int)(((point - hist->first)*(hist->num_bins))/(hist->last - hist->first)+1);
+
+ hist->hs[bin]++;
+ hist->num_points++;
+ hist->sum+=point;
+ incsum = point*point;
+ hist->sum2 += incsum;
+ if (hist->skew) {
+ incsum *= point;
+ hist->sum3 += incsum;
+ incsum *= point;
+ hist->sum4 += incsum;
+ }
+
+/* printf("point : %g, bin %u, points in bin %u\n", point, bin, hist->hs[bin]); */
+}
+
+void report_to(FILE *strm, hist_t *hist) {
+ unsigned int sofar, i;
+ double p1, p2, d, mean;
+ double variance;
+ struct optheader *trace;
+
+ if (hist->num_points == 0) {
+ fprintf(strm, "\n\n\t\t\t\tHistogram %s is empty\n\n", hist->name);
+ return;
+ }
+ fprintf(strm, "\n\n\t\t\t\tHistogram %s\n", hist->name);
+ if (hist->skew) fprintf(strm, "version: %s\n", HIST_VERSION);
+ else fprintf(strm, "version: 1.1\n");
+ fprintf(strm, "minimum: %g\n", hist->min);
+ fprintf(strm, "maximum: %g\n", hist->max);
+ fprintf(strm, "mean: %g\n", mean = hist->sum/hist->num_points);
+ variance = (hist->sum2 -
+ 2*hist->sum*mean +
+ hist->num_points*mean*mean) / (hist->num_points-1);
+ fprintf(strm, "variance: %g\n", variance);
+ if (hist->skew) {
+ fprintf(strm, "skew: %g\n", ((hist->sum3 -
+ 3*hist->sum2*mean +
+ 3*hist->sum*mean*mean -
+ hist->num_points*mean*mean*mean) /
+ pow(sqrt(variance),3) / hist->num_points));
+ fprintf(strm, "kurtosis: %g\n", ((hist->sum4 -
+ 4*hist->sum3*mean +
+ 6*hist->sum2*mean*mean -
+ 4*hist->sum*mean*mean*mean +
+ hist->num_points*mean*mean*mean*mean) /
+ pow(sqrt(variance),4)) / hist->num_points - 3);
+ }
+ fprintf(strm, "num_points: %u\n", hist->num_points);
+ fprintf(strm, "num_bins: %d %g %g\n", hist->num_bins,hist->first,hist->last);
+ if (hist->firstoptheader) {
+ trace = hist->firstoptheader;
+ while(trace->next != NULL) {
+ fprintf(strm, "%s: %s\n", trace->key, trace->value);
+ trace = trace->next;
+ }
+ fprintf(strm, "%s: %s\n", trace->key, trace->value);
+ }
+ fprintf(strm, "\n");
+ sofar = hist->hs[0];
+ fprintf(strm, "\t Low - High Count Fraction Cumulative\n");
+ fprintf(strm, "\t below - %12.3f : %5u %0.3f %0.3f\n", hist->first,
+ hist->hs[0], (double)hist->hs[0]/hist->num_points,
+ (double)histfloor(1000.0*sofar/hist->num_points)/1000.0);
+ p2 = hist->first;
+ d = (hist->last - hist->first)/hist->num_bins;
+ for(i = 1; i <= hist->num_bins; i++) {
+ p1 = p2;
+ p2 = i*d+hist->first;
+ sofar += hist->hs[i];
+ fprintf(strm, "\t%12.3f - %12.3f : %5u %0.3f %0.3f\n", p1, p2, hist->hs[i],
+ (double)hist->hs[i]/hist->num_points,
+ (double)histfloor(1000.0*sofar/hist->num_points)/1000.0);
+ }
+ sofar += hist->hs[hist->num_bins+1];
+ fprintf(strm, "\t%12.3f - above : %5u %0.3f %0.3f\n\n",
+ hist->last, hist->hs[hist->num_bins+1],
+ (double)hist->hs[hist->num_bins+1]/hist->num_points,
+ (double)histfloor(1000.0*sofar/hist->num_points)/1000.0);
+ if (hist->num_outer) {
+ fprintf(strm, "outliers:\n");
+ for(i = 0; i < hist->num_outer; i++) fprintf(strm, "\t%12.3f\n",
+ hist->outer[i]);
+ }
+ fprintf(strm, "\n\n");
+}
+
+void report() {
+ hist_t *temp = head_hist;
+ for(; temp; temp = temp->next)
+ report_to(stdout, temp);
+}
+
+void stats_init() {
+ /* this is not necessary */
+}
+
+double get_mean(HIST hist) {
+ return(hist->sum/hist->num_points);
+}
+
+double get_min(HIST hist) {
+ return(hist->min);
+}
+
+double get_max(HIST hist) {
+ return(hist->max);
+}
+
+double get_variance(HIST hist) {
+ double mean = hist->sum/hist->num_points;
+ return((hist->sum2 - 2*hist->sum*mean + hist->num_points*mean*mean)/
+ (hist->num_points-1));
+}
+
+double get_num(HIST hist) {
+ return(hist->num_points);
+}
+
+void set_mean(HIST hist, double mean) {
+ hist->sum = mean*hist->num_points;
+}
+
+void set_min(HIST hist, double min) {
+ hist->min = min;
+}
+
+void set_max(HIST hist, double max) {
+ hist->max = max;
+}
+
+void set_variance(HIST hist, double variance) {
+ /* do this after seting mean */
+ double mean = hist->sum/hist->num_points;
+ hist->sum2 = variance *(hist->num_points-1) + 2*hist->sum*mean - hist->num_points*mean*mean;
+}
+
+void add_histogram(HIST dest, HIST source) {
+ unsigned int i,j;
+ double d,midpoint;
+
+ d = (source->last - source->first)/source->num_bins;
+
+ for(i=1;i<=source->num_bins;i++) {
+ midpoint = source->first + ((i - 0.5) * d);
+ for(j=0;j<source->hs[i];j++) {
+ record(midpoint,dest);
+ }
+ }
+
+ for(i=0;i<source->num_outer;i++)
+ record(source->outer[i],dest);
+
+ set_min(dest, get_min(source));
+ set_max(dest, get_max(source));
+ set_mean(dest, get_mean(source));
+ set_variance(dest, get_variance(source));
+}
+
+double histfloor(double x) {
+
+#ifdef WIN32
+ return floor(x);
+#else
+ return((long long)x);
+#endif
+
+}
+