package algorithms;
import java.util.Collection;
import java.util.HashSet;
import models.*;
import models.algebra.*;
import models.dataConstraintModel.*;
import models.dataFlowModel.*;
public class NecessityOfStoringResourceStates {
static public ResourceDependencyGraph doDecide(DataFlowModel model) {
ResourceDependencyGraph graph = model.getResourceDependencyGraph();
Collection<ChannelGenerator> channels = new HashSet<>(model.getIOChannelGenerators());
channels.addAll(model.getChannelGenerators());
for (ChannelGenerator generator: channels) {
for (ChannelMember member: ((DataflowChannelGenerator) generator).getOutputChannelMembers()) {
boolean flag = !member.getStateTransition().isRightUnary(); // The state does not need to be stored if the state transition function is right unary.
for (Node node : graph.getNodes()) {
if (((ResourceNode) node).getIdentifierTemplate().equals(member.getIdentifierTemplate())) {
setStoreAttribute(flag, (ResourceNode) node);
}
}
}
}
for (Node node : graph.getNodes()) {
HashSet<ChannelGenerator> inChannels = new HashSet<>();
for(Edge pre : ((ResourceNode) node).getInEdges()) {
inChannels.add(((ResourceDependency) pre).getChannelGenerator());
}
if ((inChannels.size() > 1)) {
setStoreAttribute(true, (ResourceNode) node);
} else if (((ResourceNode) node).getAttribute() == null) {
setStoreAttribute(false, (ResourceNode) node);
}
}
return graph;
}
static private void setStoreAttribute(boolean flag, ResourceNode node) {
NodeAttribute attr = node.getAttribute();
StoreAttribute store;
if (attr != null && attr instanceof NodeAttribute) {
store = (StoreAttribute) attr;
store.setNeeded(store.isNeeded() || flag);
} else {
store = new StoreAttribute();
store.setNeeded(flag);
node.setAttribute(store);
}
}
}