#pragma once #include #include #include struct TTest { double t_stat = 0.0; double dof = 0.0; double p_val = 0.0; }; struct Stats { using TimeBullshit = std::chrono::time_point; double sum = 0.0; double sumsq = 0.0; double n = 0.0; double min = 0.0; double max = 0.0; inline void reset() { sum = 0.0; sumsq = 0.0; n = 0.0; min = 0.0; max = 0.0; } inline double mean() { return sum / n; } inline double stddev(bool use_sample=true) { if(use_sample) { return std::sqrt(sample_variance()); } else { return std::sqrt(variance()); } } inline double variance() { return (sumsq - (sum * sum / n)) / n; } inline double sample_variance() { return (sumsq - (sum * sum / n)) / (n - 1); } inline void sample(double s) { sum += s; sumsq += s * s; if (n == 0) { min = s; max = s; } else { if (min > s) min = s; if (max < s) max = s; } n += 1; } inline TimeBullshit time_start() { return std::chrono::high_resolution_clock::now(); } inline void sample_time(TimeBullshit start) { auto end = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration(end - start); if(elapsed.count() > 0.0) { sample(1.0/elapsed.count()); } } void dump(std::string msg=""); TTest t_test(Stats& other); };