Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/09/19 11:13:11 (5 years ago)
Author:
gkronber
Message:

#2994: worked on ConstrainedNLS

File:
1 edited

Legend:

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

    r17311 r17325  
    1010using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    1111using HeuristicLab.Analysis;
     12using System.Collections.Generic;
    1213
    1314namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
     
    157158      Results.AddOrUpdateResult("Qualities", qualitiesTable);
    158159
    159       var curConstraintValue = new DoubleValue(0);
    160       Results.AddOrUpdateResult("Current Constraint Value", curConstraintValue);
    161       var curConstraintIdx = new IntValue(0);
    162       Results.AddOrUpdateResult("Current Constraint Index", curConstraintIdx);
    163 
    164       var curConstraintRow = new DataRow("Constraint Value");
    165       var constraintsTable = new DataTable("Constraints");
    166 
    167       constraintsTable.Rows.Add(curConstraintRow);
     160      var constraintRows = new List<IndexedDataRow<int>>(); // for access via index
     161      var constraintsTable = new IndexedDataTable<int>("Constraints");
    168162      Results.AddOrUpdateResult("Constraints", constraintsTable);
     163      foreach (var constraint in problem.ProblemData.IntervalConstraints.Constraints.Where(c => c.Enabled)) {
     164        if (constraint.Interval.LowerBound > double.NegativeInfinity) {
     165          var constraintRow = new IndexedDataRow<int>("-" + constraint.Expression + " < " + (-constraint.Interval.LowerBound));
     166          constraintRows.Add(constraintRow);
     167          constraintsTable.Rows.Add(constraintRow);
     168        }
     169        if (constraint.Interval.UpperBound < double.PositiveInfinity) {
     170          var constraintRow = new IndexedDataRow<int>(constraint.Expression + " < " + (constraint.Interval.UpperBound));
     171          constraintRows.Add(constraintRow);
     172          constraintsTable.Rows.Add(constraintRow);
     173        }
     174      }
     175
     176      var parametersTable = new IndexedDataTable<int>("Parameters");
    169177
    170178      #endregion
     
    175183      var formatter = new InfixExpressionFormatter();
    176184      var constraintDescriptions = state.ConstraintDescriptions.ToArray();
    177       foreach(var constraintTree in state.constraintTrees) {
     185      foreach (var constraintTree in state.constraintTrees) {
    178186        // HACK to remove parameter nodes which occurr multiple times
    179187        var reparsedTree = parser.Parse(formatter.Format(constraintTree));
     
    186194      state.ConstraintEvaluated += State_ConstraintEvaluated;
    187195
    188       state.Optimize();
     196      state.Optimize(ConstrainedNLSInternal.OptimizationMode.UpdateParametersAndKeepLinearScaling);
    189197      bestError.Value = state.BestError;
    190198      curQualityRow.Values.Add(state.CurError);
     
    205213        curQualityRow.Values.Add(state.CurError);
    206214        bestQualityRow.Values.Add(bestError.Value);
     215
     216        // on the first call create the data rows
     217        if(!parametersTable.Rows.Any()) {
     218          for(int i=0;i<state.BestSolution.Length;i++) {
     219            parametersTable.Rows.Add(new IndexedDataRow<int>("p" + i));
     220          }
     221        }
     222        for (int i = 0; i < state.BestSolution.Length; i++) {
     223          parametersTable.Rows["p" + i].Values.Add(Tuple.Create(functionEvaluations.Value, state.BestSolution[i])); // TODO: remove access via string
     224        }
    207225      }
    208226
    209227      // local function
    210228      void State_ConstraintEvaluated(int constraintIdx, double value) {
    211         curConstraintIdx.Value = constraintIdx;
    212         curConstraintValue.Value = value;
    213         curConstraintRow.Values.Add(value);
     229        constraintRows[constraintIdx].Values.Add(Tuple.Create(functionEvaluations.Value, value));
    214230      }
    215231    }
     
    217233    private static ISymbolicRegressionSolution CreateSolution(ISymbolicExpressionTree tree, IRegressionProblemData problemData) {
    218234      var model = new SymbolicRegressionModel(problemData.TargetVariable, tree, new SymbolicDataAnalysisExpressionTreeLinearInterpreter());
    219       // model.Scale(problemData);
     235      // model.CreateRegressionSolution produces a new ProblemData and recalculates intervals ==> use SymbolicRegressionSolution.ctor instead
     236      var sol = new SymbolicRegressionSolution(model, (IRegressionProblemData)problemData.Clone());
     237      // NOTE: the solution has slightly different derivative values because simplification of derivatives can be done differently when parameter values are fixed.
     238
    220239      // var sol = model.CreateRegressionSolution((IRegressionProblemData)problemData.Clone());
    221       // model.CreateRegressionSolution produces a new ProblemData and recalculates intervals
    222 
    223       var sol = new SymbolicRegressionSolution(model, (IRegressionProblemData)problemData.Clone());
    224 
    225       // ==> set variable ranges to same range as in original problemData
    226       // foreach(var interval in problemData.VariableRanges.GetIntervals()) {
    227       //   sol.ProblemData.VariableRanges.SetInterval
    228       // }
     240
    229241      return sol;
    230242    }
Note: See TracChangeset for help on using the changeset viewer.