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#include <stdlib.h>
180b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten
190b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten#include <cpustats/CentralTendencyStatistics.h>
200b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten
210b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastenvoid CentralTendencyStatistics::sample(double x)
220b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten{
230b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    // update min and max
240b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    if (x < mMinimum)
250b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mMinimum = x;
260b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    if (x > mMaximum)
270b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mMaximum = x;
280b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    // Knuth
290b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    if (mN == 0) {
300b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mMean = 0;
310b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    }
320b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    ++mN;
330b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    double delta = x - mMean;
340b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mMean += delta / mN;
350b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mM2 += delta * (x - mMean);
360b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten}
370b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten
380b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastenvoid CentralTendencyStatistics::reset()
390b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten{
400b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mMean = NAN;
410b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mMedian = NAN;
420b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mMinimum = INFINITY;
430b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mMaximum = -INFINITY;
440b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mN = 0;
450b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mM2 = 0;
460b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mVariance = NAN;
470b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mVarianceKnownForN = 0;
480b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mStddev = NAN;
490b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    mStddevKnownForN = 0;
500b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten}
510b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten
520b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastendouble CentralTendencyStatistics::variance() const
530b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten{
540b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    double variance;
550b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    if (mVarianceKnownForN != mN) {
560b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        if (mN > 1) {
570b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten            // double variance_n = M2/n;
580b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten            variance = mM2 / (mN - 1);
590b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        } else {
600b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten            variance = NAN;
610b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        }
620b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mVariance = variance;
630b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mVarianceKnownForN = mN;
640b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    } else {
650b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        variance = mVariance;
660b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    }
670b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    return variance;
680b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten}
690b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten
700b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kastendouble CentralTendencyStatistics::stddev() const
710b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten{
720b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    double stddev;
730b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    if (mStddevKnownForN != mN) {
740b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        stddev = sqrt(variance());
750b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mStddev = stddev;
760b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        mStddevKnownForN = mN;
770b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    } else {
780b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten        stddev = mStddev;
790b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    }
800b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten    return stddev;
810b94dcd03d8764eab7f1fb00f0f1f37904732aa1Glenn Kasten}
82