10224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber/* 20224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * Copyright 2012, The Android Open Source Project 30224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * 40224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 50224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * you may not use this file except in compliance with the License. 60224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * You may obtain a copy of the License at 70224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * 80224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 90224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * 100224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * Unless required by applicable law or agreed to in writing, software 110224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 120224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * See the License for the specific language governing permissions and 140224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber * limitations under the License. 150224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber */ 160224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 170224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#include "TimeSeries.h" 180224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 190224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#include <math.h> 200224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#include <string.h> 210224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 220224bf170a3904576bba81593eaab113c5d3a4e7Andreas Hubernamespace android { 230224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 240224bf170a3904576bba81593eaab113c5d3a4e7Andreas HuberTimeSeries::TimeSeries() 250224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber : mCount(0), 260224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mSum(0.0) { 270224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber} 280224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 290224bf170a3904576bba81593eaab113c5d3a4e7Andreas Hubervoid TimeSeries::add(double val) { 300224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber if (mCount < kHistorySize) { 310224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mValues[mCount++] = val; 320224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mSum += val; 330224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } else { 340224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mSum -= mValues[0]; 350224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber memmove(&mValues[0], &mValues[1], (kHistorySize - 1) * sizeof(double)); 360224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mValues[kHistorySize - 1] = val; 370224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber mSum += val; 380224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } 390224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber} 400224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 410224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huberdouble TimeSeries::mean() const { 420224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber if (mCount < 1) { 430224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber return 0.0; 440224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } 450224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 460224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber return mSum / mCount; 470224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber} 480224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 490224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huberdouble TimeSeries::sdev() const { 500224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber if (mCount < 1) { 510224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber return 0.0; 520224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } 530224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 540224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber double m = mean(); 550224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 560224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber double sum = 0.0; 570224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber for (size_t i = 0; i < mCount; ++i) { 580224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber double tmp = mValues[i] - m; 590224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber tmp *= tmp; 600224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 610224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber sum += tmp; 620224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } 630224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 640224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber return sqrt(sum / mCount); 650224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber} 660224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber 670224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber} // namespace android 68