/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.util.arrayutil;
import java.util.ArrayList;
import java.util.List;
/**
* This class implements a simple sliding window. Arrays of doubles can be added
* to the window. The sliding window will fill up to the specified size.
* Additional entries will cause the oldest entries to fall off.
*
*/
public class WindowDouble {
/**
* The size of the window.
*/
private int size;
/**
* The data in the window.
*/
private List<double[]> data = new ArrayList<double[]>();
/**
* Construct the window.
*
* @param theSize
* The size of the window.
*/
public WindowDouble(int theSize) {
this.size = theSize;
}
/**
* Add an array to the window.
*
* @param a
* The array.
*/
public void add(double[] a) {
this.data.add(0, a);
while (this.data.size() > this.size) {
this.data.remove(this.data.size() - 1);
}
}
/**
* Clear the contents of the window.
*/
public void clear() {
this.data.clear();
}
/**
* @return True, if the window is full.
*/
public boolean isFull() {
return this.data.size() == this.size;
}
/**
* Calculate the max value, for the specified index, over all of the data in
* the window.
*
* @param index
* The index of the value to compare.
* @param starting
* The starting position, inside the window to compare at.
* @return THe max value.
*/
public double calculateMax(int index, int starting) {
double result = Double.NEGATIVE_INFINITY;
for (int i = starting; i < this.data.size(); i++) {
double[] a = this.data.get(i);
result = Math.max(a[index], result);
}
return result;
}
/**
* Calculate the max value, for the specified index, over all of the data in
* the window.
*
* @param index
* The index of the value to compare.
* @param starting
* The starting position, inside the window to compare at.
* @return THe max value.
*/
public double calculateMin(int index, int starting) {
double result = Double.POSITIVE_INFINITY;
for (int i = starting; i < this.data.size(); i++) {
double[] a = this.data.get(i);
result = Math.min(a[index], result);
}
return result;
}
/**
* Get the last value from the window. This is the most recent item added.
*
* @return The last value from the window.
*/
public double[] getLast() {
return this.data.get(0);
}
}