package edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.multiswitch.separateallocation.globaldrop;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.aggregator.AccuracyAggregator;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.multiswitch.separateallocation.MultiSwitchTask;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.multiswitch.separateallocation.SeparateMultiTaskMultiSwitchTaskHandler;
import edu.usc.enl.dynamicmeasurement.data.ConfigReader;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Element;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 12/27/13
* Time: 6:56 AM <br/>
* Drops a task if is not saisficed X percent of its lifetime, lets drop it.
*/
public class AverageSatisfactionGlobalDrop implements GlobalDrop {
private final double lowThreshold;
private final double satisfactionThreshold;
private final Element satisfactionAggregatorElement;
private Map<MultiSwitchTask, AccuracyAggregator> taskAccuracyAggregatorMap;
private SeparateMultiTaskMultiSwitchTaskHandler taskHandler;
private List<MultiSwitchTask> toDrop;
public AverageSatisfactionGlobalDrop(Element element, SeparateMultiTaskMultiSwitchTaskHandler taskHandler) {
taskAccuracyAggregatorMap = new HashMap<>();
this.taskHandler = taskHandler;
Map<String, Element> properties = Util.getChildrenProperties(element, "Property");
satisfactionThreshold = Double.parseDouble(properties.get("SatisfactionThreshold").getAttribute(ConfigReader.PROPERTY_VALUE));
lowThreshold = Double.parseDouble(properties.get("LowThreshold").getAttribute(ConfigReader.PROPERTY_VALUE));
satisfactionAggregatorElement = properties.get("SatisfactionAggregator");
toDrop = new ArrayList<>();
}
@Override
public void doRemove(MultiSwitchTask multiSwitchTask) {
taskAccuracyAggregatorMap.remove(multiSwitchTask);
}
@Override
public void globalDrop() {
for (Map.Entry<MultiSwitchTask, AccuracyAggregator> entry : taskAccuracyAggregatorMap.entrySet()) {
if (entry.getValue().getAccuracy() < satisfactionThreshold) {
taskHandler.getLogWriter().println("Drop " + entry.getKey() + " satisfaction " + entry.getValue().getAccuracy());
toDrop.add(entry.getKey());
}
}
for (MultiSwitchTask multiSwitchTask : toDrop) {
taskHandler.drop(multiSwitchTask);
}
}
@Override
public void update() {
for (MultiSwitchTask multiSwitchTask : taskHandler.getAcceptedTasks()) {
AccuracyAggregator accuracyAggregator = taskAccuracyAggregatorMap.get(multiSwitchTask);
int satisfaction = multiSwitchTask.getGlobalAccuracy() >= lowThreshold ? 1 : 0;
if (accuracyAggregator != null) {
accuracyAggregator.update(satisfaction);
// System.out.println(multiSwitchTask + ":" + satisfaction);
} else {
try {
AccuracyAggregator satisfactionAggregator = (AccuracyAggregator) Class.forName(satisfactionAggregatorElement.getAttribute(ConfigReader.PROPERTY_VALUE)).
getConstructor(Element.class).newInstance(satisfactionAggregatorElement);
taskAccuracyAggregatorMap.put(multiSwitchTask, satisfactionAggregator);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
}