Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/11/11 15:03:46 (13 years ago)
Author:
gkronber
Message:

Merged changes from trunk to data analysis exploration branch and added fractional distance metric evaluator. #1142

Location:
branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic
Files:
3 added
23 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/BestSymbolicRegressionSolutionAnalyzer.cs

    r4475 r5275  
    2222using System.Linq;
    2323using HeuristicLab.Analysis;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    2526using HeuristicLab.Data;
     
    4041    private const string VariableImpactsResultName = "Integrated variable frequencies";
    4142    private const string BestSolutionParameterName = "BestSolution";
    42     private const string BestSolutionComplexity = "Best solution complexity";
    4343
    4444    #region parameter properties
     
    6868    #endregion
    6969
     70    [StorableConstructor]
     71    private BestSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     72    private BestSymbolicRegressionSolutionAnalyzer(BestSymbolicRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
    7073    public BestSymbolicRegressionSolutionAnalyzer()
    7174      : base() {
     
    7679    }
    7780
     81    public override IDeepCloneable Clone(Cloner cloner) {
     82      return new BestSymbolicRegressionSolutionAnalyzer(this, cloner);
     83    }
     84
    7885    [StorableHook(HookType.AfterDeserialization)]
    79     private void Initialize() {
     86    private void AfterDeserialization() {
    8087      if (!Parameters.ContainsKey(VariableFrequenciesParameterName)) {
    8188        Parameters.Add(new LookupParameter<DataTable>(VariableFrequenciesParameterName, "The variable frequencies table to use for the calculation of variable impacts"));
     
    9299        var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
    93100          SymbolicExpressionTree[i]);
    94         var solution = new SymbolicRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(), model, lowerEstimationLimit, upperEstimationLimit);
     101        DataAnalysisProblemData problemDataClone = (DataAnalysisProblemData)ProblemData.Clone();
     102        var solution = new SymbolicRegressionSolution(problemDataClone, model, lowerEstimationLimit, upperEstimationLimit);
    95103        solution.Name = BestSolutionParameterName;
    96104        solution.Description = "Best solution on validation partition found over the whole run.";
    97105        BestSolutionParameter.ActualValue = solution;
    98106        BestSolutionQualityParameter.ActualValue = Quality[i];
    99         BestSymbolicRegressionSolutionAnalyzer.UpdateSymbolicRegressionBestSolutionResults(solution, ProblemData, Results, VariableFrequencies);
     107        BestSymbolicRegressionSolutionAnalyzer.UpdateSymbolicRegressionBestSolutionResults(solution, problemDataClone, Results, VariableFrequencies);
    100108      }
    101109      return BestSolutionParameter.ActualValue;
    102110    }
    103111
    104     public static void UpdateBestSolutionResults(SymbolicRegressionSolution bestSolution, DataAnalysisProblemData problemData, ResultCollection results, IntValue currentGeneration, DataTable variableFrequencies) {
    105       RegressionSolutionAnalyzer.UpdateBestSolutionResults(bestSolution, problemData, results, currentGeneration);
    106       UpdateSymbolicRegressionBestSolutionResults(bestSolution, problemData, results, variableFrequencies);
     112    public static void UpdateBestSolutionResults(SymbolicRegressionSolution solution, DataAnalysisProblemData problemData, ResultCollection results, IntValue currentGeneration, DataTable variableFrequencies) {
     113      RegressionSolutionAnalyzer.UpdateBestSolutionResults(solution, problemData, results, currentGeneration);
     114      UpdateSymbolicRegressionBestSolutionResults(solution, problemData, results, variableFrequencies);
    107115    }
    108116
    109     private static void UpdateSymbolicRegressionBestSolutionResults(SymbolicRegressionSolution bestSolution, DataAnalysisProblemData problemData, ResultCollection results, DataTable variableFrequencies) {
     117    private static void UpdateSymbolicRegressionBestSolutionResults(SymbolicRegressionSolution solution, DataAnalysisProblemData problemData, ResultCollection results, DataTable variableFrequencies) {
    110118      if (results.ContainsKey(BestSolutionInputvariableCountResultName)) {
    111         results[BestSolutionInputvariableCountResultName].Value = new IntValue(bestSolution.Model.InputVariables.Count());
     119        results[BestSolutionInputvariableCountResultName].Value = new IntValue(solution.Model.InputVariables.Count());
    112120        results[VariableImpactsResultName].Value = CalculateVariableImpacts(variableFrequencies);
    113         var sizeTable = (DataTable)results[BestSolutionComplexity].Value;
    114         sizeTable.Rows["Best solution size"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Size);
    115         sizeTable.Rows["Best solution height"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Height);
    116         sizeTable.Rows["Best solution variables"].Values.Add(bestSolution.Model.InputVariables.Count());
    117121      } else {
    118         results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(bestSolution.Model.InputVariables.Count())));
     122        results.Add(new Result(BestSolutionInputvariableCountResultName, new IntValue(solution.Model.InputVariables.Count())));
    119123        results.Add(new Result(VariableImpactsResultName, CalculateVariableImpacts(variableFrequencies)));
    120         var sizeTable = new DataTable("Best solution complexity");
    121         sizeTable.Rows.Add(new DataRow("Best solution size"));
    122         sizeTable.Rows.Add(new DataRow("Best solution height"));
    123         sizeTable.Rows.Add(new DataRow("Best solution variables"));
    124         sizeTable.Rows["Best solution size"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Size);
    125         sizeTable.Rows["Best solution height"].Values.Add(bestSolution.Model.SymbolicExpressionTree.Height);
    126         sizeTable.Rows["Best solution variables"].Values.Add(bestSolution.Model.InputVariables.Count());
    127         results.Add(new Result(BestSolutionComplexity, sizeTable));
    128124      }
    129125    }
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs

    r4484 r5275  
    2323using System.Linq;
    2424using HeuristicLab.Analysis;
     25using HeuristicLab.Common;
    2526using HeuristicLab.Core;
    2627using HeuristicLab.Data;
     
    3031using HeuristicLab.Parameters;
    3132using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    32 using HeuristicLab.Problems.DataAnalysis.Evaluators;
    3333using HeuristicLab.Problems.DataAnalysis.Symbolic;
    34 using System;
    3534
    3635namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
     
    4039  [Item("FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the validation best scaled symbolic regression solution.")]
    4140  [StorableClass]
    42   public sealed class FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer : SingleSuccessorOperator, ISymbolicRegressionAnalyzer {
    43     private const string RandomParameterName = "Random";
    44     private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
    45     private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
    46     private const string ProblemDataParameterName = "ProblemData";
    47     private const string ValidationSamplesStartParameterName = "SamplesStart";
    48     private const string ValidationSamplesEndParameterName = "SamplesEnd";
    49     // private const string QualityParameterName = "Quality";
    50     private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
    51     private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
    52     private const string EvaluatorParameterName = "Evaluator";
     41  public sealed class FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer : SymbolicRegressionValidationAnalyzer, ISymbolicRegressionAnalyzer {
    5342    private const string MaximizationParameterName = "Maximization";
     43    private const string CalculateSolutionComplexityParameterName = "CalculateSolutionComplexity";
    5444    private const string BestSolutionParameterName = "Best solution (validation)";
    5545    private const string BestSolutionQualityParameterName = "Best solution quality (validation)";
     46    private const string BestSolutionLengthParameterName = "Best solution length (validation)";
     47    private const string BestSolutionHeightParameterName = "Best solution height (validiation)";
    5648    private const string CurrentBestValidationQualityParameterName = "Current best validation quality";
    5749    private const string BestSolutionQualityValuesParameterName = "Validation Quality";
     
    6052    private const string BestKnownQualityParameterName = "BestKnownQuality";
    6153    private const string GenerationsParameterName = "Generations";
    62     private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples";
    63 
    64     private const string TrainingMeanSquaredErrorQualityParameterName = "Mean squared error (training)";
    65     private const string MinTrainingMeanSquaredErrorQualityParameterName = "Min mean squared error (training)";
    66     private const string MaxTrainingMeanSquaredErrorQualityParameterName = "Max mean squared error (training)";
    67     private const string AverageTrainingMeanSquaredErrorQualityParameterName = "Average mean squared error (training)";
    68     private const string BestTrainingMeanSquaredErrorQualityParameterName = "Best mean squared error (training)";
    69 
    70     private const string TrainingAverageRelativeErrorQualityParameterName = "Average relative error (training)";
    71     private const string MinTrainingAverageRelativeErrorQualityParameterName = "Min average relative error (training)";
    72     private const string MaxTrainingAverageRelativeErrorQualityParameterName = "Max average relative error (training)";
    73     private const string AverageTrainingAverageRelativeErrorQualityParameterName = "Average average relative error (training)";
    74     private const string BestTrainingAverageRelativeErrorQualityParameterName = "Best average relative error (training)";
    75 
    76     private const string TrainingRSquaredQualityParameterName = "R² (training)";
    77     private const string MinTrainingRSquaredQualityParameterName = "Min R² (training)";
    78     private const string MaxTrainingRSquaredQualityParameterName = "Max R² (training)";
    79     private const string AverageTrainingRSquaredQualityParameterName = "Average R² (training)";
    80     private const string BestTrainingRSquaredQualityParameterName = "Best R² (training)";
    81 
    82     private const string TestMeanSquaredErrorQualityParameterName = "Mean squared error (test)";
    83     private const string MinTestMeanSquaredErrorQualityParameterName = "Min mean squared error (test)";
    84     private const string MaxTestMeanSquaredErrorQualityParameterName = "Max mean squared error (test)";
    85     private const string AverageTestMeanSquaredErrorQualityParameterName = "Average mean squared error (test)";
    86     private const string BestTestMeanSquaredErrorQualityParameterName = "Best mean squared error (test)";
    87 
    88     private const string TestAverageRelativeErrorQualityParameterName = "Average relative error (test)";
    89     private const string MinTestAverageRelativeErrorQualityParameterName = "Min average relative error (test)";
    90     private const string MaxTestAverageRelativeErrorQualityParameterName = "Max average relative error (test)";
    91     private const string AverageTestAverageRelativeErrorQualityParameterName = "Average average relative error (test)";
    92     private const string BestTestAverageRelativeErrorQualityParameterName = "Best average relative error (test)";
    93 
    94     private const string TestRSquaredQualityParameterName = "R² (test)";
    95     private const string MinTestRSquaredQualityParameterName = "Min R² (test)";
    96     private const string MaxTestRSquaredQualityParameterName = "Max R² (test)";
    97     private const string AverageTestRSquaredQualityParameterName = "Average R² (test)";
    98     private const string BestTestRSquaredQualityParameterName = "Best R² (test)";
    99 
    100     private const string RSquaredValuesParameterName = "R²";
    101     private const string MeanSquaredErrorValuesParameterName = "Mean squared error";
    102     private const string RelativeErrorValuesParameterName = "Average relative error";
    10354
    10455    #region parameter properties
    105     public ILookupParameter<IRandom> RandomParameter {
    106       get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
    107     }
    108     public ScopeTreeLookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
    109       get { return (ScopeTreeLookupParameter<SymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
    110     }
    111     public IValueLookupParameter<ISymbolicExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
    112       get { return (IValueLookupParameter<ISymbolicExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
    113     }
    114     public ILookupParameter<ISymbolicRegressionEvaluator> EvaluatorParameter {
    115       get { return (ILookupParameter<ISymbolicRegressionEvaluator>)Parameters[EvaluatorParameterName]; }
    116     }
    11756    public ILookupParameter<BoolValue> MaximizationParameter {
    11857      get { return (ILookupParameter<BoolValue>)Parameters[MaximizationParameterName]; }
    11958    }
    120     public IValueLookupParameter<DataAnalysisProblemData> ProblemDataParameter {
    121       get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
    122     }
    123     public IValueLookupParameter<IntValue> ValidationSamplesStartParameter {
    124       get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesStartParameterName]; }
    125     }
    126     public IValueLookupParameter<IntValue> ValidationSamplesEndParameter {
    127       get { return (IValueLookupParameter<IntValue>)Parameters[ValidationSamplesEndParameterName]; }
    128     }
    129     public IValueParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter {
    130       get { return (IValueParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; }
    131     }
    132 
    133     public IValueLookupParameter<DoubleValue> UpperEstimationLimitParameter {
    134       get { return (IValueLookupParameter<DoubleValue>)Parameters[UpperEstimationLimitParameterName]; }
    135     }
    136     public IValueLookupParameter<DoubleValue> LowerEstimationLimitParameter {
    137       get { return (IValueLookupParameter<DoubleValue>)Parameters[LowerEstimationLimitParameterName]; }
     59    public IValueParameter<BoolValue> CalculateSolutionComplexityParameter {
     60      get { return (IValueParameter<BoolValue>)Parameters[CalculateSolutionComplexityParameterName]; }
    13861    }
    13962    public ILookupParameter<SymbolicRegressionSolution> BestSolutionParameter {
    14063      get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters[BestSolutionParameterName]; }
    14164    }
    142     public ILookupParameter<SymbolicRegressionSolution> BestTrainingSolutionParameter {
    143       get { return (ILookupParameter<SymbolicRegressionSolution>)Parameters["BestTrainingSolution"]; }
    144     }
    145     public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
    146       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
    147     }
    148     public ScopeTreeLookupParameter<DoubleValue> ValidationQualityParameter {
    149       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["ValidationQuality"]; }
    150     }
    151 
    15265    public ILookupParameter<IntValue> GenerationsParameter {
    15366      get { return (ILookupParameter<IntValue>)Parameters[GenerationsParameterName]; }
     
    15669      get { return (ILookupParameter<DoubleValue>)Parameters[BestSolutionQualityParameterName]; }
    15770    }
    158     public ILookupParameter<DataTable> BestSolutionQualityValuesParameter {
    159       get { return (ILookupParameter<DataTable>)Parameters[BestSolutionQualityValuesParameterName]; }
     71    public ILookupParameter<IntValue> BestSolutionLengthParameter {
     72      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionLengthParameterName]; }
     73    }
     74    public ILookupParameter<IntValue> BestSolutionHeightParameter {
     75      get { return (ILookupParameter<IntValue>)Parameters[BestSolutionHeightParameterName]; }
    16076    }
    16177    public ILookupParameter<ResultCollection> ResultsParameter {
     
    16581      get { return (ILookupParameter<DoubleValue>)Parameters[BestKnownQualityParameterName]; }
    16682    }
    167     public ILookupParameter<DoubleValue> CurrentBestValidationQualityParameter {
    168       get { return (ILookupParameter<DoubleValue>)Parameters[CurrentBestValidationQualityParameterName]; }
    169     }
    170 
    17183    public ILookupParameter<DataTable> VariableFrequenciesParameter {
    17284      get { return (ILookupParameter<DataTable>)Parameters[VariableFrequenciesParameterName]; }
     
    17587    #endregion
    17688    #region properties
    177     public IRandom Random {
    178       get { return RandomParameter.ActualValue; }
    179     }
    180     public ItemArray<SymbolicExpressionTree> SymbolicExpressionTree {
    181       get { return SymbolicExpressionTreeParameter.ActualValue; }
    182     }
    183     public ISymbolicExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
    184       get { return SymbolicExpressionTreeInterpreterParameter.ActualValue; }
    185     }
    186     public ISymbolicRegressionEvaluator Evaluator {
    187       get { return EvaluatorParameter.ActualValue; }
    188     }
    18989    public BoolValue Maximization {
    19090      get { return MaximizationParameter.ActualValue; }
    19191    }
    192     public DataAnalysisProblemData ProblemData {
    193       get { return ProblemDataParameter.ActualValue; }
    194     }
    195     public IntValue ValidationSamplesStart {
    196       get { return ValidationSamplesStartParameter.ActualValue; }
    197     }
    198     public IntValue ValidationSamplesEnd {
    199       get { return ValidationSamplesEndParameter.ActualValue; }
    200     }
    201     public PercentValue RelativeNumberOfEvaluatedSamples {
    202       get { return RelativeNumberOfEvaluatedSamplesParameter.Value; }
    203     }
    204 
    205     public DoubleValue UpperEstimationLimit {
    206       get { return UpperEstimationLimitParameter.ActualValue; }
    207     }
    208     public DoubleValue LowerEstimationLimit {
    209       get { return LowerEstimationLimitParameter.ActualValue; }
     92    public BoolValue CalculateSolutionComplexity {
     93      get { return CalculateSolutionComplexityParameter.Value; }
     94      set { CalculateSolutionComplexityParameter.Value = value; }
    21095    }
    21196    public ResultCollection Results {
     
    221106      get { return BestSolutionQualityParameter.ActualValue; }
    222107    }
     108    public IntValue BestSolutionLength {
     109      get { return BestSolutionLengthParameter.ActualValue; }
     110      set { BestSolutionLengthParameter.ActualValue = value; }
     111    }
     112    public IntValue BestSolutionHeight {
     113      get { return BestSolutionHeightParameter.ActualValue; }
     114      set { BestSolutionHeightParameter.ActualValue = value; }
     115    }
    223116
    224117    #endregion
    225118
     119    [StorableConstructor]
     120    private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     121    private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
    226122    public FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer()
    227123      : base() {
    228       Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use."));
    229       Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set."));
    230       Parameters.Add(new ScopeTreeLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees to analyze."));
    231124      Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
    232       Parameters.Add(new ValueLookupParameter<ISymbolicExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, "The interpreter that should be used for the analysis of symbolic expression trees."));
    233       Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(ProblemDataParameterName, "The problem data for which the symbolic expression tree is a solution."));
    234       Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesStartParameterName, "The first index of the validation partition of the data set."));
    235       Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesEndParameterName, "The last index of the validation partition of the data set."));
    236       Parameters.Add(new ValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index.", new PercentValue(1)));
    237       Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper estimation limit that was set for the evaluation of the symbolic expression trees."));
    238       Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower estimation limit that was set for the evaluation of the symbolic expression trees."));
     125      Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionComplexityParameterName, "Determines if the length and height of the validation best solution should be calculated.", new BoolValue(false)));
    239126      Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestSolutionParameterName, "The best symbolic regression solution."));
    240       Parameters.Add(new LookupParameter<SymbolicRegressionSolution>("BestTrainingSolution"));
    241       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality"));
    242       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ValidationQuality"));
    243127      Parameters.Add(new LookupParameter<IntValue>(GenerationsParameterName, "The number of generations calculated so far."));
    244128      Parameters.Add(new LookupParameter<DoubleValue>(BestSolutionQualityParameterName, "The quality of the best symbolic regression solution."));
     129      Parameters.Add(new LookupParameter<IntValue>(BestSolutionLengthParameterName, "The length of the best symbolic regression solution."));
     130      Parameters.Add(new LookupParameter<IntValue>(BestSolutionHeightParameterName, "The height of the best symbolic regression solution."));
    245131      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection where the best symbolic regression solution should be stored."));
    246132      Parameters.Add(new LookupParameter<DoubleValue>(BestKnownQualityParameterName, "The best known (validation) quality achieved on the data set."));
    247       Parameters.Add(new LookupParameter<DoubleValue>(CurrentBestValidationQualityParameterName, "The quality of the best solution (on the validation set) of the current generation."));
    248       Parameters.Add(new LookupParameter<DataTable>(BestSolutionQualityValuesParameterName));
    249133      Parameters.Add(new LookupParameter<DataTable>(VariableFrequenciesParameterName, "The variable frequencies table to use for the calculation of variable impacts"));
    250134    }
    251135
    252     [StorableConstructor]
    253     private FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     136    public override IDeepCloneable Clone(Cloner cloner) {
     137      return new FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
     138    }
    254139
    255140    [StorableHook(HookType.AfterDeserialization)]
    256141    private void AfterDeserialization() {
    257       #region compatibility remove before releasing 3.3.1
    258       if (!Parameters.ContainsKey(EvaluatorParameterName)) {
    259         Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>(EvaluatorParameterName, "The evaluator which should be used to evaluate the solution on the validation set."));
     142      #region compatibility remove before releasing 3.4
     143      if (!Parameters.ContainsKey("Evaluator")) {
     144        Parameters.Add(new LookupParameter<ISymbolicRegressionEvaluator>("Evaluator", "The evaluator which should be used to evaluate the solution on the validation set."));
    260145      }
    261146      if (!Parameters.ContainsKey(MaximizationParameterName)) {
    262147        Parameters.Add(new LookupParameter<BoolValue>(MaximizationParameterName, "The direction of optimization."));
    263148      }
    264       if (!Parameters.ContainsKey(BestSolutionQualityValuesParameterName)) {
    265         Parameters.Add(new LookupParameter<DataTable>(BestSolutionQualityValuesParameterName));
    266       }
    267       if (!Parameters.ContainsKey("BestTrainingSolution")) {
    268         Parameters.Add(new LookupParameter<SymbolicRegressionSolution>("BestTrainingSolution"));
    269       }
    270       if (!Parameters.ContainsKey("Quality")) {
    271         Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality"));
    272       }
    273       if (!Parameters.ContainsKey("ValidationQuality")) {
    274         Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("ValidationQuality"));
     149      if (!Parameters.ContainsKey(CalculateSolutionComplexityParameterName)) {
     150        Parameters.Add(new ValueParameter<BoolValue>(CalculateSolutionComplexityParameterName, "Determines if the length and height of the validation best solution should be calculated.", new BoolValue(false)));
     151      }
     152      if (!Parameters.ContainsKey(BestSolutionLengthParameterName)) {
     153        Parameters.Add(new LookupParameter<IntValue>(BestSolutionLengthParameterName, "The length of the best symbolic regression solution."));
     154      }
     155      if (!Parameters.ContainsKey(BestSolutionHeightParameterName)) {
     156        Parameters.Add(new LookupParameter<IntValue>(BestSolutionHeightParameterName, "The height of the best symbolic regression solution."));
    275157      }
    276158      #endregion
    277159    }
    278160
    279     public override IOperation Apply() {
    280       ItemArray<SymbolicExpressionTree> trees = SymbolicExpressionTree;
    281       ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
    282 
    283       string targetVariable = ProblemData.TargetVariable.Value;
    284 
    285       // select a random subset of rows in the validation set
    286       int validationStart = ValidationSamplesStart.Value;
    287       int validationEnd = ValidationSamplesEnd.Value;
    288       int seed = Random.Next();
    289       int count = (int)((validationEnd - validationStart) * RelativeNumberOfEvaluatedSamples.Value);
    290       if (count == 0) count = 1;
    291       IEnumerable<int> rows = RandomEnumerable.SampleRandomNumbers(seed, validationStart, validationEnd, count);
    292 
    293       double upperEstimationLimit = UpperEstimationLimit != null ? UpperEstimationLimit.Value : double.PositiveInfinity;
    294       double lowerEstimationLimit = LowerEstimationLimit != null ? LowerEstimationLimit.Value : double.NegativeInfinity;
    295 
     161    protected override void Analyze(SymbolicExpressionTree[] trees, double[] validationQuality) {
    296162      double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity;
    297163      SymbolicExpressionTree bestTree = null;
    298       SymbolicExpressionTree bestTrainingTree = trees[0];
    299       double bestTrainingQuality = qualities[0].Value;
    300       ItemArray<DoubleValue> validationQualites = new ItemArray<DoubleValue>(qualities.Length);
     164
    301165      for (int i = 0; i < trees.Length; i++) {
    302         SymbolicExpressionTree tree = trees[i];
    303         double quality = Evaluator.Evaluate(SymbolicExpressionTreeInterpreter, tree,
    304           lowerEstimationLimit, upperEstimationLimit,
    305           ProblemData.Dataset, targetVariable,
    306          rows);
    307         validationQualites[i] = new DoubleValue(quality);
     166        double quality = validationQuality[i];
    308167        if ((Maximization.Value && quality > bestQuality) ||
    309168            (!Maximization.Value && quality < bestQuality)) {
    310169          bestQuality = quality;
    311           bestTree = tree;
     170          bestTree = trees[i];
    312171        }
    313         if ((Maximization.Value && qualities[i].Value > bestTrainingQuality) ||
    314             (!Maximization.Value && qualities[i].Value < bestTrainingQuality)) {
    315           bestTrainingQuality = qualities[i].Value;
    316           bestTrainingTree = tree;
    317         }
    318       }
    319       ValidationQualityParameter.ActualValue = validationQualites;
    320 
    321       var scaledBestTrainingTree = GetScaledTree(bestTrainingTree);
    322 
    323       SymbolicRegressionSolution bestTrainingSolution = new SymbolicRegressionSolution((DataAnalysisProblemData)ProblemData.Clone(),
    324         new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(), scaledBestTrainingTree),
    325         lowerEstimationLimit, upperEstimationLimit);
    326       bestTrainingSolution.Name = "Best solution (training)";
    327       bestTrainingSolution.Description = "The solution of the population with the highest fitness";
     172      }
    328173
    329174      // if the best validation tree is better than the current best solution => update
     
    333178        (!Maximization.Value && bestQuality < BestSolutionQuality.Value);
    334179      if (newBest) {
    335         var scaledTree = GetScaledTree(bestTree);
     180        double lowerEstimationLimit = LowerEstimationLimit.Value;
     181        double upperEstimationLimit = UpperEstimationLimit.Value;
     182        string targetVariable = ProblemData.TargetVariable.Value;
     183
     184        // calculate scaling parameters and only for the best tree using the full training set
     185        double alpha, beta;
     186        SymbolicRegressionScaledMeanSquaredErrorEvaluator.Calculate(SymbolicExpressionTreeInterpreter, bestTree,
     187          lowerEstimationLimit, upperEstimationLimit,
     188          ProblemData.Dataset, targetVariable,
     189          ProblemData.TrainingIndizes, out beta, out alpha);
     190
     191        // scale tree for solution
     192        var scaledTree = SymbolicRegressionSolutionLinearScaler.Scale(bestTree, alpha, beta);
    336193        var model = new SymbolicRegressionModel((ISymbolicExpressionTreeInterpreter)SymbolicExpressionTreeInterpreter.Clone(),
    337194          scaledTree);
     
    343200        BestSolutionQualityParameter.ActualValue = new DoubleValue(bestQuality);
    344201
     202        if (CalculateSolutionComplexity.Value) {
     203          BestSolutionLength = new IntValue(solution.Model.SymbolicExpressionTree.Size);
     204          BestSolutionHeight = new IntValue(solution.Model.SymbolicExpressionTree.Height);
     205          if (!Results.ContainsKey(BestSolutionLengthParameterName)) {
     206            Results.Add(new Result(BestSolutionLengthParameterName, "Length of the best solution on the validation set", new IntValue()));
     207            Results.Add(new Result(BestSolutionHeightParameterName, "Height of the best solution on the validation set", new IntValue()));
     208          }
     209          Results[BestSolutionLengthParameterName].Value = BestSolutionLength;
     210          Results[BestSolutionHeightParameterName].Value = BestSolutionHeight;
     211        }
     212
    345213        BestSymbolicRegressionSolutionAnalyzer.UpdateBestSolutionResults(solution, ProblemData, Results, Generations, VariableFrequencies);
    346214      }
    347 
    348       CurrentBestValidationQualityParameter.ActualValue = new DoubleValue(bestQuality);
    349215
    350216      if (!Results.ContainsKey(BestSolutionQualityValuesParameterName)) {
     
    352218        Results.Add(new Result(BestSolutionQualityParameterName, new DoubleValue()));
    353219        Results.Add(new Result(CurrentBestValidationQualityParameterName, new DoubleValue()));
    354         Results.Add(new Result("Best solution (training)", bestTrainingSolution));
    355220      }
    356221      Results[BestSolutionQualityParameterName].Value = new DoubleValue(BestSolutionQualityParameter.ActualValue.Value);
    357222      Results[CurrentBestValidationQualityParameterName].Value = new DoubleValue(bestQuality);
    358       Results["Best solution (training)"].Value = bestTrainingSolution;
    359223
    360224      DataTable validationValues = (DataTable)Results[BestSolutionQualityValuesParameterName].Value;
    361225      AddValue(validationValues, BestSolutionQualityParameter.ActualValue.Value, BestSolutionQualityParameterName, BestSolutionQualityParameterName);
    362226      AddValue(validationValues, bestQuality, CurrentBestValidationQualityParameterName, CurrentBestValidationQualityParameterName);
    363 
    364       BestSolutionQualityValuesParameter.ActualValue = validationValues;
    365 
    366       return base.Apply();
    367     }
    368 
    369     private SymbolicExpressionTree GetScaledTree(SymbolicExpressionTree tree) {
    370       // calculate scaling parameters and only for the best tree using the full training set
    371       double alpha, beta;
    372       int trainingStart = ProblemData.TrainingSamplesStart.Value;
    373       int trainingEnd = ProblemData.TrainingSamplesEnd.Value;
    374       IEnumerable<int> trainingRows = Enumerable.Range(trainingStart, trainingEnd - trainingStart);
    375       IEnumerable<double> originalValues = ProblemData.Dataset.GetEnumeratedVariableValues(ProblemData.TargetVariable.Value, trainingRows);
    376       IEnumerable<double> estimatedValues = SymbolicExpressionTreeInterpreter.GetSymbolicExpressionTreeValues(tree, ProblemData.Dataset, trainingRows);
    377 
    378       SymbolicRegressionScaledMeanSquaredErrorEvaluator.CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
    379 
    380       // scale tree for solution
    381       return SymbolicRegressionSolutionLinearScaler.Scale(tree, alpha, beta);
    382     }
    383 
    384     [StorableHook(HookType.AfterDeserialization)]
    385     private void Initialize() { }
     227    }
    386228
    387229    private static void AddValue(DataTable table, double data, string name, string description) {
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityAnalyzer.cs

    r4068 r5275  
    2424using System.Linq;
    2525using HeuristicLab.Analysis;
     26using HeuristicLab.Common;
    2627using HeuristicLab.Core;
    2728using HeuristicLab.Data;
     
    118119    #endregion
    119120
     121    [StorableConstructor]
     122    private SymbolicRegressionModelQualityAnalyzer(bool deserializing) : base(deserializing) { }
     123    private SymbolicRegressionModelQualityAnalyzer(SymbolicRegressionModelQualityAnalyzer original, Cloner cloner) : base(original, cloner) { }
    120124    public SymbolicRegressionModelQualityAnalyzer()
    121125      : base() {
     
    131135    }
    132136
    133     [StorableConstructor]
    134     private SymbolicRegressionModelQualityAnalyzer(bool deserializing) : base() { }
     137    public override IDeepCloneable Clone(Cloner cloner) {
     138      return new SymbolicRegressionModelQualityAnalyzer(this, cloner);
     139    }
    135140
    136141    public override IOperation Apply() {
    137142      Analyze(SymbolicExpressionTreeParameter.ActualValue, SymbolicExpressionTreeInterpreterParameter.ActualValue,
    138143        UpperEstimationLimit.Value, LowerEstimationLimit.Value, ProblemDataParameter.ActualValue,
    139         ProblemDataParameter.ActualValue.TrainingSamplesStart.Value, ProblemDataParameter.ActualValue.TrainingSamplesEnd.Value,
    140         ProblemDataParameter.ActualValue.TestSamplesStart.Value, ProblemDataParameter.ActualValue.TestSamplesEnd.Value,
    141144        ResultsParameter.ActualValue);
    142145      return base.Apply();
     
    145148    public static void Analyze(IEnumerable<SymbolicExpressionTree> trees, ISymbolicExpressionTreeInterpreter interpreter,
    146149      double upperEstimationLimit, double lowerEstimationLimit,
    147       DataAnalysisProblemData problemData, int trainingStart, int trainingEnd, int testStart, int testEnd, ResultCollection results) {
     150      DataAnalysisProblemData problemData, ResultCollection results) {
    148151      int targetVariableIndex = problemData.Dataset.GetVariableIndex(problemData.TargetVariable.Value);
    149       IEnumerable<double> originalTrainingValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, trainingStart, trainingEnd);
    150       IEnumerable<double> originalTestValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, testStart, testEnd);
     152      IEnumerable<double> originalTrainingValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, problemData.TrainingIndizes);
     153      IEnumerable<double> originalTestValues = problemData.Dataset.GetEnumeratedVariableValues(targetVariableIndex, problemData.TestIndizes);
    151154      List<double> trainingMse = new List<double>();
    152155      List<double> trainingR2 = new List<double>();
     
    162165      foreach (var tree in trees) {
    163166        #region training
    164         var estimatedTrainingValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(trainingStart, trainingEnd - trainingStart));
     167        var estimatedTrainingValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, problemData.TrainingIndizes);
    165168        mseEvaluator.Reset();
    166169        r2Evaluator.Reset();
     
    184187        #endregion
    185188        #region test
    186         var estimatedTestValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(testStart, testEnd - testStart));
     189        var estimatedTestValues = interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, problemData.TestIndizes);
    187190
    188191        mseEvaluator.Reset();
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionModelQualityCalculator.cs

    r4068 r5275  
    2020#endregion
    2121
     22using System;
     23using HeuristicLab.Common;
    2224using HeuristicLab.Core;
    2325using HeuristicLab.Data;
     
    3537  [Item("SymbolicRegressionModelQualityCalculator", "An operator to calculate the quality values of a symbolic regression solution symbolic expression tree encoding.")]
    3638  [StorableClass]
     39  [Obsolete("This class should not be used anymore because of performance reasons and will therefore not be updated.")]
    3740  public sealed class SymbolicRegressionModelQualityCalculator : AlgorithmOperator {
    3841    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
     
    8184    #endregion
    8285
     86    [StorableConstructor]
     87    private SymbolicRegressionModelQualityCalculator(bool deserializing) : base(deserializing) { }
     88    private SymbolicRegressionModelQualityCalculator(SymbolicRegressionModelQualityCalculator original, Cloner cloner) : base(original, cloner) { }
    8389    public SymbolicRegressionModelQualityCalculator()
    8490      : base() {
     
    136142
    137143    }
     144    public override IDeepCloneable Clone(Cloner cloner) {
     145      return new SymbolicRegressionModelQualityCalculator(this, cloner);
     146    }
    138147  }
    139148}
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionSolutionLinearScaler.cs

    r4068 r5275  
    2020#endregion
    2121
     22using HeuristicLab.Common;
    2223using HeuristicLab.Core;
    2324using HeuristicLab.Data;
     
    5354    }
    5455
     56    [StorableConstructor]
     57    private SymbolicRegressionSolutionLinearScaler(bool deserializing) : base(deserializing) { }
     58    private SymbolicRegressionSolutionLinearScaler(SymbolicRegressionSolutionLinearScaler original, Cloner cloner) : base(original, cloner) { }
    5559    public SymbolicRegressionSolutionLinearScaler()
    5660      : base() {
     
    5963      Parameters.Add(new LookupParameter<DoubleValue>(AlphaParameterName, "Alpha parameter for linear transformation."));
    6064      Parameters.Add(new LookupParameter<DoubleValue>(BetaParameterName, "Beta parameter for linear transformation."));
     65    }
     66
     67    public override IDeepCloneable Clone(Cloner cloner) {
     68      return new SymbolicRegressionSolutionLinearScaler(this, cloner);
    6169    }
    6270
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionTournamentPruning.cs

    r4350 r5275  
    3333using System;
    3434using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
     35using HeuristicLab.Common;
    3536
    3637namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers {
     
    192193    [StorableConstructor]
    193194    protected SymbolicRegressionTournamentPruning(bool deserializing) : base(deserializing) { }
     195    protected SymbolicRegressionTournamentPruning(SymbolicRegressionTournamentPruning original, Cloner cloner)
     196      : base(original, cloner) {
     197    }
    194198    public SymbolicRegressionTournamentPruning()
    195199      : base() {
     
    218222      Parameters.Add(new ValueLookupParameter<PercentValue>("RelativeNumberOfEvaluatedRows", new PercentValue(1.0)));
    219223      Parameters.Add(new ValueLookupParameter<IntValue>("MinimalTreeSize", new IntValue(15)));
     224    }
     225
     226    public override IDeepCloneable Clone(Cloner cloner) {
     227      return new SymbolicRegressionTournamentPruning(this, cloner);
    220228    }
    221229
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/SymbolicRegressionVariableFrequencyAnalyzer.cs

    r4068 r5275  
    2222using System.Linq;
    2323using HeuristicLab.Analysis;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    2526using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
     
    6061    #endregion
    6162
     63    [StorableConstructor]
     64    private SymbolicRegressionVariableFrequencyAnalyzer(bool deserializing) : base(deserializing) { }
     65    private SymbolicRegressionVariableFrequencyAnalyzer(SymbolicRegressionVariableFrequencyAnalyzer original, Cloner cloner) : base(original, cloner) { }
    6266    public SymbolicRegressionVariableFrequencyAnalyzer()
    6367      : base() {
     
    6872    }
    6973
     74    public override IDeepCloneable Clone(Cloner cloner) {
     75      return new SymbolicRegressionVariableFrequencyAnalyzer(this, cloner);
     76    }
     77
    7078    public override IOperation Apply() {
    7179      ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue;
    7280      DataAnalysisProblemData problemData = ProblemDataParameter.ActualValue;
    73       var inputVariables = problemData.InputVariables.Select(x => x.Value);
     81      var inputVariables = problemData.InputVariables.CheckedItems.Select(x => x.Value.Value);
    7482      ResultCollection results = ResultsParameter.ActualValue;
    7583
    7684      if (VariableFrequencies == null) {
    7785        VariableFrequencies = new DataTable("Variable frequencies", "Relative frequency of variable references aggregated over the whole population.");
     86        VariableFrequencies.VisualProperties.XAxisTitle = "Generation";
     87        VariableFrequencies.VisualProperties.YAxisTitle = "Relative Variable Frequency";
    7888        // add a data row for each input variable
    79         foreach (var inputVariable in inputVariables)
    80           VariableFrequencies.Rows.Add(new DataRow(inputVariable));
     89        foreach (var inputVariable in inputVariables) {
     90          DataRow row = new DataRow(inputVariable);
     91          row.VisualProperties.StartIndexZero = true;
     92          VariableFrequencies.Rows.Add(row);
     93        }
    8194        results.Add(new Result("Variable frequencies", VariableFrequencies));
    8295      }
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Analyzers/ValidationBestScaledSymbolicRegressionSolutionAnalyzer.cs

    r4068 r5275  
    3939  [Item("ValidationBestScaledSymbolicRegressionSolutionAnalyzer", "An operator that analyzes the validation best scaled symbolic regression solution.")]
    4040  [StorableClass]
     41  [Obsolete("This class should not be used anymore because of performance reasons and will therefore not be updated.")]
    4142  public sealed class ValidationBestScaledSymbolicRegressionSolutionAnalyzer : AlgorithmOperator, ISymbolicRegressionAnalyzer {
    4243    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
     
    134135    private ResultsCollector resultsCollector;
    135136
     137    [StorableConstructor]
     138    private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base(deserializing) { }
     139    private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(ValidationBestScaledSymbolicRegressionSolutionAnalyzer original, Cloner cloner)
     140      : base(original, cloner) {
     141      Initialize();
     142    }
    136143    public ValidationBestScaledSymbolicRegressionSolutionAnalyzer()
    137144      : base() {
     
    248255    }
    249256
    250     [StorableConstructor]
    251     private ValidationBestScaledSymbolicRegressionSolutionAnalyzer(bool deserializing) : base() { }
     257    public override IDeepCloneable Clone(Cloner cloner) {
     258      return new ValidationBestScaledSymbolicRegressionSolutionAnalyzer(this, cloner);
     259    }
    252260
    253261    [StorableHook(HookType.AfterDeserialization)]
     262    private void AfterDeserialization() {
     263      Initialize();
     264    }
    254265    private void Initialize() {
    255266      SymbolicExpressionTreeParameter.DepthChanged += new EventHandler(SymbolicExpressionTreeParameter_DepthChanged);
    256267    }
    257268
    258     public override IDeepCloneable Clone(Cloner cloner) {
    259       ValidationBestScaledSymbolicRegressionSolutionAnalyzer clone = (ValidationBestScaledSymbolicRegressionSolutionAnalyzer)base.Clone(cloner);
    260       clone.Initialize();
    261       return clone;
    262     }
    263269
    264270    private void SymbolicExpressionTreeParameter_DepthChanged(object sender, EventArgs e) {
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionEvaluator.cs

    r4244 r5275  
    2020#endregion
    2121
    22 using System;
    2322using System.Collections.Generic;
     23using System.Linq;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    2526using HeuristicLab.Data;
     
    102103    #endregion
    103104
     105    [StorableConstructor]
     106    protected MultiObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
     107    protected MultiObjectiveSymbolicRegressionEvaluator(MultiObjectiveSymbolicRegressionEvaluator original, Cloner cloner) : base(original, cloner) { }
    104108    public MultiObjectiveSymbolicRegressionEvaluator()
    105109      : base() {
     
    114118    }
    115119
    116     [StorableConstructor]
    117     protected MultiObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
    118     [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
    119     private void AfterDeserialization() {
    120     }
    121 
    122120    public override IOperation Apply() {
    123121      int seed = Random.Next();
    124       IEnumerable<int> rows = SingleObjectiveSymbolicRegressionEvaluator.GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value);
     122      IEnumerable<int> rows = SingleObjectiveSymbolicRegressionEvaluator.GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value)
     123         .Where(i => i < RegressionProblemData.TestSamplesStart.Value || RegressionProblemData.TestSamplesEnd.Value <= i);
    125124      double[] qualities = Evaluate(SymbolicExpressionTreeInterpreter, SymbolicExpressionTree, RegressionProblemData.Dataset,
    126125        RegressionProblemData.TargetVariable, rows);
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator.cs

    r4166 r5275  
    2020#endregion
    2121
    22 using System;
    2322using System.Collections.Generic;
     23using HeuristicLab.Common;
    2424using HeuristicLab.Core;
    2525using HeuristicLab.Data;
     
    2727using HeuristicLab.Parameters;
    2828using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    29 using HeuristicLab.Problems.DataAnalysis.Evaluators;
    3029using HeuristicLab.Problems.DataAnalysis.Symbolic;
    3130using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
     
    3433  [Item("MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator", "Calculates the mean squared error and the number of variables of a symbolic regression solution.")]
    3534  [StorableClass]
    36   public class MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
     35  public sealed class MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
    3736    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
    3837    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
     
    5453    }
    5554    #endregion
     55    [StorableConstructor]
     56    private MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     57    private MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator original, Cloner cloner)
     58      : base(original, cloner) {
     59    }
    5660    public MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator()
    5761      : base() {
    5862      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper limit that should be used as cut off value for the output values of symbolic expression trees."));
    5963      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
     64    }
     65
     66    public override IDeepCloneable Clone(Cloner cloner) {
     67      return new MultiObjectiveSymbolicRegressionMeanSquaredErrorEvaluator(this, cloner);
    6068    }
    6169
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator.cs

    r4128 r5275  
    2020#endregion
    2121
    22 using System;
    2322using System.Collections.Generic;
     23using HeuristicLab.Common;
    2424using HeuristicLab.Core;
    2525using HeuristicLab.Data;
     
    2727using HeuristicLab.Parameters;
    2828using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    29 using HeuristicLab.Problems.DataAnalysis.Evaluators;
    3029using HeuristicLab.Problems.DataAnalysis.Symbolic;
    3130using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
     
    3433  [Item("MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator", "Calculates the correlation coefficient r² and the number of variables of a symbolic regression solution.")]
    3534  [StorableClass]
    36   public class MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
     35  public sealed class MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator : MultiObjectiveSymbolicRegressionEvaluator {
    3736    private const string UpperEstimationLimitParameterName = "UpperEstimationLimit";
    3837    private const string LowerEstimationLimitParameterName = "LowerEstimationLimit";
     
    5453    }
    5554    #endregion
     55    [StorableConstructor]
     56    private MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(bool deserializing) : base(deserializing) { }
     57    private MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator original, Cloner cloner)
     58      : base(original, cloner) {
     59    }
    5660    public MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator()
    5761      : base() {
    5862      Parameters.Add(new ValueLookupParameter<DoubleValue>(UpperEstimationLimitParameterName, "The upper limit that should be used as cut off value for the output values of symbolic expression trees."));
    5963      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
     64    }
     65
     66    public override IDeepCloneable Clone(Cloner cloner) {
     67      return new MultiObjectiveSymbolicRegressionPearsonsRSquaredEvaluator(this, cloner);
    6068    }
    6169
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SingleObjectiveSymbolicRegressionEvaluator.cs

    r4244 r5275  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Linq;
     25using HeuristicLab.Common;
    2426using HeuristicLab.Core;
    2527using HeuristicLab.Data;
     
    114116    #endregion
    115117
     118    [StorableConstructor]
     119    protected SingleObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
     120    protected SingleObjectiveSymbolicRegressionEvaluator(SingleObjectiveSymbolicRegressionEvaluator original, Cloner cloner)
     121      : base(original, cloner) {
     122    }
    116123    public SingleObjectiveSymbolicRegressionEvaluator()
    117124      : base() {
     
    128135    }
    129136
    130     [StorableConstructor]
    131     protected SingleObjectiveSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
     137
    132138    [StorableHook(Persistence.Default.CompositeSerializers.Storable.HookType.AfterDeserialization)]
    133139    private void AfterDeserialization() {
     
    140146    public override IOperation Apply() {
    141147      int seed = Random.Next();
    142       IEnumerable<int> rows = GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value);
     148      IEnumerable<int> rows = GenerateRowsToEvaluate(seed, RelativeNumberOfEvaluatedSamples.Value, SamplesStart.Value, SamplesEnd.Value)
     149          .Where(i => i < RegressionProblemData.TestSamplesStart.Value || RegressionProblemData.TestSamplesEnd.Value <= i);
    143150      double quality = Evaluate(SymbolicExpressionTreeInterpreter, SymbolicExpressionTree, LowerEstimationLimit.Value, UpperEstimationLimit.Value,
    144151        RegressionProblemData.Dataset,
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionMeanSquaredErrorEvaluator.cs

    r4195 r5275  
    2222using System;
    2323using System.Collections.Generic;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    25 using HeuristicLab.Data;
    2626using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    27 using HeuristicLab.Parameters;
    2827using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2928using HeuristicLab.Problems.DataAnalysis.Evaluators;
     
    3534  public class SymbolicRegressionMeanSquaredErrorEvaluator : SingleObjectiveSymbolicRegressionEvaluator {
    3635
    37     public SymbolicRegressionMeanSquaredErrorEvaluator()
    38       : base() {
     36    [StorableConstructor]
     37    protected SymbolicRegressionMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     38    protected SymbolicRegressionMeanSquaredErrorEvaluator(SymbolicRegressionMeanSquaredErrorEvaluator original, Cloner cloner)
     39      : base(original, cloner) {
     40    }
     41    public SymbolicRegressionMeanSquaredErrorEvaluator() : base() { }
     42
     43    public override IDeepCloneable Clone(Cloner cloner) {
     44      return new SymbolicRegressionMeanSquaredErrorEvaluator(this, cloner);
    3945    }
    4046
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionPearsonsRSquaredEvaluator.cs

    r4225 r5275  
    2222using System;
    2323using System.Collections.Generic;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    25 using HeuristicLab.Data;
    2626using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    27 using HeuristicLab.Parameters;
    2827using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2928using HeuristicLab.Problems.DataAnalysis.Evaluators;
     
    3433  [StorableClass]
    3534  public class SymbolicRegressionPearsonsRSquaredEvaluator : SingleObjectiveSymbolicRegressionEvaluator {
    36     public SymbolicRegressionPearsonsRSquaredEvaluator()
    37       : base() {
     35    [StorableConstructor]
     36    protected SymbolicRegressionPearsonsRSquaredEvaluator(bool deserializing) : base(deserializing) { }
     37    protected SymbolicRegressionPearsonsRSquaredEvaluator(SymbolicRegressionPearsonsRSquaredEvaluator original, Cloner cloner)
     38      : base(original, cloner) {
    3839    }
     40    public SymbolicRegressionPearsonsRSquaredEvaluator() : base() { }
    3941
     42    public override IDeepCloneable Clone(Cloner cloner) {
     43      return new SymbolicRegressionPearsonsRSquaredEvaluator(this, cloner);
     44    }
    4045    public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
    41       double r2 = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows);
    42       return r2;
     46      double mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows);
     47      return mse;
    4348    }
    4449
     
    5459        double original = originalEnumerator.Current;
    5560        if (double.IsNaN(estimated))
    56           return 0.0;
     61          estimated = upperEstimationLimit;
    5762        else
    5863          estimated = Math.Min(upperEstimationLimit, Math.Max(lowerEstimationLimit, estimated));
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator.cs

    r4555 r5275  
    3434  [Item("SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator", "Calculates the mean and the variance of the squared errors of a linearly scaled symbolic regression solution.")]
    3535  [StorableClass]
    36   public class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
     36  public sealed class SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
    3737    private const string QualityVarianceParameterName = "QualityVariance";
    3838    private const string QualitySamplesParameterName = "QualitySamples";
     
    9090    }
    9191    #endregion
     92    [StorableConstructor]
     93    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     94    private SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { }
    9295    public SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator()
    9396      : base() {
     
    102105    }
    103106
     107    public override IDeepCloneable Clone(Cloner cloner) {
     108      return new SymbolicRegressionScaledMeanAndVarianceSquaredErrorEvaluator(this, cloner);
     109    }
     110
    104111    public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
    105112      double alpha, beta;
     
    108115      double bias, variance, covariance;
    109116      double mse;
    110       if (ApplyScaling.Value) {
    111         mse = Calculate(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
    112         Alpha = new DoubleValue(alpha);
    113         Beta = new DoubleValue(beta);
     117      if (ExecutionContext != null) {
     118        if (ApplyScaling.Value) {
     119          mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     120          Alpha = new DoubleValue(alpha);
     121          Beta = new DoubleValue(beta);
     122        } else {
     123          mse = CalculateWithScaling(interpreter, solution,lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     124        }
     125        QualityVariance = new DoubleValue(varianceSE);
     126        QualitySamples = new IntValue(count);
     127        DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE);
     128        DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE);
     129        DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE);
    114130      } else {
    115         mse = CalculateWithScaling(interpreter, solution, LowerEstimationLimit.Value, UpperEstimationLimit.Value, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
    116       }
    117       QualityVariance = new DoubleValue(varianceSE);
    118       QualitySamples = new IntValue(count);
    119       DecompositionBiasParameter.ActualValue = new DoubleValue(bias / meanSE);
    120       DecompositionVarianceParameter.ActualValue = new DoubleValue(variance / meanSE);
    121       DecompositionCovarianceParameter.ActualValue = new DoubleValue(covariance / meanSE);
     131        if (ApplyScalingParameter.Value != null && ApplyScalingParameter.Value.Value)
     132          mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     133        else
     134          mse = CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, 1, 0, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     135      }
     136
    122137      return mse;
    123138    }
     
    126141      IEnumerable<double> originalValues = dataset.GetEnumeratedVariableValues(targetVariable, rows);
    127142      IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, dataset, rows);
    128       SymbolicRegressionScaledMeanSquaredErrorEvaluator.CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
     143      CalculateScalingParameters(originalValues, estimatedValues, out beta, out alpha);
    129144
    130145      return CalculateWithScaling(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, beta, alpha, out meanSE, out varianceSE, out count, out bias, out variance, out covariance);
     
    174189      }
    175190    }
     191
     192    /// <summary>
     193    /// Calculates linear scaling parameters in one pass.
     194    /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer.
     195    /// http://www.springerlink.com/content/x035121165125175/
     196    /// </summary>
     197    public static void CalculateScalingParameters(IEnumerable<double> original, IEnumerable<double> estimated, out double beta, out double alpha) {
     198      IEnumerator<double> originalEnumerator = original.GetEnumerator();
     199      IEnumerator<double> estimatedEnumerator = estimated.GetEnumerator();
     200      OnlineMeanAndVarianceCalculator yVarianceCalculator = new OnlineMeanAndVarianceCalculator();
     201      OnlineMeanAndVarianceCalculator tMeanCalculator = new OnlineMeanAndVarianceCalculator();
     202      OnlineCovarianceEvaluator ytCovarianceEvaluator = new OnlineCovarianceEvaluator();
     203      int cnt = 0;
     204
     205      while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
     206        double y = estimatedEnumerator.Current;
     207        double t = originalEnumerator.Current;
     208        if (IsValidValue(t) && IsValidValue(y)) {
     209          tMeanCalculator.Add(t);
     210          yVarianceCalculator.Add(y);
     211          ytCovarianceEvaluator.Add(y, t);
     212
     213          cnt++;
     214        }
     215      }
     216
     217      if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())
     218        throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match.");
     219      if (cnt < 2) {
     220        alpha = 0;
     221        beta = 1;
     222      } else {
     223        if (yVarianceCalculator.Variance.IsAlmost(0.0))
     224          beta = 1;
     225        else
     226          beta = ytCovarianceEvaluator.Covariance / yVarianceCalculator.Variance;
     227
     228        alpha = tMeanCalculator.Mean - beta * yVarianceCalculator.Mean;
     229      }
     230    }
     231
     232    private static bool IsValidValue(double d) {
     233      return !double.IsInfinity(d) && !double.IsNaN(d) && d > -1.0E07 && d < 1.0E07;  // don't consider very large or very small values for scaling
     234    }
    176235  }
    177236}
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Evaluators/SymbolicRegressionScaledMeanSquaredErrorEvaluator.cs

    r4555 r5275  
    3434  [Item("SymbolicRegressionScaledMeanSquaredErrorEvaluator", "Calculates the mean squared error of a linearly scaled symbolic regression solution.")]
    3535  [StorableClass]
    36   public class SymbolicRegressionScaledMeanSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
     36  public sealed class SymbolicRegressionScaledMeanSquaredErrorEvaluator : SymbolicRegressionMeanSquaredErrorEvaluator {
    3737
    3838    #region parameter properties
     
    5454    }
    5555    #endregion
     56    [StorableConstructor]
     57    private SymbolicRegressionScaledMeanSquaredErrorEvaluator(bool deserializing) : base(deserializing) { }
     58    private SymbolicRegressionScaledMeanSquaredErrorEvaluator(SymbolicRegressionScaledMeanSquaredErrorEvaluator original, Cloner cloner) : base(original, cloner) { }
    5659    public SymbolicRegressionScaledMeanSquaredErrorEvaluator()
    5760      : base() {
     
    6063    }
    6164
     65    public override IDeepCloneable Clone(Cloner cloner) {
     66      return new SymbolicRegressionScaledMeanSquaredErrorEvaluator(this, cloner);
     67    }
     68
    6269    public override double Evaluate(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, Dataset dataset, string targetVariable, IEnumerable<int> rows) {
    6370      double alpha, beta;
    6471      double mse = Calculate(interpreter, solution, lowerEstimationLimit, upperEstimationLimit, dataset, targetVariable, rows, out beta, out alpha);
    65       AlphaParameter.ActualValue = new DoubleValue(alpha);
    66       BetaParameter.ActualValue = new DoubleValue(beta);
     72      if (ExecutionContext != null) {
     73        AlphaParameter.ActualValue = new DoubleValue(alpha);
     74        BetaParameter.ActualValue = new DoubleValue(beta);
     75      }
    6776      return mse;
    6877    }
     
    100109    }
    101110
     111    /// <summary>
     112    /// Calculates linear scaling parameters in one pass.
     113    /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer.
     114    /// http://www.springerlink.com/content/x035121165125175/
     115    /// </summary>
    102116    public static void CalculateScalingParameters(IEnumerable<double> original, IEnumerable<double> estimated, out double beta, out double alpha) {
    103117      IEnumerator<double> originalEnumerator = original.GetEnumerator();
    104118      IEnumerator<double> estimatedEnumerator = estimated.GetEnumerator();
    105       OnlineLinearScalingCalculator linearScalingCalculator = new OnlineLinearScalingCalculator();
     119      OnlineMeanAndVarianceCalculator yVarianceCalculator = new OnlineMeanAndVarianceCalculator();
     120      OnlineMeanAndVarianceCalculator tMeanCalculator = new OnlineMeanAndVarianceCalculator();
     121      OnlineCovarianceEvaluator ytCovarianceEvaluator = new OnlineCovarianceEvaluator();
     122      int cnt = 0;
    106123
    107124      while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
     
    109126        double t = originalEnumerator.Current;
    110127        if (IsValidValue(t) && IsValidValue(y)) {
    111           linearScalingCalculator.Add(t, y);
     128          tMeanCalculator.Add(t);
     129          yVarianceCalculator.Add(y);
     130          ytCovarianceEvaluator.Add(y, t);
     131
     132          cnt++;
    112133        }
    113134      }
     
    115136      if (estimatedEnumerator.MoveNext() || originalEnumerator.MoveNext())
    116137        throw new ArgumentException("Number of elements in original and estimated enumeration doesn't match.");
    117       else {
    118         beta = linearScalingCalculator.Beta;
    119         alpha = linearScalingCalculator.Alpha;
     138      if (cnt < 2) {
     139        alpha = 0;
     140        beta = 1;
     141      } else {
     142        if (yVarianceCalculator.PopulationVariance.IsAlmost(0.0))
     143          beta = 1;
     144        else
     145          beta = ytCovarianceEvaluator.Covariance / yVarianceCalculator.PopulationVariance;
     146
     147        alpha = tMeanCalculator.Mean - beta * yVarianceCalculator.Mean;
    120148      }
    121149    }
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/Interfaces/ISymbolicRegressionEvaluator.cs

    r4195 r5275  
    2020#endregion
    2121
     22using System.Collections.Generic;
    2223using HeuristicLab.Core;
    2324using HeuristicLab.Data;
     
    2526using HeuristicLab.Optimization;
    2627using HeuristicLab.Problems.DataAnalysis.Symbolic;
    27 using System.Collections.Generic;
    2828
    2929namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/MultiObjectiveSymbolicRegressionProblem.cs

    r4166 r5275  
    2121
    2222using System;
    23 using System.Collections.Generic;
    24 using System.Linq;
    2523using HeuristicLab.Common;
    2624using HeuristicLab.Core;
    2725using HeuristicLab.Data;
    28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    29 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Analyzers;
    30 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators;
    31 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Interfaces;
    3226using HeuristicLab.Optimization;
    3327using HeuristicLab.Parameters;
    3428using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    35 using HeuristicLab.PluginInfrastructure;
    36 using HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Analyzers;
    37 using HeuristicLab.Problems.DataAnalysis.Symbolic;
    3829
    3930namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
     
    7162    #endregion
    7263
    73 
    7464    [StorableConstructor]
    7565    protected MultiObjectiveSymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
     66    protected MultiObjectiveSymbolicRegressionProblem(MultiObjectiveSymbolicRegressionProblem original, Cloner cloner)
     67      : base(original, cloner) {
     68      RegisterParameterEvents();
     69      RegisterParameterValueEvents();
     70    }
    7671    public MultiObjectiveSymbolicRegressionProblem()
    7772      : base() {
     
    8984
    9085    public override IDeepCloneable Clone(Cloner cloner) {
    91       MultiObjectiveSymbolicRegressionProblem clone = (MultiObjectiveSymbolicRegressionProblem)base.Clone(cloner);
    92       clone.RegisterParameterEvents();
    93       clone.RegisterParameterValueEvents();
    94       return clone;
     86      return new MultiObjectiveSymbolicRegressionProblem(this, cloner);
    9587    }
    9688
     
    112104    }
    113105
    114     protected virtual void OnEvaluatorChanged(EventArgs e) {
     106    protected override void OnEvaluatorChanged(EventArgs e) {
     107      base.OnEvaluatorChanged(e);
    115108      ParameterizeEvaluator();
    116109      RaiseEvaluatorChanged(e);
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SimpleSymbolicRegressionEvaluator.cs

    r4068 r5275  
    2222using System;
    2323using System.Linq;
     24using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    2526using HeuristicLab.Data;
     
    3334  [Item("SimpleSymbolicRegressionEvaluator", "Evaluates a symbolic regression solution and outputs a matrix of target and estimated values.")]
    3435  [StorableClass]
    35   public class SimpleSymbolicRegressionEvaluator : SingleSuccessorOperator {
     36  public sealed class SimpleSymbolicRegressionEvaluator : SingleSuccessorOperator {
    3637    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
    3738    private const string FunctionTreeParameterName = "FunctionTree";
     
    100101    #endregion
    101102
     103    [StorableConstructor]
     104    private SimpleSymbolicRegressionEvaluator(bool deserializing) : base(deserializing) { }
     105    private SimpleSymbolicRegressionEvaluator(SimpleSymbolicRegressionEvaluator original, Cloner cloner) : base(original, cloner) { }
    102106    public SimpleSymbolicRegressionEvaluator()
    103107      : base() {
     
    110114      Parameters.Add(new ValueLookupParameter<DoubleValue>(LowerEstimationLimitParameterName, "The lower limit that should be used as cut off value for the output values of symbolic expression trees."));
    111115      Parameters.Add(new LookupParameter<DoubleMatrix>(ValuesParameterName, "The matrix of target and estimated values as generated by the symbolic regression solution."));
     116    }
     117
     118    public override IDeepCloneable Clone(Cloner cloner) {
     119      return new SimpleSymbolicRegressionEvaluator(this, cloner);
    112120    }
    113121
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionModel.cs

    r4068 r5275  
    3232  [StorableClass]
    3333  [Item("SymbolicRegressionModel", "A symbolic regression model represents an entity that provides estimated values based on input values.")]
    34   public class SymbolicRegressionModel : NamedItem, IDataAnalysisModel {
    35     private SymbolicRegressionModel() : base() { } // for cloning
     34  public sealed class SymbolicRegressionModel : NamedItem, IDataAnalysisModel {
    3635    [StorableConstructor]
    37     protected SymbolicRegressionModel(bool deserializing)
    38       : base(deserializing) {
     36    private SymbolicRegressionModel(bool deserializing) : base(deserializing) { }
     37    private SymbolicRegressionModel(SymbolicRegressionModel original, Cloner cloner)
     38      : base(original, cloner) {
     39      tree = (SymbolicExpressionTree)cloner.Clone(original.tree);
     40      interpreter = (ISymbolicExpressionTreeInterpreter)cloner.Clone(original.interpreter);
     41      inputVariables = new List<string>(original.inputVariables);
    3942    }
     43
    4044    public SymbolicRegressionModel(ISymbolicExpressionTreeInterpreter interpreter, SymbolicExpressionTree tree)
    4145      : base() {
     
    4347      this.interpreter = interpreter;
    4448      this.inputVariables = tree.IterateNodesPrefix().OfType<VariableTreeNode>().Select(var => var.VariableName).Distinct().ToList();
     49    }
     50
     51    public override IDeepCloneable Clone(Cloner cloner) {
     52      return new SymbolicRegressionModel(this, cloner);
     53    }
     54
     55    [StorableHook(HookType.AfterDeserialization)]
     56    private void AfterDeserialization() {
     57      if (inputVariables == null)
     58        this.inputVariables = tree.IterateNodesPrefix().OfType<VariableTreeNode>().Select(var => var.VariableName).Distinct().ToList();
    4559    }
    4660
     
    6276
    6377    public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, int start, int end) {
    64       return interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, Enumerable.Range(start, end - start));
     78      return GetEstimatedValues(problemData, Enumerable.Range(start, end - start));
    6579    }
    66 
    67     public override IDeepCloneable Clone(Cloner cloner) {
    68       var clone = (SymbolicRegressionModel)base.Clone(cloner);
    69       clone.tree = (SymbolicExpressionTree)cloner.Clone(tree);
    70       clone.interpreter = (ISymbolicExpressionTreeInterpreter)cloner.Clone(interpreter);
    71       clone.inputVariables = new List<string>(inputVariables);
    72       return clone;
     80    public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, IEnumerable<int> rows) {
     81      return interpreter.GetSymbolicExpressionTreeValues(tree, problemData.Dataset, rows);
    7382    }
    7483  }
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblem.cs

    r4341 r5275  
    3434  [Creatable("Problems")]
    3535  [StorableClass]
    36   public class SymbolicRegressionProblem : SymbolicRegressionProblemBase, ISingleObjectiveProblem {
     36  public sealed class SymbolicRegressionProblem : SymbolicRegressionProblemBase, ISingleObjectiveDataAnalysisProblem {
    3737
    3838    #region Parameter Properties
     
    7474
    7575    [StorableConstructor]
    76     protected SymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
     76    private SymbolicRegressionProblem(bool deserializing) : base(deserializing) { }
     77    private SymbolicRegressionProblem(SymbolicRegressionProblem original, Cloner cloner)
     78      : base(original, cloner) {
     79      RegisterParameterEvents();
     80      RegisterParameterValueEvents();
     81    }
     82
    7783    public SymbolicRegressionProblem()
    7884      : base() {
     
    8187      Parameters.Add(new ValueParameter<ISymbolicRegressionEvaluator>("Evaluator", "The operator which should be used to evaluate symbolic regression solutions.", evaluator));
    8288      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The minimal error value that reached by symbolic regression solutions for the problem."));
    83 
    84       evaluator.QualityParameter.ActualName = "TrainingPearsonR2";
    8589
    8690      InitializeOperators();
     
    9296
    9397    public override IDeepCloneable Clone(Cloner cloner) {
    94       SymbolicRegressionProblem clone = (SymbolicRegressionProblem)base.Clone(cloner);
    95       clone.RegisterParameterEvents();
    96       clone.RegisterParameterValueEvents();
    97       return clone;
     98      return new SymbolicRegressionProblem(this, cloner);
    9899    }
    99100
     
    146147    private void InitializeOperators() {
    147148      AddOperator(new FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer());
     149      AddOperator(new SymbolicRegressionOverfittingAnalyzer());
    148150      ParameterizeAnalyzers();
    149151    }
     
    159161      foreach (var analyzer in Analyzers) {
    160162        analyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
     163        var validationSolutionAnalyzer = analyzer as SymbolicRegressionValidationAnalyzer;
     164        if (validationSolutionAnalyzer != null) {
     165          validationSolutionAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
     166          validationSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
     167          validationSolutionAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
     168          validationSolutionAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
     169          validationSolutionAnalyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
     170          validationSolutionAnalyzer.ValidationSamplesStartParameter.Value = ValidationSamplesStart;
     171          validationSolutionAnalyzer.ValidationSamplesEndParameter.Value = ValidationSamplesEnd;
     172        }
     173
    161174        var fixedBestValidationSolutionAnalyzer = analyzer as FixedValidationBestScaledSymbolicRegressionSolutionAnalyzer;
    162175        if (fixedBestValidationSolutionAnalyzer != null) {
    163           fixedBestValidationSolutionAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
    164           fixedBestValidationSolutionAnalyzer.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
    165           fixedBestValidationSolutionAnalyzer.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
    166           fixedBestValidationSolutionAnalyzer.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
    167           fixedBestValidationSolutionAnalyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    168           fixedBestValidationSolutionAnalyzer.ValidationSamplesStartParameter.Value = ValidationSamplesStart;
    169           fixedBestValidationSolutionAnalyzer.ValidationSamplesEndParameter.Value = ValidationSamplesEnd;
    170176          fixedBestValidationSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
    171177        }
     178
    172179        var bestValidationSolutionAnalyzer = analyzer as ValidationBestScaledSymbolicRegressionSolutionAnalyzer;
    173180        if (bestValidationSolutionAnalyzer != null) {
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionProblemBase.cs

    r4341 r5275  
    125125    }
    126126    public IntValue TrainingSamplesStart {
    127       get { return new IntValue(DataAnalysisProblemData.TrainingSamplesStart.Value); }
     127      get { return new IntValue(DataAnalysisProblemData.TrainingIndizes.First()); }
    128128    }
    129129    public IntValue TrainingSamplesEnd {
    130130      get {
    131         return new IntValue((DataAnalysisProblemData.TrainingSamplesStart.Value +
    132           DataAnalysisProblemData.TrainingSamplesEnd.Value) / 2);
     131        int endIndex = (int)(DataAnalysisProblemData.TrainingIndizes.Count() * (1.0 - DataAnalysisProblemData.ValidationPercentage.Value) - 1);
     132        if (endIndex < 0) endIndex = 0;
     133        return new IntValue(DataAnalysisProblemData.TrainingIndizes.ElementAt(endIndex));
    133134      }
    134135    }
     
    137138    }
    138139    public IntValue ValidationSamplesEnd {
    139       get { return new IntValue(DataAnalysisProblemData.TrainingSamplesEnd.Value); }
     140      get { return new IntValue(DataAnalysisProblemData.TrainingIndizes.Last() + 1); }
    140141    }
    141142    public IntValue TestSamplesStart {
     
    152153    [StorableConstructor]
    153154    protected SymbolicRegressionProblemBase(bool deserializing) : base(deserializing) { }
     155    protected SymbolicRegressionProblemBase(SymbolicRegressionProblemBase original, Cloner cloner)
     156      : base(original, cloner) {
     157      operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
     158      RegisterParameterValueEvents();
     159      RegisterParameterEvents();
     160    }
    154161    public SymbolicRegressionProblemBase()
    155162      : base() {
     
    164171      Parameters.Add(new ValueParameter<ISymbolicExpressionGrammar>("FunctionTreeGrammar", "The grammar that should be used for symbolic regression models.", globalGrammar));
    165172      Parameters.Add(new ValueParameter<IntValue>("MaxExpressionLength", "Maximal length of the symbolic expression.", new IntValue(100)));
    166       Parameters.Add(new ValueParameter<IntValue>("MaxExpressionDepth", "Maximal depth of the symbolic expression.", new IntValue(10)));
     173      Parameters.Add(new ValueParameter<IntValue>("MaxExpressionDepth", "Maximal depth of the symbolic expression. The minimum depth needed for the algorithm is 3 because two levels are reserved for the ProgramRoot and the Start symbol.", new IntValue(10)));
    167174      Parameters.Add(new ValueParameter<IntValue>("MaxFunctionDefiningBranches", "Maximal number of automatically defined functions.", (IntValue)new IntValue(0).AsReadOnly()));
    168175      Parameters.Add(new ValueParameter<IntValue>("MaxFunctionArguments", "Maximal number of arguments of automatically defined functions.", (IntValue)new IntValue(0).AsReadOnly()));
    169 
    170       creator.SymbolicExpressionTreeParameter.ActualName = "SymbolicRegressionModel";
    171176
    172177      ParameterizeSolutionCreator();
     
    175180      UpdateEstimationLimits();
    176181      InitializeOperators();
     182      RegisterParameterValueEvents();
    177183      RegisterParameterEvents();
    178       RegisterParameterValueEvents();
    179     }
    180 
    181     public override IDeepCloneable Clone(Cloner cloner) {
    182       SymbolicRegressionProblemBase clone = (SymbolicRegressionProblemBase)base.Clone(cloner);
    183       clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
    184       clone.RegisterParameterEvents();
    185       clone.RegisterParameterValueEvents();
    186       return clone;
    187     }
    188 
    189     private void RegisterParameterValueEvents() {
     184    }
     185
     186    private void RegisterParameterEvents() {
    190187      MaxFunctionArgumentsParameter.ValueChanged += new EventHandler(ArchitectureParameter_ValueChanged);
    191188      MaxFunctionDefiningBranchesParameter.ValueChanged += new EventHandler(ArchitectureParameter_ValueChanged);
     189      MaxExpressionDepthParameter.ValueChanged += new EventHandler(MaxExpressionDepthParameter_ValueChanged);
    192190      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
    193191      FunctionTreeGrammarParameter.ValueChanged += new EventHandler(FunctionTreeGrammarParameter_ValueChanged);
    194     }
    195 
    196     private void RegisterParameterEvents() {
     192      SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);
     193    }
     194
     195    private void RegisterParameterValueEvents() {
    197196      MaxFunctionArgumentsParameter.Value.ValueChanged += new EventHandler(ArchitectureParameterValue_ValueChanged);
    198197      MaxFunctionDefiningBranchesParameter.Value.ValueChanged += new EventHandler(ArchitectureParameterValue_ValueChanged);
    199       SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);
     198      MaxExpressionDepthParameter.Value.ValueChanged += new EventHandler(MaxExpressionDepthParameterValue_ValueChanged);
    200199    }
    201200
     
    253252      OnArchitectureParameterChanged(e);
    254253    }
     254
     255    private void MaxExpressionDepthParameter_ValueChanged(object sender, EventArgs e) {
     256      MaxExpressionDepthParameterValue_ValueChanged(sender, e);
     257      MaxExpressionDepthParameter.Value.ValueChanged += MaxExpressionDepthParameterValue_ValueChanged;
     258    }
     259    private void MaxExpressionDepthParameterValue_ValueChanged(object sender, EventArgs e) {
     260      if (MaxExpressionDepth != null && MaxExpressionDepth.Value < 3)
     261        MaxExpressionDepth.Value = 3;
     262    }
    255263    #endregion
    256264
     
    262270      if (operators == null) InitializeOperators();
    263271      #endregion
     272      RegisterParameterValueEvents();
    264273      RegisterParameterEvents();
    265       RegisterParameterValueEvents();
    266274    }
    267275
     
    325333          varFreqAnalyzer.ProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
    326334        }
    327         var pruningOperator = analyzer as SymbolicRegressionTournamentPruning;
    328         if (pruningOperator != null) {
    329           pruningOperator.SamplesStartParameter.Value = TrainingSamplesStart;
    330           pruningOperator.SamplesEndParameter.Value = TrainingSamplesEnd;
    331           pruningOperator.DataAnalysisProblemDataParameter.ActualName = DataAnalysisProblemDataParameter.Name;
    332           pruningOperator.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    333           pruningOperator.SymbolicExpressionTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
    334           pruningOperator.LowerEstimationLimitParameter.ActualName = LowerEstimationLimitParameter.Name;
    335           pruningOperator.UpperEstimationLimitParameter.ActualName = UpperEstimationLimitParameter.Name;
    336         }
    337335      }
    338336      foreach (ISymbolicExpressionTreeAnalyzer analyzer in Operators.OfType<ISymbolicExpressionTreeAnalyzer>()) {
  • branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SymbolicRegressionSolution.cs

    r5010 r5275  
    2424using System.Drawing;
    2525using System.Linq;
     26using HeuristicLab.Common;
    2627using HeuristicLab.Core;
    2728using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3435  [Item("SymbolicRegressionSolution", "Represents a solution for a symbolic regression problem which can be visualized in the GUI.")]
    3536  [StorableClass]
    36   public sealed class SymbolicRegressionSolution : DataAnalysisSolution {
    37     public SymbolicRegressionSolution() : base() { } // for cloning
    38     [StorableConstructor]
    39     public SymbolicRegressionSolution(bool deserializing) : base(deserializing) { }
    40     public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
    41       : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
    42       this.Model = model;
    43     }
    44 
     37  public class SymbolicRegressionSolution : DataAnalysisSolution {
    4538    public override Image ItemImage {
    4639      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Function; }
     
    5043      get { return (SymbolicRegressionModel)base.Model; }
    5144      set { base.Model = value; }
     45    }
     46
     47    protected List<double> estimatedValues;
     48    public override IEnumerable<double> EstimatedValues {
     49      get {
     50        if (estimatedValues == null) RecalculateEstimatedValues();
     51        return estimatedValues;
     52      }
     53    }
     54
     55    public override IEnumerable<double> EstimatedTrainingValues {
     56      get { return GetEstimatedValues(ProblemData.TrainingIndizes); }
     57    }
     58
     59    public override IEnumerable<double> EstimatedTestValues {
     60      get { return GetEstimatedValues(ProblemData.TestIndizes); }
     61    }
     62
     63    [StorableConstructor]
     64    protected SymbolicRegressionSolution(bool deserializing) : base(deserializing) { }
     65    protected SymbolicRegressionSolution(SymbolicRegressionSolution original, Cloner cloner)
     66      : base(original, cloner) {
     67    }
     68    public SymbolicRegressionSolution(DataAnalysisProblemData problemData, SymbolicRegressionModel model, double lowerEstimationLimit, double upperEstimationLimit)
     69      : base(problemData, lowerEstimationLimit, upperEstimationLimit) {
     70      this.Model = model;
     71    }
     72
     73    public override IDeepCloneable Clone(Cloner cloner) {
     74      return new SymbolicRegressionSolution(this, cloner);
    5275    }
    5376
     
    6588    }
    6689
    67     private List<double> estimatedValues;
    68     public override IEnumerable<double> EstimatedValues {
    69       get {
    70         if (estimatedValues == null) RecalculateEstimatedValues();
    71         return estimatedValues.AsEnumerable();
    72       }
    73     }
    74 
    75     public override IEnumerable<double> EstimatedTrainingValues {
    76       get {
    77         if (estimatedValues == null) RecalculateEstimatedValues();
    78         int start = ProblemData.TrainingSamplesStart.Value;
    79         int n = ProblemData.TrainingSamplesEnd.Value - start;
    80         return estimatedValues.Skip(start).Take(n).ToList();
    81       }
    82     }
    83 
    84     public override IEnumerable<double> EstimatedTestValues {
    85       get {
    86         if (estimatedValues == null) RecalculateEstimatedValues();
    87         int start = ProblemData.TestSamplesStart.Value;
    88         int n = ProblemData.TestSamplesEnd.Value - start;
    89         return estimatedValues.Skip(start).Take(n).ToList();
    90       }
     90    public virtual IEnumerable<double> GetEstimatedValues(IEnumerable<int> rows) {
     91      if (estimatedValues == null) RecalculateEstimatedValues();
     92      foreach (int row in rows)
     93        yield return estimatedValues[row];
    9194    }
    9295  }
Note: See TracChangeset for help on using the changeset viewer.