diff --git a/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java b/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java index 5bf5410..44f78ed 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java @@ -6,23 +6,40 @@ import models.dataFlowModel.DataFlowModel; public class UpdateConflictCheck { - private Map unvisit = new HashMap<>(); - private List list = new LinkedList<>(); + private int index = 0; + private Deque stack = new ArrayDeque<>(); + private Set> strong = new HashSet<>(); + private Map ids = new HashMap<>(); + private Map lowlink = new HashMap<>(); + private Map onStack = new HashMap<>(); - private void visit(Node node) { - if (unvisit.get(node)) { - for (Node n : node.getSuccessors()) { - visit(n); - list.add(node); + private void strongconnect(Node node) { + ids.put(index, node); + lowlink.put(node, index); + index++; + stack.push(node); + onStack.put(node, true); + + for (Node n : node.getSuccessors()) { + if (lowlink.containsKey(n)) { + strongconnect(n); + if (lowlink.get(node) > lowlink.get(n)) { + lowlink.replace(node, lowlink.get(node), lowlink.get(n)); + } + } else if (onStack.get(n)) { + if (lowlink.get(node) > lowlink.get(n)) { + lowlink.replace(node, lowlink.get(node), lowlink.get(n)); + } } } } - private void assign(Node u1, Node u2) { - - } - public boolean run(DataFlowModel model) { + for (Node node : model.getResourceDependencyGraph().getNodes()) { + if (ids.get(index) == null) { + strongconnect(node); + } + } return false; } }