10b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten/* 20b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * Copyright (C) 2011 The Android Open Source Project 30b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * 40b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * you may not use this file except in compliance with the License. 60b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * You may obtain a copy of the License at 70b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * 80b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * 100b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * See the License for the specific language governing permissions and 140b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten * limitations under the License. 150b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten */ 160b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 170b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten#ifndef _CENTRAL_TENDENCY_STATISTICS_H 180b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten#define _CENTRAL_TENDENCY_STATISTICS_H 190b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 200b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten#include <math.h> 210b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 220b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten// Not multithread safe 230b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastenclass CentralTendencyStatistics { 240b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 250b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastenpublic: 260b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 270b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten CentralTendencyStatistics() : 280b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mMean(NAN), mMedian(NAN), mMinimum(INFINITY), mMaximum(-INFINITY), mN(0), mM2(0), 290b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mVariance(NAN), mVarianceKnownForN(0), mStddev(NAN), mStddevKnownForN(0) { } 300b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 310b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten ~CentralTendencyStatistics() { } 320b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 330b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // add x to the set of samples 340b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten void sample(double x); 350b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 360b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the arithmetic mean of all samples so far 370b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mean() const { return mMean; } 380b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 390b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the minimum of all samples so far 400b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double minimum() const { return mMinimum; } 410b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 420b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the maximum of all samples so far 430b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double maximum() const { return mMaximum; } 440b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 450b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the variance of all samples so far 460b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double variance() const; 470b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 480b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the standard deviation of all samples so far 490b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double stddev() const; 500b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 510b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // return the number of samples added so far 520b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten unsigned n() const { return mN; } 530b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 540b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // reset the set of samples to be empty 550b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten void reset(); 560b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 570b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastenprivate: 580b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mMean; 590b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mMedian; 600b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mMinimum; 610b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mMaximum; 620b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten unsigned mN; // number of samples so far 630b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten double mM2; 640b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 650b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // cached variance, and n at time of caching 660b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mutable double mVariance; 670b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mutable unsigned mVarianceKnownForN; 680b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 690b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten // cached standard deviation, and n at time of caching 700b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mutable double mStddev; 710b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten mutable unsigned mStddevKnownForN; 720b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 730b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten}; 740b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten 750b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten#endif // _CENTRAL_TENDENCY_STATISTICS_H 76