using System; using System.Collections.Generic; using HeuristicLab.Data; using HeuristicLab.Problems.DynamicalSystemsModelling; using HeuristicLab.Random; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace AutoDiffForDynamicalModelsTest { [TestClass] public class TestOdeIdentification { [TestMethod] public void RunOdeIdentification() { var alg = new OdeParameterIdentification(); var dynProb = new Problem(); var parser = new HeuristicLab.Problems.Instances.DataAnalysis.TableFileParser(); // var fileName = @"C:\reps\HEAL\EuroCAST - Kronberger\DataGeneration\test.csv"; var fileName = @"D:\heal\documents\trunk\Publications\2019\EuroCAST\Kronberger\DataGeneration\test.csv"; parser.Parse(fileName, true); var prov = new HeuristicLab.Problems.Instances.DataAnalysis.RegressionCSVInstanceProvider(); var regressionProblemData = prov.ImportData(fileName); regressionProblemData.TrainingPartition.Start = 0; regressionProblemData.TrainingPartition.End = 40; regressionProblemData.TestPartition.Start = 41; var allowedInputs = new List(); // empty var targets = new List(new[] { "x1", "x2", "v" }); foreach (var checkedItem in regressionProblemData.InputVariables) { regressionProblemData.InputVariables.SetItemCheckedState(checkedItem, allowedInputs.Contains(checkedItem.Value)); } dynProb.Load(regressionProblemData); foreach (var checkedItem in dynProb.TargetVariables) { dynProb.TargetVariables.SetItemCheckedState(checkedItem, targets.Contains(checkedItem.Value)); } dynProb.TrainingEpisodesParameter.Value.Add(new IntRange(0, 40)); dynProb.NumericIntegrationStepsParameter.Value.Value = 1; var rand = new FastRandom(1234); var expressions = new string[] { "v", "-v", "1.0*(x2-x1)" }; alg.CreateSolution(dynProb, expressions, 200, rand); Assert.AreEqual(6.8350792038369173E-20, ((DoubleValue)alg.Results["SNMSE"].Value).Value, 1E-8); } [TestMethod] public void RunOdeIdentificationMultipleEpisodes() { var alg = new OdeParameterIdentification(); var dynProb = new Problem(); var parser = new HeuristicLab.Problems.Instances.DataAnalysis.TableFileParser(); // var fileName = @"C:\reps\HEAL\EuroCAST - Kronberger\DataGeneration\test.csv"; var fileName = @"C:\reps\HEAL\EuroCAST - Kronberger\DataGeneration\s-system.csv"; parser.Parse(fileName, true); var prov = new HeuristicLab.Problems.Instances.DataAnalysis.RegressionCSVInstanceProvider(); var regressionProblemData = prov.ImportData(fileName); regressionProblemData.TrainingPartition.Start = 0; regressionProblemData.TrainingPartition.End = 61; regressionProblemData.TestPartition.Start = 61; var allowedInputs = new List(); // empty var targets = new List(new[] { "y1", "y2", "y3", "y4", "y5" }); foreach (var checkedItem in regressionProblemData.InputVariables) { regressionProblemData.InputVariables.SetItemCheckedState(checkedItem, allowedInputs.Contains(checkedItem.Value)); } dynProb.Load(regressionProblemData); foreach (var checkedItem in dynProb.TargetVariables) { dynProb.TargetVariables.SetItemCheckedState(checkedItem, targets.Contains(checkedItem.Value)); } dynProb.TrainingEpisodesParameter.Value.Add(new IntRange(0, 30)); dynProb.TrainingEpisodesParameter.Value.Add(new IntRange(30, 61)); dynProb.NumericIntegrationStepsParameter.Value.Value = 1; var rand = new FastRandom(1234); var expressions = new string[] { "1.0*(y3*exp(log(y5)*0.1)) + 1.0*(y1*y1)", "1.0*(y1*y1) + 1.0*(y2*y2)", "1.0*exp(log(y2)*0.1) + 1.0*exp(log(y2)*0.1)*(y3*y3)", "1.0*(y1*y1)*exp(log(y5)*0.1) + 1.0*(y4*y4)", "1.0*(y4*y4)+1.0*(y5*y5)" }; alg.CreateSolution(dynProb, expressions, 200, rand); Assert.AreEqual(0.0, ((DoubleValue)alg.Results["SNMSE"].Value).Value, 1E-8); } } }