Changeset 12745 for stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
- Timestamp:
- 07/12/15 11:23:06 (9 years ago)
- Location:
- stable
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 12189,12358-12359,12361,12461,12674,12720,12744
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic merged: 12189,12358-12359,12361,12674,12720,12744
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionPruningOperator.cs
r12009 r12745 34 34 [StorableClass] 35 35 [Item("SymbolicExpressionTreePruningOperator", "An operator that replaces introns with constant values in a symbolic expression tree.")] 36 public abstract class SymbolicDataAnalysisExpressionPruningOperator : SingleSuccessorOperator {36 public abstract class SymbolicDataAnalysisExpressionPruningOperator : SingleSuccessorOperator, ISymbolicExpressionTreeOperator { 37 37 #region parameter names 38 38 private const string ProblemDataParameterName = "ProblemData"; … … 41 41 private const string PrunedSubtreesParameterName = "PrunedSubtrees"; 42 42 private const string PrunedTreesParameterName = "PrunedTrees"; 43 private const string PrunedNodesParameterName = "PrunedNodes"; 43 44 private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition"; 44 45 private const string NodeImpactThresholdParameterName = "ImpactThreshold"; … … 48 49 private const string EstimationLimitsParameterName = "EstimationLimits"; 49 50 private const string InterpreterParameterName = "SymbolicExpressionTreeInterpreter"; 51 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; 50 52 #endregion 51 53 … … 72 74 get { return (ILookupParameter<IntValue>)Parameters[PrunedTreesParameterName]; } 73 75 } 76 public ILookupParameter<IntValue> PrunedNodesParameter { 77 get { return (ILookupParameter<IntValue>)Parameters[PrunedNodesParameterName]; } 78 } 74 79 public IFixedValueParameter<DoubleValue> NodeImpactThresholdParameter { 75 80 get { return (IFixedValueParameter<DoubleValue>)Parameters[NodeImpactThresholdParameterName]; } … … 84 89 get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[InterpreterParameterName]; } 85 90 } 91 public ILookupParameter<BoolValue> ApplyLinearScalingParameter { 92 get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; } 93 } 86 94 #endregion 87 95 88 96 #region properties 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 { 97 public ISymbolicDataAnalysisSolutionImpactValuesCalculator ImpactValuesCalculator { 98 get { return ImpactValuesCalculatorParameter.Value; } 99 set { ImpactValuesCalculatorParameter.Value = value; } 100 } 101 public bool PruneOnlyZeroImpactNodes { 93 102 get { return PruneOnlyZeroImpactNodesParameter.Value.Value; } 94 103 set { PruneOnlyZeroImpactNodesParameter.Value.Value = value; } 95 104 } 96 p rotecteddouble NodeImpactThreshold {105 public double NodeImpactThreshold { 97 106 get { return NodeImpactThresholdParameter.Value.Value; } 98 107 set { NodeImpactThresholdParameter.Value.Value = value; } 99 108 } 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; } }104 109 #endregion 105 110 … … 109 114 : base(original, cloner) { } 110 115 111 protected SymbolicDataAnalysisExpressionPruningOperator( ) {116 protected SymbolicDataAnalysisExpressionPruningOperator(ISymbolicDataAnalysisSolutionImpactValuesCalculator impactValuesCalculator) { 112 117 #region add parameters 113 118 Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName)); 114 119 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisModel>(SymbolicDataAnalysisModelParameterName)); 115 120 Parameters.Add(new LookupParameter<IntRange>(FitnessCalculationPartitionParameterName)); 121 Parameters.Add(new LookupParameter<IntValue>(PrunedNodesParameterName, "A counter of how many nodes were pruned.")); 116 122 Parameters.Add(new LookupParameter<IntValue>(PrunedSubtreesParameterName, "A counter of how many subtrees were replaced.")); 117 123 Parameters.Add(new LookupParameter<IntValue>(PrunedTreesParameterName, "A counter of how many trees were pruned.")); … … 122 128 Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName)); 123 129 Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName)); 130 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName)); 131 Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName, impactValuesCalculator)); 124 132 #endregion 125 133 } 126 134 127 protected abstract ISymbolicDataAnalysisModel CreateModel(); 135 [StorableHook(HookType.AfterDeserialization)] 136 private void AfterDeserialization() { 137 // BackwardsCompatibility3.3 138 #region Backwards compatible code, remove with 3.4 139 if (!Parameters.ContainsKey(PrunedNodesParameterName)) { 140 Parameters.Add(new LookupParameter<IntValue>(PrunedNodesParameterName, "A counter of how many nodes were pruned.")); 141 } 142 if (!Parameters.ContainsKey(ApplyLinearScalingParameterName)) { 143 Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName)); 144 } 145 if (!Parameters.ContainsKey(ImpactValuesCalculatorParameterName)) { 146 // value must be set by derived operators (regression/classification) 147 Parameters.Add(new ValueParameter<ISymbolicDataAnalysisSolutionImpactValuesCalculator>(ImpactValuesCalculatorParameterName)); 148 } 149 #endregion 150 } 151 152 protected abstract ISymbolicDataAnalysisModel CreateModel(ISymbolicExpressionTree tree, ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, IDataAnalysisProblemData problemData, DoubleLimit estimationLimits); 128 153 129 154 protected abstract double Evaluate(IDataAnalysisModel model); 130 155 131 156 public override IOperation Apply() { 132 var model = CreateModel(); 133 var nodes = SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList(); 134 var rows = Enumerable.Range(FitnessCalculationPartition.Start, FitnessCalculationPartition.Size); 157 var tree = SymbolicExpressionTreeParameter.ActualValue; 158 var problemData = ProblemDataParameter.ActualValue; 159 var fitnessCalculationPartition = FitnessCalculationPartitionParameter.ActualValue; 160 var estimationLimits = EstimationLimitsParameter.ActualValue; 161 var interpreter = InterpreterParameter.ActualValue; 162 163 var model = CreateModel(tree, interpreter, problemData, estimationLimits); 164 var nodes = tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix().ToList(); 165 var rows = Enumerable.Range(fitnessCalculationPartition.Start, fitnessCalculationPartition.Size).ToList(); 135 166 var prunedSubtrees = 0; 136 167 var prunedTrees = 0; 137 138 double quality = Evaluate(model); 168 var prunedNodes = 0; 169 170 double qualityForImpactsCalculation = double.NaN; 139 171 140 172 for (int i = 0; i < nodes.Count; ++i) { … … 143 175 144 176 double impactValue, replacementValue; 145 ImpactValuesCalculator.CalculateImpactAndReplacementValues(model, node, ProblemData, rows, out impactValue, out replacementValue, quality); 146 147 if (PruneOnlyZeroImpactNodes) { 148 if (!impactValue.IsAlmost(0.0)) continue; 149 } else if (NodeImpactThreshold < impactValue) { 150 continue; 151 } 177 double newQualityForImpacts; 178 ImpactValuesCalculator.CalculateImpactAndReplacementValues(model, node, problemData, rows, out impactValue, out replacementValue, out newQualityForImpacts, qualityForImpactsCalculation); 179 180 if (PruneOnlyZeroImpactNodes && !impactValue.IsAlmost(0.0)) continue; 181 if (!PruneOnlyZeroImpactNodes && impactValue > NodeImpactThreshold) continue; 152 182 153 183 var constantNode = (ConstantTreeNode)node.Grammar.GetSymbol("Constant").CreateTreeNode(); 154 184 constantNode.Value = replacementValue; 155 185 186 var length = node.GetLength(); 156 187 ReplaceWithConstant(node, constantNode); 157 i += node.GetLength() - 1; // skip subtrees under the node that was folded 158 159 quality -= impactValue; 188 i += length - 1; // skip subtrees under the node that was folded 160 189 161 190 prunedSubtrees++; 191 prunedNodes += length; 192 193 qualityForImpactsCalculation = newQualityForImpacts; 162 194 } 163 195 … … 165 197 PrunedSubtreesParameter.ActualValue = new IntValue(prunedSubtrees); 166 198 PrunedTreesParameter.ActualValue = new IntValue(prunedTrees); 199 PrunedNodesParameter.ActualValue = new IntValue(prunedNodes); 200 201 if (prunedSubtrees > 0) // if nothing was pruned then there's no need to re-evaluate the tree 202 QualityParameter.ActualValue.Value = Evaluate(model); 167 203 168 204 return base.Apply(); 169 205 } 170 206 171 pr ivatestatic void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) {207 protected static void ReplaceWithConstant(ISymbolicExpressionTreeNode original, ISymbolicExpressionTreeNode replacement) { 172 208 var parent = original.Parent; 173 209 var i = parent.IndexOfSubtree(original);
Note: See TracChangeset
for help on using the changeset viewer.