DFSA<String, Integer> answerLattice, CoreLabel[] docArray) { if(tSource.isAccepting() && tSource.continuingInputs().isEmpty()) { tSource.addTransition (new DFSATransition<>("", tSource, new DFSAState<>(-1, null), "1", "", 0)); Set<String> inputs = tSource.continuingInputs(); DFSATransition<String, Integer> transition = tSource.transition(predictSpace); double transitionCost = transition.score(); if (transitionCost < minCost) { DFSATransition<String, Integer> transition = tSource.transition(predictSpace); DFSAState<String, Integer> tDest = transition.target(); DFSAState<String, Integer> newASource = aSource; newASource.addTransition (new DFSATransition<>("", newASource, aDest, newAnswer.toString(), "", newCost)); DFSAState<String, Integer> aDest = new DFSAState<>(nodeId.intValue(), answerLattice, 0.0); stateLinks.put(tSource,aDest); newASource.addTransition(new DFSATransition<>("", newASource, aDest, newAnswer.toString(), "", newCost)); if(tSource.isAccepting()) { aDest.setAccepting(true); continue;
public Set<DFSAState<T, S>> statesReachable() { Set<DFSAState<T, S>> visited = Generics.newHashSet(); List<DFSAState<T, S>> toVisit = new ArrayList<>(); toVisit.add(this); exploreStates(toVisit, visited); return visited; }
public void printAttFsmFormat(Writer w) throws IOException { Queue<DFSAState<T,S>> q = new LinkedList<>(); Set<DFSAState<T,S>> visited = Generics.newHashSet(); q.offer(initialState); while(q.peek() != null) { DFSAState<T, S> state = q.poll(); if(state == null || visited.contains(state)) continue; visited.add(state); if (state.isAccepting()) { w.write(state.toString()+"\t"+state.score()+"\n"); continue; } TreeSet<T> inputs = new TreeSet<>(state.continuingInputs()); for (T input : inputs) { DFSATransition<T, S> transition = state.transition(input); DFSAState<T,S> target = transition.target(); if(!visited.contains(target)) q.add(target); w.write(state.toString()+"\t"+target.toString()+"\t"+transition.getInput()+"\t"+transition.score()+"\n"); } } }
private static <T, S> void printTrieAsRulesHelper(DFSAState<T, S> state, String prefix, Writer w) throws IOException { if (state.isAccepting()) { return; } Set<T> inputs = state.continuingInputs(); for (T input : inputs) { DFSATransition<T, S> transition = state.transition(input); DFSAState<T, S> target = transition.target(); Set<T> inputs2 = target.continuingInputs(); boolean allTerminate = true; for (T input2 : inputs2) { DFSATransition<T, S> transition2 = target.transition(input2); DFSAState<T, S> target2 = transition2.target(); if (target2.isAccepting()) { // it's a binary end rule. Print it. w.write(prefix + " --> " + input + " " + input2 + "\n"); } else { allTerminate = false; } } if (!allTerminate) { // there are some longer continuations. Print continuation rule String newPrefix = prefix + "_" + input; w.write(prefix + " --> " + input + " " + newPrefix + "\n"); printTrieAsRulesHelper(transition.target(), newPrefix, w); } } }
lattice = new DFSA<>("wordLattice"); for (int i=0; i<=s.length(); ++i) states.add(new DFSAState<>(i, lattice)); states.get(len).setAccepting(true); new DFSATransition<>(null, states.get(start), states.get(end), new Word(str), null, cost); states.get(start).addTransition(trans); ++edgesNb;
for (int i = 0; i < numStates; i++) { for (int j = i + 1; j < numStates; j++) { distinct[i][j] = state[i].isAccepting() != state[j].isAccepting(); inputs.addAll(state1.continuingInputs()); inputs.addAll(state2.continuingInputs()); boolean distinguishable = false; Set<IntPair> pendingIPairs = Generics.newHashSet(); while (inputI.hasNext() && !distinguishable) { T input = inputI.next(); DFSATransition<T, S> transition1 = state1.transition(input); DFSATransition<T, S> transition2 = state2.transition(input); if ((transition1 == null) != (transition2 == null)) { distinguishable = true; if (!state1.equals(stateToRep.get(state1))) { continue; for (DFSATransition<T, S> transition : state1.transitions()) {
private static <T, S> void exploreStates(List<DFSAState<T, S>> toVisit, Set<DFSAState<T, S>> visited) { while (!toVisit.isEmpty()) { DFSAState<T, S> state = toVisit.get(toVisit.size() - 1); toVisit.remove(toVisit.size() - 1); if (!visited.contains(state)) { toVisit.addAll(state.successorStates()); visited.add(state); } } }
public DFSAState(S id, DFSA<T,S> dfsa, double score) { this(id,dfsa); setScore(score); }
@Override public void printLattice(DFSA<String, Integer> tagLattice, List<CoreLabel> doc, PrintWriter out) { CoreLabel[] docArray = doc.toArray(new CoreLabel[doc.size()]); // Create answer lattice: MutableInteger nodeId = new MutableInteger(0); DFSA<String, Integer> answerLattice = new DFSA<>(null); DFSAState<String, Integer> aInitState = new DFSAState<>(nodeId.intValue(), answerLattice); answerLattice.setInitialState(aInitState); Map<DFSAState<String, Integer>,DFSAState<String, Integer>> stateLinks = Generics.newHashMap(); // Convert binary lattice into word lattice: tagLatticeToAnswerLattice (tagLattice.initialState(), aInitState, new StringBuilder(""), nodeId, 0, 0.0, stateLinks, answerLattice, docArray); try { answerLattice.printAttFsmFormat(out); } catch(IOException e) { throw new RuntimeException(e); } }
private static <T, S> void printTrieDFSAHelper(DFSAState<T, S> state, int level) { if (state.isAccepting()) { return; } Set<T> inputs = state.continuingInputs(); for (T input : inputs) { DFSATransition<T, S> transition = state.transition(input); System.out.print(level); System.out.print(input); for (int i = 0; i < level; i++) { System.out.print(" "); } System.out.print(transition.score()); System.out.print(" "); System.out.println(input); printTrieDFSAHelper(transition.target(), level + 1); } }
if(viterbiSearchGraph != null) { int stateId = -1; startState = new DFSAState<>(++stateId, viterbiSearchGraph, 0.0); viterbiSearchGraph.setInitialState(startState); graphStates = new DFSAState[length][]; graphStates[pos][product] = new DFSAState<>(++stateId, viterbiSearchGraph); endState = new DFSAState<>(++stateId, viterbiSearchGraph, 0.0); endState.setAccepting(true); startState.addTransition(tr); } else { int sharedProduct = product / tagNum[pos + rightWindow]; DFSATransition<String, Integer> tr = new DFSATransition<>("", sourceState, destState, classIndex.get(curTag), "", -windowScore[pos][product]); graphStates[pos-leftWindow][predTag].addTransition(tr);
for (DFSAState<T, S> state2 : states) { UnorderedPair<DFSAState<T, S>, DFSAState<T, S>> up = new UnorderedPair<>(state1, state2); if (state1.equals(state2)) { continue; if (state1.isAccepting() != state2.isAccepting()) { Set<T> inputs = Generics.newHashSet(state1.continuingInputs()); inputs.addAll(state2.continuingInputs()); boolean distinguishable = false; Set<UnorderedPair<DFSAState<T, S>, DFSAState<T, S>>> pendingUPairs = Generics.newHashSet(); while (inputI.hasNext() && !distinguishable) { T input = inputI.next(); DFSATransition<T, S> transition1 = state1.transition(input); DFSATransition<T, S> transition2 = state2.transition(input); if ((transition1 == null) != (transition2 == null)) { distinguishable = true; DFSAState<T, S> target2 = transition2.getTarget(); UnorderedPair<DFSAState<T, S>, DFSAState<T, S>> targetUPair = new UnorderedPair<>(target1, target2); if (!target1.equals(target2)) { if (stateUPairToDistinguished.get(targetUPair).equals(Boolean.TRUE)) { distinguishable = true; if (!state.equals(stateToRep.get(state))) { continue; for (DFSATransition<T, S> transition : state.transitions()) {
private void exploreStates(List<DFSAState<T, S>> toVisit, Set<DFSAState<T, S>> visited) { while (!toVisit.isEmpty()) { DFSAState<T, S> state = toVisit.get(toVisit.size() - 1); toVisit.remove(toVisit.size() - 1); if (!visited.contains(state)) { toVisit.addAll(state.successorStates()); visited.add(state); } } }
public DFSAState(S id, DFSA<T,S> dfsa, double score) { this(id,dfsa); setScore(score); }
@Override public void printLattice(DFSA<String, Integer> tagLattice, List<CoreLabel> doc, PrintWriter out) { CoreLabel[] docArray = doc.toArray(new CoreLabel[doc.size()]); // Create answer lattice: MutableInteger nodeId = new MutableInteger(0); DFSA<String, Integer> answerLattice = new DFSA<>(null); DFSAState<String, Integer> aInitState = new DFSAState<>(nodeId.intValue(), answerLattice); answerLattice.setInitialState(aInitState); Map<DFSAState<String, Integer>,DFSAState<String, Integer>> stateLinks = Generics.newHashMap(); // Convert binary lattice into word lattice: tagLatticeToAnswerLattice (tagLattice.initialState(), aInitState, new StringBuilder(""), nodeId, 0, 0.0, stateLinks, answerLattice, docArray); try { answerLattice.printAttFsmFormat(out); } catch(IOException e) { throw new RuntimeException(e); } }
DFSA<String, Integer> answerLattice, CoreLabel[] docArray) { if(tSource.isAccepting() && tSource.continuingInputs().isEmpty()) { tSource.addTransition (new DFSATransition<String, Integer>("", tSource, new DFSAState<String, Integer>(-1, null), "1", "", 0)); Set<String> inputs = tSource.continuingInputs(); DFSATransition<String, Integer> transition = tSource.transition(predictSpace); double transitionCost = transition.score(); if (transitionCost < minCost) { DFSATransition<String, Integer> transition = tSource.transition(predictSpace); DFSAState<String, Integer> tDest = transition.target(); DFSAState<String, Integer> newASource = aSource; newASource.addTransition (new DFSATransition<String, Integer>("", newASource, aDest, newAnswer.toString(), "", newCost)); DFSAState<String, Integer> aDest = new DFSAState<String, Integer>(nodeId.intValue(), answerLattice, 0.0); stateLinks.put(tSource,aDest); newASource.addTransition(new DFSATransition<String, Integer>("", newASource, aDest, newAnswer.toString(), "", newCost)); if(tSource.isAccepting()) { aDest.setAccepting(true); continue;
public void printAttFsmFormat(Writer w) throws IOException { Queue<DFSAState<T,S>> q = new LinkedList<>(); Set<DFSAState<T,S>> visited = Generics.newHashSet(); q.offer(initialState); while(q.peek() != null) { DFSAState<T, S> state = q.poll(); if(state == null || visited.contains(state)) continue; visited.add(state); if (state.isAccepting()) { w.write(state.toString()+"\t"+state.score()+"\n"); continue; } TreeSet<T> inputs = new TreeSet<>(state.continuingInputs()); for (T input : inputs) { DFSATransition<T, S> transition = state.transition(input); DFSAState<T,S> target = transition.target(); if(!visited.contains(target)) q.add(target); w.write(state.toString()+"\t"+target.toString()+"\t"+transition.getInput()+"\t"+transition.score()+"\n"); } } }
private static <T, S> void printTrieDFSAHelper(DFSAState<T, S> state, int level) { if (state.isAccepting()) { return; } Set<T> inputs = state.continuingInputs(); for (T input : inputs) { DFSATransition<T, S> transition = state.transition(input); System.out.print(level); System.out.print(input); for (int i = 0; i < level; i++) { System.out.print(" "); } System.out.print(transition.score()); System.out.print(" "); System.out.println(input); printTrieDFSAHelper(transition.target(), level + 1); } }
if(viterbiSearchGraph != null) { int stateId = -1; startState = new DFSAState<String, Integer>(++stateId, viterbiSearchGraph, 0.0); viterbiSearchGraph.setInitialState(startState); graphStates = new DFSAState[length][]; graphStates[pos][product] = new DFSAState<String, Integer>(++stateId, viterbiSearchGraph); endState = new DFSAState<String, Integer>(++stateId, viterbiSearchGraph, 0.0); endState.setAccepting(true); startState.addTransition(tr); } else { int sharedProduct = product / tagNum[pos + rightWindow]; DFSATransition<String, Integer> tr = new DFSATransition<String, Integer>("",sourceState,destState,classIndex.get(curTag),"",-windowScore[pos][product]); graphStates[pos-leftWindow][predTag].addTransition(tr);
private void exploreStates(List<DFSAState<T, S>> toVisit, Set<DFSAState<T, S>> visited) { while (!toVisit.isEmpty()) { DFSAState<T, S> state = toVisit.get(toVisit.size() - 1); toVisit.remove(toVisit.size() - 1); if (!visited.contains(state)) { toVisit.addAll(state.successorStates()); visited.add(state); } } }