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#include <stdlib.h>
18921832327619f7852b16f73a19504702c5a28a31Glenn Kasten
19921832327619f7852b16f73a19504702c5a28a31Glenn Kasten#include <cpustats/CentralTendencyStatistics.h>
20921832327619f7852b16f73a19504702c5a28a31Glenn Kasten
21921832327619f7852b16f73a19504702c5a28a31Glenn Kastenvoid CentralTendencyStatistics::sample(double x)
22921832327619f7852b16f73a19504702c5a28a31Glenn Kasten{
23921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    // update min and max
24921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    if (x < mMinimum)
25921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mMinimum = x;
26921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    if (x > mMaximum)
27921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mMaximum = x;
28921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    // Knuth
29921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    if (mN == 0) {
30921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mMean = 0;
31921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    }
32921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    ++mN;
33921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    double delta = x - mMean;
34921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mMean += delta / mN;
35921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mM2 += delta * (x - mMean);
36921832327619f7852b16f73a19504702c5a28a31Glenn Kasten}
37921832327619f7852b16f73a19504702c5a28a31Glenn Kasten
38921832327619f7852b16f73a19504702c5a28a31Glenn Kastenvoid CentralTendencyStatistics::reset()
39921832327619f7852b16f73a19504702c5a28a31Glenn Kasten{
40921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mMean = NAN;
41921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mMedian = NAN;
42921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mMinimum = INFINITY;
43921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mMaximum = -INFINITY;
44921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mN = 0;
45921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mM2 = 0;
46921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mVariance = NAN;
47921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mVarianceKnownForN = 0;
48921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mStddev = NAN;
49921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    mStddevKnownForN = 0;
50921832327619f7852b16f73a19504702c5a28a31Glenn Kasten}
51921832327619f7852b16f73a19504702c5a28a31Glenn Kasten
52921832327619f7852b16f73a19504702c5a28a31Glenn Kastendouble CentralTendencyStatistics::variance() const
53921832327619f7852b16f73a19504702c5a28a31Glenn Kasten{
54921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    double variance;
55921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    if (mVarianceKnownForN != mN) {
56921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        if (mN > 1) {
57921832327619f7852b16f73a19504702c5a28a31Glenn Kasten            // double variance_n = M2/n;
58921832327619f7852b16f73a19504702c5a28a31Glenn Kasten            variance = mM2 / (mN - 1);
59921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        } else {
60921832327619f7852b16f73a19504702c5a28a31Glenn Kasten            variance = NAN;
61921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        }
62921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mVariance = variance;
63921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mVarianceKnownForN = mN;
64921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    } else {
65921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        variance = mVariance;
66921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    }
67921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    return variance;
68921832327619f7852b16f73a19504702c5a28a31Glenn Kasten}
69921832327619f7852b16f73a19504702c5a28a31Glenn Kasten
70921832327619f7852b16f73a19504702c5a28a31Glenn Kastendouble CentralTendencyStatistics::stddev() const
71921832327619f7852b16f73a19504702c5a28a31Glenn Kasten{
72921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    double stddev;
73921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    if (mStddevKnownForN != mN) {
74921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        stddev = sqrt(variance());
75921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mStddev = stddev;
76921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        mStddevKnownForN = mN;
77921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    } else {
78921832327619f7852b16f73a19504702c5a28a31Glenn Kasten        stddev = mStddev;
79921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    }
80921832327619f7852b16f73a19504702c5a28a31Glenn Kasten    return stddev;
81921832327619f7852b16f73a19504702c5a28a31Glenn Kasten}
82