Changeset 11145 for stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
- Timestamp:
- 07/08/14 19:29:00 (10 years ago)
- Location:
- stable
- Files:
-
- 2 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 10368,10375,10378,10414,10417-10418,10428,10469-10470,11013,11025-11027
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic merged: 10368,10375,10378,10414,10417,10428,10469-10470,11013,11025-11027
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
r10368 r11145 34 34 [StorableClass] 35 35 [Item("SymbolicExpressionTreePruningOperator", "An operator that replaces introns with constant values in a symbolic expression tree.")] 36 public class SymbolicDataAnalysisExpressionPruningOperator : SingleSuccessorOperator { 37 private const string NumberOfPrunedSubtreesParameterName = "PrunedSubtrees"; 38 private const string NumberOfPrunedTreesParameterName = "PrunedTrees"; 36 public abstract class SymbolicDataAnalysisExpressionPruningOperator : SingleSuccessorOperator { 37 #region parameter names 38 private const string ProblemDataParameterName = "ProblemData"; 39 private const string SymbolicDataAnalysisModelParameterName = "SymbolicDataAnalysisModel"; 40 private const string ImpactValuesCalculatorParameterName = "ImpactValuesCalculator"; 41 private const string PrunedSubtreesParameterName = "PrunedSubtrees"; 42 private const string PrunedTreesParameterName = "PrunedTrees"; 43 private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition"; 44 private const string NodeImpactThresholdParameterName = "ImpactThreshold"; 45 private const string PruneOnlyZeroImpactNodesParameterName = "PruneOnlyZeroImpactNodes"; 46 private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree"; // the tree to be pruned 47 private const string QualityParameterName = "Quality"; // the quality 48 private const string EstimationLimitsParameterName = "EstimationLimits"; 49 private const string InterpreterParameterName = "SymbolicExpressionTreeInterpreter"; 50 #endregion 51 39 52 #region parameter properties 40 public ILookupParameter< DoubleValue> NumberOfPrunedSubtreesParameter {41 get { return (ILookupParameter< DoubleValue>)Parameters[NumberOfPrunedSubtreesParameterName]; }53 public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter { 54 get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; } 42 55 } 43 public ILookupParameter<DoubleValue> NumberOfPrunedTreesParameter { 44 get { return (ILookupParameter<DoubleValue>)Parameters[NumberOfPrunedTreesParameterName]; } 56 public ILookupParameter<DoubleValue> QualityParameter { 57 get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; } 58 } 59 public ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter { 60 get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; } 61 } 62 public IValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator> ImpactValuesCalculatorParameter { 63 get { return (IValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>)Parameters[ImpactValuesCalculatorParameterName]; } 64 } 65 public ILookupParameter<IntRange> FitnessCalculationPartitionParameter { 66 get { return (ILookupParameter<IntRange>)Parameters[FitnessCalculationPartitionParameterName]; } 67 } 68 public ILookupParameter<IntValue> PrunedSubtreesParameter { 69 get { return (ILookupParameter<IntValue>)Parameters[PrunedSubtreesParameterName]; } 70 } 71 public ILookupParameter<IntValue> PrunedTreesParameter { 72 get { return (ILookupParameter<IntValue>)Parameters[PrunedTreesParameterName]; } 73 } 74 public IFixedValueParameter<DoubleValue> NodeImpactThresholdParameter { 75 get { return (IFixedValueParameter<DoubleValue>)Parameters[NodeImpactThresholdParameterName]; } 76 } 77 public IFixedValueParameter<BoolValue> PruneOnlyZeroImpactNodesParameter { 78 get { return (IFixedValueParameter<BoolValue>)Parameters[PruneOnlyZeroImpactNodesParameterName]; } 79 } 80 public ILookupParameter<DoubleLimit> EstimationLimitsParameter { 81 get { return (ILookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; } 82 } 83 public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> InterpreterParameter { 84 get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[InterpreterParameterName]; } 45 85 } 46 86 #endregion 87 47 88 #region properties 48 private DoubleValue PrunedSubtrees { get { return NumberOfPrunedSubtreesParameter.ActualValue; } } 49 private DoubleValue PrunedTrees { get { return NumberOfPrunedTreesParameter.ActualValue; } } 89 protected IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } } 90 protected ISymbolicDataAnalysisSolutionImpactValuesCalculator ImpactValuesCalculator { get { return ImpactValuesCalculatorParameter.Value; } } 91 protected IntRange FitnessCalculationPartition { get { return FitnessCalculationPartitionParameter.ActualValue; } } 92 protected bool PruneOnlyZeroImpactNodes { 93 get { return PruneOnlyZeroImpactNodesParameter.Value.Value; } 94 set { PruneOnlyZeroImpactNodesParameter.Value.Value = value; } 95 } 96 protected double NodeImpactThreshold { 97 get { return NodeImpactThresholdParameter.Value.Value; } 98 set { NodeImpactThresholdParameter.Value.Value = value; } 99 } 100 protected ISymbolicExpressionTree SymbolicExpressionTree { get { return SymbolicExpressionTreeParameter.ActualValue; } } 101 protected DoubleValue Quality { get { return QualityParameter.ActualValue; } } 102 protected DoubleLimit EstimationLimits { get { return EstimationLimitsParameter.ActualValue; } } 103 protected ISymbolicDataAnalysisExpressionTreeInterpreter Interpreter { get { return InterpreterParameter.ActualValue; } } 50 104 #endregion 51 public override IDeepCloneable Clone(Cloner cloner) { 52 return new SymbolicDataAnalysisExpressionPruningOperator(this, cloner); 53 } 54 private SymbolicDataAnalysisExpressionPruningOperator(SymbolicDataAnalysisExpressionPruningOperator original, Cloner cloner) 55 : base(original, cloner) { 105 106 [StorableConstructor] 107 protected SymbolicDataAnalysisExpressionPruningOperator(bool deserializing) : base(deserializing) { } 108 protected SymbolicDataAnalysisExpressionPruningOperator(SymbolicDataAnalysisExpressionPruningOperator original, Cloner cloner) 109 : base(original, cloner) { } 110 111 protected SymbolicDataAnalysisExpressionPruningOperator() { 112 #region add parameters 113 Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName)); 114 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisModel>(SymbolicDataAnalysisModelParameterName)); 115 Parameters.Add(new LookupParameter<IntRange>(FitnessCalculationPartitionParameterName)); 116 Parameters.Add(new LookupParameter<IntValue>(PrunedSubtreesParameterName, "A counter of how many subtrees were replaced.")); 117 Parameters.Add(new LookupParameter<IntValue>(PrunedTreesParameterName, "A counter of how many trees were pruned.")); 118 Parameters.Add(new FixedValueParameter<BoolValue>(PruneOnlyZeroImpactNodesParameterName, "Specify whether or not only zero impact nodes should be pruned.")); 119 Parameters.Add(new FixedValueParameter<DoubleValue>(NodeImpactThresholdParameterName, "Specifies an impact value threshold below which nodes should be pruned.")); 120 Parameters.Add(new LookupParameter<DoubleLimit>(EstimationLimitsParameterName)); 121 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(InterpreterParameterName)); 122 Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName)); 123 Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName)); 124 #endregion 56 125 } 57 126 58 public SymbolicDataAnalysisExpressionPruningOperator() { 59 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfPrunedSubtreesParameterName)); 60 Parameters.Add(new LookupParameter<DoubleValue>(NumberOfPrunedTreesParameterName)); 61 } 127 protected abstract ISymbolicDataAnalysisModel CreateModel(); 62 128 63 public ISymbolicDataAnalysisModel Model { get; set; } 64 public IDataAnalysisProblemData ProblemData { get; set; } 65 public ISymbolicDataAnalysisSolutionImpactValuesCalculator ImpactsCalculator { get; set; } 66 public IRandom Random { get; set; } 67 68 public bool PruneOnlyZeroImpactNodes { get; set; } 69 public double NodeImpactThreshold { get; set; } 129 protected abstract double Evaluate(IDataAnalysisModel model); 70 130 71 131 public override IOperation Apply() { 72 int prunedSubtrees = 0; 132 var model = CreateModel(); 133 var nodes = SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList(); 134 var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size); 135 var prunedSubtrees = 0; 136 var prunedTrees = 0; 73 137 74 var nodes = Model.SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList();138 double quality = Evaluate(model); 75 139 76 for (int j = 0; j < nodes.Count; ++j) {77 var node = nodes[ j];140 for (int i = 0; i < nodes.Count; ++i) { 141 var node = nodes[i]; 78 142 if (node is ConstantTreeNode) continue; 79 143 80 var impact = ImpactsCalculator.CalculateImpactValue(Model, node, ProblemData, ProblemData.TrainingIndices); 144 double impactValue, replacementValue; 145 ImpactValuesCalculator.CalculateImpactAndReplacementValues(model, node, ProblemData, rows, out impactValue, out replacementValue, quality); 81 146 82 147 if (PruneOnlyZeroImpactNodes) { 83 if (!impact .IsAlmost(0.0)) continue;84 } else {85 if (NodeImpactThreshold < impact)continue;148 if (!impactValue.IsAlmost(0.0)) continue; 149 } else if (NodeImpactThreshold < impactValue) { 150 continue; 86 151 } 87 152 88 var replacementValue = ImpactsCalculator.CalculateReplacementValue(Model, node, ProblemData, ProblemData.TrainingIndices); 89 var constantNode = new ConstantTreeNode(new Constant()) { Value = replacementValue }; 153 var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode(); 154 constantNode.Value = replacementValue; 155 90 156 ReplaceWithConstant(node, constantNode); 91 j += node.GetLength() - 1; // skip subtrees under the node that was folded 157 i += node.GetLength() - 1; // skip subtrees under the node that was folded 158 159 quality -= impactValue; 92 160 93 161 prunedSubtrees++; 94 162 } 95 163 96 if (prunedSubtrees > 0) {97 lock (PrunedSubtrees) { PrunedSubtrees.Value += prunedSubtrees; }98 lock (PrunedTrees) { PrunedTrees.Value += 1; }99 } 164 if (prunedSubtrees > 0) prunedTrees = 1; 165 PrunedSubtreesParameter.ActualValue = new IntValue(prunedSubtrees); 166 PrunedTreesParameter.ActualValue = new IntValue(prunedTrees); 167 100 168 return base.Apply(); 101 169 } 170 102 171 private static void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) { 103 172 var parent = original.Parent;
Note: See TracChangeset
for help on using the changeset viewer.