예제 #1
0
        public void BottomUpTreeSimilarityCalculatorTestPerformance()
        {
            var grammar = new TypeCoherentExpressionGrammar();

            grammar.ConfigureAsDefaultRegressionGrammar();
            var twister = new MersenneTwister(31415);
            var ds      = Util.CreateRandomDataset(twister, Rows, Columns);
            var trees   = Util.CreateRandomTrees(twister, ds, grammar, N, 1, 100, 0, 0);

            double s  = 0;
            var    sw = new Stopwatch();

            var similarityCalculator = new SymbolicExpressionTreeBottomUpSimilarityCalculator {
                MatchVariableWeights = false, MatchConstantValues = false
            };

            sw.Start();
            for (int i = 0; i < trees.Length - 1; ++i)
            {
                for (int j = i + 1; j < trees.Length; ++j)
                {
                    s += similarityCalculator.CalculateSimilarity(trees[i], trees[j]);
                }
            }

            sw.Stop();
            Console.WriteLine("Elapsed time: " + sw.ElapsedMilliseconds / 1000.0 + ", Avg. similarity: " + s / (N * (N - 1) / 2));
            Console.WriteLine(N * (N + 1) / (2 * sw.ElapsedMilliseconds / 1000.0) + " similarity calculations per second.");
        }
예제 #2
0
        private static void TestMatchingConsistency(bool strict = false)
        {
            var grammar = new TypeCoherentExpressionGrammar();

            grammar.ConfigureAsDefaultRegressionGrammar();
            var twister = new MersenneTwister(31415);
            var ds      = Util.CreateRandomDataset(twister, Rows, Columns);
            var trees   = Util.CreateRandomTrees(twister, ds, grammar, N, 1, 100, 0, 0);

            var similarityCalculator = new SymbolicExpressionTreeBottomUpSimilarityCalculator {
                MatchConstantValues = strict, MatchVariableWeights = strict
            };
            var bottomUpSimilarity = 0d;

            for (int i = 0; i < trees.Length - 1; ++i)
            {
                for (int j = i + 1; j < trees.Length; ++j)
                {
                    bottomUpSimilarity += similarityCalculator.CalculateSimilarity(trees[i], trees[j]);
                }
            }
            bottomUpSimilarity /= N * (N - 1) / 2;

            var hashBasedSimilarity = SymbolicExpressionTreeHash.ComputeAverageSimilarity(trees, false, strict);

            Assert.AreEqual(bottomUpSimilarity, hashBasedSimilarity, 1e-6);

            Console.WriteLine($"Bottom-up similarity: {bottomUpSimilarity}, hash-based similarity: {hashBasedSimilarity}");
        }
예제 #3
0
        private void TestMatchedNodes(string expr1, string expr2, int expected, bool strict)
        {
            var t1 = parser.Parse(expr1);
            var t2 = parser.Parse(expr2);

            var map = SymbolicExpressionTreeBottomUpSimilarityCalculator.ComputeBottomUpMapping(t1, t2, strict);

            Console.WriteLine($"Count: {map.Count}");

            if (map.Count != expected)
            {
                throw new Exception($"Match count {map.Count} is different than expected value {expected} for expressions:\n{expr1} and {expr2} (strict = {strict})\n");
            }
        }
 public BottomUpSimilarityCalculatorTest()
 {
     busCalculator = new SymbolicExpressionTreeBottomUpSimilarityCalculator();
     importer      = new SymbolicExpressionImporter();
 }