All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fishwife.jrugged.MovingAverage Maven / Gradle / Ivy

/* MovingAverage.java
 * 
 * Copyright 2009-2012 Comcast Interactive Media, LLC.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.fishwife.jrugged;

/**
 * This class implements an exponential moving average, using the
 *  algorithm described at http://en.wikipedia.org/wiki/Moving_average. The average does not
 *  sample itself; it merely computes the new average when updated with
 *  a sample by an external mechanism.
 */
public class MovingAverage {
    private long windowMillis;
    private long lastMillis;
    private double average;

    /** Construct a {@link MovingAverage}, providing the time window
     *  we want the average over. For example, providing a value of
	 *  3,600,000 provides a moving average over the last hour.
     *  @param windowMillis the length of the sliding window in
     *    milliseconds */
    public MovingAverage(long windowMillis) {
		this.windowMillis = windowMillis;
    }

    /** Updates the average with the latest measurement.
     *  @param sample the latest measurement in the rolling average */
    public synchronized void update(double sample) {
		long now = System.currentTimeMillis();

		if (lastMillis == 0) {	// first sample
			average = sample;
			lastMillis = now;
			return;
		}
		long deltaTime = now - lastMillis;
		double coeff = Math.exp(-1.0 * ((double)deltaTime / windowMillis));
        average = (1.0 - coeff) * sample + coeff * average;
        
		lastMillis = now;
    }

    /**
     * Returns the last computed average value.
     *
     * @return double The calculated avg.
     */
    public double getAverage() { return average; }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy