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