private void doOneOrMore(Path path) { if ( trace ) System.out.printf("\nOneOrMore: %s\n", node) ; //Stack<Node> visited = new Stack<Node>() ; Set<Node> visited = new HashSet<Node>() ; // Do one step without including. Iterator<Node> iter1 = eval(graph, node, path, forwardMode) ; for ( ; iter1.hasNext() ; ) { Node n1 = iter1.next(); if ( trace ) System.out.printf("One from %s\n visited=%s\n output=%s\n", n1, visited, output) ; ALP(n1, path, visited) ; } }
private void ALP(Node node, Path path, Collection<Node> visited) { if ( trace ) System.out.printf("ALP node=%s\n visited=%s\n output=%s\n", node, visited, output) ; if ( visited.contains(node) ) return ; // If output is a set, then no point going on if node has been added to the results. // If output includes duplicates, more solutions are generated // "visited" is nodes on this path (see the matching .remove). if ( ! output.add(node) ) return ; visited.add(node) ; Iterator<Node> iter1 = eval(graph, node, path, forwardMode) ; // For each step, add to results and recurse. for ( ; iter1.hasNext() ; ) { Node n1 = iter1.next(); ALP(n1, path, visited) ; } visited.remove(node) ; } }
private void doZeroOrMore(Path path) { if ( trace ) System.out.printf("\nZeroOrMore: %s\n", node) ; //Stack<Node> visited = new Stack<Node>() ; Set<Node> visited = new HashSet<Node>() ; ALP(node, path, visited) ; }