public override void SetUp() { base.SetUp(); // build an automaton matching this jvm's letter definition State initial = new State(); State accept = new State(); accept.Accept = true; for (int i = 0; i <= 0x10FFFF; i++) { if (Character.IsLetter(i)) { initial.AddTransition(new Transition(i, i, accept)); } } Automaton single = new Automaton(initial); single.Reduce(); Automaton repeat = BasicOperations.Repeat(single); jvmLetter = new CharacterRunAutomaton(repeat); }
/// <summary> /// Compute a DFA that accepts all strings within an edit distance of <code>n</code>. /// <p> /// All automata have the following properties: /// <ul> /// <li>They are deterministic (DFA). /// <li>There are no transitions to dead states. /// <li>They are not minimal (some transitions could be combined). /// </ul> /// </p> /// </summary> public virtual Automaton ToAutomaton(int n) { if (n == 0) { return BasicAutomata.MakeString(Word, 0, Word.Length); } if (n >= Descriptions.Length) { return null; } int range = 2 * n + 1; ParametricDescription description = Descriptions[n]; // the number of states is based on the length of the word and n State[] states = new State[description.Size()]; // create all states, and mark as accept states if appropriate for (int i = 0; i < states.Length; i++) { states[i] = new State(); states[i].number = i; states[i].Accept = description.IsAccept(i); } // create transitions from state to state for (int k = 0; k < states.Length; k++) { int xpos = description.GetPosition(k); if (xpos < 0) { continue; } int end = xpos + Math.Min(Word.Length - xpos, range); for (int x = 0; x < Alphabet.Length; x++) { int ch = Alphabet[x]; // get the characteristic vector at this position wrt ch int cvec = GetVector(ch, xpos, end); int dest = description.Transition(k, xpos, cvec); if (dest >= 0) { states[k].AddTransition(new Transition(ch, states[dest])); } } // add transitions for all other chars in unicode // by definition, their characteristic vectors are always 0, // because they do not exist in the input string. int dest_ = description.Transition(k, xpos, 0); // by definition if (dest_ >= 0) { for (int r = 0; r < NumRanges; r++) { states[k].AddTransition(new Transition(RangeLower[r], RangeUpper[r], states[dest_])); } } } Automaton a = new Automaton(states[0]); a.Deterministic = true; // we create some useless unconnected states, and its a net-win overall to remove these, // as well as to combine any adjacent transitions (it makes later algorithms more efficient). // so, while we could set our numberedStates here, its actually best not to, and instead to // force a traversal in reduce, pruning the unconnected states while we combine adjacent transitions. //a.setNumberedStates(states); a.Reduce(); // we need not trim transitions to dead states, as they are not created. //a.restoreInvariant(); return a; }
/// <summary> /// Compute a DFA that accepts all strings within an edit distance of <paramref name="n"/>. /// <para> /// All automata have the following properties: /// <list type="bullet"> /// <item><description>They are deterministic (DFA).</description></item> /// <item><description>There are no transitions to dead states.</description></item> /// <item><description>They are not minimal (some transitions could be combined).</description></item> /// </list> /// </para> /// </summary> public virtual Automaton ToAutomaton(int n) { if (n == 0) { return(BasicAutomata.MakeString(word, 0, word.Length)); } if (n >= descriptions.Length) { return(null); } int range = 2 * n + 1; ParametricDescription description = descriptions[n]; // the number of states is based on the length of the word and n State[] states = new State[description.Count]; // create all states, and mark as accept states if appropriate for (int i = 0; i < states.Length; i++) { states[i] = new State(); states[i].number = i; states[i].Accept = description.IsAccept(i); } // create transitions from state to state for (int k = 0; k < states.Length; k++) { int xpos = description.GetPosition(k); if (xpos < 0) { continue; } int end = xpos + Math.Min(word.Length - xpos, range); for (int x = 0; x < alphabet.Length; x++) { int ch = alphabet[x]; // get the characteristic vector at this position wrt ch int cvec = GetVector(ch, xpos, end); int dest = description.Transition(k, xpos, cvec); if (dest >= 0) { states[k].AddTransition(new Transition(ch, states[dest])); } } // add transitions for all other chars in unicode // by definition, their characteristic vectors are always 0, // because they do not exist in the input string. int dest_ = description.Transition(k, xpos, 0); // by definition if (dest_ >= 0) { for (int r = 0; r < numRanges; r++) { states[k].AddTransition(new Transition(rangeLower[r], rangeUpper[r], states[dest_])); } } } Automaton a = new Automaton(states[0]); a.IsDeterministic = true; // we create some useless unconnected states, and its a net-win overall to remove these, // as well as to combine any adjacent transitions (it makes later algorithms more efficient). // so, while we could set our numberedStates here, its actually best not to, and instead to // force a traversal in reduce, pruning the unconnected states while we combine adjacent transitions. //a.setNumberedStates(states); a.Reduce(); // we need not trim transitions to dead states, as they are not created. //a.restoreInvariant(); return(a); }