1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using HEAL.Attic;
|
---|
4 | using HeuristicLab.Common;
|
---|
5 | using HeuristicLab.Core;
|
---|
6 | using HeuristicLab.Data;
|
---|
7 | using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
|
---|
8 | using HeuristicLab.Parameters;
|
---|
9 |
|
---|
10 | namespace 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 | } |
---|