1921832327619f7852b16f73a19504702c5a28a31Glenn Kasten/* 2921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * Copyright (C) 2011 The Android Open Source Project 3921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * 4921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * you may not use this file except in compliance with the License. 6921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * You may obtain a copy of the License at 7921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * 8921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * 10921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * See the License for the specific language governing permissions and 14921832327619f7852b16f73a19504702c5a28a31Glenn Kasten * limitations under the License. 15921832327619f7852b16f73a19504702c5a28a31Glenn Kasten */ 16921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 17921832327619f7852b16f73a19504702c5a28a31Glenn Kasten#ifndef _CENTRAL_TENDENCY_STATISTICS_H 18921832327619f7852b16f73a19504702c5a28a31Glenn Kasten#define _CENTRAL_TENDENCY_STATISTICS_H 19921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 20921832327619f7852b16f73a19504702c5a28a31Glenn Kasten#include <math.h> 21921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 22921832327619f7852b16f73a19504702c5a28a31Glenn Kasten// Not multithread safe 23921832327619f7852b16f73a19504702c5a28a31Glenn Kastenclass CentralTendencyStatistics { 24921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 25921832327619f7852b16f73a19504702c5a28a31Glenn Kastenpublic: 26921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 27921832327619f7852b16f73a19504702c5a28a31Glenn Kasten CentralTendencyStatistics() : 28921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mMean(NAN), mMedian(NAN), mMinimum(INFINITY), mMaximum(-INFINITY), mN(0), mM2(0), 29921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mVariance(NAN), mVarianceKnownForN(0), mStddev(NAN), mStddevKnownForN(0) { } 30921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 31921832327619f7852b16f73a19504702c5a28a31Glenn Kasten ~CentralTendencyStatistics() { } 32921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 33921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // add x to the set of samples 34921832327619f7852b16f73a19504702c5a28a31Glenn Kasten void sample(double x); 35921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 36921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the arithmetic mean of all samples so far 37921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mean() const { return mMean; } 38921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 39921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the minimum of all samples so far 40921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double minimum() const { return mMinimum; } 41921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 42921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the maximum of all samples so far 43921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double maximum() const { return mMaximum; } 44921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 45921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the variance of all samples so far 46921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double variance() const; 47921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 48921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the standard deviation of all samples so far 49921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double stddev() const; 50921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 51921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // return the number of samples added so far 52921832327619f7852b16f73a19504702c5a28a31Glenn Kasten unsigned n() const { return mN; } 53921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 54921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // reset the set of samples to be empty 55921832327619f7852b16f73a19504702c5a28a31Glenn Kasten void reset(); 56921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 57921832327619f7852b16f73a19504702c5a28a31Glenn Kastenprivate: 58921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mMean; 59921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mMedian; 60921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mMinimum; 61921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mMaximum; 62921832327619f7852b16f73a19504702c5a28a31Glenn Kasten unsigned mN; // number of samples so far 63921832327619f7852b16f73a19504702c5a28a31Glenn Kasten double mM2; 64921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 65921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // cached variance, and n at time of caching 66921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mutable double mVariance; 67921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mutable unsigned mVarianceKnownForN; 68921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 69921832327619f7852b16f73a19504702c5a28a31Glenn Kasten // cached standard deviation, and n at time of caching 70921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mutable double mStddev; 71921832327619f7852b16f73a19504702c5a28a31Glenn Kasten mutable unsigned mStddevKnownForN; 72921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 73921832327619f7852b16f73a19504702c5a28a31Glenn Kasten}; 74921832327619f7852b16f73a19504702c5a28a31Glenn Kasten 75921832327619f7852b16f73a19504702c5a28a31Glenn Kasten#endif // _CENTRAL_TENDENCY_STATISTICS_H 76