package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.aggregator;
import edu.usc.enl.dynamicmeasurement.data.ConfigReader;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Element;
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 8/8/13
* Time: 9:09 AM <br/>
* Implements Moving Average over a window of size = "Width"
* <p>The XML constructor requires the following Property children tags: <ul>
* <li> name attribute as "Init", the initial value of the aggregator</li>
* <li> name attribute as "Width", the width parameter as described above</li>
* </ul></p>
*/
public class MovingAverageAccuracyAggregatorImpl extends AccuracyAggregator {
private double[] accuracyWindow;
private int index = 0;
public MovingAverageAccuracyAggregatorImpl(Element element) {
accuracyWindow = new double[(int) Double.parseDouble(Util.getChildrenProperties(element, "Property").get("Width").getAttribute(ConfigReader.PROPERTY_VALUE))];
init(Double.parseDouble(Util.getChildrenProperties(element, "Property").get("Init").getAttribute(ConfigReader.PROPERTY_VALUE)));
}
public MovingAverageAccuracyAggregatorImpl(int windowSize) {
accuracyWindow = new double[windowSize];
init(1);
}
@Override
public double getAccuracy() {
double sum = 0;
for (double anAccuracyWindow : accuracyWindow) {
sum += anAccuracyWindow;
}
return sum / accuracyWindow.length;
}
@Override
public double update(double accuracy) {
accuracyWindow[index % accuracyWindow.length] = accuracy;
index++;
return getAccuracy();
}
@Override
public void init(double nextNum) {
Arrays.fill(accuracyWindow, nextNum);
}
}