protected <S> void collect(Nfa<S> nfa, S state, Set<S> visited) { if (!visited.add(state)) return; for (S s : nfa.getFollowers(state)) collect(nfa, s, visited); }
protected <S> void collectedInverseMap(Nfa<S> nfa, S state, Map<S, List<S>> inverseMap, Set<S> visited) { if (!visited.add(state)) return; for (S follower : nfa.getFollowers(state)) { List<S> inverse = inverseMap.get(follower); if (inverse == null) inverseMap.put(follower, inverse = Lists.newArrayList()); inverse.add(state); collectedInverseMap(nfa, follower, inverseMap, visited); } }
protected <S> void collectFollowers(Nfa<S> nfa, S owner, Set<S> result, Set<S> visited, Predicate<S> filter) { if (!visited.add(owner)) return; if (filter.apply(owner)) { result.add(owner); return; } for (S follower : nfa.getFollowers(owner)) collectFollowers(nfa, follower, result, visited, filter); }
protected <S> void collect(Nfa<S> nfa, S state, Set<S> visited) { if (!visited.add(state)) return; for (S s : nfa.getFollowers(state)) collect(nfa, s, visited); }
protected <S> void collectFollowers(Nfa<S> nfa, S owner, Set<S> result, Set<S> visited, Predicate<S> filter) { if (!visited.add(owner)) return; if (filter.apply(owner)) { result.add(owner); return; } for (S follower : nfa.getFollowers(owner)) collectFollowers(nfa, follower, result, visited, filter); }
protected <S> void collectedInverseMap(Nfa<S> nfa, S state, Map<S, List<S>> inverseMap, Set<S> visited) { if (!visited.add(state)) return; for (S follower : nfa.getFollowers(state)) { List<S> inverse = inverseMap.get(follower); if (inverse == null) inverseMap.put(follower, inverse = Lists.newArrayList()); inverse.add(state); collectedInverseMap(nfa, follower, inverseMap, visited); } }
public <S> void removeOrphans(Nfa<S> nfa) { Map<S, Integer> distances = distanceToFinalStateMap(nfa); for (S s : collect(nfa)) { Iterator<S> i = nfa.getFollowers(s).iterator(); while (i.hasNext()) if (!distances.containsKey(i.next())) i.remove(); } }
public <S> void removeOrphans(Nfa<S> nfa) { Map<S, Integer> distances = distanceToFinalStateMap(nfa); for (S s : collect(nfa)) { Iterator<S> i = nfa.getFollowers(s).iterator(); while (i.hasNext()) if (!distances.containsKey(i.next())) i.remove(); } }
protected <SRCSTATE, DSTSTATE, P extends Nfa<DSTSTATE>> DSTSTATE create(Nfa<SRCSTATE> source, P result, SRCSTATE src, NfaFactory<P, DSTSTATE, SRCSTATE> factory, Map<SRCSTATE, DSTSTATE> src2dst) { DSTSTATE dst = src2dst.get(src); if (dst != null) return dst; dst = factory.createState(result, src); src2dst.put(src, dst); List<DSTSTATE> dstFollower = Lists.newArrayList(); for (SRCSTATE srcFollower : source.getFollowers(src)) dstFollower.add(create(source, result, srcFollower, factory, src2dst)); factory.setFollowers(result, dst, dstFollower); return dst; }
public <S> Nfa<S> sort(Nfa<S> nfa, Comparator<S> comparator) { Map<S, List<S>> followerMap = Maps.newHashMap(); for (S state : new NfaUtil().collect(nfa)) { ArrayList<S> followers = Lists.newArrayList(nfa.getFollowers(state)); Collections.sort(followers, comparator); followerMap.put(state, followers); } return new NFAImpl<S>(nfa.getStart(), nfa.getStop(), followerMap); }
public <S extends Comparable<S>> Nfa<S> sort(Nfa<S> nfa) { Map<S, List<S>> followerMap = Maps.newLinkedHashMap(); for (S state : new NfaUtil().collect(nfa)) { ArrayList<S> followers = Lists.newArrayList(nfa.getFollowers(state)); Collections.sort(followers); followerMap.put(state, followers); } return new NFAImpl<S>(nfa.getStart(), nfa.getStop(), followerMap); }
public <S> Nfa<S> sort(Nfa<S> nfa, Comparator<S> comparator) { Map<S, List<S>> followerMap = Maps.newLinkedHashMap(); for (S state : new NfaUtil().collect(nfa)) { ArrayList<S> followers = Lists.newArrayList(nfa.getFollowers(state)); Collections.sort(followers, comparator); followerMap.put(state, followers); } return new NFAImpl<S>(nfa.getStart(), nfa.getStop(), followerMap); }
public <S extends Comparable<S>> Nfa<S> sort(Nfa<S> nfa) { Map<S, List<S>> followerMap = Maps.newHashMap(); for (S state : new NfaUtil().collect(nfa)) { ArrayList<S> followers = Lists.newArrayList(nfa.getFollowers(state)); Collections.sort(followers); followerMap.put(state, followers); } return new NFAImpl<S>(nfa.getStart(), nfa.getStop(), followerMap); }
protected <STATE> Node createNodes(Nfa<STATE> nfa, STATE state, Map<STATE, Integer> names, Wrapper<Integer> lastName) { Integer name = names.get(state); if (name != null) return new Node(String.valueOf(name), true); lastName.set(lastName.get() + 1); names.put(state, lastName.get()); Node node = new Node(String.valueOf(lastName.get()), false); for (STATE follower : nfa.getFollowers(state)) node.children.add(createNodes(nfa, follower, names, lastName)); return node; } }
@Override public Set<S> getFollowers(final S node) { final S start = nfa.getStart(); final S stop = nfa.getStop(); return filterFollowers(nfa, nfa.getFollowers(node), new Predicate<S>() { @Override public boolean apply(S input) { return input == start || input == stop || filter.apply(input); } }); }
public Set<S> getFollowers(final S node) { final S start = nfa.getStart(); final S stop = nfa.getStop(); return filterFollowers(nfa, nfa.getFollowers(node), new Predicate<S>() { public boolean apply(S input) { return input == start || input == stop || filter.apply(input); } }); }
public <SRCSTATE, DSTSTATE, P extends Nfa<DSTSTATE>> P create(Nfa<SRCSTATE> source, NfaFactory<P, DSTSTATE, SRCSTATE> factory) { Map<SRCSTATE, DSTSTATE> src2dst = Maps.newLinkedHashMap(); P result = factory.create(source.getStart(), source.getStop()); src2dst.put(source.getStop(), result.getStop()); src2dst.put(source.getStart(), result.getStart()); List<DSTSTATE> dstFollower = Lists.newArrayList(); for (SRCSTATE srcFollower : source.getFollowers(source.getStart())) dstFollower.add(create(source, result, srcFollower, factory, src2dst)); factory.setFollowers(result, result.getStart(), dstFollower); return result; }
public <SRCSTATE, DSTSTATE, NFA extends Nfa<DSTSTATE>> NFA create(Nfa<SRCSTATE> source, NfaFactory<NFA, DSTSTATE, SRCSTATE> factory) { Map<SRCSTATE, DSTSTATE> src2dst = Maps.newHashMap(); NFA result = factory.create(source.getStart(), source.getStop()); src2dst.put(source.getStop(), result.getStop()); src2dst.put(source.getStart(), result.getStart()); List<DSTSTATE> dstFollower = Lists.newArrayList(); for (SRCSTATE srcFollower : source.getFollowers(source.getStart())) dstFollower.add(create(source, result, srcFollower, factory, src2dst)); factory.setFollowers(result, result.getStart(), dstFollower); return result; }
protected void draw(Digraph result, Nfa<STATE> nfa) { for (STATE s : new NfaUtil().collect(nfa)) { result.add(create(result, nfa, s)); for (STATE f : nfa.getFollowers(s)) result.add(create(result, nfa, s, f)); } }
protected void draw(Digraph result, Nfa<STATE> nfa) { for (STATE s : new NfaUtil().collect(nfa)) { result.add(create(result, nfa, s)); for (STATE f : nfa.getFollowers(s)) result.add(create(result, nfa, s, f)); } }