using HeuristicLab.Algorithms.DataAnalysis.FastFunctionExtraction; using HeuristicLab.Common; using HeuristicLab.Problems.DataAnalysis; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Linq; namespace UnitTests { [TestClass] public class FFXModelTests { private static readonly IDataset defaultDataset = new Dataset(new string[] { "x1", "x2", "x3", "y" }, new double[,] { { 1, 1, 3, 7 }, { 2, 3, 1, 12 }, { 3, -3, 0, 0 }, { 4, -2, 1, 8 }, { 5, -8, 5, 2 } }); [TestMethod] public void Simulate_MultipleNominatorTerms() { double[] expr(double[] x1, double[] x2) { return Enumerable.Range(0, x1.Length).Select(i => (-0.5 + 1.5 * Math.Pow(x1[i], 2) + 0.5 * Math.Abs(x2[i])) ).ToArray(); } var data = new RegressionProblemData(defaultDataset, new string[] { "x1", "x2" }, "y"); var basisFunctions = new (double, IBasisFunction)[2]; // model: -0.5 + 1.5 * x1^2 + 0.5* abs(x2) double intercept = -0.5; basisFunctions[0] = (1.5, new SimpleBasisFunction("x1", 2, NonlinearOperator.None, true)); basisFunctions[1] = (0.5, new SimpleBasisFunction("x2", 1, NonlinearOperator.Abs, true)); var model = new FFXModel(intercept, basisFunctions); var expectedVals = expr( data.Dataset.GetDoubleValues("x1").ToArray(), data.Dataset.GetDoubleValues("x2").ToArray() ); var calculatedVals = model.Simulate(data, data.AllIndices); for (int i = 0; i < calculatedVals.Length; i++) { Assert.IsTrue(expectedVals[i].IsAlmost(calculatedVals[i])); } } [TestMethod] public void Simulate_MultipleDenominatorTerms() { double[] expr(double[] x1, double[] x2, double[] x3) { return Enumerable.Range(0, x1.Length).Select(i => (-0.5 + 1.5 * Math.Abs(x1[i])) / (1 + 1.5 * Math.Pow(x2[i], 2) - 0.3 * x3[i]) ).ToArray(); } var data = new RegressionProblemData(defaultDataset, new string[] { "x1", "x2", "x3" }, "y"); var basisFunctions = new (double, IBasisFunction)[3]; // model: (-0.5 + 1.5 * abs(x1)) / (1 + 1.5 * x2^2 - 0.3 * x3) double intercept = -0.5; basisFunctions[0] = (1.5, new SimpleBasisFunction("x1", 1, NonlinearOperator.Abs, true)); basisFunctions[1] = (1.5, new SimpleBasisFunction("x2", 2, NonlinearOperator.None, false)); basisFunctions[2] = (-0.3, new SimpleBasisFunction("x3", 1, NonlinearOperator.None, false)); var model = new FFXModel(intercept, basisFunctions); var calculatedVals = model.Simulate(data, data.AllIndices); var expectedVals = expr( data.Dataset.GetDoubleValues("x1").ToArray(), data.Dataset.GetDoubleValues("x2").ToArray(), data.Dataset.GetDoubleValues("x3").ToArray() ).ToArray(); for (int i = 0; i < expectedVals.Length; i++) { Assert.IsTrue(expectedVals[i].IsAlmost(calculatedVals[i])); } // TODO } } }