Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/11/19 20:55:22 (5 years ago)
Author:
gkronber
Message:

#2994 made some fixes in the const-opt evaluator with constraints and added some debugging capabilities

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2994-AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Extensions/NLOptEvaluator.cs

    r17325 r17328  
    3131using HEAL.Attic;
    3232using System.Runtime.InteropServices;
     33using System.Diagnostics;
    3334
    3435namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
     
    4748    private const string CountEvaluationsParameterName = "Count Function and Gradient Evaluations";
    4849
     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
    4958    public IFixedValueParameter<IntValue> ConstantOptimizationIterationsParameter {
    5059      get { return (IFixedValueParameter<IntValue>)Parameters[ConstantOptimizationIterationsParameterName]; }
     
    7786    public IConstrainedValueParameter<StringValue> SolverParameter {
    7887      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]; }
    79108    }
    80109
     
    134163      Parameters.Add(new ResultParameter<IntValue>(FunctionEvaluationsResultParameterName, "The number of function evaluations performed by the constants optimization evaluator", "Results", new IntValue()));
    135164      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));
    136174    }
    137175
     
    141179
    142180    [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    }
    144194
    145195    private static readonly object locker = new object();
     
    151201        IEnumerable<int> constantOptimizationRows = GenerateRowsToEvaluate(ConstantOptimizationRowsPercentage.Value);
    152202        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 
    156203        if (ConstantOptimizationRowsPercentage.Value != RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value) {
    157204          throw new NotSupportedException();
    158205        }
     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);
    159220
    160221        if (CountEvaluations) {
     
    202263    public static double OptimizeConstants(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter,
    203264      ISymbolicExpressionTree tree, IRegressionProblemData problemData, IEnumerable<int> rows, bool applyLinearScaling,
    204       string solver,
     265      string solver, out double qDiff, out double[] constraintsBefore, out double[] constraintsAfter,
    205266      int maxIterations, bool updateVariableWeights = true,
    206267      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      ) {
    208270
    209271      if (!updateVariableWeights) throw new NotSupportedException("not updating variable weights is not supported");
     
    213275
    214276      using (var state = new ConstrainedNLSInternal(solver, tree, maxIterations, problemData, 0, 0, 0)) {
     277        constraintsBefore = state.BestConstraintValues;
     278        double qBefore = state.BestError;
    215279        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;
    217285      }
    218286    }
Note: See TracChangeset for help on using the changeset viewer.