#region License Information
/* HeuristicLab
* Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using HeuristicLab.Analysis;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
using HeuristicLab.Operators;
using HeuristicLab.Optimization;
using HeuristicLab.Optimization.Operators;
using HeuristicLab.Parameters;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.PluginInfrastructure;
using HeuristicLab.Problems.DataAnalysis.Symbolic;
namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
///
/// An operator that analyzes the validation best scaled symbolic regression solution.
///
[Item("ValidationBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the validation best scaled symbolic regression solution.")]
[StorableClass]
[NonDiscoverableType]
public sealed class ValidationBestScaledSymbolicRegressionSolutionAnalyzer : AlgorithmOperator, ISymbolicRegressionAnalyzer {
private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
private const string ScaledSymbolicExpressionTreeParameterName = "ScaledSymbolicExpressionTree";
private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
private const string ProblemDataParameterName = "ProblemData";
private const string TrainingSamplesStartParameterName = "TrainingSamplesStart";
private const string TrainingSamplesEndParameterName = "TrainingSamplesEnd";
private const string ValidationSamplesStartParameterName = "ValidationSamplesStart";
private const string ValidationSamplesEndParameterName = "ValidationSamplesEnd";
private const string TestSamplesStartParameterName = "TestSamplesStart";
private const string TestSamplesEndParameterName = "TestSamplesEnd";
private const string QualityParameterName = "Quality";
private const string ScaledQualityParameterName = "ScaledQuality";
private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
private const string AlphaParameterName = "Alpha";
private const string BetaParameterName = "Beta";
private const string BestSolutionParameterName = "Best solution (validation)";
private const string BestSolutionQualityParameterName = "Best solution quality (validation)";
private const string CurrentBestValidationQualityParameterName = "Current best validation quality";
private const string ResultsParameterName = "Results";
private const string BestKnownQualityParameterName = "BestKnownQuality";
public ScopeTreeLookupParameter SymbolicExpressionTreeParameter {
get { return (ScopeTreeLookupParameter)Parameters[SymbolicExpressionTreeParameterName]; }
}
public ScopeTreeLookupParameter QualityParameter {
get { return (ScopeTreeLookupParameter)Parameters[QualityParameterName]; }
}
public IValueLookupParameter SymbolicExpressionTreeInterpreterParameter {
get { return (IValueLookupParameter)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
}
public IValueLookupParameter ProblemDataParameter {
get { return (IValueLookupParameter)Parameters[ProblemDataParameterName]; }
}
public IValueLookupParameter TrainingSamplesStartParameter {
get { return (IValueLookupParameter)Parameters[TrainingSamplesStartParameterName]; }
}
public IValueLookupParameter TrainingSamplesEndParameter {
get { return (IValueLookupParameter)Parameters[TrainingSamplesEndParameterName]; }
}
public IValueLookupParameter ValidationSamplesStartParameter {
get { return (IValueLookupParameter)Parameters[ValidationSamplesStartParameterName]; }
}
public IValueLookupParameter ValidationSamplesEndParameter {
get { return (IValueLookupParameter)Parameters[ValidationSamplesEndParameterName]; }
}
public IValueLookupParameter TestSamplesStartParameter {
get { return (IValueLookupParameter)Parameters[TestSamplesStartParameterName]; }
}
public IValueLookupParameter TestSamplesEndParameter {
get { return (IValueLookupParameter)Parameters[TestSamplesEndParameterName]; }
}
public IValueLookupParameter UpperEstimationLimitParameter {
get { return (IValueLookupParameter)Parameters[UpperEstimationLimitParameterName]; }
}
public IValueLookupParameter LowerEstimationLimitParameter {
get { return (IValueLookupParameter)Parameters[LowerEstimationLimitParameterName]; }
}
public ILookupParameter BestSolutionParameter {
get { return (ILookupParameter)Parameters[BestSolutionParameterName]; }
}
public ILookupParameter BestSolutionQualityParameter {
get { return (ILookupParameter)Parameters[BestSolutionQualityParameterName]; }
}
public ILookupParameter ResultsParameter {
get { return (ILookupParameter)Parameters[ResultsParameterName]; }
}
public ILookupParameter BestKnownQualityParameter {
get { return (ILookupParameter)Parameters[BestKnownQualityParameterName]; }
}
[Storable]
private UniformSubScopesProcessor subScopesProcessor;
[Storable]
private SymbolicRegressionSolutionLinearScaler linearScaler;
[Storable]
private SymbolicRegressionModelQualityAnalyzer modelQualityAnalyzer;
[Storable]
private SymbolicRegressionMeanSquaredErrorEvaluator validationMseEvaluator;
[Storable]
private BestSymbolicRegressionSolutionAnalyzer bestSolutionAnalyzer;
[Storable]
private UniformSubScopesProcessor cleaningSubScopesProcessor;
[Storable]
private Assigner removeScaledExpressionTreeAssigner;
[Storable]
private BestQualityMemorizer bestKnownQualityMemorizer;
[Storable]
private BestAverageWorstQualityCalculator bestAvgWorstValidationQualityCalculator;
[Storable]
private DataTableValuesCollector validationValuesCollector;
[Storable]
private ResultsCollector resultsCollector;
[StorableConstructor]
private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(ValidationBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner)
: base(original, cloner) {
Initialize();
}
public ValidationBestScaledSymbolicRegressionSolutionAnalyzer()
: base() {
Parameters.Add(new ScopeTreeLookupParameter(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
Parameters.Add(new ScopeTreeLookupParameter(QualityParameterName, "The quality of the symbolic expression trees to analyze."));
Parameters.Add(new ValueLookupParameter(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
Parameters.Add(new ValueLookupParameter(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
Parameters.Add(new ValueLookupParameter(TrainingSamplesStartParameterName, "The first index of the training partition of the data set."));
Parameters.Add(new ValueLookupParameter(TrainingSamplesEndParameterName, "The last index of the training partition of the data set."));
Parameters.Add(new ValueLookupParameter(ValidationSamplesStartParameterName, "The first index of the validation partition of the data set."));
Parameters.Add(new ValueLookupParameter(ValidationSamplesEndParameterName, "The last index of the validation partition of the data set."));
Parameters.Add(new ValueLookupParameter(TestSamplesStartParameterName, "The first index of the test partition of the data set."));
Parameters.Add(new ValueLookupParameter(TestSamplesEndParameterName, "The last index of the test partition of the data set."));
Parameters.Add(new ValueLookupParameter(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
Parameters.Add(new ValueLookupParameter(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
Parameters.Add(new LookupParameter(BestSolutionParameterName, "The best symbolic regression solution."));
Parameters.Add(new LookupParameter(BestSolutionQualityParameterName, "The quality of the best symbolic regression solution."));
Parameters.Add(new LookupParameter(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
Parameters.Add(new LookupParameter(BestKnownQualityParameterName, "The best known (validation) quality achieved on the data set."));
#region operator initialization
subScopesProcessor = new UniformSubScopesProcessor();
linearScaler = new SymbolicRegressionSolutionLinearScaler();
modelQualityAnalyzer = new SymbolicRegressionModelQualityAnalyzer();
validationMseEvaluator = new SymbolicRegressionMeanSquaredErrorEvaluator();
bestSolutionAnalyzer = new BestSymbolicRegressionSolutionAnalyzer();
cleaningSubScopesProcessor = new UniformSubScopesProcessor();
removeScaledExpressionTreeAssigner = new Assigner();
bestKnownQualityMemorizer = new BestQualityMemorizer();
bestAvgWorstValidationQualityCalculator = new BestAverageWorstQualityCalculator();
validationValuesCollector = new DataTableValuesCollector();
resultsCollector = new ResultsCollector();
#endregion
#region parameter wiring
subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
linearScaler.AlphaParameter.ActualName = AlphaParameterName;
linearScaler.BetaParameter.ActualName = BetaParameterName;
linearScaler.SymbolicExpressionTreeParameter.ActualName = SymbolicExpressionTreeParameter.Name;
linearScaler.ScaledSymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
modelQualityAnalyzer.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
modelQualityAnalyzer.SymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
modelQualityAnalyzer.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
modelQualityAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
modelQualityAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
modelQualityAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
validationMseEvaluator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
validationMseEvaluator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
validationMseEvaluator.SymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
validationMseEvaluator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
validationMseEvaluator.QualityParameter.ActualName = ScaledQualityParameterName;
validationMseEvaluator.RegressionProblemDataParameter.ActualName = ProblemDataParameter.Name;
validationMseEvaluator.SamplesStartParameter.ActualName = ValidationSamplesStartParameter.Name;
validationMseEvaluator.SamplesEndParameter.ActualName = ValidationSamplesEndParameter.Name;
bestSolutionAnalyzer.BestSolutionParameter.ActualName = BestSolutionParameter.Name;
bestSolutionAnalyzer.BestSolutionQualityParameter.ActualName = BestSolutionQualityParameter.Name;
bestSolutionAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
bestSolutionAnalyzer.ProblemDataParameter.ActualName = ProblemDataParameter.Name;
bestSolutionAnalyzer.QualityParameter.ActualName = ScaledQualityParameterName;
bestSolutionAnalyzer.ResultsParameter.ActualName = ResultsParameter.Name;
bestSolutionAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
bestSolutionAnalyzer.SymbolicExpressionTreeParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
bestSolutionAnalyzer.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
bestSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
cleaningSubScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
removeScaledExpressionTreeAssigner.LeftSideParameter.ActualName = ScaledSymbolicExpressionTreeParameterName;
removeScaledExpressionTreeAssigner.RightSideParameter.Value = new SymbolicExpressionTree();
bestAvgWorstValidationQualityCalculator.AverageQualityParameter.ActualName = "Current average validation quality";
bestAvgWorstValidationQualityCalculator.BestQualityParameter.ActualName = CurrentBestValidationQualityParameterName;
bestAvgWorstValidationQualityCalculator.MaximizationParameter.Value = new BoolValue(false);
bestAvgWorstValidationQualityCalculator.QualityParameter.ActualName = ScaledQualityParameterName;
bestAvgWorstValidationQualityCalculator.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
bestAvgWorstValidationQualityCalculator.WorstQualityParameter.ActualName = "Current worst validation quality";
bestKnownQualityMemorizer.BestQualityParameter.ActualName = BestKnownQualityParameterName;
bestKnownQualityMemorizer.MaximizationParameter.Value = new BoolValue(false);
bestKnownQualityMemorizer.QualityParameter.ActualName = QualityParameter.Name;
bestKnownQualityMemorizer.QualityParameter.Depth = QualityParameter.Depth;
validationValuesCollector.DataTableParameter.ActualName = "Validation quality";
validationValuesCollector.CollectedValues.Add(new LookupParameter(CurrentBestValidationQualityParameterName, null, CurrentBestValidationQualityParameterName));
validationValuesCollector.CollectedValues.Add(new LookupParameter(BestSolutionQualityParameter.Name, null, BestSolutionQualityParameter.Name));
resultsCollector.CollectedValues.Add(new LookupParameter(CurrentBestValidationQualityParameterName, null, CurrentBestValidationQualityParameterName));
resultsCollector.CollectedValues.Add(new LookupParameter(BestSolutionQualityParameter.Name, null, BestSolutionQualityParameter.Name));
resultsCollector.CollectedValues.Add(new LookupParameter("Validation quality"));
resultsCollector.ResultsParameter.ActualName = ResultsParameter.Name;
#endregion
#region operator graph
OperatorGraph.InitialOperator = subScopesProcessor;
subScopesProcessor.Operator = linearScaler;
linearScaler.Successor = validationMseEvaluator;
validationMseEvaluator.Successor = null;
subScopesProcessor.Successor = modelQualityAnalyzer;
modelQualityAnalyzer.Successor = bestSolutionAnalyzer;
bestSolutionAnalyzer.Successor = cleaningSubScopesProcessor;
cleaningSubScopesProcessor.Operator = removeScaledExpressionTreeAssigner;
cleaningSubScopesProcessor.Successor = bestAvgWorstValidationQualityCalculator;
bestAvgWorstValidationQualityCalculator.Successor = bestKnownQualityMemorizer;
bestKnownQualityMemorizer.Successor = validationValuesCollector;
validationValuesCollector.Successor = resultsCollector;
resultsCollector.Successor = null;
#endregion
Initialize();
}
public override IDeepCloneable Clone(Cloner cloner) {
return new ValidationBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
}
[StorableHook(HookType.AfterDeserialization)]
private void AfterDeserialization() {
Initialize();
}
private void Initialize() {
SymbolicExpressionTreeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeParameter_DepthChanged);
}
private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
subScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
cleaningSubScopesProcessor.Depth.Value = SymbolicExpressionTreeParameter.Depth;
bestSolutionAnalyzer.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
bestSolutionAnalyzer.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
bestAvgWorstValidationQualityCalculator.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
bestKnownQualityMemorizer.QualityParameter.Depth = SymbolicExpressionTreeParameter.Depth;
modelQualityAnalyzer.SymbolicExpressionTreeParameter.Depth = SymbolicExpressionTreeParameter.Depth;
}
}
}