Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator.cs @ 17744

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

#3076

  • modified SymbolicRegressionConstraintAnalyzer to calculate an error (as out parameter)
    • added an ILookupParameter to write a penality multiplier into the scope
  • changed a lot of evaluators to match the changed analyzer method
  • changed SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator to use a rising penality (instead of setting an unsatisfied solution to 1.0)
File size: 7.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using HEAL.Attic;
4using HeuristicLab.Common;
5using HeuristicLab.Core;
6using HeuristicLab.Data;
7using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
8using HeuristicLab.Parameters;
9
10namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.SingleObjective.Evaluators {
11  [Item("Constraint ConstOpt NMSE Evaluator", "")]
12  [StorableType("DED36D85-A4BA-4019-B12D-C523F7327899")]
13  public class SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator
14    : SymbolicRegressionSingleObjectiveEvaluator {
15    private const string UseConstOptParameterName = "Use ConstOpt";
16    private const string ConstOptIterationsParameterName = "ConstOpt Iterations";
17    private const string PenalityMultiplierParameterName = "ConstraintsPenalityMultiplier";
18
19    public IFixedValueParameter<BoolValue> UseConstOptParamerter =>
20      (IFixedValueParameter<BoolValue>) Parameters[UseConstOptParameterName];
21
22    public IFixedValueParameter<IntValue> ConstOpterIterationsParameter =>
23      (IFixedValueParameter<IntValue>) Parameters[ConstOptIterationsParameterName];
24
25    public ILookupParameter<DoubleValue> PenalityMultiplierParameter =>
26      (ILookupParameter<DoubleValue>)Parameters[PenalityMultiplierParameterName];
27
28    public bool UseConstOpt {
29      get => UseConstOptParamerter.Value.Value;
30      set => UseConstOptParamerter.Value.Value = value;
31    }
32
33    public int ConstOptIterations {
34      get => ConstOpterIterationsParameter.Value.Value;
35      set => ConstOpterIterationsParameter.Value.Value = value;
36    }
37
38    [StorableConstructor]
39    protected SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(StorableConstructorFlag _) : base(_) {}
40
41    protected SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(
42      SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator original, Cloner cloner) :
43      base(original, cloner) { }
44
45    public override IDeepCloneable Clone(Cloner cloner) {
46      return new SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(this, cloner);
47    }
48
49    public SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator() {
50      Parameters.Add(new FixedValueParameter<BoolValue>(UseConstOptParameterName,
51        "Define whether constOpt is active or not.", new BoolValue(true)));
52      Parameters.Add(new FixedValueParameter<IntValue>(ConstOptIterationsParameterName,
53        "Define how many constOpt iterations should be performed.", new IntValue(10)));
54      Parameters.Add(new LookupParameter<DoubleValue>(PenalityMultiplierParameterName,
55        "Lookup parameter for the penality multiplier.", "PenalityMultiplier"));
56    }
57
58    public override bool Maximization => false;
59
60    [StorableHook(HookType.AfterDeserialization)]
61    private void AfterDeserialization() {
62      if (!Parameters.ContainsKey(UseConstOptParameterName)) {
63        Parameters.Add(new FixedValueParameter<BoolValue>(UseConstOptParameterName,
64          "Define whether constOpt is active or not.", new BoolValue(true)));
65      }
66
67      if (!Parameters.ContainsKey(ConstOptIterationsParameterName)) {
68        Parameters.Add(new FixedValueParameter<IntValue>(ConstOptIterationsParameterName,
69          "Define how many constOpt iterations should be performed.", new IntValue(10)));
70      }
71
72      if (!Parameters.ContainsKey(PenalityMultiplierParameterName))
73        Parameters.Add(new LookupParameter<DoubleValue>(PenalityMultiplierParameterName,
74          "Lookup parameter for the penality multiplier.", "PenalityMultiplier"));
75    }
76
77    public override IOperation InstrumentedApply() {
78      var rows                                      = GenerateRowsToEvaluate();
79      var solution                                  = SymbolicExpressionTreeParameter.ActualValue;
80      var problemData                               = ProblemDataParameter.ActualValue;
81      var interpreter                               = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
82      var estimationLimits                          = EstimationLimitsParameter.ActualValue;
83      var applyLinearScaling                        = false;
84      var constantOptimizationIterations            = ConstOptIterations;
85      var constantOptimizationUpdateVariableWeights = true;
86
87      //Use Const Opt
88      if(UseConstOpt)
89        SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows,
90          applyLinearScaling, constantOptimizationIterations, constantOptimizationUpdateVariableWeights,
91          estimationLimits.Lower, estimationLimits.Upper);
92
93      var penalityMultiplier = PenalityMultiplierParameter.ActualValue?.Value ?? 1.0;
94
95      var quality = Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, rows,
96        applyLinearScaling, penalityMultiplier);
97      QualityParameter.ActualValue = new DoubleValue(quality);
98
99
100      return base.InstrumentedApply();
101    }
102
103    public static double Calculate(
104      ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,
105      ISymbolicExpressionTree solution, double lowerEstimationLimit,
106      double upperEstimationLimit,
107      IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling,
108      double penalityMultiplier) {
109      var estimatedValues =
110        interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows);
111      var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
112      var constraints = problemData.IntervalConstraints.EnabledConstraints;
113      var variableRanges = problemData.VariableRanges.GetReadonlyDictionary();
114
115      var boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);
116      var nmse = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out var errorState);
117      if (!SymbolicRegressionConstraintAnalyzer.ConstraintsSatisfied(constraints, variableRanges, solution, out double error))
118      {
119        if (double.IsNaN(error) || double.IsInfinity(error))
120          nmse += penalityMultiplier * 1.0;
121        else
122          nmse += penalityMultiplier * error;
123        nmse = Math.Min(1.0, nmse);
124      }
125
126      if (errorState != OnlineCalculatorError.None) nmse = 1.0;
127
128      return nmse;
129    }
130   
131    public override double Evaluate(
132      IExecutionContext context, ISymbolicExpressionTree tree, IRegressionProblemData problemData,
133      IEnumerable<int> rows) {
134      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context;
135      EstimationLimitsParameter.ExecutionContext                    = context;
136      ApplyLinearScalingParameter.ExecutionContext                  = context;
137
138      var penalityMultiplier = PenalityMultiplierParameter.ActualValue?.Value ?? 1.0;
139
140      var nmse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree,
141        EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper,
142        problemData, rows,
143        ApplyLinearScalingParameter.ActualValue.Value,
144        penalityMultiplier);
145
146      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;
147      EstimationLimitsParameter.ExecutionContext                    = null;
148      ApplyLinearScalingParameter.ExecutionContext                  = null;
149
150      return nmse;
151    }
152  }
153}
Note: See TracBrowser for help on using the repository browser.