Changeset 17328 for branches/2994-AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Extensions/NLOptEvaluator.cs
- Timestamp:
- 10/11/19 20:55:22 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2994-AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Extensions/NLOptEvaluator.cs
r17325 r17328 31 31 using HEAL.Attic; 32 32 using System.Runtime.InteropServices; 33 using System.Diagnostics; 33 34 34 35 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression { … … 47 48 private const string CountEvaluationsParameterName = "Count Function and Gradient Evaluations"; 48 49 50 51 private const string AchievedQualityImprovementParameterName = "AchievedQualityImprovment"; 52 private const string NumberOfConstraintViolationsBeforeOptimizationParameterName = "NumberOfConstraintViolationsBeforeOptimization"; 53 private const string NumberOfConstraintViolationsAfterOptimizationParameterName = "NumberOfConstraintViolationsAfterOptimization"; 54 private const string ConstraintsBeforeOptimizationParameterName = "ConstraintsBeforeOptimization"; 55 private const string ViolationsAfterOptimizationParameterName = "ConstraintsAfterOptimization"; 56 private const string OptimizationDurationParameterName = "OptimizationDuration"; 57 49 58 public IFixedValueParameter<IntValue> ConstantOptimizationIterationsParameter { 50 59 get { return (IFixedValueParameter<IntValue>)Parameters[ConstantOptimizationIterationsParameterName]; } … … 77 86 public IConstrainedValueParameter<StringValue> SolverParameter { 78 87 get { return (IConstrainedValueParameter<StringValue>)Parameters["Solver"]; } 88 } 89 90 91 public ILookupParameter<DoubleValue> AchievedQualityImprovementParameter { 92 get { return (ILookupParameter<DoubleValue>)Parameters[AchievedQualityImprovementParameterName]; } 93 } 94 public ILookupParameter<DoubleValue> NumberOfConstraintViolationsBeforeOptimizationParameter { 95 get { return (ILookupParameter<DoubleValue>)Parameters[NumberOfConstraintViolationsBeforeOptimizationParameterName]; } 96 } 97 public ILookupParameter<DoubleValue> NumberOfConstraintViolationsAfterOptimizationParameter { 98 get { return (ILookupParameter<DoubleValue>)Parameters[NumberOfConstraintViolationsAfterOptimizationParameterName]; } 99 } 100 public ILookupParameter<DoubleArray> ViolationsAfterOptimizationParameter { 101 get { return (ILookupParameter<DoubleArray>)Parameters[ViolationsAfterOptimizationParameterName]; } 102 } 103 public ILookupParameter<DoubleArray> ViolationsBeforeOptimizationParameter { 104 get { return (ILookupParameter<DoubleArray>)Parameters[ConstraintsBeforeOptimizationParameterName]; } 105 } 106 public ILookupParameter<DoubleValue> OptimizationDurationParameter { 107 get { return (ILookupParameter<DoubleValue>)Parameters[OptimizationDurationParameterName]; } 79 108 } 80 109 … … 134 163 Parameters.Add(new ResultParameter<IntValue>(FunctionEvaluationsResultParameterName, "The number of function evaluations performed by the constants optimization evaluator", "Results", new IntValue())); 135 164 Parameters.Add(new ResultParameter<IntValue>(GradientEvaluationsResultParameterName, "The number of gradient evaluations performed by the constants optimization evaluator", "Results", new IntValue())); 165 166 167 168 Parameters.Add(new LookupParameter<DoubleValue>(AchievedQualityImprovementParameterName)); 169 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfConstraintViolationsBeforeOptimizationParameterName)); 170 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfConstraintViolationsAfterOptimizationParameterName)); 171 Parameters.Add(new LookupParameter<DoubleArray>(ConstraintsBeforeOptimizationParameterName)); 172 Parameters.Add(new LookupParameter<DoubleArray>(ViolationsAfterOptimizationParameterName)); 173 Parameters.Add(new LookupParameter<DoubleValue>(OptimizationDurationParameterName)); 136 174 } 137 175 … … 141 179 142 180 [StorableHook(HookType.AfterDeserialization)] 143 private void AfterDeserialization() { } 181 private void AfterDeserialization() { 182 if (!Parameters.ContainsKey(AchievedQualityImprovementParameterName)) { 183 Parameters.Add(new LookupParameter<DoubleValue>(AchievedQualityImprovementParameterName)); 184 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfConstraintViolationsBeforeOptimizationParameterName)); 185 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfConstraintViolationsAfterOptimizationParameterName)); 186 } 187 if(!Parameters.ContainsKey(ConstraintsBeforeOptimizationParameterName)) { 188 Parameters.Add(new LookupParameter<DoubleArray>(ConstraintsBeforeOptimizationParameterName)); 189 Parameters.Add(new LookupParameter<DoubleArray>(ViolationsAfterOptimizationParameterName)); 190 Parameters.Add(new LookupParameter<DoubleValue>(OptimizationDurationParameterName)); 191 192 } 193 } 144 194 145 195 private static readonly object locker = new object(); … … 151 201 IEnumerable<int> constantOptimizationRows = GenerateRowsToEvaluate(ConstantOptimizationRowsPercentage.Value); 152 202 var counter = new EvaluationsCounter(); 153 quality = OptimizeConstants(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, ProblemDataParameter.ActualValue,154 constantOptimizationRows, ApplyLinearScalingParameter.ActualValue.Value, Solver, ConstantOptimizationIterations.Value, updateVariableWeights: UpdateVariableWeights, lowerEstimationLimit: EstimationLimitsParameter.ActualValue.Lower, upperEstimationLimit: EstimationLimitsParameter.ActualValue.Upper, updateConstantsInTree: UpdateConstantsInTree, counter: counter);155 156 203 if (ConstantOptimizationRowsPercentage.Value != RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value) { 157 204 throw new NotSupportedException(); 158 205 } 206 207 var sw = new Stopwatch(); 208 sw.Start(); 209 quality = OptimizeConstants(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, ProblemDataParameter.ActualValue, 210 constantOptimizationRows, ApplyLinearScalingParameter.ActualValue.Value, Solver, 211 out double qDiff, out double[] constraintsBefore, out double[] constraintsAfter, 212 ConstantOptimizationIterations.Value, updateVariableWeights: UpdateVariableWeights, lowerEstimationLimit: EstimationLimitsParameter.ActualValue.Lower, upperEstimationLimit: EstimationLimitsParameter.ActualValue.Upper, updateConstantsInTree: UpdateConstantsInTree, counter: counter); 213 214 AchievedQualityImprovementParameter.ActualValue = new DoubleValue(qDiff); 215 NumberOfConstraintViolationsBeforeOptimizationParameter.ActualValue = new DoubleValue(constraintsBefore.Count(cv => cv > 0)); 216 NumberOfConstraintViolationsAfterOptimizationParameter.ActualValue = new DoubleValue(constraintsAfter.Count(cv => cv > 0)); 217 ViolationsBeforeOptimizationParameter.ActualValue = new DoubleArray(constraintsBefore); 218 ViolationsAfterOptimizationParameter.ActualValue = new DoubleArray(constraintsAfter); 219 OptimizationDurationParameter.ActualValue = new DoubleValue(sw.Elapsed.TotalSeconds); 159 220 160 221 if (CountEvaluations) { … … 202 263 public static double OptimizeConstants(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 203 264 ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling, 204 string solver, 265 string solver, out double qDiff, out double[] constraintsBefore, out double[] constraintsAfter, 205 266 int maxIterations, bool updateVariableWeights = true, 206 267 double lowerEstimationLimit = double.MinValue, double upperEstimationLimit = double.MaxValue, 207 bool updateConstantsInTree = true, Action<double[], double, object> iterationCallback = null, EvaluationsCounter counter = null) { 268 bool updateConstantsInTree = true, Action<double[], double, object> iterationCallback = null, EvaluationsCounter counter = null 269 ) { 208 270 209 271 if (!updateVariableWeights) throw new NotSupportedException("not updating variable weights is not supported"); … … 213 275 214 276 using (var state = new ConstrainedNLSInternal(solver, tree, maxIterations, problemData, 0, 0, 0)) { 277 constraintsBefore = state.BestConstraintValues; 278 double qBefore = state.BestError; 215 279 state.Optimize(ConstrainedNLSInternal.OptimizationMode.UpdateParameters); 216 return state.BestError; 280 constraintsAfter = state.BestConstraintValues; 281 var qOpt = state.BestError; 282 if (constraintsAfter.Any(cv => cv > 1e-8)) qOpt = qBefore; 283 qDiff = qOpt - qBefore; 284 return qOpt; 217 285 } 218 286 }
Note: See TracChangeset
for help on using the changeset viewer.