Changeset 15973 for branches/2522_RefactorPluginInfrastructure/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisSolutionImpactValuesCalculator.cs
- Timestamp:
- 06/28/18 11:13:37 (6 years ago)
- Location:
- branches/2522_RefactorPluginInfrastructure
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2522_RefactorPluginInfrastructure
- Property svn:ignore
-
old new 24 24 protoc.exe 25 25 obj 26 .vs
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
branches/2522_RefactorPluginInfrastructure/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisSolutionImpactValuesCalculator.cs
r12720 r15973 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 5Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 21 21 22 22 using System.Collections.Generic; 23 using System.Linq; 23 24 using HeuristicLab.Common; 24 25 using HeuristicLab.Core; … … 31 32 public abstract class SymbolicDataAnalysisSolutionImpactValuesCalculator : Item, ISymbolicDataAnalysisSolutionImpactValuesCalculator { 32 33 protected SymbolicDataAnalysisSolutionImpactValuesCalculator() { } 33 34 34 protected SymbolicDataAnalysisSolutionImpactValuesCalculator(SymbolicDataAnalysisSolutionImpactValuesCalculator original, Cloner cloner) 35 35 : base(original, cloner) { } 36 36 [StorableConstructor] 37 37 protected SymbolicDataAnalysisSolutionImpactValuesCalculator(bool deserializing) : base(deserializing) { } 38 public abstract double CalculateReplacementValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows);39 public abstract double CalculateImpactValue(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, double qualityForImpactsCalculation = double.NaN);40 public abstract void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, out double impactValue, out double replacementValue, out double newQualityForImpactsCalculation, double qualityForImpactsCalculation = double.NaN);41 38 42 protected static double CalculateReplacementValue(ISymbolicExpressionTreeNode node, ISymbolicExpressionTree sourceTree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 39 public virtual void CalculateImpactAndReplacementValues(ISymbolicDataAnalysisModel model, ISymbolicExpressionTreeNode node, IDataAnalysisProblemData problemData, IEnumerable<int> rows, 40 out double impactValue, out double replacementValue, out double newQualityForImpactsCalculation, 41 double qualityForImpactsCalculation = double.NaN) { 42 43 var cloner = new Cloner(); 44 var tempModel = cloner.Clone(model); 45 46 if (double.IsNaN(qualityForImpactsCalculation)) { 47 qualityForImpactsCalculation = CalculateQualityForImpacts(tempModel, problemData, rows); 48 } 49 50 var tempModelNode = (ISymbolicExpressionTreeNode)cloner.GetClone(node); 51 var tempModelParentNode = tempModelNode.Parent; 52 int i = tempModelParentNode.IndexOfSubtree(tempModelNode); 53 54 double bestReplacementValue = 0.0; 55 double bestImpactValue = double.PositiveInfinity; 56 newQualityForImpactsCalculation = qualityForImpactsCalculation; // initialize 57 // try the potentially reasonable replacement values and use the best one 58 foreach (var repValue in CalculateReplacementValues(node, model.SymbolicExpressionTree, model.Interpreter, problemData.Dataset, rows)) { 59 tempModelParentNode.RemoveSubtree(i); 60 61 var constantNode = new ConstantTreeNode(new Constant()) { Value = repValue }; 62 tempModelParentNode.InsertSubtree(i, constantNode); 63 64 newQualityForImpactsCalculation = CalculateQualityForImpacts(tempModel, problemData, rows); 65 66 impactValue = qualityForImpactsCalculation - newQualityForImpactsCalculation; 67 if (impactValue < bestImpactValue) { 68 bestImpactValue = impactValue; 69 bestReplacementValue = repValue; 70 } 71 } 72 73 replacementValue = bestReplacementValue; 74 impactValue = bestImpactValue; 75 } 76 77 protected abstract double CalculateQualityForImpacts(ISymbolicDataAnalysisModel model, IDataAnalysisProblemData problemData, IEnumerable<int> rows); 78 79 protected IEnumerable<double> CalculateReplacementValues(ISymbolicExpressionTreeNode node, ISymbolicExpressionTree sourceTree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, 43 80 IDataset dataset, IEnumerable<int> rows) { 44 81 //optimization: constant nodes return always the same value 45 82 ConstantTreeNode constantNode = node as ConstantTreeNode; 46 if (constantNode != null) return constantNode.Value; 83 BinaryFactorVariableTreeNode binaryFactorNode = node as BinaryFactorVariableTreeNode; 84 FactorVariableTreeNode factorNode = node as FactorVariableTreeNode; 85 if (constantNode != null) { 86 yield return constantNode.Value; 87 } else if (binaryFactorNode != null) { 88 // valid replacements are either all off or all on 89 yield return 0; 90 yield return 1; 91 } else if (factorNode != null) { 92 foreach (var w in factorNode.Weights) yield return w; 93 yield return 0.0; 94 } else { 95 var rootSymbol = new ProgramRootSymbol().CreateTreeNode(); 96 var startSymbol = new StartSymbol().CreateTreeNode(); 97 rootSymbol.AddSubtree(startSymbol); 98 startSymbol.AddSubtree((ISymbolicExpressionTreeNode)node.Clone()); 47 99 48 var rootSymbol = new ProgramRootSymbol().CreateTreeNode(); 49 var startSymbol = new StartSymbol().CreateTreeNode(); 50 rootSymbol.AddSubtree(startSymbol); 51 startSymbol.AddSubtree((ISymbolicExpressionTreeNode)node.Clone()); 52 53 var tempTree = new SymbolicExpressionTree(rootSymbol); 54 // clone ADFs of source tree 55 for (int i = 1; i < sourceTree.Root.SubtreeCount; i++) { 56 tempTree.Root.AddSubtree((ISymbolicExpressionTreeNode)sourceTree.Root.GetSubtree(i).Clone()); 100 var tempTree = new SymbolicExpressionTree(rootSymbol); 101 // clone ADFs of source tree 102 for (int i = 1; i < sourceTree.Root.SubtreeCount; i++) { 103 tempTree.Root.AddSubtree((ISymbolicExpressionTreeNode)sourceTree.Root.GetSubtree(i).Clone()); 104 } 105 yield return interpreter.GetSymbolicExpressionTreeValues(tempTree, dataset, rows).Median(); 106 yield return interpreter.GetSymbolicExpressionTreeValues(tempTree, dataset, rows).Average(); // TODO perf 57 107 } 58 return interpreter.GetSymbolicExpressionTreeValues(tempTree, dataset, rows).Median();59 108 } 60 109 }
Note: See TracChangeset
for help on using the changeset viewer.