[2616] | 1 | using HeuristicLab.GP.StructureIdentification.Networks;
|
---|
| 2 | using Microsoft.VisualStudio.TestTools.UnitTesting;
|
---|
| 3 | using HeuristicLab.GP.Interfaces;
|
---|
| 4 | using HeuristicLab.Core;
|
---|
| 5 | using HeuristicLab.GP.StructureIdentification;
|
---|
| 6 | using System.Linq;
|
---|
| 7 | using System.Collections.Generic;
|
---|
[2627] | 8 | using HeuristicLab.Random;
|
---|
| 9 | using HeuristicLab.DataAnalysis;
|
---|
[2674] | 10 | using HeuristicLab.Common;
|
---|
[2616] | 11 |
|
---|
[2622] | 12 | namespace HeuristicLab.GP.Test {
|
---|
[2616] | 13 |
|
---|
| 14 |
|
---|
| 15 | /// <summary>
|
---|
| 16 | ///This is a test class for NetworkToFunctionTransformerTest and is intended
|
---|
| 17 | ///to contain all NetworkToFunctionTransformerTest Unit Tests
|
---|
| 18 | ///</summary>
|
---|
| 19 | [TestClass()]
|
---|
| 20 | public class NetworkToFunctionTransformerTest {
|
---|
| 21 |
|
---|
| 22 |
|
---|
| 23 | private TestContext testContextInstance;
|
---|
| 24 |
|
---|
| 25 | /// <summary>
|
---|
| 26 | ///Gets or sets the test context which provides
|
---|
| 27 | ///information about and functionality for the current test run.
|
---|
| 28 | ///</summary>
|
---|
| 29 | public TestContext TestContext {
|
---|
| 30 | get {
|
---|
| 31 | return testContextInstance;
|
---|
| 32 | }
|
---|
| 33 | set {
|
---|
| 34 | testContextInstance = value;
|
---|
| 35 | }
|
---|
| 36 | }
|
---|
| 37 |
|
---|
| 38 | #region Additional test attributes
|
---|
| 39 | //
|
---|
| 40 | //You can use the following additional attributes as you write your tests:
|
---|
| 41 | //
|
---|
| 42 | //Use ClassInitialize to run code before running the first test in the class
|
---|
| 43 | //[ClassInitialize()]
|
---|
| 44 | //public static void MyClassInitialize(TestContext testContext)
|
---|
| 45 | //{
|
---|
| 46 | //}
|
---|
| 47 | //
|
---|
| 48 | //Use ClassCleanup to run code after all tests in a class have run
|
---|
| 49 | //[ClassCleanup()]
|
---|
| 50 | //public static void MyClassCleanup()
|
---|
| 51 | //{
|
---|
| 52 | //}
|
---|
| 53 | //
|
---|
| 54 | //Use TestInitialize to run code before running each test
|
---|
| 55 | //[TestInitialize()]
|
---|
| 56 | //public void MyTestInitialize()
|
---|
| 57 | //{
|
---|
| 58 | //}
|
---|
| 59 | //
|
---|
| 60 | //Use TestCleanup to run code after each test has run
|
---|
| 61 | //[TestCleanup()]
|
---|
| 62 | //public void MyTestCleanup()
|
---|
| 63 | //{
|
---|
| 64 | //}
|
---|
| 65 | //
|
---|
| 66 | #endregion
|
---|
| 67 |
|
---|
| 68 |
|
---|
| 69 | /// <summary>
|
---|
| 70 | ///A test for InvertFunction
|
---|
| 71 | ///</summary>
|
---|
| 72 | [TestMethod()]
|
---|
| 73 | [DeploymentItem("HeuristicLab.GP.StructureIdentification.Networks-3.2.dll")]
|
---|
| 74 | public void InvertFunctionTest() {
|
---|
| 75 | var log = new OpenLog();
|
---|
| 76 | var exp = new OpenExp();
|
---|
| 77 | var openAdd = new AdditionF1();
|
---|
| 78 | var openSub = new SubtractionF1();
|
---|
| 79 | var openMul = new MultiplicationF1();
|
---|
| 80 | var openDiv = new DivisionF1();
|
---|
| 81 | var param = new OpenParameter();
|
---|
| 82 | var rootAdd = new OpenAddition();
|
---|
| 83 | var rootSub = new OpenSubtraction();
|
---|
| 84 | var rootMul = new OpenMultiplication();
|
---|
| 85 | var rootDiv = new OpenDivision();
|
---|
| 86 |
|
---|
| 87 | IFunctionTree tree = exp.GetTreeNode(); tree.AddSubTree(param.GetTreeNode());
|
---|
| 88 | IFunctionTree expected = log.GetTreeNode(); expected.AddSubTree(param.GetTreeNode());
|
---|
| 89 | IFunctionTree actual;
|
---|
[2624] | 90 | actual = NetworkToFunctionTransformer_Accessor.InvertChain(tree);
|
---|
[2616] | 91 | var e = (from x in FunctionTreeIterator.IteratePostfix(expected)
|
---|
| 92 | select x.Function.GetType()).GetEnumerator();
|
---|
| 93 | var a = (from x in FunctionTreeIterator.IteratePostfix(actual)
|
---|
| 94 | select x.Function.GetType()).GetEnumerator();
|
---|
| 95 |
|
---|
| 96 | Assert.AreEqual(expected.GetSize(), actual.GetSize());
|
---|
| 97 | while (e.MoveNext() && a.MoveNext()) {
|
---|
| 98 | Assert.AreEqual(e.Current, a.Current);
|
---|
| 99 | }
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | [TestMethod()]
|
---|
| 103 | [DeploymentItem("HeuristicLab.GP.StructureIdentification.Networks-3.2.dll")]
|
---|
| 104 | public void TransformTest() {
|
---|
[2622] | 105 | SymbolicExpressionImporter importer = new SymbolicExpressionImporter();
|
---|
[2616] | 106 |
|
---|
[2622] | 107 | {
|
---|
[2674] | 108 | IFunctionTree tree = importer.Import("(open-+ (open-param 1.0 - 0) (open-param 2.0 - 0) (open-param 4.0 - 0))");
|
---|
[2616] | 109 |
|
---|
[2622] | 110 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
[2616] | 111 |
|
---|
[2674] | 112 | IFunctionTree t0 = importer.Import("(+ (variable 2.0 b 0) (variable 4.0 c 0))");
|
---|
| 113 | IFunctionTree t1 = importer.Import("(* (- (variable 1.0 a 0) (variable 4.0 c 0)) 0.5)");
|
---|
| 114 | IFunctionTree t2 = importer.Import("(* (- (variable 1.0 a 0) (variable 2.0 b 0)) 0.25)");
|
---|
[2622] | 115 |
|
---|
[2635] | 116 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2616] | 117 | t0, t1, t2
|
---|
[2622] | 118 | });
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | {
|
---|
[2674] | 122 | IFunctionTree tree = importer.Import("(open-- (open-param 1.0 - 0) (f1-+ (open-param 2.0 - 0) 1.0) (f1-* (open-param 4.0 - 0) 1.0))");
|
---|
[2622] | 123 |
|
---|
| 124 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 125 |
|
---|
[2674] | 126 | IFunctionTree t0 = importer.Import("(- (+ (variable 2.0 b 0) 1.0) (* (variable 4.0 c 0) 1.0 ))");
|
---|
| 127 | IFunctionTree t1 = importer.Import("(* (- (+ (variable 1.0 a 0) (* (variable 4.0 c 0) 1.0)) 1.0 ) 0.5)");
|
---|
| 128 | IFunctionTree t2 = importer.Import("(* (/ (+ (variable 1.0 a 0) (+ (variable 2.0 b 0) 1.0)) 1.0 ) 0.25)");
|
---|
[2622] | 129 |
|
---|
[2635] | 130 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2622] | 131 | t0, t1, t2
|
---|
| 132 | });
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 | {
|
---|
[2674] | 136 | IFunctionTree tree = importer.Import("(cycle (open-* (open-param 1.0 - 0) (open-param 2.0 - 0) (open-param 4.0 - 0)))");
|
---|
[2622] | 137 |
|
---|
| 138 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 139 |
|
---|
[2674] | 140 | IFunctionTree t0 = importer.Import("(* (* (variable 4.0 b 0) (variable 1.0 c 0)) 0.5)");
|
---|
| 141 | IFunctionTree t1 = importer.Import("(* (/ (variable 2.0 a 0) (variable 1.0 c 0)) 0.25)");
|
---|
| 142 | IFunctionTree t2 = importer.Import("(/ (variable 2.0 a 0) (variable 4.0 b 0))");
|
---|
[2622] | 143 |
|
---|
| 144 |
|
---|
[2635] | 145 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2622] | 146 | t0, t1, t2
|
---|
| 147 | });
|
---|
| 148 | }
|
---|
| 149 |
|
---|
| 150 |
|
---|
| 151 | {
|
---|
[2674] | 152 | IFunctionTree tree = importer.Import("(open-- (open-log (open-param 1.0 - 0)) (open-exp (open-param 1.0 - 0)) (open-param 1.0 - 0))");
|
---|
[2622] | 153 |
|
---|
| 154 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 155 |
|
---|
| 156 | IFunctionTree t0 = importer.Import(@"(exp (- (exp (variable 1.0 b 0))
|
---|
| 157 | (variable 1.0 c 0))))");
|
---|
| 158 | IFunctionTree t1 = importer.Import(@"(log (+ (log (variable 1.0 a 0))
|
---|
| 159 | (variable 1.0 c 0))))");
|
---|
| 160 | IFunctionTree t2 = importer.Import(@"(+ (log (variable 1.0 a 0))
|
---|
| 161 | (exp (variable 1.0 b 0)))");
|
---|
| 162 |
|
---|
[2635] | 163 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2622] | 164 | t0, t1, t2
|
---|
| 165 | });
|
---|
| 166 | }
|
---|
[2625] | 167 | {
|
---|
[2674] | 168 | IFunctionTree tree = importer.Import("(open-- (open-log (open-log (open-param 1.0 - 0))) (open-exp (open-exp (open-param 1.0 - 0))) (f1-* (open-param 1.0 - 0) 2.0))");
|
---|
[2622] | 169 |
|
---|
[2625] | 170 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
[2622] | 171 |
|
---|
[2625] | 172 | IFunctionTree t0 = importer.Import(@"(exp (exp (- (exp (exp (variable 1.0 b 0)))
|
---|
| 173 | (* (variable 1.0 c 0) 2.0)))))");
|
---|
| 174 | IFunctionTree t1 = importer.Import(@"(log (log (+ (log (log (variable 1.0 a 0)))
|
---|
| 175 | (* (variable 1.0 c 0) 2.0))))");
|
---|
| 176 | IFunctionTree t2 = importer.Import(@"(/ (+ (log (log (variable 1.0 a 0)))
|
---|
| 177 | (exp (exp (variable 1.0 b 0)))) 2.0)");
|
---|
[2622] | 178 |
|
---|
[2635] | 179 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2625] | 180 | t0, t1, t2
|
---|
| 181 | });
|
---|
| 182 | }
|
---|
| 183 | {
|
---|
[2674] | 184 | IFunctionTree tree = importer.Import(@"(open-- (flip (open-log (open-param 1.0 - 0)))
|
---|
| 185 | (flip (f1-* (open-param 2.0 - 0) 2.0))
|
---|
| 186 | (flip (flip (f1-* (open-param 4.0 - 0) 2.0))))");
|
---|
[2625] | 187 |
|
---|
| 188 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 189 |
|
---|
[2674] | 190 | IFunctionTree t0 = importer.Import(@"(log (- (/ (variable 0.5 b 0) 2.0)
|
---|
| 191 | (* (variable 4.0 c 0) 2.0)))");
|
---|
| 192 | IFunctionTree t1 = importer.Import(@"(* (* (+ (exp (variable 1.0 a 0))
|
---|
| 193 | (* (variable 4.0 c 0) 2.0)) 2.0) 2)");
|
---|
| 194 | IFunctionTree t2 = importer.Import(@"(* (/ (+ (exp (variable 1.0 a 0))
|
---|
| 195 | (/ (variable 0.5 b 0) 2.0)) 2.0) 0.25)");
|
---|
[2625] | 196 |
|
---|
[2635] | 197 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2625] | 198 | t0, t1, t2
|
---|
| 199 | });
|
---|
| 200 | }
|
---|
| 201 | {
|
---|
[2627] | 202 | IFunctionTree tree = importer.Import(@"(open-+
|
---|
| 203 | (flip (f1-+
|
---|
| 204 | (flip (f1--
|
---|
| 205 | (flip (f1-/
|
---|
[2674] | 206 | (open-param 1.0 - 0) 4.0)) 3.0)) 2.0))
|
---|
| 207 | (open-param 1.0 - 0)
|
---|
| 208 | (open-param 1.0 - 0)))");
|
---|
[2625] | 209 | // -3*4-2 x
|
---|
| 210 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 211 |
|
---|
[2627] | 212 | IFunctionTree t0 = importer.Import("(+ (/ (+ (+ (variable 1.0 b 0) (variable 1.0 c 0)) 3.0) 4.0) 2.0)");
|
---|
[2625] | 213 | IFunctionTree t1 = importer.Import("(- (- (* (- (variable 1.0 a 0) 2.0) 4.0) 3.0) (variable 1.0 c 0))");
|
---|
| 214 | IFunctionTree t2 = importer.Import("(- (- (* (- (variable 1.0 a 0) 2.0) 4.0) 3.0) (variable 1.0 b 0))");
|
---|
| 215 |
|
---|
| 216 |
|
---|
[2635] | 217 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2625] | 218 | t0, t1, t2
|
---|
| 219 | });
|
---|
| 220 | }
|
---|
[2627] | 221 | {
|
---|
| 222 | // constant expression
|
---|
| 223 | IFunctionTree tree = importer.Import(@"(* (variable 1.0 d 0) (variable 1.0 d 0))");
|
---|
[2625] | 224 |
|
---|
[2627] | 225 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 226 |
|
---|
| 227 | IFunctionTree t0 = importer.Import("(* (variable 1.0 d 0) (variable 1.0 d 0))");
|
---|
| 228 | IFunctionTree t1 = importer.Import("(* (variable 1.0 d 0) (variable 1.0 d 0))");
|
---|
| 229 | IFunctionTree t2 = importer.Import("(* (variable 1.0 d 0) (variable 1.0 d 0))");
|
---|
| 230 |
|
---|
| 231 |
|
---|
[2635] | 232 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2627] | 233 | t0, t1, t2
|
---|
| 234 | });
|
---|
| 235 | }
|
---|
| 236 | {
|
---|
| 237 | // expression with one parameter
|
---|
[2674] | 238 | IFunctionTree tree = importer.Import(@"(f1-* (open-param 1.0 - 0) (variable 1.0 d 0))");
|
---|
[2627] | 239 |
|
---|
| 240 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 241 |
|
---|
| 242 | IFunctionTree t0 = importer.Import("(/ (variable 1.0 b 0) (variable 1.0 d 0))");
|
---|
| 243 | IFunctionTree t1 = importer.Import("(* (variable 1.0 a 0) (variable 1.0 d 0))");
|
---|
| 244 | IFunctionTree t2 = importer.Import("(* (variable 1.0 a 0) (variable 1.0 d 0))");
|
---|
| 245 |
|
---|
| 246 |
|
---|
[2635] | 247 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2627] | 248 | t0, t1, t2
|
---|
| 249 | });
|
---|
| 250 | }
|
---|
| 251 | {
|
---|
| 252 | // expression with one parameter
|
---|
[2674] | 253 | IFunctionTree tree = importer.Import(@"(open-log (open-param 1.0 - 0))");
|
---|
[2627] | 254 |
|
---|
| 255 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 256 |
|
---|
| 257 | IFunctionTree t0 = importer.Import("(exp (variable 1.0 b 0))");
|
---|
| 258 | IFunctionTree t1 = importer.Import("(log (variable 1.0 a 0))");
|
---|
| 259 | IFunctionTree t2 = importer.Import("(log (variable 1.0 a 0))");
|
---|
| 260 |
|
---|
| 261 |
|
---|
[2635] | 262 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2627] | 263 | t0, t1, t2
|
---|
| 264 | });
|
---|
| 265 | }
|
---|
| 266 | {
|
---|
| 267 | // expression with flip and one parameter
|
---|
[2674] | 268 | IFunctionTree tree = importer.Import(@"(flip (open-log (open-param 1.0 - 0)))");
|
---|
[2627] | 269 |
|
---|
| 270 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 271 |
|
---|
| 272 | IFunctionTree t0 = importer.Import("(log (variable 1.0 b 0))");
|
---|
| 273 | IFunctionTree t1 = importer.Import("(exp (variable 1.0 a 0))");
|
---|
| 274 | IFunctionTree t2 = importer.Import("(exp (variable 1.0 a 0))");
|
---|
| 275 |
|
---|
| 276 |
|
---|
[2635] | 277 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2627] | 278 | t0, t1, t2
|
---|
| 279 | });
|
---|
| 280 | }
|
---|
[2633] | 281 |
|
---|
| 282 | {
|
---|
| 283 | // expression with flip and one parameter
|
---|
[2674] | 284 | IFunctionTree tree = importer.Import(@"(open-param 1.0 - 0)");
|
---|
[2633] | 285 |
|
---|
| 286 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 287 |
|
---|
| 288 | IFunctionTree t0 = importer.Import("(variable 1.0 b 0)");
|
---|
| 289 | IFunctionTree t1 = importer.Import("(variable 1.0 a 0)");
|
---|
| 290 | IFunctionTree t2 = importer.Import("(variable 1.0 a 0)");
|
---|
| 291 |
|
---|
| 292 |
|
---|
[2635] | 293 | CompareTrees(actualTrees.ToList(), new List<IFunctionTree>() {
|
---|
[2633] | 294 | t0, t1, t2
|
---|
| 295 | });
|
---|
| 296 | }
|
---|
[2622] | 297 | }
|
---|
| 298 |
|
---|
[2635] | 299 | private void CompareTrees(List<IFunctionTree> actual, List<IFunctionTree> expected) {
|
---|
[2674] | 300 | var expectedEnumerator = expected.GetEnumerator();
|
---|
[2622] | 301 | foreach (var actualTree in actual) {
|
---|
| 302 | if (!expectedEnumerator.MoveNext()) Assert.Fail();
|
---|
| 303 | IFunctionTree expectedTree = expectedEnumerator.Current;
|
---|
[2625] | 304 | var e = (from x in FunctionTreeIterator.IteratePrefix(expectedTree)
|
---|
[2622] | 305 | select x).GetEnumerator();
|
---|
[2625] | 306 | var a = (from x in FunctionTreeIterator.IteratePrefix(actualTree)
|
---|
[2622] | 307 | select x).GetEnumerator();
|
---|
[2616] | 308 | Assert.AreEqual(expectedTree.GetSize(), actualTree.GetSize());
|
---|
| 309 | while (e.MoveNext() && a.MoveNext()) {
|
---|
[2625] | 310 | Assert.AreEqual(e.Current.Function.GetType(), a.Current.Function.GetType());
|
---|
[2622] | 311 | if (e.Current.Function is HeuristicLab.GP.StructureIdentification.Variable) {
|
---|
| 312 | var expectedVar = (VariableFunctionTree)e.Current;
|
---|
| 313 | var actualVar = (VariableFunctionTree)a.Current;
|
---|
| 314 | Assert.AreEqual(expectedVar.VariableName, actualVar.VariableName);
|
---|
[2674] | 315 | Assert.IsTrue(expectedVar.Weight.IsAlmost(actualVar.Weight));
|
---|
[2622] | 316 | Assert.AreEqual(expectedVar.SampleOffset, actualVar.SampleOffset);
|
---|
| 317 | } else if (e.Current.Function is Constant) {
|
---|
| 318 | var expectedConst = (ConstantFunctionTree)e.Current;
|
---|
| 319 | var actualConst = (ConstantFunctionTree)a.Current;
|
---|
| 320 | Assert.AreEqual(expectedConst.Value, actualConst.Value);
|
---|
| 321 | }
|
---|
[2616] | 322 | }
|
---|
| 323 | }
|
---|
| 324 | }
|
---|
[2627] | 325 |
|
---|
| 326 | [TestMethod()]
|
---|
| 327 | [DeploymentItem("HeuristicLab.GP.StructureIdentification.Networks-3.2.dll")]
|
---|
| 328 | public void TransformRandomTreesTest() {
|
---|
| 329 |
|
---|
| 330 | MersenneTwister twister = new MersenneTwister();
|
---|
| 331 | Dataset ds = Util.CreateRandomDataset(twister, 1, 20);
|
---|
[2843] | 332 | IFunctionTree[] randomTrees = Util.CreateRandomTrees(twister, ds, FunctionLibraryInjector.Create(), 1000, 1, 100);
|
---|
[2627] | 333 | foreach (var tree in randomTrees) {
|
---|
| 334 | IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
|
---|
| 335 | actualTrees.ToList();
|
---|
| 336 | }
|
---|
| 337 | }
|
---|
[2616] | 338 | }
|
---|
| 339 | }
|
---|