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