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