xref: /aosp_15_r20/frameworks/av/media/libcpustats/CentralTendencyStatistics.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <cpustats/CentralTendencyStatistics.h>
20*ec779b8eSAndroid Build Coastguard Worker 
sample(double x)21*ec779b8eSAndroid Build Coastguard Worker void CentralTendencyStatistics::sample(double x)
22*ec779b8eSAndroid Build Coastguard Worker {
23*ec779b8eSAndroid Build Coastguard Worker     // update min and max
24*ec779b8eSAndroid Build Coastguard Worker     if (x < mMinimum)
25*ec779b8eSAndroid Build Coastguard Worker         mMinimum = x;
26*ec779b8eSAndroid Build Coastguard Worker     if (x > mMaximum)
27*ec779b8eSAndroid Build Coastguard Worker         mMaximum = x;
28*ec779b8eSAndroid Build Coastguard Worker     // Knuth
29*ec779b8eSAndroid Build Coastguard Worker     if (mN == 0) {
30*ec779b8eSAndroid Build Coastguard Worker         mMean = 0;
31*ec779b8eSAndroid Build Coastguard Worker     }
32*ec779b8eSAndroid Build Coastguard Worker     ++mN;
33*ec779b8eSAndroid Build Coastguard Worker     double delta = x - mMean;
34*ec779b8eSAndroid Build Coastguard Worker     mMean += delta / mN;
35*ec779b8eSAndroid Build Coastguard Worker     mM2 += delta * (x - mMean);
36*ec779b8eSAndroid Build Coastguard Worker }
37*ec779b8eSAndroid Build Coastguard Worker 
reset()38*ec779b8eSAndroid Build Coastguard Worker void CentralTendencyStatistics::reset()
39*ec779b8eSAndroid Build Coastguard Worker {
40*ec779b8eSAndroid Build Coastguard Worker     mMean = NAN;
41*ec779b8eSAndroid Build Coastguard Worker     mMedian = NAN;
42*ec779b8eSAndroid Build Coastguard Worker     mMinimum = INFINITY;
43*ec779b8eSAndroid Build Coastguard Worker     mMaximum = -INFINITY;
44*ec779b8eSAndroid Build Coastguard Worker     mN = 0;
45*ec779b8eSAndroid Build Coastguard Worker     mM2 = 0;
46*ec779b8eSAndroid Build Coastguard Worker     mVariance = NAN;
47*ec779b8eSAndroid Build Coastguard Worker     mVarianceKnownForN = 0;
48*ec779b8eSAndroid Build Coastguard Worker     mStddev = NAN;
49*ec779b8eSAndroid Build Coastguard Worker     mStddevKnownForN = 0;
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker 
variance() const52*ec779b8eSAndroid Build Coastguard Worker double CentralTendencyStatistics::variance() const
53*ec779b8eSAndroid Build Coastguard Worker {
54*ec779b8eSAndroid Build Coastguard Worker     double variance;
55*ec779b8eSAndroid Build Coastguard Worker     if (mVarianceKnownForN != mN) {
56*ec779b8eSAndroid Build Coastguard Worker         if (mN > 1) {
57*ec779b8eSAndroid Build Coastguard Worker             // double variance_n = M2/n;
58*ec779b8eSAndroid Build Coastguard Worker             variance = mM2 / (mN - 1);
59*ec779b8eSAndroid Build Coastguard Worker         } else {
60*ec779b8eSAndroid Build Coastguard Worker             variance = NAN;
61*ec779b8eSAndroid Build Coastguard Worker         }
62*ec779b8eSAndroid Build Coastguard Worker         mVariance = variance;
63*ec779b8eSAndroid Build Coastguard Worker         mVarianceKnownForN = mN;
64*ec779b8eSAndroid Build Coastguard Worker     } else {
65*ec779b8eSAndroid Build Coastguard Worker         variance = mVariance;
66*ec779b8eSAndroid Build Coastguard Worker     }
67*ec779b8eSAndroid Build Coastguard Worker     return variance;
68*ec779b8eSAndroid Build Coastguard Worker }
69*ec779b8eSAndroid Build Coastguard Worker 
stddev() const70*ec779b8eSAndroid Build Coastguard Worker double CentralTendencyStatistics::stddev() const
71*ec779b8eSAndroid Build Coastguard Worker {
72*ec779b8eSAndroid Build Coastguard Worker     double stddev;
73*ec779b8eSAndroid Build Coastguard Worker     if (mStddevKnownForN != mN) {
74*ec779b8eSAndroid Build Coastguard Worker         stddev = sqrt(variance());
75*ec779b8eSAndroid Build Coastguard Worker         mStddev = stddev;
76*ec779b8eSAndroid Build Coastguard Worker         mStddevKnownForN = mN;
77*ec779b8eSAndroid Build Coastguard Worker     } else {
78*ec779b8eSAndroid Build Coastguard Worker         stddev = mStddev;
79*ec779b8eSAndroid Build Coastguard Worker     }
80*ec779b8eSAndroid Build Coastguard Worker     return stddev;
81*ec779b8eSAndroid Build Coastguard Worker }
82