1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/sample_stats.h" 11*d9f75844SAndroid Build Coastguard Worker 12*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 13*d9f75844SAndroid Build Coastguard Worker Max()14*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Max() { 15*d9f75844SAndroid Build Coastguard Worker if (IsEmpty()) 16*d9f75844SAndroid Build Coastguard Worker return INFINITY; 17*d9f75844SAndroid Build Coastguard Worker return GetMax(); 18*d9f75844SAndroid Build Coastguard Worker } 19*d9f75844SAndroid Build Coastguard Worker Mean()20*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Mean() { 21*d9f75844SAndroid Build Coastguard Worker if (IsEmpty()) 22*d9f75844SAndroid Build Coastguard Worker return 0; 23*d9f75844SAndroid Build Coastguard Worker return GetAverage(); 24*d9f75844SAndroid Build Coastguard Worker } 25*d9f75844SAndroid Build Coastguard Worker Median()26*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Median() { 27*d9f75844SAndroid Build Coastguard Worker return Quantile(0.5); 28*d9f75844SAndroid Build Coastguard Worker } 29*d9f75844SAndroid Build Coastguard Worker Quantile(double quantile)30*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Quantile(double quantile) { 31*d9f75844SAndroid Build Coastguard Worker if (IsEmpty()) 32*d9f75844SAndroid Build Coastguard Worker return 0; 33*d9f75844SAndroid Build Coastguard Worker return GetPercentile(quantile); 34*d9f75844SAndroid Build Coastguard Worker } 35*d9f75844SAndroid Build Coastguard Worker Min()36*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Min() { 37*d9f75844SAndroid Build Coastguard Worker if (IsEmpty()) 38*d9f75844SAndroid Build Coastguard Worker return -INFINITY; 39*d9f75844SAndroid Build Coastguard Worker return GetMin(); 40*d9f75844SAndroid Build Coastguard Worker } 41*d9f75844SAndroid Build Coastguard Worker Variance()42*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::Variance() { 43*d9f75844SAndroid Build Coastguard Worker if (IsEmpty()) 44*d9f75844SAndroid Build Coastguard Worker return 0; 45*d9f75844SAndroid Build Coastguard Worker return GetVariance(); 46*d9f75844SAndroid Build Coastguard Worker } 47*d9f75844SAndroid Build Coastguard Worker StandardDeviation()48*d9f75844SAndroid Build Coastguard Workerdouble SampleStats<double>::StandardDeviation() { 49*d9f75844SAndroid Build Coastguard Worker return sqrt(Variance()); 50*d9f75844SAndroid Build Coastguard Worker } 51*d9f75844SAndroid Build Coastguard Worker Count()52*d9f75844SAndroid Build Coastguard Workerint SampleStats<double>::Count() { 53*d9f75844SAndroid Build Coastguard Worker return static_cast<int>(GetSamples().size()); 54*d9f75844SAndroid Build Coastguard Worker } 55*d9f75844SAndroid Build Coastguard Worker AddSample(TimeDelta delta)56*d9f75844SAndroid Build Coastguard Workervoid SampleStats<TimeDelta>::AddSample(TimeDelta delta) { 57*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(delta.IsFinite()); 58*d9f75844SAndroid Build Coastguard Worker stats_.AddSample(delta.seconds<double>()); 59*d9f75844SAndroid Build Coastguard Worker } 60*d9f75844SAndroid Build Coastguard Worker AddSampleMs(double delta_ms)61*d9f75844SAndroid Build Coastguard Workervoid SampleStats<TimeDelta>::AddSampleMs(double delta_ms) { 62*d9f75844SAndroid Build Coastguard Worker AddSample(TimeDelta::Millis(delta_ms)); 63*d9f75844SAndroid Build Coastguard Worker } AddSamples(const SampleStats<TimeDelta> & other)64*d9f75844SAndroid Build Coastguard Workervoid SampleStats<TimeDelta>::AddSamples(const SampleStats<TimeDelta>& other) { 65*d9f75844SAndroid Build Coastguard Worker stats_.AddSamples(other.stats_); 66*d9f75844SAndroid Build Coastguard Worker } 67*d9f75844SAndroid Build Coastguard Worker IsEmpty()68*d9f75844SAndroid Build Coastguard Workerbool SampleStats<TimeDelta>::IsEmpty() { 69*d9f75844SAndroid Build Coastguard Worker return stats_.IsEmpty(); 70*d9f75844SAndroid Build Coastguard Worker } 71*d9f75844SAndroid Build Coastguard Worker Max()72*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Max() { 73*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.Max()); 74*d9f75844SAndroid Build Coastguard Worker } 75*d9f75844SAndroid Build Coastguard Worker Mean()76*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Mean() { 77*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.Mean()); 78*d9f75844SAndroid Build Coastguard Worker } 79*d9f75844SAndroid Build Coastguard Worker Median()80*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Median() { 81*d9f75844SAndroid Build Coastguard Worker return Quantile(0.5); 82*d9f75844SAndroid Build Coastguard Worker } 83*d9f75844SAndroid Build Coastguard Worker Quantile(double quantile)84*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Quantile(double quantile) { 85*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.Quantile(quantile)); 86*d9f75844SAndroid Build Coastguard Worker } 87*d9f75844SAndroid Build Coastguard Worker Min()88*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Min() { 89*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.Min()); 90*d9f75844SAndroid Build Coastguard Worker } 91*d9f75844SAndroid Build Coastguard Worker Variance()92*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::Variance() { 93*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.Variance()); 94*d9f75844SAndroid Build Coastguard Worker } 95*d9f75844SAndroid Build Coastguard Worker StandardDeviation()96*d9f75844SAndroid Build Coastguard WorkerTimeDelta SampleStats<TimeDelta>::StandardDeviation() { 97*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Seconds(stats_.StandardDeviation()); 98*d9f75844SAndroid Build Coastguard Worker } 99*d9f75844SAndroid Build Coastguard Worker Count()100*d9f75844SAndroid Build Coastguard Workerint SampleStats<TimeDelta>::Count() { 101*d9f75844SAndroid Build Coastguard Worker return stats_.Count(); 102*d9f75844SAndroid Build Coastguard Worker } 103*d9f75844SAndroid Build Coastguard Worker AddSample(DataRate sample)104*d9f75844SAndroid Build Coastguard Workervoid SampleStats<DataRate>::AddSample(DataRate sample) { 105*d9f75844SAndroid Build Coastguard Worker stats_.AddSample(sample.bps<double>()); 106*d9f75844SAndroid Build Coastguard Worker } 107*d9f75844SAndroid Build Coastguard Worker AddSampleBps(double rate_bps)108*d9f75844SAndroid Build Coastguard Workervoid SampleStats<DataRate>::AddSampleBps(double rate_bps) { 109*d9f75844SAndroid Build Coastguard Worker stats_.AddSample(rate_bps); 110*d9f75844SAndroid Build Coastguard Worker } 111*d9f75844SAndroid Build Coastguard Worker AddSamples(const SampleStats<DataRate> & other)112*d9f75844SAndroid Build Coastguard Workervoid SampleStats<DataRate>::AddSamples(const SampleStats<DataRate>& other) { 113*d9f75844SAndroid Build Coastguard Worker stats_.AddSamples(other.stats_); 114*d9f75844SAndroid Build Coastguard Worker } 115*d9f75844SAndroid Build Coastguard Worker IsEmpty()116*d9f75844SAndroid Build Coastguard Workerbool SampleStats<DataRate>::IsEmpty() { 117*d9f75844SAndroid Build Coastguard Worker return stats_.IsEmpty(); 118*d9f75844SAndroid Build Coastguard Worker } 119*d9f75844SAndroid Build Coastguard Worker Max()120*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Max() { 121*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.Max()); 122*d9f75844SAndroid Build Coastguard Worker } 123*d9f75844SAndroid Build Coastguard Worker Mean()124*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Mean() { 125*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.Mean()); 126*d9f75844SAndroid Build Coastguard Worker } 127*d9f75844SAndroid Build Coastguard Worker Median()128*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Median() { 129*d9f75844SAndroid Build Coastguard Worker return Quantile(0.5); 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker Quantile(double quantile)132*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Quantile(double quantile) { 133*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.Quantile(quantile)); 134*d9f75844SAndroid Build Coastguard Worker } 135*d9f75844SAndroid Build Coastguard Worker Min()136*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Min() { 137*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.Min()); 138*d9f75844SAndroid Build Coastguard Worker } 139*d9f75844SAndroid Build Coastguard Worker Variance()140*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::Variance() { 141*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.Variance()); 142*d9f75844SAndroid Build Coastguard Worker } 143*d9f75844SAndroid Build Coastguard Worker StandardDeviation()144*d9f75844SAndroid Build Coastguard WorkerDataRate SampleStats<DataRate>::StandardDeviation() { 145*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(stats_.StandardDeviation()); 146*d9f75844SAndroid Build Coastguard Worker } 147*d9f75844SAndroid Build Coastguard Worker Count()148*d9f75844SAndroid Build Coastguard Workerint SampleStats<DataRate>::Count() { 149*d9f75844SAndroid Build Coastguard Worker return stats_.Count(); 150*d9f75844SAndroid Build Coastguard Worker } 151*d9f75844SAndroid Build Coastguard Worker 152*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 153