#region License Information /* HeuristicLab * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using HeuristicLab.Core; using HeuristicLab.DataAnalysis; using HeuristicLab.GP.Interfaces; using HeuristicLab.Operators; using HeuristicLab.Modeling; using HeuristicLab.Logging; using HeuristicLab.Selection; using HeuristicLab.Data; namespace HeuristicLab.GP.StructureIdentification { public static class DefaultStructureIdentificationAlgorithmOperators { public static IOperator CreateFunctionLibraryInjector() { CombinedOperator op = new CombinedOperator(); op.Name = "FunctionLibraryInjector"; SequentialProcessor seq = new SequentialProcessor(); seq.AddSubOperator(new FunctionLibraryInjector()); seq.AddSubOperator(new HL3TreeEvaluatorInjector()); op.OperatorGraph.AddOperator(seq); op.OperatorGraph.InitialOperator = seq; return op; } public static IOperator CreateProblemInjector() { CombinedOperator op = new CombinedOperator(); op.Name = "ProblemInjector"; SequentialProcessor seq = new SequentialProcessor(); seq.AddSubOperator(new ProblemInjector()); DatasetShuffler shuffler = new DatasetShuffler(); shuffler.GetVariableInfo("ShuffleStart").ActualName = "TrainingSamplesStart"; shuffler.GetVariableInfo("ShuffleEnd").ActualName = "TrainingSamplesEnd"; seq.AddSubOperator(shuffler); op.OperatorGraph.AddOperator(seq); op.OperatorGraph.InitialOperator = seq; return op; } public static IOperator CreateInitialPopulationEvaluator() { MeanSquaredErrorEvaluator eval = new MeanSquaredErrorEvaluator(); eval.Name = "Evaluator"; eval.GetVariableInfo("MSE").ActualName = "Quality"; eval.GetVariableInfo("SamplesStart").ActualName = "ActualTrainingSamplesStart"; eval.GetVariableInfo("SamplesEnd").ActualName = "ActualTrainingSamplesEnd"; return eval; } public static IOperator CreateEvaluator() { return CreateInitialPopulationEvaluator(); } public static IOperator CreateGenerationStepHook() { CombinedOperator op = new CombinedOperator(); SequentialProcessor seq = new SequentialProcessor(); UniformSequentialSubScopesProcessor subScopesProc = new UniformSequentialSubScopesProcessor(); SequentialProcessor individualProc = new SequentialProcessor(); MeanSquaredErrorEvaluator validationEvaluator = new MeanSquaredErrorEvaluator(); validationEvaluator.Name = "ValidationEvaluator"; validationEvaluator.GetVariableInfo("MSE").ActualName = "ValidationQuality"; validationEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart"; validationEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd"; individualProc.AddSubOperator(validationEvaluator); BestSolutionStorer solutionStorer = new BestSolutionStorer(); solutionStorer.GetVariableInfo("BestSolution").ActualName = "BestValidationSolution"; solutionStorer.GetVariableInfo("Quality").ActualName = "ValidationQuality"; BestAverageWorstQualityCalculator validationQualityCalculator = new BestAverageWorstQualityCalculator(); validationQualityCalculator.Name = "BestAverageWorstValidationQualityCalculator"; validationQualityCalculator.GetVariableInfo("Quality").ActualName = "ValidationQuality"; validationQualityCalculator.GetVariableInfo("BestQuality").ActualName = "BestValidationQuality"; validationQualityCalculator.GetVariableInfo("AverageQuality").ActualName = "AverageValidationQuality"; validationQualityCalculator.GetVariableInfo("WorstQuality").ActualName = "WorstValidationQuality"; subScopesProc.AddSubOperator(individualProc); seq.AddSubOperator(subScopesProc); seq.AddSubOperator(solutionStorer); seq.AddSubOperator(validationQualityCalculator); op.OperatorGraph.AddOperator(seq); op.OperatorGraph.InitialOperator = seq; return op; } public static IOperator CreatePostProcessingOperator() { CombinedOperator op = new CombinedOperator(); op.Name = "ModelAnalyser"; SequentialProcessor seq = new SequentialProcessor(); LeftReducer cleanUp = new LeftReducer(); cleanUp.Name = "Reset Population"; seq.AddSubOperator(cleanUp); SolutionExtractor extractor = new SolutionExtractor(); extractor.GetVariableInfo("Scope").ActualName = "BestValidationSolution"; SequentialSubScopesProcessor seqSubScopeProc = new SequentialSubScopesProcessor(); SequentialProcessor solutionProc = new SequentialProcessor(); seq.AddSubOperator(extractor); seq.AddSubOperator(seqSubScopeProc); seqSubScopeProc.AddSubOperator(solutionProc); HL3TreeEvaluatorInjector evaluatorInjector = new HL3TreeEvaluatorInjector(); evaluatorInjector.AddVariable(new HeuristicLab.Core.Variable("PunishmentFactor", new DoubleData(1000.0))); evaluatorInjector.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator"; #region simple evaluators SimpleEvaluator trainingEvaluator = new SimpleEvaluator(); trainingEvaluator.Name = "TrainingEvaluator"; trainingEvaluator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart"; trainingEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd"; trainingEvaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; trainingEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator"; SimpleEvaluator validationEvaluator = new SimpleEvaluator(); validationEvaluator.Name = "ValidationEvaluator"; validationEvaluator.GetVariableInfo("SamplesStart").ActualName = "ValidationSamplesStart"; validationEvaluator.GetVariableInfo("SamplesEnd").ActualName = "ValidationSamplesEnd"; validationEvaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; validationEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator"; SimpleEvaluator testEvaluator = new SimpleEvaluator(); testEvaluator.Name = "TestEvaluator"; testEvaluator.GetVariableInfo("SamplesStart").ActualName = "TestSamplesStart"; testEvaluator.GetVariableInfo("SamplesEnd").ActualName = "TestSamplesEnd"; testEvaluator.GetVariableInfo("Values").ActualName = "TestValues"; testEvaluator.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator"; #endregion #region MSE SimpleMSEEvaluator trainingMseEvaluator = new SimpleMSEEvaluator(); trainingMseEvaluator.Name = "TrainingMseEvaluator"; trainingMseEvaluator.GetVariableInfo("MSE").ActualName = "TrainingMSE"; trainingMseEvaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; SimpleMSEEvaluator validationMseEvaluator = new SimpleMSEEvaluator(); validationMseEvaluator.Name = "ValidationMseEvaluator"; validationMseEvaluator.GetVariableInfo("MSE").ActualName = "ValidationMSE"; validationMseEvaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; SimpleMSEEvaluator testMseEvaluator = new SimpleMSEEvaluator(); testMseEvaluator.Name = "TestMseEvaluator"; testMseEvaluator.GetVariableInfo("MSE").ActualName = "TestMSE"; testMseEvaluator.GetVariableInfo("Values").ActualName = "TestValues"; #endregion #region MAPE SimpleMeanAbsolutePercentageErrorEvaluator trainingMapeEvaluator = new SimpleMeanAbsolutePercentageErrorEvaluator(); trainingMapeEvaluator.Name = "TrainingMapeEvaluator"; trainingMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TrainingMAPE"; trainingMapeEvaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; SimpleMeanAbsolutePercentageErrorEvaluator validationMapeEvaluator = new SimpleMeanAbsolutePercentageErrorEvaluator(); validationMapeEvaluator.Name = "ValidationMapeEvaluator"; validationMapeEvaluator.GetVariableInfo("MAPE").ActualName = "ValidationMAPE"; validationMapeEvaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; SimpleMeanAbsolutePercentageErrorEvaluator testMapeEvaluator = new SimpleMeanAbsolutePercentageErrorEvaluator(); testMapeEvaluator.Name = "TestMapeEvaluator"; testMapeEvaluator.GetVariableInfo("MAPE").ActualName = "TestMAPE"; testMapeEvaluator.GetVariableInfo("Values").ActualName = "TestValues"; #endregion #region MAPRE SimpleMeanAbsolutePercentageOfRangeErrorEvaluator trainingMapreEvaluator = new SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(); trainingMapreEvaluator.Name = "TrainingMapreEvaluator"; trainingMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TrainingMAPRE"; trainingMapreEvaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; SimpleMeanAbsolutePercentageOfRangeErrorEvaluator validationMapreEvaluator = new SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(); validationMapreEvaluator.Name = "ValidationMapreEvaluator"; validationMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "ValidationMAPRE"; validationMapreEvaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; SimpleMeanAbsolutePercentageOfRangeErrorEvaluator testMapreEvaluator = new SimpleMeanAbsolutePercentageOfRangeErrorEvaluator(); testMapreEvaluator.Name = "TestMapreEvaluator"; testMapreEvaluator.GetVariableInfo("MAPRE").ActualName = "TestMAPRE"; testMapreEvaluator.GetVariableInfo("Values").ActualName = "TestValues"; #endregion MAPRE #region R2 SimpleR2Evaluator trainingR2Evaluator = new SimpleR2Evaluator(); trainingR2Evaluator.Name = "TrainingR2Evaluator"; trainingR2Evaluator.GetVariableInfo("R2").ActualName = "TrainingR2"; trainingR2Evaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; SimpleR2Evaluator validationR2Evaluator = new SimpleR2Evaluator(); validationR2Evaluator.Name = "ValidationR2Evaluator"; validationR2Evaluator.GetVariableInfo("R2").ActualName = "ValidationR2"; validationR2Evaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; SimpleR2Evaluator testR2Evaluator = new SimpleR2Evaluator(); testR2Evaluator.Name = "TestR2Evaluator"; testR2Evaluator.GetVariableInfo("R2").ActualName = "TestR2"; testR2Evaluator.GetVariableInfo("Values").ActualName = "TestValues"; #endregion #region VAF SimpleVarianceAccountedForEvaluator trainingVAFEvaluator = new SimpleVarianceAccountedForEvaluator(); trainingVAFEvaluator.Name = "TrainingVAFEvaluator"; trainingVAFEvaluator.GetVariableInfo("VAF").ActualName = "TrainingVAF"; trainingVAFEvaluator.GetVariableInfo("Values").ActualName = "TrainingValues"; SimpleVarianceAccountedForEvaluator validationVAFEvaluator = new SimpleVarianceAccountedForEvaluator(); validationVAFEvaluator.Name = "ValidationVAFEvaluator"; validationVAFEvaluator.GetVariableInfo("VAF").ActualName = "ValidationVAF"; validationVAFEvaluator.GetVariableInfo("Values").ActualName = "ValidationValues"; SimpleVarianceAccountedForEvaluator testVAFEvaluator = new SimpleVarianceAccountedForEvaluator(); testVAFEvaluator.Name = "TestVAFEvaluator"; testVAFEvaluator.GetVariableInfo("VAF").ActualName = "TestVAF"; testVAFEvaluator.GetVariableInfo("Values").ActualName = "TestValues"; #endregion solutionProc.AddSubOperator(evaluatorInjector); solutionProc.AddSubOperator(trainingEvaluator); solutionProc.AddSubOperator(validationEvaluator); solutionProc.AddSubOperator(testEvaluator); solutionProc.AddSubOperator(trainingMseEvaluator); solutionProc.AddSubOperator(validationMseEvaluator); solutionProc.AddSubOperator(testMseEvaluator); solutionProc.AddSubOperator(trainingMapeEvaluator); solutionProc.AddSubOperator(validationMapeEvaluator); solutionProc.AddSubOperator(testMapeEvaluator); solutionProc.AddSubOperator(trainingMapreEvaluator); solutionProc.AddSubOperator(validationMapreEvaluator); solutionProc.AddSubOperator(testMapreEvaluator); solutionProc.AddSubOperator(trainingR2Evaluator); solutionProc.AddSubOperator(validationR2Evaluator); solutionProc.AddSubOperator(testR2Evaluator); solutionProc.AddSubOperator(trainingVAFEvaluator); solutionProc.AddSubOperator(validationVAFEvaluator); solutionProc.AddSubOperator(testVAFEvaluator); #region variable impacts // calculate and set variable impacts VariableNamesExtractor namesExtractor = new VariableNamesExtractor(); namesExtractor.GetVariableInfo("VariableNames").ActualName = "InputVariableNames"; PredictorBuilder predictorBuilder = new PredictorBuilder(); predictorBuilder.GetVariableInfo("TreeEvaluator").ActualName = "ModelAnalysisTreeEvaluator"; VariableEvaluationImpactCalculator evaluationImpactCalculator = new VariableEvaluationImpactCalculator(); evaluationImpactCalculator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart"; evaluationImpactCalculator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd"; VariableQualityImpactCalculator qualityImpactCalculator = new VariableQualityImpactCalculator(); qualityImpactCalculator.GetVariableInfo("SamplesStart").ActualName = "TrainingSamplesStart"; qualityImpactCalculator.GetVariableInfo("SamplesEnd").ActualName = "TrainingSamplesEnd"; solutionProc.AddSubOperator(namesExtractor); solutionProc.AddSubOperator(predictorBuilder); solutionProc.AddSubOperator(evaluationImpactCalculator); solutionProc.AddSubOperator(qualityImpactCalculator); #endregion op.OperatorGraph.AddOperator(seq); op.OperatorGraph.InitialOperator = seq; return op; } public static IAnalyzerModel CreateGPModel(IScope bestModelScope) { IAnalyzerModel model = new AnalyzerModel(); model.Predictor = bestModelScope.GetVariableValue("Predictor", true); Dataset ds = bestModelScope.GetVariableValue("Dataset", true); model.Dataset = ds; model.TargetVariable = ds.GetVariableName(bestModelScope.GetVariableValue("TargetVariable", true).Data); model.TrainingSamplesStart = bestModelScope.GetVariableValue("TrainingSamplesStart", true).Data; model.TrainingSamplesEnd = bestModelScope.GetVariableValue("TrainingSamplesEnd", true).Data; model.ValidationSamplesStart = bestModelScope.GetVariableValue("ValidationSamplesStart", true).Data; model.ValidationSamplesEnd = bestModelScope.GetVariableValue("ValidationSamplesEnd", true).Data; model.TestSamplesStart = bestModelScope.GetVariableValue("TestSamplesStart", true).Data; model.TestSamplesEnd = bestModelScope.GetVariableValue("TestSamplesEnd", true).Data; model.SetResult("TrainingMeanSquaredError", bestModelScope.GetVariableValue("TrainingMSE", false).Data); model.SetResult("ValidationMeanSquaredError", bestModelScope.GetVariableValue("ValidationMSE", false).Data); model.SetResult("TestMeanSquaredError", bestModelScope.GetVariableValue("TestMSE", false).Data); model.SetResult("TrainingCoefficientOfDetermination", bestModelScope.GetVariableValue("TrainingR2", false).Data); model.SetResult("ValidationCoefficientOfDetermination", bestModelScope.GetVariableValue("ValidationR2", false).Data); model.SetResult("TestCoefficientOfDetermination", bestModelScope.GetVariableValue("TestR2", false).Data); model.SetResult("TrainingMeanAbsolutePercentageError", bestModelScope.GetVariableValue("TrainingMAPE", false).Data); model.SetResult("ValidationMeanAbsolutePercentageError", bestModelScope.GetVariableValue("ValidationMAPE", false).Data); model.SetResult("TestMeanAbsolutePercentageError", bestModelScope.GetVariableValue("TestMAPE", false).Data); model.SetResult("TrainingMeanAbsolutePercentageOfRangeError", bestModelScope.GetVariableValue("TrainingMAPRE", false).Data); model.SetResult("ValidationMeanAbsolutePercentageOfRangeError", bestModelScope.GetVariableValue("ValidationMAPRE", false).Data); model.SetResult("TestMeanAbsolutePercentageOfRangeError", bestModelScope.GetVariableValue("TestMAPRE", false).Data); model.SetResult("TrainingVarianceAccountedFor", bestModelScope.GetVariableValue("TrainingVAF", false).Data); model.SetResult("ValidationVarianceAccountedFor", bestModelScope.GetVariableValue("ValidationVAF", false).Data); model.SetResult("TestVarianceAccountedFor", bestModelScope.GetVariableValue("TestVAF", false).Data); model.SetMetaData("EvaluatedSolutions", bestModelScope.GetVariableValue("EvaluatedSolutions", true).Data); IGeneticProgrammingModel gpModel = bestModelScope.GetVariableValue("FunctionTree", true); model.SetMetaData("TreeSize", gpModel.Size); model.SetMetaData("TreeHeight", gpModel.Height); ItemList evaluationImpacts = bestModelScope.GetVariableValue("VariableEvaluationImpacts", false); ItemList qualityImpacts = bestModelScope.GetVariableValue("VariableQualityImpacts", false); foreach (ItemList row in evaluationImpacts) { string variableName = ((StringData)row[0]).Data; double impact = ((DoubleData)row[1]).Data; model.SetVariableEvaluationImpact(variableName, impact); model.AddInputVariable(variableName); } foreach (ItemList row in qualityImpacts) { string variableName = ((StringData)row[0]).Data; double impact = ((DoubleData)row[1]).Data; model.SetVariableQualityImpact(variableName, impact); model.AddInputVariable(variableName); } return model; } } }