Changeset 17769 for branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMultiSoftConstraintEvaluator.cs
- Timestamp:
- 10/02/20 11:38:13 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3076_IA_evaluators_analyzers/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/MultiObjective/SymbolicRegressionMultiObjectiveMultiSoftConstraintEvaluator.cs
r17761 r17769 39 39 SymbolicRegressionMultiObjectiveMultiSoftConstraintEvaluator : SymbolicRegressionMultiObjectiveSplittingEvaluator { 40 40 public const string DimensionsParameterName = "Dimensions"; 41 42 public IFixedValueParameter<IntValue> DimensionsParameter => (IFixedValueParameter<IntValue>)Parameters[DimensionsParameterName]; 43 41 private const string BoundsEstimatorParameterName = "Bounds estimator"; 42 43 public IFixedValueParameter<IntValue> DimensionsParameter => 44 (IFixedValueParameter<IntValue>) Parameters[DimensionsParameterName]; 45 46 public IValueParameter<IBoundsEstimator> BoundsEstimatorParameter => 47 (IValueParameter<IBoundsEstimator>) Parameters[BoundsEstimatorParameterName]; 48 49 public IBoundsEstimator BoundsEstimator { 50 get => BoundsEstimatorParameter.Value; 51 set => BoundsEstimatorParameter.Value = value; 52 } 44 53 45 54 #region Constructors 55 46 56 public SymbolicRegressionMultiObjectiveMultiSoftConstraintEvaluator() { 47 57 Parameters.Add(new FixedValueParameter<IntValue>(DimensionsParameterName, new IntValue(2))); 58 Parameters.Add(new ValueParameter<IBoundsEstimator>(BoundsEstimatorParameterName, new IABoundsEstimator())); 48 59 } 49 60 … … 58 69 [StorableHook(HookType.AfterDeserialization)] 59 70 private void AfterDeserialization() { 60 if (!Parameters.ContainsKey(DimensionsParameterName))71 if (!Parameters.ContainsKey(DimensionsParameterName)) 61 72 Parameters.Add(new FixedValueParameter<IntValue>(DimensionsParameterName, new IntValue(2))); 73 74 if (!Parameters.ContainsKey(BoundsEstimatorParameterName)) 75 Parameters.Add(new ValueParameter<IBoundsEstimator>(BoundsEstimatorParameterName, new IABoundsEstimator())); 62 76 } 63 77 … … 68 82 69 83 public override IOperation InstrumentedApply() { 70 var rows = GenerateRowsToEvaluate(); 71 var solution = SymbolicExpressionTreeParameter.ActualValue; 72 var problemData = ProblemDataParameter.ActualValue; 73 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; 74 var estimationLimits = EstimationLimitsParameter.ActualValue; 75 var minIntervalWidth = MinSplittingWidth; 76 var maxIntervalSplitDepth = MaxSplittingDepth; 77 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 78 79 if (applyLinearScaling) { 80 //Check for interval arithmetic grammar 81 //remove scaling nodes for linear scaling evaluation 82 var rootNode = new ProgramRootSymbol().CreateTreeNode(); 83 var startNode = new StartSymbol().CreateTreeNode(); 84 SymbolicExpressionTree newTree = null; 85 foreach (var node in solution.IterateNodesPrefix()) 86 if (node.Symbol.Name == "Scaling") { 87 for (var i = 0; i < node.SubtreeCount; ++i) startNode.AddSubtree(node.GetSubtree(i)); 88 rootNode.AddSubtree(startNode); 89 newTree = new SymbolicExpressionTree(rootNode); 90 break; 91 } 92 93 //calculate alpha and beta for scaling 94 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(newTree, problemData.Dataset, rows); 95 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 96 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out var alpha, out var beta, 97 out var errorState); 98 //Set alpha and beta to the scaling nodes from ia grammar 99 foreach (var node in solution.IterateNodesPrefix()) 100 if (node.Symbol.Name == "Offset") { 101 node.RemoveSubtree(1); 102 var alphaNode = new ConstantTreeNode(new Constant()) {Value = alpha}; 103 node.AddSubtree(alphaNode); 104 } else if (node.Symbol.Name == "Scaling") { 105 node.RemoveSubtree(1); 106 var betaNode = new ConstantTreeNode(new Constant()) {Value = beta}; 107 node.AddSubtree(betaNode); 108 } 109 } 110 111 if (UseConstantOptimization) 84 var rows = GenerateRowsToEvaluate(); 85 var solution = SymbolicExpressionTreeParameter.ActualValue; 86 var problemData = ProblemDataParameter.ActualValue; 87 var interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; 88 var estimationLimits = EstimationLimitsParameter.ActualValue; 89 var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value; 90 91 if (UseConstantOptimization) { 112 92 SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows, 113 93 false, … … 116 96 estimationLimits.Lower, 117 97 estimationLimits.Upper); 98 } else { 99 if (applyLinearScaling) { 100 //Check for interval arithmetic grammar 101 //remove scaling nodes for linear scaling evaluation 102 var rootNode = new ProgramRootSymbol().CreateTreeNode(); 103 var startNode = new StartSymbol().CreateTreeNode(); 104 SymbolicExpressionTree newTree = null; 105 foreach (var node in solution.IterateNodesPrefix()) 106 if (node.Symbol.Name == "Scaling") { 107 for (var i = 0; i < node.SubtreeCount; ++i) startNode.AddSubtree(node.GetSubtree(i)); 108 rootNode.AddSubtree(startNode); 109 newTree = new SymbolicExpressionTree(rootNode); 110 break; 111 } 112 113 //calculate alpha and beta for scaling 114 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(newTree, problemData.Dataset, rows); 115 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 116 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out var alpha, out var beta, 117 out var errorState); 118 //Set alpha and beta to the scaling nodes from ia grammar 119 foreach (var node in solution.IterateNodesPrefix()) 120 if (node.Symbol.Name == "Offset") { 121 node.RemoveSubtree(1); 122 var alphaNode = new ConstantTreeNode(new Constant()) {Value = alpha}; 123 node.AddSubtree(alphaNode); 124 } else if (node.Symbol.Name == "Scaling") { 125 node.RemoveSubtree(1); 126 var betaNode = new ConstantTreeNode(new Constant()) {Value = beta}; 127 node.AddSubtree(betaNode); 128 } 129 } 130 } 118 131 119 132 var qualities = Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, 120 rows, UseIntervalSplitting);133 rows, BoundsEstimator); 121 134 QualitiesParameter.ActualValue = new DoubleArray(qualities); 122 135 return base.InstrumentedApply(); 123 136 } 124 137 125 public override double[] Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, 126 IRegressionProblemData problemData, 127 IEnumerable<int> rows) { 138 public override double[] Evaluate( 139 IExecutionContext context, ISymbolicExpressionTree tree, 140 IRegressionProblemData problemData, 141 IEnumerable<int> rows) { 128 142 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 129 EstimationLimitsParameter.ExecutionContext 130 ApplyLinearScalingParameter.ExecutionContext 143 EstimationLimitsParameter.ExecutionContext = context; 144 ApplyLinearScalingParameter.ExecutionContext = context; 131 145 132 146 var quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, 133 147 EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, 134 problemData, rows, UseIntervalSplitting);148 problemData, rows, BoundsEstimator); 135 149 136 150 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 137 EstimationLimitsParameter.ExecutionContext 138 ApplyLinearScalingParameter.ExecutionContext 151 EstimationLimitsParameter.ExecutionContext = null; 152 ApplyLinearScalingParameter.ExecutionContext = null; 139 153 140 154 return quality; … … 142 156 143 157 144 public static double[] Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 145 ISymbolicExpressionTree solution, double lowerEstimationLimit, 146 double upperEstimationLimit, 147 IRegressionProblemData problemData, IEnumerable<int> rows, bool splitting) { 158 public static double[] Calculate( 159 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 160 ISymbolicExpressionTree solution, double lowerEstimationLimit, 161 double upperEstimationLimit, 162 IRegressionProblemData problemData, IEnumerable<int> rows, IBoundsEstimator estimator) { 148 163 OnlineCalculatorError errorState; 149 var estimatedValues = 150 interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 164 var estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 151 165 var targetValues = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, rows); 166 var constraints = problemData.IntervalConstraints.Constraints.Where(c => c.Enabled); 167 var intervalCollection = problemData.VariableRanges; 152 168 153 169 double nmse; … … 160 176 nmse = 1.0; 161 177 162 var constraints = problemData.IntervalConstraints.Constraints.Where(c => c.Enabled); 163 var variableRanges = problemData.VariableRanges.GetReadonlyDictionary(); 164 165 var objectives = new List<double> {nmse}; 166 var intervalInterpreter = new IntervalInterpreter(){UseIntervalSplitting = splitting}; 167 168 var constraintObjectives = new List<double>(); 169 foreach (var c in constraints) { 170 var penalty = ConstraintExceeded(c, intervalInterpreter, variableRanges, 171 solution); 172 var maxP = 0.1; 173 174 if (double.IsNaN(penalty) || double.IsInfinity(penalty) || penalty > maxP) 175 penalty = maxP; 176 177 constraintObjectives.Add(penalty); 178 } 179 180 objectives.AddRange(constraintObjectives); 181 178 179 var objectives = new List<double> {nmse}; 180 ////var intervalInterpreter = new IntervalInterpreter() {UseIntervalSplitting = splitting}; 181 182 //var constraintObjectives = new List<double>(); 183 //foreach (var c in constraints) { 184 // var penalty = ConstraintExceeded(c, intervalInterpreter, variableRanges, 185 // solution); 186 // var maxP = 0.1; 187 188 // if (double.IsNaN(penalty) || double.IsInfinity(penalty) || penalty > maxP) 189 // penalty = maxP; 190 191 // constraintObjectives.Add(penalty); 192 //} 193 194 //objectives.AddRange(constraintObjectives); 195 196 //return objectives.ToArray(); 197 198 var results = IntervalUtil.IntervalConstraintsViolation(constraints, estimator, intervalCollection, solution); 199 objectives.AddRange(results); 182 200 return objectives.ToArray(); 183 }184 185 public static double ConstraintExceeded(IntervalConstraint constraint, IntervalInterpreter intervalInterpreter,186 IReadOnlyDictionary<string, Interval> variableRanges,187 ISymbolicExpressionTree solution) {188 if (constraint.Variable != null && !variableRanges.ContainsKey(constraint.Variable))189 throw new ArgumentException(190 $"The given variable {constraint.Variable} in the constraint does not exists in the model.",191 nameof(IntervalConstraintsParser));192 Interval resultInterval;193 if (!constraint.IsDerivative) {194 resultInterval =195 intervalInterpreter.GetSymbolicExpressionTreeInterval(solution, variableRanges);196 }197 else {198 var tree = solution;199 for (var i = 0; i < constraint.NumberOfDerivations; ++i)200 tree = DerivativeCalculator.Derive(tree, constraint.Variable);201 202 resultInterval =203 intervalInterpreter.GetSymbolicExpressionTreeInterval(tree, variableRanges);204 }205 206 //Calculate soft-constraints for intervals207 if (constraint.Interval.Contains(resultInterval)) return 0;208 var pLower = 0.0;209 var pUpper = 0.0;210 if (constraint.Interval.Contains(resultInterval.LowerBound))211 pLower = 0;212 else213 pLower = constraint.Interval.LowerBound - resultInterval.LowerBound;214 215 if (constraint.Interval.Contains(resultInterval.UpperBound))216 pUpper = 0;217 else218 pUpper = resultInterval.UpperBound - constraint.Interval.UpperBound;219 var penalty = Math.Abs(pLower) + Math.Abs(pUpper);220 221 return penalty;222 201 } 223 202 … … 226 205 * All following objectives have to be minimized ==> Constraints 227 206 */ 207 228 208 public override IEnumerable<bool> Maximization { 229 209 get { 230 var objectives = new List<bool> {false}; 210 var objectives = new List<bool> {false}; //First NMSE ==> min 231 211 objectives.AddRange(Enumerable.Repeat(false, DimensionsParameter.Value.Value)); //Constraints ==> min 232 212 233 213 return objectives; 234 214 }
Note: See TracChangeset
for help on using the changeset viewer.