Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SimilarityCalculators/MaxCommonSubtreeSimilarityCalculator.cs @ 11482

Last change on this file since 11482 was 11482, checked in by bburlacu, 10 years ago

#1772: Added the ability to ignore variable weights or constant values to the BottomUpSimilarityCalculator and added parameters to the SymbolicDataAnalysisBottomUpDiversityAnalyzer. Added separate methods in the MaxCommonSubtreeSimilarityCalculator for performing matching with full subtrees (including all leaves) or without (like the old - and better - behavior).

File size: 4.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
26using HeuristicLab.Optimization.Operators;
27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
28
29namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
30  [StorableClass]
31  [Item("MaxCommonSubtreeSimilarityCalculator", "A similarity calculator based on the size of the maximum common subtree between two trees")]
32  public class MaxCommonSubtreeSimilarityCalculator : SingleObjectiveSolutionSimilarityCalculator, ISymbolicDataAnalysisExpressionSimilarityCalculator {
33    [Storable]
34    private readonly SymbolicExpressionTreeNodeSimilarityComparer comparer;
35    public bool MatchVariableNames {
36      get { return comparer.MatchVariableNames; }
37      set { comparer.MatchVariableNames = value; }
38    }
39
40    public bool MatchVariableWeights {
41      get { return comparer.MatchVariableWeights; }
42      set { comparer.MatchVariableWeights = value; }
43    }
44
45    public bool MatchConstantValues {
46      get { return comparer.MatchConstantValues; }
47      set { comparer.MatchConstantValues = value; }
48    }
49
50    [StorableConstructor]
51    protected MaxCommonSubtreeSimilarityCalculator(bool deserializing) : base(deserializing) { }
52
53    public override IDeepCloneable Clone(Cloner cloner) {
54      return new MaxCommonSubtreeSimilarityCalculator(this, cloner);
55    }
56
57    protected MaxCommonSubtreeSimilarityCalculator(MaxCommonSubtreeSimilarityCalculator original, Cloner cloner)
58      : base(original, cloner) {
59    }
60
61    public MaxCommonSubtreeSimilarityCalculator() {
62      comparer = new SymbolicExpressionTreeNodeSimilarityComparer {
63        MatchConstantValues = true,
64        MatchVariableNames = true,
65        MatchVariableWeights = true
66      };
67    }
68
69    public MaxCommonSubtreeSimilarityCalculator(bool matchVariableNames, bool matchVariableWeights, bool matchConstantValues) {
70      comparer = new SymbolicExpressionTreeNodeSimilarityComparer {
71        MatchConstantValues = matchConstantValues,
72        MatchVariableNames = matchVariableNames,
73        MatchVariableWeights = matchVariableWeights
74      };
75    }
76
77    public double CalculateSimilarity(ISymbolicExpressionTree t1, ISymbolicExpressionTree t2) {
78      return MaxCommonSubtreeSimilarity(t1, t2, comparer);
79    }
80
81    public override double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution) {
82      var t1 = leftSolution.Variables[SolutionVariableName].Value as ISymbolicExpressionTree;
83      var t2 = rightSolution.Variables[SolutionVariableName].Value as ISymbolicExpressionTree;
84
85      if (t1 == null || t2 == null)
86        throw new ArgumentException("Cannot calculate similarity when one of the arguments is null.");
87
88      return MaxCommonSubtreeSimilarity(t1, t2, comparer);
89    }
90
91    public static double MaxCommonSubtreeSimilarity(ISymbolicExpressionTree a, ISymbolicExpressionTree b, ISymbolicExpressionTreeNodeSimilarityComparer comparer) {
92      int m = SymbolicExpressionTreeMatching.Match(a.Root, b.Root, comparer);
93      return 2.0 * m / (a.Length + b.Length);
94    }
95
96    public static double MaxCommonSubtreeSimilarityRestricted(ISymbolicExpressionTree a, ISymbolicExpressionTree b, SymbolicExpressionTreeNodeSimilarityComparer comparer) {
97      int max = 0;
98      var rootA = a.Root.GetSubtree(0).GetSubtree(0);
99      var rootB = b.Root.GetSubtree(0).GetSubtree(0);
100      foreach (var aa in rootA.IterateNodesBreadth()) {
101        int lenA = aa.GetLength();
102        if (lenA <= max) continue;
103        foreach (var bb in rootB.IterateNodesBreadth()) {
104          int lenB = bb.GetLength();
105          if (lenB <= max) continue;
106          int matches = SymbolicExpressionTreeMatching.Match(aa, bb, comparer);
107          //          if (max < matches)
108          if (matches == lenB && max < matches)
109            max = matches;
110        }
111      }
112      return 2.0 * max / (rootA.GetLength() + rootB.GetLength());
113    }
114  }
115}
Note: See TracBrowser for help on using the repository browser.