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."); }
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}"); }
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(); }