public void LoopyArithmetic() { StringAutomaton automaton1 = StringAutomaton.Zero(); automaton1.Start.AddTransition('a', Weight.FromValue(4.0)).AddTransition('b', Weight.One, automaton1.Start).EndWeight = Weight.One; StringAutomaton automaton2 = StringAutomaton.Zero(); automaton2.Start.AddSelfTransition('a', Weight.FromValue(2)).AddSelfTransition('b', Weight.FromValue(3)).EndWeight = Weight.One; StringAutomaton sum = automaton1.Sum(automaton2); StringInferenceTestUtilities.TestValue(sum, 2.0, string.Empty); StringInferenceTestUtilities.TestValue(sum, 4.0 + 6.0, "ab"); StringInferenceTestUtilities.TestValue(sum, 16.0 + 36.0, "abab"); StringInferenceTestUtilities.TestValue(sum, 12.0, "aab", "aba", "baa"); StringInferenceTestUtilities.TestValue(sum, 18.0, "abb", "bab", "bba"); StringInferenceTestUtilities.TestValue(sum, 8.0, "aaa"); StringInferenceTestUtilities.TestValue(sum, 27.0, "bbb"); StringAutomaton product = automaton1.Product(automaton2); StringInferenceTestUtilities.TestValue(product, 1.0, string.Empty); StringInferenceTestUtilities.TestValue(product, 4 * 6, "ab"); StringInferenceTestUtilities.TestValue(product, 16 * 36, "abab"); StringInferenceTestUtilities.TestValue(product, 0.0, "aba", "bbb", "a", "b"); product.SetToProduct(product, product); StringInferenceTestUtilities.TestValue(product, 1.0, string.Empty); StringInferenceTestUtilities.TestValue(product, 4 * 4 * 6 * 6, "ab"); StringInferenceTestUtilities.TestValue(product, 16 * 16 * 36 * 36, "abab"); StringInferenceTestUtilities.TestValue(product, 0.0, "aba", "bbb", "a", "b"); }
public void CopyElement() { StringTransducer copy = StringTransducer.CopyElement(DiscreteChar.OneOf('a', 'b')); StringInferenceTestUtilities.TestTransducerValue(copy, "a", "a", 1.0); StringInferenceTestUtilities.TestTransducerValue(copy, "b", "b", 1.0); StringInferenceTestUtilities.TestTransducerValue(copy, "a", "b", 0.0); StringInferenceTestUtilities.TestTransducerValue(copy, "b", "a", 0.0); StringInferenceTestUtilities.TestTransducerValue(copy, string.Empty, string.Empty, 0.0); StringInferenceTestUtilities.TestTransducerValue(copy, "bb", "bb", 0.0); StringInferenceTestUtilities.TestTransducerValue(copy, "bab", "bab", 0.0); StringInferenceTestUtilities.TestTransducerValue(copy, "bab", "ba", 0.0); //// Tests that projection on CopyElement(elements) shrinks the support StringAutomaton automaton = StringAutomaton.ConstantOn(2.0, "a", "ab", "ac"); automaton = automaton.Sum(StringAutomaton.ConstantOn(1.0, "a")); automaton = automaton.Sum(StringAutomaton.Constant(2.0)); automaton = automaton.Product(StringAutomaton.Constant(3.0)); for (int i = 0; i < 2; ++i) { StringInferenceTestUtilities.TestValue(automaton, 15, "a"); StringInferenceTestUtilities.TestValue(automaton, 6.0, "b"); StringInferenceTestUtilities.TestValue(automaton, i == 0 ? 6.0 : 0.0, string.Empty); StringInferenceTestUtilities.TestValue(automaton, i == 0 ? 12.0 : 0.0, "ac", "ab"); automaton = copy.ProjectSource(automaton); } }
public void ProjectSourceLargeAutomaton() { using (var unlimited = new StringAutomaton.UnlimitedStatesComputation()) { const int StateCount = 100_000; var builder = new StringAutomaton.Builder(); var state = builder.Start; for (var i = 1; i < StateCount; ++i) { state = state.AddTransition('a', Weight.One); } state.SetEndWeight(Weight.One); var automaton = builder.GetAutomaton(); var point = new string('a', StateCount - 1); var copyTransducer = StringTransducer.Copy(); var projectedAutomaton = copyTransducer.ProjectSource(automaton); var projectedPoint = copyTransducer.ProjectSource(point); StringInferenceTestUtilities.TestValue(projectedAutomaton, 1.0, point); StringInferenceTestUtilities.TestValue(projectedPoint, 1.0, point); } }
public void Repeat4() { StringAutomaton automaton = StringAutomaton.ConstantOn(2.0, "aa"); automaton = StringAutomaton.Repeat(automaton, minTimes: 0); StringInferenceTestUtilities.TestValue(automaton, 0.0, "a", "aaa"); StringInferenceTestUtilities.TestValue(automaton, 1.0, string.Empty); StringInferenceTestUtilities.TestValue(automaton, 2.0, "aa"); StringInferenceTestUtilities.TestValue(automaton, 4.0, "aaaa"); }
public void NormalizeWithInfiniteEpsilon1() { StringAutomaton automaton = StringAutomaton.Zero(); automaton.Start.AddTransition('a', Weight.One).AddSelfTransition(null, Weight.FromValue(3)).EndWeight = Weight.One; // The automaton takes an infinite value on "a", and yet the normalization must work Assert.True(automaton.TryNormalizeValues()); StringInferenceTestUtilities.TestValue(automaton, 1, "a"); StringInferenceTestUtilities.TestValue(automaton, 0, "b"); }
public void NormalizeWithInfiniteEpsilon2() { StringAutomaton automaton = StringAutomaton.Zero(); automaton.Start.AddTransition('a', Weight.One).AddSelfTransition(null, Weight.FromValue(2)).EndWeight = Weight.One; automaton.Start.AddTransition('b', Weight.One).AddSelfTransition(null, Weight.FromValue(1)).EndWeight = Weight.One; // "a" branch infinitely dominates over the "b" branch Assert.True(automaton.TryNormalizeValues()); StringInferenceTestUtilities.TestValue(automaton, 1, "a"); Assert.True(automaton.GetValue("b") < 1e-50); }
public void NormalizeWithInfiniteEpsilon1() { var builder = new StringAutomaton.Builder(); builder.Start.AddTransition('a', Weight.One).AddSelfTransition(Option.None, Weight.FromValue(3)).SetEndWeight(Weight.One); var automaton = builder.GetAutomaton(); // The automaton takes an infinite value on "a", and yet the normalization must work Assert.True(automaton.TryNormalizeValues()); StringInferenceTestUtilities.TestValue(automaton, 1, "a"); StringInferenceTestUtilities.TestValue(automaton, 0, "b"); }
public void NormalizeWithInfiniteEpsilon2() { var builder = new StringAutomaton.Builder(); builder.Start.AddTransition('a', Weight.One).AddSelfTransition(Option.None, Weight.FromValue(2)).SetEndWeight(Weight.One); builder.Start.AddTransition('b', Weight.One).AddSelfTransition(Option.None, Weight.FromValue(1)).SetEndWeight(Weight.One); var automaton = builder.GetAutomaton(); // "a" branch infinitely dominates over the "b" branch Assert.True(automaton.TryNormalizeValues()); StringInferenceTestUtilities.TestValue(automaton, 1, "a"); Assert.True(automaton.GetValue("b") < 1e-50); }
public void Repeat2() { StringAutomaton automaton = StringAutomaton.Constant(1.0, DiscreteChar.Lower()); StringInferenceTestUtilities.TestValue(automaton, 1.0, string.Empty, "ab", "abcab"); automaton = StringAutomaton.Repeat(automaton); // Can't use StringInferenceTestUtilities.TestValue here since the value is not infinite in log-domain // due to approximate closure computations for epsilon-loops Assert.True(automaton.GetValue(string.Empty) > 1000); Assert.True(automaton.GetValue("ab") > 1000); Assert.True(automaton.GetValue("abcab") > 1000); }
public void Repeat1() { StringAutomaton automaton = StringAutomaton.ConstantOn(1.0, "abc"); automaton.AppendInPlace(StringAutomaton.Constant(2.0, DiscreteChar.Upper())); StringInferenceTestUtilities.TestValue(automaton, 0.0, string.Empty, "ab", "abcab", "XYZ"); StringInferenceTestUtilities.TestValue(automaton, 2.0, "abc", "abcX", "abcXXYZ"); StringAutomaton loopyAutomaton = StringAutomaton.Repeat(automaton); StringInferenceTestUtilities.TestValue(loopyAutomaton, 0.0, string.Empty, "ab", "abcab", "XYZ"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 2.0, "abc", "abcA"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 4.0, "abcabc", "abcabcX", "abcABCabc", "abcXabcYZ"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 8.0, "abcabcabc", "abcXabcYabcZZ"); }
public void Repeat3() { StringAutomaton automaton = StringAutomaton.ConstantOn(1.0, "a"); automaton.AppendInPlace(StringAutomaton.ConstantOn(1.0, "a")); automaton = StringAutomaton.Sum(automaton, StringAutomaton.ConstantOn(1.0, "a")); StringInferenceTestUtilities.TestValue(automaton, 0.0, string.Empty, "aaa", "ab", "X"); StringInferenceTestUtilities.TestValue(automaton, 1.0, "a", "aa"); // Yep, it turns out you can compute the Fibonacci sequence with an automaton StringAutomaton loopyAutomaton = StringAutomaton.Repeat(automaton); StringInferenceTestUtilities.TestValue(loopyAutomaton, 0.0, string.Empty, "ab"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 1.0, "a"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 2.0, "aa"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 3.0, "aaa"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 5.0, "aaaa"); StringInferenceTestUtilities.TestValue(loopyAutomaton, 8.0, "aaaaa"); }
public void LoopyArithmetic() { var builder1 = new StringAutomaton.Builder(); builder1.Start .AddTransition('a', Weight.FromValue(4.0)) .AddTransition('b', Weight.One, builder1.Start.Index) .SetEndWeight(Weight.One); var automaton1 = builder1.GetAutomaton(); var builder2 = new StringAutomaton.Builder(); builder2.Start .AddSelfTransition('a', Weight.FromValue(2)) .AddSelfTransition('b', Weight.FromValue(3)) .SetEndWeight(Weight.One); var automaton2 = builder2.GetAutomaton(); StringAutomaton sum = automaton1.Sum(automaton2); StringInferenceTestUtilities.TestValue(sum, 2.0, string.Empty); StringInferenceTestUtilities.TestValue(sum, 4.0 + 6.0, "ab"); StringInferenceTestUtilities.TestValue(sum, 16.0 + 36.0, "abab"); StringInferenceTestUtilities.TestValue(sum, 12.0, "aab", "aba", "baa"); StringInferenceTestUtilities.TestValue(sum, 18.0, "abb", "bab", "bba"); StringInferenceTestUtilities.TestValue(sum, 8.0, "aaa"); StringInferenceTestUtilities.TestValue(sum, 27.0, "bbb"); StringAutomaton product = automaton1.Product(automaton2); StringInferenceTestUtilities.TestValue(product, 1.0, string.Empty); StringInferenceTestUtilities.TestValue(product, 4 * 6, "ab"); StringInferenceTestUtilities.TestValue(product, 16 * 36, "abab"); StringInferenceTestUtilities.TestValue(product, 0.0, "aba", "bbb", "a", "b"); product.SetToProduct(product, product); StringInferenceTestUtilities.TestValue(product, 1.0, string.Empty); StringInferenceTestUtilities.TestValue(product, 4 * 4 * 6 * 6, "ab"); StringInferenceTestUtilities.TestValue(product, 16 * 16 * 36 * 36, "abab"); StringInferenceTestUtilities.TestValue(product, 0.0, "aba", "bbb", "a", "b"); }