Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3022-FastFunctionExtraction/UnitTests/FFXModelTests.cs @ 18183

Last change on this file since 18183 was 17738, checked in by lleko, 4 years ago

#3022 implement ffx

File size: 3.4 KB
RevLine 
[17738]1using HeuristicLab.Algorithms.DataAnalysis.FastFunctionExtraction;
2using HeuristicLab.Common;
3using HeuristicLab.Problems.DataAnalysis;
4using Microsoft.VisualStudio.TestTools.UnitTesting;
5using System;
6using System.Linq;
7
8namespace UnitTests {
9
10    [TestClass]
11    public class FFXModelTests {
12        private static readonly IDataset defaultDataset = new Dataset(new string[] { "x1", "x2", "x3", "y" }, new double[,] {
13            { 1, 1, 3, 7 },
14            { 2, 3, 1, 12 },
15            { 3, -3, 0, 0 },
16            { 4, -2, 1, 8 },
17            { 5, -8, 5, 2 }
18        });
19
20        [TestMethod]
21        public void Simulate_MultipleNominatorTerms() {
22            double[] expr(double[] x1, double[] x2) {
23                return Enumerable.Range(0, x1.Length).Select(i =>
24                    (-0.5 + 1.5 * Math.Pow(x1[i], 2) + 0.5 * Math.Abs(x2[i]))
25                ).ToArray();
26            }
27
28
29            var data = new RegressionProblemData(defaultDataset, new string[] { "x1", "x2" }, "y");
30            var basisFunctions = new (double, IBasisFunction)[2];
31
32            // model: -0.5 + 1.5 * x1^2 + 0.5* abs(x2)
33            double intercept = -0.5;
34            basisFunctions[0] = (1.5, new SimpleBasisFunction("x1", 2, NonlinearOperator.None, true));
35            basisFunctions[1] = (0.5, new SimpleBasisFunction("x2", 1, NonlinearOperator.Abs, true));
36            var model = new FFXModel(intercept, basisFunctions);
37
38            var expectedVals = expr(
39                data.Dataset.GetDoubleValues("x1").ToArray(),
40                data.Dataset.GetDoubleValues("x2").ToArray()
41            );
42            var calculatedVals = model.Simulate(data, data.AllIndices);
43            for (int i = 0; i < calculatedVals.Length; i++) {
44                Assert.IsTrue(expectedVals[i].IsAlmost(calculatedVals[i]));
45            }
46        }
47
48        [TestMethod]
49        public void Simulate_MultipleDenominatorTerms() {
50            double[] expr(double[] x1, double[] x2, double[] x3) {
51                return Enumerable.Range(0, x1.Length).Select(i =>
52                    (-0.5 + 1.5 * Math.Abs(x1[i])) / (1 + 1.5 * Math.Pow(x2[i], 2) - 0.3 * x3[i])
53                ).ToArray();
54            }
55
56            var data = new RegressionProblemData(defaultDataset, new string[] { "x1", "x2", "x3" }, "y");
57            var basisFunctions = new (double, IBasisFunction)[3];
58
59            // model: (-0.5 + 1.5 * abs(x1)) / (1 + 1.5 * x2^2 - 0.3 * x3)
60            double intercept = -0.5;
61            basisFunctions[0] = (1.5, new SimpleBasisFunction("x1", 1, NonlinearOperator.Abs, true));
62            basisFunctions[1] = (1.5, new SimpleBasisFunction("x2", 2, NonlinearOperator.None, false));
63            basisFunctions[2] = (-0.3, new SimpleBasisFunction("x3", 1, NonlinearOperator.None, false));
64
65            var model = new FFXModel(intercept, basisFunctions);
66
67            var calculatedVals = model.Simulate(data, data.AllIndices);
68            var expectedVals = expr(
69                data.Dataset.GetDoubleValues("x1").ToArray(),
70                data.Dataset.GetDoubleValues("x2").ToArray(),
71                data.Dataset.GetDoubleValues("x3").ToArray()
72            ).ToArray();
73            for (int i = 0; i < expectedVals.Length; i++) {
74                Assert.IsTrue(expectedVals[i].IsAlmost(calculatedVals[i]));
75            }
76            // TODO
77        }
78    }
79}
Note: See TracBrowser for help on using the repository browser.