Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SymbolicRegressionConstraintAnalyzer.cs @ 17722

Last change on this file since 17722 was 17722, checked in by dpiringe, 4 years ago

#3076

  • added parameter support for dimensions
  • added region calculation in SymbolicRegressionConstraintAnalyzer
File size: 7.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Collections.ObjectModel;
4using System.Linq;
5using HEAL.Attic;
6using HeuristicLab.Analysis;
7using HeuristicLab.Common;
8using HeuristicLab.Core;
9using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
10using HeuristicLab.Optimization;
11using HeuristicLab.Parameters;
12
13namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
14  [StorableType("4318C6BD-E0A1-45FE-AC30-96E7F73B51FB")]
15  public class SymbolicRegressionConstraintAnalyzer : SymbolicDataAnalysisAnalyzer, ISymbolicExpressionTreeAnalyzer {
16    private const string ConstraintViolationsResultName   = "Constraint Violations";
17    private const string ProblemDataParameterName         = "ProblemData";
18    private const string ConstraintViolationParameterName = "ConstraintViolations";
19
20    #region parameter properties
21
22    public ILookupParameter<IRegressionProblemData> RegressionProblemDataParameter =>
23      (ILookupParameter<IRegressionProblemData>) Parameters[ProblemDataParameterName];
24
25    public IResultParameter<DataTable> ConstraintViolationParameter =>
26      (IResultParameter<DataTable>) Parameters[ConstraintViolationParameterName];
27
28    #endregion
29
30    public override bool EnabledByDefault => false;
31
32    [StorableConstructor]
33    protected SymbolicRegressionConstraintAnalyzer(StorableConstructorFlag _) : base(_) { }
34
35    protected SymbolicRegressionConstraintAnalyzer(SymbolicRegressionConstraintAnalyzer original, Cloner cloner) :
36      base(original, cloner) { }
37
38    public override IDeepCloneable Clone(Cloner cloner) {
39      return new SymbolicRegressionConstraintAnalyzer(this, cloner);
40    }
41
42    public SymbolicRegressionConstraintAnalyzer() {
43      Parameters.Add(new LookupParameter<IRegressionProblemData>(ProblemDataParameterName,
44                                                                 "The problem data of the symbolic data analysis problem."));
45      Parameters.Add(new ResultParameter<DataTable>(ConstraintViolationParameterName,
46                                                    "Shows the number of constraint violations!"));
47      ConstraintViolationParameter.DefaultValue = new DataTable(ConstraintViolationParameterName) {
48                                                                                                    VisualProperties = {
49                                                                                                                         XAxisTitle
50                                                                                                                           = "Generations",
51                                                                                                                         YAxisTitle
52                                                                                                                           = "Constraint Violations"
53                                                                                                                       }
54                                                                                                  };
55    }
56
57    [StorableHook(HookType.AfterDeserialization)]
58    private void AfterDeserialization() { }
59
60    public override IOperation Apply() {
61      var problemData = RegressionProblemDataParameter.ActualValue;
62      var trees       = SymbolicExpressionTreeParameter.ActualValue;
63
64      var results        = ResultCollectionParameter.ActualValue;
65      var constraints    = problemData.IntervalConstraints.EnabledConstraints;
66      var variableRanges = problemData.VariableRanges.GetReadonlyDictionary();
67      var newDataTable   = ConstraintViolationParameter.ActualValue;
68
69      if (newDataTable.Rows.Count == 0)
70        foreach (var constraint in constraints)
71          newDataTable.Rows.Add(new DataRow(constraint.Expression));
72
73      var interpreter = new IntervalInterpreter();
74      foreach (var constraint in constraints) {
75        var violations = trees.Select(tree => ConstraintSatisfied(constraint, interpreter, variableRanges, tree))
76                              .Count(satisfied => !satisfied);
77        newDataTable.Rows[constraint.Expression].Values.Add(violations);
78      }
79
80      return base.Apply();
81    }
82
83    public static bool ConstraintSatisfied(IntervalConstraint            constraint,
84                                           IntervalInterpreter           intervalInterpreter,
85                                           IReadOnlyDictionary<string, Interval> variableRanges,
86                                           ISymbolicExpressionTree       solution) {
87      if (constraint.Variable != null && !variableRanges.ContainsKey(constraint.Variable))
88        throw new
89          ArgumentException($"The given variable {constraint.Variable} in the constraint does not exists in the model.",
90                            nameof(IntervalConstraintsParser));
91
92      Interval resultInterval;
93
94      // create new variable ranges for defined regions
95      IDictionary<string, Interval> regionRanges = new Dictionary<string, Interval>();
96      foreach (var kvp in variableRanges)
97      {
98        if (kvp.Key != constraint.Target && constraint.Regions.TryGetValue(kvp.Key, out Interval val))
99        {
100          regionRanges.Add(kvp.Key, val);
101        }
102        else
103        {
104          regionRanges.Add(kvp);
105        }
106      }
107
108      // calculate result interval
109      if (!constraint.IsDerivative) {
110        resultInterval = intervalInterpreter.GetSymbolicExpressionTreeInterval(solution, new ReadOnlyDictionary<string, Interval>(regionRanges));
111      }
112      else {
113        var tree = solution;
114        for (var i = 0; i < constraint.NumberOfDerivations; ++i) {
115          if (!IntervalInterpreter.IsCompatible(tree) || !DerivativeCalculator.IsCompatible(tree))
116            throw new ArgumentException("Cube, Root, Power Symbols are not supported.");
117          tree = DerivativeCalculator.Derive(tree, constraint.Variable);
118        }
119
120        resultInterval = intervalInterpreter.GetSymbolicExpressionTreeInterval(tree, new ReadOnlyDictionary<string, Interval>(regionRanges));
121      }
122
123      var satisfied = constraint.Interval.Contains(resultInterval);
124      return satisfied;
125    }
126
127    public static bool ConstraintsSatisfied(IEnumerable<IntervalConstraint> constraints,
128                                            IReadOnlyDictionary<string, Interval>   variableRanges,
129                                            ISymbolicExpressionTree         solution) {
130      var intervalInterpreter = new IntervalInterpreter();
131      foreach (var constraint in constraints) {
132        if (constraint.Variable != null && !variableRanges.ContainsKey(constraint.Variable))
133          throw new
134            ArgumentException($"The given variable {constraint.Variable} in the constraint does not exists in the model.",
135                              nameof(IntervalConstraintsParser));
136
137        var satisfied = ConstraintSatisfied(constraint, intervalInterpreter, variableRanges, solution);
138        if (!satisfied) return false;
139      }
140
141      return true;
142    }
143  }
144}
Note: See TracBrowser for help on using the repository browser.