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 @ 17705

Last change on this file since 17705 was 17660, checked in by chaider, 4 years ago

#3076

  • Set worst nmse value to 1.0 in SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator
  • Added SymbolicRegressionSingleObjectiveConstraintScalingNmseEvaluator which allows to use linear scaling within IA
File size: 6.3 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
18    public IFixedValueParameter<BoolValue> UseConstOptParamerter =>
19      (IFixedValueParameter<BoolValue>) Parameters[UseConstOptParameterName];
20
21    public IFixedValueParameter<IntValue> ConstOpterIterationsParameter =>
22      (IFixedValueParameter<IntValue>) Parameters[ConstOptIterationsParameterName];
23
24    public bool UseConstOpt {
25      get => UseConstOptParamerter.Value.Value;
26      set => UseConstOptParamerter.Value.Value = value;
27    }
28
29    public int ConstOptIterations {
30      get => ConstOpterIterationsParameter.Value.Value;
31      set => ConstOpterIterationsParameter.Value.Value = value;
32    }
33
34    [StorableConstructor]
35    protected SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(StorableConstructorFlag _) : base(_) {}
36
37    protected SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(
38      SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator original, Cloner cloner) :
39      base(original, cloner) { }
40
41    public override IDeepCloneable Clone(Cloner cloner) {
42      return new SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator(this, cloner);
43    }
44
45    public SymbolicRegressionSingleObjectiveConstraintConstOptNmseEvaluator() {
46      Parameters.Add(new FixedValueParameter<BoolValue>(UseConstOptParameterName,
47        "Define whether constOpt is active or not.", new BoolValue(true)));
48      Parameters.Add(new FixedValueParameter<IntValue>(ConstOptIterationsParameterName,
49        "Define how many constOpt iterations should be performed.", new IntValue(10)));
50    }
51
52    public override bool Maximization => false;
53
54    [StorableHook(HookType.AfterDeserialization)]
55    private void AfterDeserialization() {
56      if (!Parameters.ContainsKey(UseConstOptParameterName)) {
57        Parameters.Add(new FixedValueParameter<BoolValue>(UseConstOptParameterName,
58          "Define whether constOpt is active or not.", new BoolValue(true)));
59      }
60
61      if (!Parameters.ContainsKey(ConstOptIterationsParameterName)) {
62        Parameters.Add(new FixedValueParameter<IntValue>(ConstOptIterationsParameterName,
63          "Define how many constOpt iterations should be performed.", new IntValue(10)));
64      }
65    }
66
67    public override IOperation InstrumentedApply() {
68      var rows                                      = GenerateRowsToEvaluate();
69      var solution                                  = SymbolicExpressionTreeParameter.ActualValue;
70      var problemData                               = ProblemDataParameter.ActualValue;
71      var interpreter                               = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
72      var estimationLimits                          = EstimationLimitsParameter.ActualValue;
73      var applyLinearScaling                        = false;
74      var constantOptimizationIterations            = ConstOptIterations;
75      var constantOptimizationUpdateVariableWeights = true;
76
77      //Use Const Opt
78      if(UseConstOpt)
79        SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows,
80          applyLinearScaling, constantOptimizationIterations, constantOptimizationUpdateVariableWeights,
81          estimationLimits.Lower, estimationLimits.Upper);
82
83      var quality = Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, rows,
84        applyLinearScaling);
85      QualityParameter.ActualValue = new DoubleValue(quality);
86      return base.InstrumentedApply();
87    }
88
89    public static double Calculate(
90      ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,
91      ISymbolicExpressionTree solution, double lowerEstimationLimit,
92      double upperEstimationLimit,
93      IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling) {
94      var estimatedValues =
95        interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows);
96      var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows);
97      var constraints = problemData.IntervalConstraints.EnabledConstraints;
98      var variableRanges = problemData.VariableRanges.GetReadonlyDictionary();
99
100      if (!SymbolicRegressionConstraintAnalyzer.ConstraintsSatisfied(constraints, variableRanges, solution))
101        return 1.0;
102
103      var boundedEstimatedValues = estimatedValues.LimitToRange(lowerEstimationLimit, upperEstimationLimit);
104      var nmse = OnlineNormalizedMeanSquaredErrorCalculator.Calculate(targetValues, boundedEstimatedValues, out var errorState);
105      if (errorState != OnlineCalculatorError.None) nmse = 1.0;
106
107      return nmse;
108    }
109   
110    public override double Evaluate(
111      IExecutionContext context, ISymbolicExpressionTree tree, IRegressionProblemData problemData,
112      IEnumerable<int> rows) {
113      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context;
114      EstimationLimitsParameter.ExecutionContext                    = context;
115      ApplyLinearScalingParameter.ExecutionContext                  = context;
116
117      var nmse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree,
118        EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper,
119        problemData, rows,
120        ApplyLinearScalingParameter.ActualValue.Value);
121
122      SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null;
123      EstimationLimitsParameter.ExecutionContext                    = null;
124      ApplyLinearScalingParameter.ExecutionContext                  = null;
125
126      return nmse;
127    }
128  }
129}
Note: See TracBrowser for help on using the repository browser.