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

hivemall.utils.stats.MovingAverage Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 hivemall.utils.stats;

import hivemall.utils.collections.DoubleRingBuffer;
import hivemall.utils.lang.NumberUtils;
import hivemall.utils.lang.Preconditions;

import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;

public final class MovingAverage {

    @Nonnull
    private final DoubleRingBuffer ring;

    private double totalSum;

    public MovingAverage(@Nonnegative int windowSize) {
        Preconditions.checkArgument(windowSize > 1, "Invalid window size: " + windowSize);
        this.ring = new DoubleRingBuffer(windowSize);
        this.totalSum = 0.d;
    }

    public double add(final double x) {
        if (!NumberUtils.isFinite(x)) {
            throw new IllegalArgumentException("Detected Infinite input: " + x);
        }

        if (ring.isFull()) {
            double head = ring.head();
            this.totalSum -= head;
        }
        ring.add(x);
        totalSum += x;

        final int size = ring.size();
        if (size == 0) {
            return 0.d;
        }
        return totalSum / size;
    }

    public double get() {
        final int size = ring.size();
        if (size == 0) {
            return 0.d;
        }
        return totalSum / size;
    }

    @Override
    public String toString() {
        return "MovingAverage [ring=" + ring + ", total=" + totalSum + ", moving_avg=" + get()
                + "]";
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy