package generators;
import java.util.HashSet;
import models.*;
import models.algebra.*;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.DataConstraintModel;
import models.dataFlowModel.*;
/**
* Algorithm to analyze data transfer methods selected by a user
*
* @author Nitta
*
*/
public class DataTransferMethodAnalyzer {
static private HashSet<ResourceNode> reachableNodes = new HashSet<>();
/**
* Determine whether each resource state is stored or not depending on selected data transfer methods.
*
* @param graph a data flow graph (in/out)
*/
static public void decideToStoreResourceStates(DataFlowGraph graph) {
reachableNodes.clear();
for (ResourceNode n: graph.getResourceNodes()) {
ResourceNode resource = (ResourceNode) n;
trackNode(resource);
}
}
static private void trackNode(ResourceNode resource) {
if (reachableNodes.contains(resource))
return;
reachableNodes.add(resource);
boolean flag = true;
for (Edge chToRes: resource.getInEdges()) {
for (Edge resToCh: chToRes.getSource().getInEdges()) {
if (((PushPullAttribute) resToCh.getAttribute()).getSelectedOption() != PushPullValue.PUSH) {
// Traverse pull edges only.
trackNode((ResourceNode) resToCh.getSource());
flag = false;
}
}
}
((StoreAttribute) resource.getAttribute()).setStored(flag);
}
}