Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GrammaticalOptimization/Test/TestCanonicalExpressions.cs @ 11972

Last change on this file since 11972 was 11972, checked in by gkronber, 9 years ago

#2283 new experiments

File size: 4.6 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using HeuristicLab.Algorithms.Bandits;
7using Microsoft.VisualStudio.TestTools.UnitTesting;
8
9namespace HeuristicLab.Problems.GrammaticalOptimization.Test {
10  [TestClass]
11  public class TestCanonicalExpressions {
12    [TestMethod]
13    public void TestFactorReordering() {
14      var extender = new ExpressionExtender();
15      Assert.AreEqual("a*b", extender.CanonicalRepresentation("b*a"));
16      Assert.AreEqual("a*b*c", extender.CanonicalRepresentation("b*a*c"));
17      Assert.AreEqual("a*b*E", extender.CanonicalRepresentation("b*a*E"));
18    }
19
20    [TestMethod]
21    public void TestDuplicateTerms() {
22      var extender = new ExpressionExtender();
23      Assert.AreEqual("a", extender.CanonicalRepresentation("a+a"));
24      Assert.AreEqual("a+b", extender.CanonicalRepresentation("b+a+b"));
25      Assert.AreEqual("a+b", extender.CanonicalRepresentation("b+a-b")); // even though b-b canceles should keep this as we might find a non-zero factor for b
26    }
27
28    [TestMethod]
29    public void TestSimpleTermReordering() {
30      var extender = new ExpressionExtender();
31      Assert.AreEqual("a+b", extender.CanonicalRepresentation("b+a"));
32      Assert.AreEqual("a+b+c", extender.CanonicalRepresentation("b+a+c"));
33      Assert.AreEqual("a+b+E", extender.CanonicalRepresentation("b+a+E"));
34    }
35
36    [TestMethod]
37    public void TestCombinedTermReordering() {
38      var extender = new ExpressionExtender();
39      Assert.AreEqual("a+b+a*b+E", extender.CanonicalRepresentation("b*a+b+a+E"));
40      Assert.AreEqual("a+b+b*c+E", extender.CanonicalRepresentation("c*b+b+a+E"));
41      Assert.AreEqual("a+b+b*c+a*b*c+E", extender.CanonicalRepresentation("c*b+b*a*c+b+a+E"));
42    }
43    [TestMethod]
44    public void TestNegativeAndReorderTerms() {
45      var extender = new ExpressionExtender();
46      // when using constant opt the negative sign is not necessary because a negative factor can be produced
47      Assert.AreEqual("a+b", extender.CanonicalRepresentation("b-a"));
48      Assert.AreEqual("a+b+c", extender.CanonicalRepresentation("b-a-c"));
49      Assert.AreEqual("a+b+E", extender.CanonicalRepresentation("b-a-E"));
50    }
51    [TestMethod]
52    public void TestFactorExpansion() {
53      var extender = new ExpressionExtender();
54      Assert.AreEqual("a+b", extender.CanonicalRepresentation("(b+a)"));
55      Assert.AreEqual("a+b", extender.CanonicalRepresentation("(b)+(a)"));
56      Assert.AreEqual("a+b", extender.CanonicalRepresentation("(b+(a))"));
57      Assert.AreEqual("a+b", extender.CanonicalRepresentation("((b)+a)"));
58
59      Assert.AreEqual("a+b+c", extender.CanonicalRepresentation("b-(a-c)"));
60      Assert.AreEqual("a+b+c", extender.CanonicalRepresentation("b-(a+c)"));
61      Assert.AreEqual("a+b+E", extender.CanonicalRepresentation("b-(a-E)"));
62
63      // when using constant opt the negative sign is not necessary because a negative factor can be produced
64      Assert.AreEqual("a*b+b*c", extender.CanonicalRepresentation("b*(c-a)"));
65      Assert.AreEqual("a*b+a*d+b*c+c*d", extender.CanonicalRepresentation("(b-d)*(c-a)"));
66    }
67    [TestMethod]
68    public void TestDivisionExpansion() {
69      var extender = new ExpressionExtender();
70      Assert.AreEqual("a*1/c+b*1/c", extender.CanonicalRepresentation("(b+a)%c"));
71      Assert.AreEqual("a*1/c*1/d+b*1/c*1/d", extender.CanonicalRepresentation("(b+a)%(d*c)"));
72      Assert.AreEqual("a*1/(c+d)+b*1/(c+d)", extender.CanonicalRepresentation("(b-a)%(d-c)"));
73      Assert.AreEqual("a*b*1/(c+d)", extender.CanonicalRepresentation("(b*a)%(d-c)"));
74
75      Assert.AreEqual("a*b*1/(a+b)*1/(c+d)", extender.CanonicalRepresentation("(b*a)%(d-c)%(a+b)"));
76      Assert.AreEqual("a*b*1/(a*1/e+b*1/e)*1/(c+d)", extender.CanonicalRepresentation("((b*a)%(d-c))%((a+b)%e)"));
77      // a*b*e%(c+d)%(a+b)
78    }
79    [TestMethod]
80    public void TestDivisionCancellation() {
81      var extender = new ExpressionExtender();
82      Assert.AreEqual("1", extender.CanonicalRepresentation("a%a"));
83      Assert.AreEqual("a", extender.CanonicalRepresentation("a*a%a"));
84      Assert.AreEqual("1/a", extender.CanonicalRepresentation("(a%a)%a"));
85      Assert.AreEqual("1/a", extender.CanonicalRepresentation("a%a%a"));
86      Assert.AreEqual("a", extender.CanonicalRepresentation("a%(a%a)"));
87      Assert.AreEqual("1", extender.CanonicalRepresentation("(a+b)%(b+a)"));
88      Assert.AreEqual("1/a+1/b", extender.CanonicalRepresentation("(a+b)%(a*b)"));
89      Assert.AreEqual("a*1/(a*c*1/b+e*1/d*1/f)+b*1/(a*c*1/b+e*1/d*1/f)", extender.CanonicalRepresentation("(a+b)%(a%b*c+e%f%d)"));
90    }
91  }
92}
Note: See TracBrowser for help on using the repository browser.