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