Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3119_AdditionalShapeConstraintFeatures/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionMetaModelAnalyzer.cs @ 17994

Last change on this file since 17994 was 17994, checked in by dpiringe, 3 years ago

#3119

  • added MetaModelAnalyzer to analye solutions for additinal problem instances
File size: 4.8 KB
Line 
1using HEAL.Attic;
2using HeuristicLab.Analysis;
3using HeuristicLab.Common;
4using HeuristicLab.Core;
5using HeuristicLab.Data;
6using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
7using HeuristicLab.Optimization;
8using HeuristicLab.Parameters;
9using System;
10using System.Collections.Generic;
11using System.Linq;
12using System.Text;
13using System.Threading.Tasks;
14
15namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
16  [StorableType("E5B7E058-E63F-4059-A87F-EA9247592254")]
17  public abstract class SymbolicRegressionMetaModelAnalyzer<T>
18    : SymbolicDataAnalysisAnalyzer, ISymbolicExpressionTreeAnalyzer where T: class, IRegressionProblem {
19
20    #region constants
21    private const string ProblemsToAnalyzeParameterName = "Problems to Analyze";
22    private const string BaseProblemParameterName = "Base Problem";
23    private const string AnalyzeXIterationParameterName = "Analyze X Iteration";
24    #endregion
25
26    #region parameter properties
27    //IRegressionProblem
28    public IFixedValueParameter<ItemList<T>> ProblemsToAnalyzeParameter =>
29      (IFixedValueParameter<ItemList<T>>)Parameters[ProblemsToAnalyzeParameterName];
30
31    public IValueParameter<T> BaseProblemParameter =>
32      (IValueParameter<T>)Parameters[BaseProblemParameterName];
33
34    public IFixedValueParameter<IntValue> AnalyzeXIterationParameter =>
35      (IFixedValueParameter<IntValue>)Parameters[AnalyzeXIterationParameterName];
36    #endregion
37
38    public static int Iterations { get; set; } = 1;
39
40    #region constructors and cloning
41    protected SymbolicRegressionMetaModelAnalyzer(SymbolicRegressionMetaModelAnalyzer<T> original, Cloner cloner) :
42      base(original, cloner) { }
43
44    [StorableConstructor]
45    protected SymbolicRegressionMetaModelAnalyzer(StorableConstructorFlag _) : base(_) { }
46
47    public SymbolicRegressionMetaModelAnalyzer() {
48      Parameters.Add(new FixedValueParameter<ItemList<T>>(ProblemsToAnalyzeParameterName,
49        "List of datasets, which are used to find a meta model.", new ItemList<T>()));
50      Parameters.Add(new ValueParameter<T>(BaseProblemParameterName,
51        "The problem which uses the algorithm (just drag&drop it)."));
52      Parameters.Add(new FixedValueParameter<IntValue>(AnalyzeXIterationParameterName,
53        "After every X iteration, the analyzer will perform its step.", new IntValue(1)));
54    }
55
56    [StorableHook(HookType.AfterDeserialization)]
57    private void AfterDeserialization() {
58      if (!Parameters.ContainsKey(ProblemsToAnalyzeParameterName))
59        Parameters.Add(new FixedValueParameter<ItemList<T>>(ProblemsToAnalyzeParameterName,
60          "List of datasets, which are used to find a meta model.", new ItemList<T>()));
61
62      if (!Parameters.ContainsKey(BaseProblemParameterName))
63        Parameters.Add(new ValueParameter<T>(BaseProblemParameterName,
64          "The problem which uses the algorithm (just drag&drop it)."));
65
66      if (!Parameters.ContainsKey(AnalyzeXIterationParameterName))
67        Parameters.Add(new FixedValueParameter<IntValue>(AnalyzeXIterationParameterName,
68          "After every X iteration, the analyzer will perform its step.", new IntValue(1)));
69    }
70
71    #endregion
72
73    public override void InitializeState() {
74      Iterations = 1;
75      base.InitializeState();
76    }
77
78    public override void ClearState() {
79      Iterations = 1;
80      base.ClearState();
81    }
82
83    //protected abstract bool TryFittingSolution(ISymbolicExpressionTree tree, T problem, out SymbolicRegressionSolution solution);
84    protected abstract void PerformApply(T baseProblem, IEnumerable<T> problems, string targetVariable);
85
86    public override IOperation Apply() {
87      if (BaseProblemParameter.Value == null)
88        throw new ArgumentNullException("BaseProblemParameter",
89          "Base Problem Parameter is null! Please drag&drop the used problem into the parameter slot.");
90
91      if (Iterations >= AnalyzeXIterationParameter.Value.Value) {
92        Iterations = 1;
93        var baseProblem = BaseProblemParameter.Value;
94        var problems = ProblemsToAnalyzeParameter.Value;
95        var targetVariable = BaseProblemParameter.Value.ProblemData.TargetVariable;
96
97        // error handling
98        var badProblems = problems.Where(x => x.ProblemData.TargetVariable != targetVariable);
99        IList<Exception> errors = new List<Exception>();
100        foreach (var problem in badProblems)
101          errors.Add(new ArgumentException($"The target variable of the problem '{problem.Name}' does not match with the base problem."));
102        if (badProblems.Any())
103          throw new AggregateException(errors);
104
105        // apply
106        PerformApply(baseProblem, problems, targetVariable);
107      } else {
108        Iterations++;
109      }
110      return base.Apply();
111    }
112  }
113}
Note: See TracBrowser for help on using the repository browser.