RateEstimator.java revision fd303327083fdf309b9d8a15343f9eb70c014b11
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package com.android.server.notification; 18 19 20/** 21 * Exponentially weighted moving average estimator for event rate. 22 * 23 * {@hide} 24 */ 25public class RateEstimator { 26 private static final double RATE_ALPHA = 0.8; 27 private static final double MINIMUM_DT = 0.0005; 28 private Long mLastEventTime; 29 private Float mInterarrivalTime; 30 31 public RateEstimator() {} 32 33 /** Update the estimate to account for an event that just happened. */ 34 public float update(long now) { 35 float rate; 36 if (mLastEventTime == null) { 37 // No last event time, rate is zero. 38 rate = 0f; 39 } else { 40 // Calculate the new inter-arrival time based on last event time. 41 mInterarrivalTime = (float) getInterarrivalEstimate(now); 42 rate = (float) (1.0 / mInterarrivalTime); 43 } 44 mLastEventTime = now; 45 return rate; 46 } 47 48 /** @return the estimated rate if there were a new event right now. */ 49 public float getRate(long now) { 50 if (mLastEventTime == null) { 51 return 0f; 52 } 53 return (float) (1.0 / getInterarrivalEstimate(now)); 54 } 55 56 /** @return the average inter-arrival time if there were a new event right now. */ 57 private double getInterarrivalEstimate(long now) { 58 double dt = ((double) (now - mLastEventTime)) / 1000.0; 59 dt = Math.max(dt, MINIMUM_DT); 60 if (mInterarrivalTime == null) { 61 // No last inter-arrival time, return the new value directly. 62 return dt; 63 } 64 // a*iat_old + (1-a)*(t_now-t_last) 65 return (RATE_ALPHA * mInterarrivalTime + (1.0 - RATE_ALPHA) * dt); 66 } 67} 68