RateEstimator.java revision c8673a88fed53715d2295a535535c7ce7acbe7b6
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(long now) { 32 mLastEventTime = now; 33 } 34 35 /** Update the estimate to account for an event that jsut happened. */ 36 public float update(long now) { 37 mInterarrivalTime = (float) getInterarrivalEstimate(now); 38 mLastEventTime = now; 39 return (float) (1.0 / mInterarrivalTime); 40 } 41 42 /** @return the estimated rate if there were a new event right now. */ 43 public float getRate(long now) { 44 return (float) (1.0 / getInterarrivalEstimate(now)); 45 } 46 47 /** @return the average inter-arrival time if there were a new event right now. */ 48 private double getInterarrivalEstimate(long now) { 49 // a*iat_old + (1-a)*(t_now-t_last) 50 double dt = ((double) (now - mLastEventTime)) / 1000.0; 51 dt = Math.max(dt, MINIMUM_DT); 52 return (RATE_ALPHA * mInterarrivalTime + (1.0 - RATE_ALPHA) * dt); 53 } 54} 55