Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2886_SymRegGrammarEnumeration/Test/TreeHashingTest.cs @ 15834

Last change on this file since 15834 was 15834, checked in by lkammere, 6 years ago

#2886: Store production rules in grammar instead of nonterminal symbols.

File size: 6.7 KB
Line 
1using System.Linq;
2using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration;
3using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration.GrammarEnumeration;
4using Microsoft.VisualStudio.TestTools.UnitTesting;
5
6namespace Test {
7  [TestClass]
8  public class TreeHashingTest {
9
10    private Grammar grammar;
11    private TerminalSymbol varA;
12    private TerminalSymbol varB;
13    private TerminalSymbol varC;
14
15    [TestInitialize]
16    public void InitTest() {
17      grammar = new Grammar(new[] { "a", "b", "c" });
18
19      varA = grammar.VarTerminals.First(s => s.StringRepresentation == "a");
20      varB = grammar.VarTerminals.First(s => s.StringRepresentation == "b");
21      varC = grammar.VarTerminals.First(s => s.StringRepresentation == "c");
22    }
23
24    [TestMethod]
25    [TestCategory("TreeHashing")]
26    public void SimpleEqualityAddition() {
27      SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition });
28      SymbolString s2 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition });
29
30      int hash1 = grammar.Hasher.CalcHashCode(s1);
31      int hash2 = grammar.Hasher.CalcHashCode(s2);
32
33      Assert.AreEqual(hash1, hash2);
34    }
35
36    [TestMethod]
37    [TestCategory("TreeHashing")]
38    public void SimpleInequalityAddition() {
39      SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition });
40      SymbolString s2 = new SymbolString(new[] { varB, varB, grammar.Addition, varB, grammar.Addition });
41
42      int hash1 = grammar.Hasher.CalcHashCode(s1);
43      int hash2 = grammar.Hasher.CalcHashCode(s2);
44
45      Assert.AreNotEqual(hash1, hash2);
46    }
47
48    [TestMethod]
49    [TestCategory("TreeHashing")]
50    public void CommutativityAddition() {
51      SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition });
52      SymbolString s2 = new SymbolString(new[] { varB, varA, grammar.Addition });
53
54      int hash1 = grammar.Hasher.CalcHashCode(s1);
55      int hash2 = grammar.Hasher.CalcHashCode(s2);
56
57      Assert.AreEqual(hash1, hash2);
58    }
59
60    [TestMethod]
61    [TestCategory("TreeHashing")]
62    public void AssociativityAddition() {
63      SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varA, grammar.Addition });
64      SymbolString s2 = new SymbolString(new[] { varA, varB, varA, grammar.Addition, grammar.Addition });
65
66      int hash1 = grammar.Hasher.CalcHashCode(s1);
67      int hash2 = grammar.Hasher.CalcHashCode(s2);
68
69      Assert.AreEqual(hash1, hash2);
70    }
71
72    [TestMethod]
73    [TestCategory("TreeHashing")]
74    public void RepeatedAddition() {
75      SymbolString s1 = new SymbolString(new[] { varA, varA, grammar.Addition, varA, grammar.Addition });
76      SymbolString s2 = new SymbolString(new[] { varA });
77
78      int hash1 = grammar.Hasher.CalcHashCode(s1);
79      int hash2 = grammar.Hasher.CalcHashCode(s2);
80
81      Assert.AreEqual(hash1, hash2);
82    }
83
84    [TestMethod]
85    [TestCategory("TreeHashing")]
86    public void ComplexInequality() {
87      SymbolString s1 = new SymbolString(new[] { varA, varA, varA, grammar.Multiplication, grammar.Multiplication });
88      SymbolString s2 = new SymbolString(new[] { varA, varA, varA, grammar.Multiplication, grammar.Addition });
89
90      int hash1 = grammar.Hasher.CalcHashCode(s1);
91      int hash2 = grammar.Hasher.CalcHashCode(s2);
92
93      Assert.AreNotEqual(hash1, hash2);
94    }
95
96    [TestMethod]
97    [TestCategory("TreeHashing")]
98    public void NonterminalHashing() {
99      SymbolString s1 = new SymbolString(new Symbol[] { varA, varA, grammar.Expr, grammar.Addition, grammar.Addition });
100      SymbolString s2 = new SymbolString(new Symbol[] { varA, grammar.Expr, grammar.Addition });
101
102      int hash1 = grammar.Hasher.CalcHashCode(s1);
103      int hash2 = grammar.Hasher.CalcHashCode(s2);
104
105      Assert.AreEqual(hash1, hash2);
106    }
107
108    [TestMethod]
109    [TestCategory("TreeHashing")]
110    public void InverseFactorCancelationSimple() {
111      // 1/a * b * a * a
112      SymbolString s1 = new SymbolString(new Symbol[] { varA, grammar.Inv, varB, grammar.Multiplication, varA, grammar.Multiplication, varA, grammar.Multiplication });
113      // a * b
114      SymbolString s2 = new SymbolString(new Symbol[] { varA, varB, grammar.Multiplication });
115
116      int hash1 = grammar.Hasher.CalcHashCode(s1);
117      int hash2 = grammar.Hasher.CalcHashCode(s2);
118
119      Assert.AreEqual(hash1, hash2);
120    }
121
122    [TestMethod]
123    [TestCategory("TreeHashing")]
124    public void InverseFactorCancelationComplex() {
125      SymbolString s1 = new SymbolString(new Symbol[] { varA, grammar.Sin, varA, varA, grammar.Multiplication, varA, grammar.Addition, grammar.Sin, grammar.Addition });
126      SymbolString s2 = new SymbolString(new Symbol[] { varA, varA, varA, grammar.Multiplication, grammar.Addition, grammar.Sin, varA, grammar.Inv, varA, grammar.Sin, varA, grammar.Multiplication, grammar.Multiplication, grammar.Addition });
127
128      int hash1 = grammar.Hasher.CalcHashCode(s1);
129      int hash2 = grammar.Hasher.CalcHashCode(s2);
130
131      Assert.AreEqual(hash1, hash2);
132    }
133
134    /* DEPRECATED; SINCE WE DO NOT ALLOW COMPOUND DIVISIONS
135    [TestMethod]
136    [TestCategory("TreeHashing")]
137    public void CompoundInverseCancellationToSingleInverse() {
138      SymbolString s1 = new SymbolString(new Symbol[] { varA, varB, grammar.Addition, grammar.Inv, grammar.Inv, grammar.Inv });
139      SymbolString s2 = new SymbolString(new Symbol[] { varA, varB, grammar.Addition, grammar.Inv });
140
141      int hash1 = grammar.CalcHashCode(s1);
142      int hash2 = grammar.CalcHashCode(s2);
143
144      Assert.AreEqual(hash1, hash2);
145    }
146
147    [TestMethod]
148    [TestCategory("TreeHashing")]
149    public void CompoundInverseCancellationToDivisor() {
150      SymbolString s1 = new SymbolString(new Symbol[] { varA, varB, grammar.Addition, grammar.Inv, grammar.Inv });
151      SymbolString s2 = new SymbolString(new Symbol[] { varA, varB, grammar.Addition });
152
153      int hash1 = grammar.CalcHashCode(s1);
154      int hash2 = grammar.CalcHashCode(s2);
155
156      Assert.AreEqual(hash1, hash2);
157    }
158
159    [TestMethod]
160    [TestCategory("TreeHashing")]
161    public void UncancelableCompoundInverse() {
162      // 1 / ( 1/b + sin(a*c) )
163      SymbolString s1 = new SymbolString(new Symbol[] { varB, grammar.Inv, varA, varC, grammar.Multiplication, grammar.Sin, grammar.Addition, grammar.Inv });
164      // b + sin(a*c)
165      SymbolString s2 = new SymbolString(new Symbol[] { varB, varA, varC, grammar.Multiplication, grammar.Sin, grammar.Addition });
166
167      int hash1 = grammar.CalcHashCode(s1);
168      int hash2 = grammar.CalcHashCode(s2);
169
170      Assert.AreNotEqual(hash1, hash2);
171    }*/
172  }
173}
Note: See TracBrowser for help on using the repository browser.