Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2971_named_intervals/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/ConstantOptimizationAnalyzer.cs @ 16628

Last change on this file since 16628 was 16628, checked in by gkronber, 5 years ago

#2971: made branch compile with current version of trunk

File size: 8.4 KB
RevLine 
[5607]1#region License Information
2/* HeuristicLab
[15583]3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[5607]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
[7721]22using System;
[5607]23using System.Linq;
[8844]24using HeuristicLab.Analysis;
[5607]25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
[16628]31using HEAL.Attic;
[5607]32
[8844]33namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
[5607]34  /// <summary>
[8844]35  /// An operator that optimizes the constants for the best symbolic expression tress in the current generation.
[5607]36  /// </summary>
[8844]37  [Item("ConstantOptimizationAnalyzer", "An operator that performs a constant optimization on the best symbolic expression trees.")]
[16628]38  [StorableType("FB130F7F-36D1-413B-A9A4-F5270B536B66")]
[8849]39  public sealed class ConstantOptimizationAnalyzer : SymbolicDataAnalysisSingleObjectiveAnalyzer, IStatefulItem {
[8844]40    private const string PercentageOfBestSolutionsParameterName = "PercentageOfBestSolutions";
41    private const string ConstantOptimizationEvaluatorParameterName = "ConstantOptimizationOperator";
[5607]42
[8844]43    private const string DataTableNameConstantOptimizationImprovement = "Constant Optimization Improvement";
44    private const string DataRowNameMinimumImprovement = "Minimum improvement";
[8893]45    private const string DataRowNameMedianImprovement = "Median improvement";
[8844]46    private const string DataRowNameAverageImprovement = "Average improvement";
47    private const string DataRowNameMaximumImprovement = "Maximum improvement";
48
[5607]49    #region parameter properties
[8844]50    public IFixedValueParameter<PercentValue> PercentageOfBestSolutionsParameter {
51      get { return (IFixedValueParameter<PercentValue>)Parameters[PercentageOfBestSolutionsParameterName]; }
[5607]52    }
[8844]53
54    public IFixedValueParameter<SymbolicRegressionConstantOptimizationEvaluator> ConstantOptimizationEvaluatorParameter {
55      get { return (IFixedValueParameter<SymbolicRegressionConstantOptimizationEvaluator>)Parameters[ConstantOptimizationEvaluatorParameterName]; }
[5607]56    }
57    #endregion
[8844]58
[5607]59    #region properties
[8844]60    public SymbolicRegressionConstantOptimizationEvaluator ConstantOptimizationEvaluator {
61      get { return ConstantOptimizationEvaluatorParameter.Value; }
[5607]62    }
[8844]63    public double PercentageOfBestSolutions {
64      get { return PercentageOfBestSolutionsParameter.Value.Value; }
[5607]65    }
[8844]66
67    private DataTable ConstantOptimizationImprovementDataTable {
68      get {
69        IResult result;
[8976]70        ResultCollection.TryGetValue(DataTableNameConstantOptimizationImprovement, out result);
[8844]71        if (result == null) return null;
72        return (DataTable)result.Value;
73      }
74    }
75    private DataRow MinimumImprovement {
76      get { return ConstantOptimizationImprovementDataTable.Rows[DataRowNameMinimumImprovement]; }
77    }
[8893]78    private DataRow MedianImprovement {
79      get { return ConstantOptimizationImprovementDataTable.Rows[DataRowNameMedianImprovement]; }
80    }
[8844]81    private DataRow AverageImprovement {
82      get { return ConstantOptimizationImprovementDataTable.Rows[DataRowNameAverageImprovement]; }
83    }
84    private DataRow MaximumImprovement {
85      get { return ConstantOptimizationImprovementDataTable.Rows[DataRowNameMaximumImprovement]; }
86    }
[5607]87    #endregion
88
89    [StorableConstructor]
[16628]90    private ConstantOptimizationAnalyzer(StorableConstructorFlag _) : base(_) { }
[8845]91    private ConstantOptimizationAnalyzer(ConstantOptimizationAnalyzer original, Cloner cloner) : base(original, cloner) { }
[8844]92    public override IDeepCloneable Clone(Cloner cloner) { return new ConstantOptimizationAnalyzer(this, cloner); }
93    public ConstantOptimizationAnalyzer()
[5607]94      : base() {
[8844]95      Parameters.Add(new FixedValueParameter<PercentValue>(PercentageOfBestSolutionsParameterName, "The percentage of the top solutions which should be analyzed.", new PercentValue(0.1)));
96      Parameters.Add(new FixedValueParameter<SymbolicRegressionConstantOptimizationEvaluator>(ConstantOptimizationEvaluatorParameterName, "The operator used to perform the constant optimization"));
97
98      //Changed the ActualName of the EvaluationPartitionParameter so that it matches the parameter name of symbolic regression problems.
99      ConstantOptimizationEvaluator.EvaluationPartitionParameter.ActualName = "FitnessCalculationPartition";
[5607]100    }
101
[8844]102
103    private double[] qualitiesBeforeCoOp = null;
104    private int[] scopeIndexes = null;
[8849]105    void IStatefulItem.InitializeState() {
106      qualitiesBeforeCoOp = null;
107      scopeIndexes = null;
108    }
109    void IStatefulItem.ClearState() {
110      qualitiesBeforeCoOp = null;
111      scopeIndexes = null;
112    }
113
[5607]114    public override IOperation Apply() {
[8976]115      //code executed in the first call of analyzer
[8844]116      if (qualitiesBeforeCoOp == null) {
117        double[] trainingQuality;
118        // sort is ascending and we take the first n% => order so that best solutions are smallest
119        // sort order is determined by maximization parameter
120        if (Maximization.Value) {
121          // largest values must be sorted first
122          trainingQuality = Quality.Select(x => -x.Value).ToArray();
123        } else {
124          // smallest values must be sorted first
125          trainingQuality = Quality.Select(x => x.Value).ToArray();
126        }
127        // sort trees by training qualities
128        int topN = (int)Math.Max(trainingQuality.Length * PercentageOfBestSolutions, 1);
129        scopeIndexes = Enumerable.Range(0, trainingQuality.Length).ToArray();
130        Array.Sort(trainingQuality, scopeIndexes);
131        scopeIndexes = scopeIndexes.Take(topN).ToArray();
132        qualitiesBeforeCoOp = scopeIndexes.Select(x => Quality[x].Value).ToArray();
[5759]133
[8844]134        OperationCollection operationCollection = new OperationCollection();
135        operationCollection.Parallel = true;
136        foreach (var scopeIndex in scopeIndexes) {
137          var childOperation = ExecutionContext.CreateChildOperation(ConstantOptimizationEvaluator, ExecutionContext.Scope.SubScopes[scopeIndex]);
138          operationCollection.Add(childOperation);
139        }
140
141        return new OperationCollection { operationCollection, ExecutionContext.CreateOperation(this) };
[7721]142      }
143
[8844]144      //code executed to analyze results of constant optimization
145      double[] qualitiesAfterCoOp = scopeIndexes.Select(x => Quality[x].Value).ToArray();
146      var qualityImprovement = qualitiesBeforeCoOp.Zip(qualitiesAfterCoOp, (b, a) => a - b).ToArray();
[7721]147
[8844]148      if (!ResultCollection.ContainsKey(DataTableNameConstantOptimizationImprovement)) {
149        var dataTable = new DataTable(DataTableNameConstantOptimizationImprovement);
150        ResultCollection.Add(new Result(DataTableNameConstantOptimizationImprovement, dataTable));
151        dataTable.VisualProperties.YAxisTitle = "R²";
[7721]152
[8844]153        dataTable.Rows.Add(new DataRow(DataRowNameMinimumImprovement));
154        MinimumImprovement.VisualProperties.StartIndexZero = true;
[6728]155
[8893]156        dataTable.Rows.Add(new DataRow(DataRowNameMedianImprovement));
157        MedianImprovement.VisualProperties.StartIndexZero = true;
158
[8844]159        dataTable.Rows.Add(new DataRow(DataRowNameAverageImprovement));
160        AverageImprovement.VisualProperties.StartIndexZero = true;
161
162        dataTable.Rows.Add(new DataRow(DataRowNameMaximumImprovement));
163        MaximumImprovement.VisualProperties.StartIndexZero = true;
[5607]164      }
165
[8844]166      MinimumImprovement.Values.Add(qualityImprovement.Min());
[8893]167      MedianImprovement.Values.Add(qualityImprovement.Median());
[8844]168      AverageImprovement.Values.Add(qualityImprovement.Average());
169      MaximumImprovement.Values.Add(qualityImprovement.Max());
[5607]170
[8844]171      qualitiesBeforeCoOp = null;
172      scopeIndexes = null;
[5607]173      return base.Apply();
174    }
175  }
176}
Note: See TracBrowser for help on using the repository browser.