1e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton/* 2e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton * Copyright 2015 Google Inc. 3e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton * 4e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton * Use of this source code is governed by a BSD-style license that can be 5e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton * found in the LICENSE file. 6e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton */ 7e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton 890c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein#ifndef Stats_DEFINED 990c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein#define Stats_DEFINED 1090c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein 115d9d10e8217d2138b5514a4d4216f95373240942mtklein#include "SkString.h" 1240b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein#include "SkTSort.h" 1340b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein 146238688af0d758660d344ec047243d4efefd6f4dmtklein#ifdef SK_BUILD_FOR_WIN 156238688af0d758660d344ec047243d4efefd6f4dmtklein static const char* kBars[] = { ".", "o", "O" }; 166238688af0d758660d344ec047243d4efefd6f4dmtklein#else 176238688af0d758660d344ec047243d4efefd6f4dmtklein static const char* kBars[] = { "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█" }; 186238688af0d758660d344ec047243d4efefd6f4dmtklein#endif 195d9d10e8217d2138b5514a4d4216f95373240942mtklein 2090c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtkleinstruct Stats { 21e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton Stats(const SkTArray<double>& samples) { 22e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton int n = samples.count(); 23e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton if (!n) { 24e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton min = max = mean = var = median = 0; 25e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton return; 26e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton } 27e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton 2890c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein min = samples[0]; 2990c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein max = samples[0]; 3090c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein for (int i = 0; i < n; i++) { 3190c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein if (samples[i] < min) { min = samples[i]; } 3290c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein if (samples[i] > max) { max = samples[i]; } 3390c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein } 3490c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein 3590c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein double sum = 0.0; 3690c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein for (int i = 0 ; i < n; i++) { 3790c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein sum += samples[i]; 3890c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein } 3990c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein mean = sum / n; 4090c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein 4190c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein double err = 0.0; 4290c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein for (int i = 0 ; i < n; i++) { 4390c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein err += (samples[i] - mean) * (samples[i] - mean); 4490c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein } 4590c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein var = err / (n-1); 4640b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein 4740b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein SkAutoTMalloc<double> sorted(n); 48e1b8958877a512bf83cbc2c72bb31e7d71b06f43cdalton memcpy(sorted.get(), samples.begin(), n * sizeof(double)); 4940b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein SkTQSort(sorted.get(), sorted.get() + n - 1); 5040b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein median = sorted[n/2]; 515d9d10e8217d2138b5514a4d4216f95373240942mtklein 52a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein // Normalize samples to [min, max] in as many quanta as we have distinct bars to print. 535d9d10e8217d2138b5514a4d4216f95373240942mtklein for (int i = 0; i < n; i++) { 54a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein if (min == max) { 55a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein // All samples are the same value. Don't divide by zero. 56a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein plot.append(kBars[0]); 57a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein continue; 58a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein } 59a189ccdb4d5efdbbfa34a26c08656634b615f930mtklein 605d9d10e8217d2138b5514a4d4216f95373240942mtklein double s = samples[i]; 615d9d10e8217d2138b5514a4d4216f95373240942mtklein s -= min; 625d9d10e8217d2138b5514a4d4216f95373240942mtklein s /= (max - min); 635d9d10e8217d2138b5514a4d4216f95373240942mtklein s *= (SK_ARRAY_COUNT(kBars) - 1); 64912947737a973421f4c58682b6171cb5ee00ad3aMike Klein const size_t bar = (size_t)(s + 0.5); 65f2b340fc885ad2a12d2d73974eff9c8f4c94192cdjsollen SkASSERT_RELEASE(bar < SK_ARRAY_COUNT(kBars)); 665d9d10e8217d2138b5514a4d4216f95373240942mtklein plot.append(kBars[bar]); 675d9d10e8217d2138b5514a4d4216f95373240942mtklein } 6890c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein } 6990c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein 7090c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein double min; 7190c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein double max; 725d9d10e8217d2138b5514a4d4216f95373240942mtklein double mean; // Estimate of population mean. 735d9d10e8217d2138b5514a4d4216f95373240942mtklein double var; // Estimate of population variance. 7440b32be3718f0f2e01c4a21bb0004b7f93670c42mtklein double median; 755d9d10e8217d2138b5514a4d4216f95373240942mtklein SkString plot; // A single-line bar chart (_not_ histogram) of the samples. 7690c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein}; 7790c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein 7890c471e73fb0bd09aef8ad1e3f0842e5d46fb342mtklein#endif//Stats_DEFINED 79