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 | 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 | } |
---|