/// <summary> /// Returns final FST. NOTE: this will return null if /// nothing is accepted by the FST. /// </summary> public virtual FST <T> Finish() { UnCompiledNode <T> root = frontier[0]; // minimize nodes in the last word's suffix DoFreezeTail(0); if (root.InputCount < minSuffixCount1 || root.InputCount < minSuffixCount2 || root.NumArcs == 0) { if (fst.emptyOutput == null) { return(null); } else if (minSuffixCount1 > 0 || minSuffixCount2 > 0) { // empty string got pruned return(null); } } else { if (minSuffixCount2 != 0) { CompileAllTargets(root, lastInput.Length); } } //if (DEBUG) System.out.println(" builder.finish root.isFinal=" + root.isFinal + " root.Output=" + root.Output); fst.Finish(CompileNode(root, lastInput.Length).Node); if (doPackFST) { return(fst.Pack(3, Math.Max(10, (int)(fst.NodeCount / 4)), acceptableOverheadRatio)); } else { return(fst); } }