예제 #1
0
        public void SemanticWebTest3()
        {
            // Simplified name model
            var prop0 = Variable.Random(NamePrior()).Named("prop0");
            // Simplified date model any string ending in a digit
            var prop1 = Variable.Random(
                StringDistribution.Char(DiscreteChar.Digit()) + StringDistribution.Any() + StringDistribution.Char(DiscreteChar.Digit()))
                        .Named("prop1");
            var template = Variable.Random(StringDistribution.String("{0}") + WordStrings.WordMiddle() + StringDistribution.String("{1}"))
                           .Named("template");
            var text = Variable.StringFormat(template, prop0, prop1).Named("text");

            text.ObservedValue = "Tony Blair was born on 6 May 1953";

            var engine = new InferenceEngine();

            engine.Compiler.RecommendedQuality = QualityBand.Experimental;
            engine.NumberOfIterations          = 1;

            var prop0Dist    = engine.Infer <StringDistribution>(prop0);
            var prop1Dist    = engine.Infer <StringDistribution>(prop1);
            var templateDist = engine.Infer <StringDistribution>(template);

            StringInferenceTestUtilities.TestProbability(prop0Dist, 1.0, "Tony Blair");
            StringInferenceTestUtilities.TestProbability(prop1Dist, 0.5, "1953", "6 May 1953");
            StringInferenceTestUtilities.TestProbability(templateDist, 0.5, "{0} was born on {1}", "{0} was born on 6 May {1}");
        }
예제 #2
0
        public void ProductWithLogOverrideBroad()
        {
            for (var i = 0; i < 2; i++)
            {
                var dist1 = DiscreteChar.LetterOrDigit();
                var dist2 = DiscreteChar.Digit();

                var logOverrideProbability = Math.Log(0.9);
                dist1.SetToPartialUniformOf(dist1, logOverrideProbability);
                Xunit.Assert.True(dist1.HasLogProbabilityOverride);
                Xunit.Assert.True(dist2.IsBroad);

                if (i == 1)
                {
                    Util.Swap(ref dist1, ref dist2);
                }

                var dist3 = DiscreteChar.Uniform();
                dist3.SetToProduct(dist1, dist2);

                Xunit.Assert.True(dist3.HasLogProbabilityOverride);
                Assert.Equal(logOverrideProbability, dist3.GetLogProb('5'), Eps);
                Xunit.Assert.True(double.IsNegativeInfinity(dist3.GetLogProb('a')));
            }
        }
예제 #3
0
        public void LengthBounds()
        {
            var lengthDist1 = StringDistribution.Any(minLength: 1, maxLength: 3);

            Assert.True(lengthDist1.IsProper());
            StringInferenceTestUtilities.TestProbability(lengthDist1, StringInferenceTestUtilities.StringUniformProbability(1, 3, 65536), "a", "aa", "aaa");
            StringInferenceTestUtilities.TestProbability(lengthDist1, 0.0, string.Empty, "aaaa");

            var lengthDist2 = StringDistribution.Repeat(DiscreteChar.OneOf('a', 'b'), minTimes: 1, maxTimes: 3);

            Assert.True(lengthDist2.IsProper());
            StringInferenceTestUtilities.TestProbability(lengthDist2, StringInferenceTestUtilities.StringUniformProbability(1, 3, 2), "a", "ab", "aba");
            StringInferenceTestUtilities.TestProbability(lengthDist2, 0.0, string.Empty, "aaaa", "abab", "cc");

            var lengthDist3 = StringDistribution.Repeat(DiscreteChar.OneOf('a', 'b'), minTimes: 2, maxTimes: 2);

            Assert.True(lengthDist3.IsProper());
            StringInferenceTestUtilities.TestProbability(lengthDist3, StringInferenceTestUtilities.StringUniformProbability(2, 2, 2), "aa", "ab", "ba", "bb");
            StringInferenceTestUtilities.TestProbability(lengthDist3, 0.0, string.Empty, "a", "abab", "cc");

            var minLengthDist = StringDistribution.Any(minLength: 2);

            Assert.False(minLengthDist.IsProper());
            StringInferenceTestUtilities.TestProbability(minLengthDist, 1.0, "aa", "123", "@*(@*&(@)");
            StringInferenceTestUtilities.TestProbability(minLengthDist, 0.0, string.Empty, "a", "!");

            var maxLengthDist = StringDistribution.ZeroOrMore(DiscreteChar.Digit(), maxTimes: 3);

            Assert.True(maxLengthDist.IsProper());
            StringInferenceTestUtilities.TestProbability(maxLengthDist, StringInferenceTestUtilities.StringUniformProbability(0, 3, 10), string.Empty, "1", "32", "432");
            StringInferenceTestUtilities.TestProbability(maxLengthDist, 0.0, "abc", "1234");
        }
예제 #4
0
 public void CommonChars()
 {
     TestSupport("digit", DiscreteChar.Digit(), "0123456789", "Ab !Ј");
     TestSupport("lower", DiscreteChar.Lower(), "abcdefghixyz", "ABC0123, ");
     TestSupport("upper", DiscreteChar.Upper(), "ABCDEFGHUXYZ", "abc0123, ");
     TestSupport("letter", DiscreteChar.Letter(), "aBcDeFgGhxyzXYZ", "0123! ,");
     TestSupport("letterOrDigit", DiscreteChar.LetterOrDigit(), "abcABC0123xyzXYZ789", " !Ј$,");
     TestSupport("wordChar", DiscreteChar.WordChar(), "abc_ABC_0123s", " !:.,");
     TestSupport("whitespace", DiscreteChar.Whitespace(), " \t", "abcABC0123,:!");
 }
예제 #5
0
        public void BroadAndNarrow()
        {
            var dist1 = DiscreteChar.Digit();

            Xunit.Assert.True(dist1.IsBroad);

            var dist2 = DiscreteChar.OneOf('1', '3', '5', '6');

            Xunit.Assert.False(dist2.IsBroad);
        }
예제 #6
0
        public void ItemFromString()
        {
            Variable <string> str1 = Variable.StringOfLength(2, DiscreteChar.Digit());
            Variable <string> str2 = Variable.StringOfLength(3, DiscreteChar.Letter());
            Variable <string> str  = str1 + str2;

            var engine = new InferenceEngine();

            Assert.Equal(DiscreteChar.Digit(), engine.Infer <DiscreteChar>(Variable.GetItem(str, 0)), ProbEps);
            Assert.Equal(DiscreteChar.Digit(), engine.Infer <DiscreteChar>(Variable.GetItem(str, 1)), ProbEps);
            Assert.Equal(DiscreteChar.Letter(), engine.Infer <DiscreteChar>(Variable.GetItem(str, 2)), ProbEps);
            Assert.Equal(DiscreteChar.Letter(), engine.Infer <DiscreteChar>(Variable.GetItem(str, 3)), ProbEps);
            Assert.Equal(DiscreteChar.Letter(), engine.Infer <DiscreteChar>(Variable.GetItem(str, 4)), ProbEps);
            Assert.Throws <AllZeroException>(() => engine.Infer <DiscreteChar>(Variable.GetItem(str, 5)));
        }
예제 #7
0
        public void Sum()
        {
            StringTransducer replace = StringTransducer.Sum(
                StringTransducer.Replace(DiscreteChar.Lower(), DiscreteChar.Digit()),
                StringTransducer.Replace(DiscreteChar.Lower(), DiscreteChar.LetterOrDigit()));

            StringInferenceTestUtilities.TestTransducerValue(replace, "hello", "123", 2.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "w", "1337", 2.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "w", string.Empty, 2.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, "17", 2.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, string.Empty, 2.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "hello", "worlds", 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "hello", "WORLDS111", 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "123", "worlds", 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "123", "123", 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "1", string.Empty, 0.0);
        }
예제 #8
0
        public void ReplaceAutomaton()
        {
            StringAutomaton automaton1 = StringAutomaton.Constant(2.0, DiscreteChar.Lower());

            automaton1 = automaton1.Sum(StringAutomaton.ConstantOnElement(3.0, 'a'));
            StringAutomaton automaton2 = StringAutomaton.Constant(0.5, DiscreteChar.Digit());

            automaton2 = automaton2.Sum(StringAutomaton.Constant(2.5, DiscreteChar.LetterOrDigit()));
            StringTransducer replace = StringTransducer.Replace(automaton1, automaton2);

            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, "123", 6.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "a", "123", 15.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "ax", "AbC", 5.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "a", "a", 12.5);
            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, string.Empty, 6.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "123", string.Empty, 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "AbC", "ax", 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "1", "1", 0.0);
        }
예제 #9
0
        public void UniformOf()
        {
            var unif1 = StringDistribution.ZeroOrMore(DiscreteChar.Lower());

            Assert.False(unif1.IsUniform());
            Assert.False(unif1.IsProper());
            StringInferenceTestUtilities.TestProbability(unif1, 1.0, "hello", "a", string.Empty);
            StringInferenceTestUtilities.TestProbability(unif1, 0.0, "123", "!", "Abc");

            // Test if non-uniform element distribution does not affect the outcome
            Vector probs = DiscreteChar.Digit().GetProbs();

            probs['1'] = 0;
            probs['2'] = 0.3;
            probs['3'] = 0.0001;
            var unif2 = StringDistribution.ZeroOrMore(DiscreteChar.FromVector(probs));

            StringInferenceTestUtilities.TestProbability(unif2, 1.0, "0", "234", string.Empty);
            StringInferenceTestUtilities.TestProbability(unif2, 0.0, "1", "231", "!", "Abc");
        }
예제 #10
0
 private static StringDistribution TemplateArgString() =>
 StringDistribution.Char('{') + StringDistribution.Char(DiscreteChar.Digit()) + StringDistribution.Char('}');
예제 #11
0
        public void InefficientPermutationRepresentation()
        {
            StringDistribution placeholder = StringDistribution.Char('{') + StringDistribution.Char(DiscreteChar.Digit()) + StringDistribution.Char('}');
            StringDistribution formatPrior = placeholder + StringDistribution.String(" ");

            formatPrior = StringDistribution.ZeroOrMore(formatPrior) + placeholder;

            const int ArgCount  = 6;
            const int ArgLength = 3;

            StringDistribution[] args = Util.ArrayInit(ArgCount, i => StringDistribution.String(new string((char)('0' + i), ArgLength)));

            StringDistribution str = StringFormatOp_AllowMissingPlaceholders_NoArgumentNames.StrAverageConditional(formatPrior, args);

            Console.WriteLine(str.GetWorkspaceOrPoint().States.Count);

            StringInferenceTestUtilities.TestIfIncludes(str, "111 333 222", "111 222", "222 111", "111", "222", "333");
            StringInferenceTestUtilities.TestIfExcludes(str, string.Empty, "111 111", "222 222 111", "333 111 222 333", "112", "1");
        }
예제 #12
0
        public void ReplaceElements()
        {
            StringTransducer replace = StringTransducer.Replace(DiscreteChar.Lower(), DiscreteChar.Digit());

            StringInferenceTestUtilities.TestTransducerValue(replace, "hello", "123", 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "w", "1337", 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "w", string.Empty, 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, "17", 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, string.Empty, string.Empty, 1.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "123", "worlds", 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "123", "123", 0.0);
            StringInferenceTestUtilities.TestTransducerValue(replace, "1", string.Empty, 0.0);
        }