Changeset 11208 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs
- Timestamp:
- 07/18/14 16:39:50 (10 years ago)
- Location:
- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectivePruningAnalyzer.cs
r10501 r11208 1 using System; 1 #region License Information 2 3 /* HeuristicLab 4 * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 5 * 6 * This file is part of HeuristicLab. 7 * 8 * HeuristicLab is free software: you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation, either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * HeuristicLab is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #endregion 23 24 using System; 2 25 using System.Linq; 3 26 using HeuristicLab.Analysis; … … 27 50 private const string PruningOperatorParameterName = "PruningOperator"; 28 51 private const string ResultsParameterName = "Results"; 29 #endregion 52 private const string PopulationSizeParameterName = "PopulationSize"; 53 #endregion 54 30 55 #region private members 31 56 private DataReducer prunedSubtreesReducer; … … 33 58 private DataTableValuesCollector valuesCollector; 34 59 private ResultsCollector resultsCollector; 35 private EmptyOperator emptyOp;36 #endregion 60 #endregion 61 37 62 #region parameter properties 38 63 public IValueParameter<SymbolicDataAnalysisExpressionPruningOperator> PruningOperatorParameter { … … 48 73 get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; } 49 74 } 50 private ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter { 51 get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; } 52 } 53 public IValueParameter<IntValue> UpdateIntervalParameter { 54 get { return (IValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; } 55 } 56 public IValueParameter<IntValue> UpdateCounterParameter { 57 get { return (IValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; } 58 } 59 public IValueParameter<DoubleRange> PopulationSliceParameter { 60 get { return (IValueParameter<DoubleRange>)Parameters[PopulationSliceParameterName]; } 61 } 62 public IValueParameter<DoubleValue> PruningProbabilityParameter { 63 get { return (IValueParameter<DoubleValue>)Parameters[PruningProbabilityParameterName]; } 64 } 65 #endregion 75 public IFixedValueParameter<IntValue> UpdateIntervalParameter { 76 get { return (IFixedValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; } 77 } 78 public IFixedValueParameter<IntValue> UpdateCounterParameter { 79 get { return (IFixedValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; } 80 } 81 public IFixedValueParameter<DoubleRange> PopulationSliceParameter { 82 get { return (IFixedValueParameter<DoubleRange>)Parameters[PopulationSliceParameterName]; } 83 } 84 public IFixedValueParameter<DoubleValue> PruningProbabilityParameter { 85 get { return (IFixedValueParameter<DoubleValue>)Parameters[PruningProbabilityParameterName]; } 86 } 87 public ILookupParameter<IntValue> PopulationSizeParameter { 88 get { return (ILookupParameter<IntValue>)Parameters[PopulationSizeParameterName]; } 89 } 90 #endregion 91 66 92 #region properties 67 93 protected SymbolicDataAnalysisExpressionPruningOperator PruningOperator { get { return PruningOperatorParameter.Value; } } 68 protected IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } } 69 protected IntValue UpdateInterval { get { return UpdateIntervalParameter.Value; } } 70 protected IntValue UpdateCounter { get { return UpdateCounterParameter.Value; } } 71 protected DoubleRange PopulationSlice { get { return PopulationSliceParameter.Value; } } 72 protected DoubleValue PruningProbability { get { return PruningProbabilityParameter.Value; } } 73 protected IRandom Random { get { return RandomParameter.ActualValue; } } 74 protected DoubleValue NodeImpactThreshold { get { return NodeImpactThresholdParameter.Value; } } 75 protected BoolValue PruneOnlyZeroImpactNodes { get { return PruneOnlyZeroImpactNodesParameter.Value; } } 76 #endregion 94 protected int UpdateInterval { get { return UpdateIntervalParameter.Value.Value; } } 95 96 protected int UpdateCounter { 97 get { return UpdateCounterParameter.Value.Value; } 98 set { UpdateCounterParameter.Value.Value = value; } 99 } 100 101 protected double PopulationSliceStart { 102 get { return PopulationSliceParameter.Value.Start; } 103 set { PopulationSliceParameter.Value.Start = value; } 104 } 105 106 protected double PopulationSliceEnd { 107 get { return PopulationSliceParameter.Value.End; } 108 set { PopulationSliceParameter.Value.End = value; } 109 } 110 111 protected double PruningProbability { 112 get { return PruningProbabilityParameter.Value.Value; } 113 set { PruningProbabilityParameter.Value.Value = value; } 114 } 115 116 protected bool PruneOnlyZeroImpactNodes { 117 get { return PruneOnlyZeroImpactNodesParameter.Value.Value; } 118 set { PruneOnlyZeroImpactNodesParameter.Value.Value = value; } 119 } 120 protected double NodeImpactThreshold { 121 get { return NodeImpactThresholdParameter.Value.Value; } 122 set { NodeImpactThresholdParameter.Value.Value = value; } 123 } 124 #endregion 125 77 126 #region IStatefulItem members 78 127 public override void InitializeState() { 79 128 base.InitializeState(); 80 UpdateCounter .Value= 0;129 UpdateCounter = 0; 81 130 } 82 131 public override void ClearState() { 83 132 base.ClearState(); 84 UpdateCounter .Value= 0;133 UpdateCounter = 0; 85 134 } 86 135 #endregion … … 88 137 [StorableConstructor] 89 138 protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer(bool deserializing) : base(deserializing) { } 139 90 140 protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer(SymbolicDataAnalysisSingleObjectivePruningAnalyzer original, Cloner cloner) 91 141 : base(original, cloner) { … … 99 149 this.resultsCollector = (ResultsCollector)original.resultsCollector.Clone(); 100 150 } 151 152 [StorableHook(HookType.AfterDeserialization)] 153 private void AfterDeserialization() { 154 if (!Parameters.ContainsKey(PopulationSizeParameterName)) { 155 Parameters.Add(new LookupParameter<IntValue>(PopulationSizeParameterName, "The population of individuals.")); 156 } 157 if (Parameters.ContainsKey(UpdateCounterParameterName)) { 158 var fixedValueParameter = Parameters[UpdateCounterParameterName] as FixedValueParameter<IntValue>; 159 if (fixedValueParameter == null) { 160 var valueParameter = (ValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; 161 Parameters.Remove(UpdateCounterParameterName); 162 Parameters.Add(new FixedValueParameter<IntValue>(UpdateCounterParameterName, valueParameter.Value)); 163 } 164 } 165 if (Parameters.ContainsKey(UpdateIntervalParameterName)) { 166 var fixedValueParameter = Parameters[UpdateIntervalParameterName] as FixedValueParameter<IntValue>; 167 if (fixedValueParameter == null) { 168 var valueParameter = (ValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; 169 Parameters.Remove(UpdateIntervalParameterName); 170 Parameters.Add(new FixedValueParameter<IntValue>(UpdateIntervalParameterName, valueParameter.Value)); 171 } 172 } 173 if (Parameters.ContainsKey(PopulationSliceParameterName)) { 174 var fixedValueParameter = Parameters[PopulationSliceParameterName] as FixedValueParameter<DoubleRange>; 175 if (fixedValueParameter == null) { 176 var valueParameter = (ValueParameter<DoubleRange>)Parameters[PopulationSliceParameterName]; 177 Parameters.Remove(PopulationSliceParameterName); 178 Parameters.Add(new FixedValueParameter<DoubleRange>(PopulationSliceParameterName, valueParameter.Value)); 179 } 180 } 181 if (Parameters.ContainsKey(PruningProbabilityParameterName)) { 182 var fixedValueParameter = Parameters[PruningProbabilityParameterName] as FixedValueParameter<DoubleValue>; 183 if (fixedValueParameter == null) { 184 var valueParameter = (ValueParameter<DoubleValue>)Parameters[PruningProbabilityParameterName]; 185 Parameters.Remove(PruningProbabilityParameterName); 186 Parameters.Add(new FixedValueParameter<DoubleValue>(PruningProbabilityParameterName, valueParameter.Value)); 187 } 188 } 189 } 190 101 191 protected SymbolicDataAnalysisSingleObjectivePruningAnalyzer() { 102 192 #region add parameters 103 Parameters.Add(new ValueParameter<DoubleRange>(PopulationSliceParameterName, new DoubleRange(0.75, 1))); 104 Parameters.Add(new ValueParameter<DoubleValue>(PruningProbabilityParameterName, new DoubleValue(0.5))); 105 Parameters.Add(new ValueParameter<IntValue>(UpdateIntervalParameterName, "The interval in which the tree length analysis should be applied.", new IntValue(1))); 106 Parameters.Add(new ValueParameter<IntValue>(UpdateCounterParameterName, "The value which counts how many times the operator was called", new IntValue(0))); 107 Parameters.Add(new LookupParameter<IRandom>(RandomParameterName)); 108 Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName)); 109 Parameters.Add(new FixedValueParameter<DoubleValue>(NodeImpactThresholdParameterName, new DoubleValue(0.0))); 110 Parameters.Add(new FixedValueParameter<BoolValue>(PruneOnlyZeroImpactNodesParameterName, new BoolValue(false))); 193 Parameters.Add(new FixedValueParameter<DoubleRange>(PopulationSliceParameterName, "The slice of the population where pruning should be applied.", new DoubleRange(0.75, 1))); 194 Parameters.Add(new FixedValueParameter<DoubleValue>(PruningProbabilityParameterName, "The probability for pruning an individual.", new DoubleValue(0.5))); 195 Parameters.Add(new FixedValueParameter<IntValue>(UpdateIntervalParameterName, "The interval in which the tree length analysis should be applied.", new IntValue(1))); 196 Parameters.Add(new FixedValueParameter<IntValue>(UpdateCounterParameterName, "The value which counts how many times the operator was called", new IntValue(0))); 197 Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random number generator.")); 198 Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName, "The problem data.")); 199 Parameters.Add(new FixedValueParameter<DoubleValue>(NodeImpactThresholdParameterName, "The impact threshold below which an individual should be pruned.", new DoubleValue(0.0))); 200 Parameters.Add(new FixedValueParameter<BoolValue>(PruneOnlyZeroImpactNodesParameterName, "Switch to determine of only zero impact individuals should be pruned.", new BoolValue(false))); 201 Parameters.Add(new LookupParameter<IntValue>(PopulationSizeParameterName, "The population of individuals.")); 111 202 #endregion 203 } 204 205 // 206 /// <summary> 207 /// Computes the closed interval bounding the portion of the population that is to be pruned. 208 /// </summary> 209 /// <returns>Returns an int range [start, end]</returns> 210 private IntRange GetSliceBounds() { 211 if (PopulationSliceStart < 0 || PopulationSliceEnd < 0) throw new ArgumentOutOfRangeException("The slice bounds cannot be negative."); 212 if (PopulationSliceStart > 1 || PopulationSliceEnd > 1) throw new ArgumentOutOfRangeException("The slice bounds should be expressed as unit percentages."); 213 var count = PopulationSizeParameter.ActualValue.Value; 214 var start = (int)Math.Round(PopulationSliceStart * count); 215 var end = (int)Math.Round(PopulationSliceEnd * count); 216 if (end > count) end = count; 217 218 if (start >= end) throw new ArgumentOutOfRangeException("Invalid PopulationSlice bounds."); 219 return new IntRange(start, end); 220 } 221 222 private IOperation CreatePruningOperation() { 223 var operations = new OperationCollection { Parallel = true }; 224 var range = GetSliceBounds(); 225 var qualities = Quality.Select(x => x.Value).ToArray(); 226 var indices = Enumerable.Range(0, qualities.Length).ToArray(); 227 Array.Sort(qualities, indices); 228 if (!Maximization.Value) Array.Reverse(indices); 229 230 var subscopes = ExecutionContext.Scope.SubScopes; 231 var random = RandomParameter.ActualValue; 232 233 var empty = new EmptyOperator(); 234 235 for (int i = 0; i < subscopes.Count; ++i) { 236 IOperator @operator; 237 if (range.Start <= i && i < range.End && random.NextDouble() <= PruningProbability) 238 @operator = PruningOperator; 239 else @operator = empty; 240 var index = indices[i]; 241 var subscope = subscopes[index]; 242 operations.Add(ExecutionContext.CreateChildOperation(@operator, subscope)); 243 } 244 return operations; 245 } 246 247 public override IOperation Apply() { 248 UpdateCounter++; 249 if (UpdateCounter != UpdateInterval) return base.Apply(); 250 UpdateCounter = 0; 251 252 if (prunedSubtreesReducer == null || prunedTreesReducer == null || valuesCollector == null || resultsCollector == null) { InitializeOperators(); } 253 254 var prune = CreatePruningOperation(); 255 var reducePrunedSubtrees = ExecutionContext.CreateChildOperation(prunedSubtreesReducer); 256 var reducePrunedTrees = ExecutionContext.CreateChildOperation(prunedTreesReducer); 257 var collectValues = ExecutionContext.CreateChildOperation(valuesCollector); 258 var collectResults = ExecutionContext.CreateChildOperation(resultsCollector); 259 260 return new OperationCollection { prune, reducePrunedSubtrees, reducePrunedTrees, collectValues, collectResults, base.Apply() }; 112 261 } 113 262 … … 133 282 resultsCollector.CollectedValues.Add(new LookupParameter<DataTable>("Population pruning")); 134 283 resultsCollector.ResultsParameter.ActualName = ResultsParameterName; 135 136 emptyOp = new EmptyOperator();137 }138 139 //140 /// <summary>141 /// Computes the closed interval bounding the portion of the population that is to be pruned.142 /// </summary>143 /// <returns>Returns an int range [start, end]</returns>144 private IntRange GetSliceBounds() {145 var count = ExecutionContext.Scope.SubScopes.Count;146 var start = (int)Math.Round(PopulationSlice.Start * count);147 var end = (int)Math.Round(PopulationSlice.End * count);148 if (end > count) end = count;149 150 if (start >= end) throw new ArgumentOutOfRangeException("Invalid PopulationSlice bounds.");151 return new IntRange(start, end);152 }153 154 private IOperation CreatePruningOperation() {155 var oc = new OperationCollection { Parallel = true };156 var range = GetSliceBounds();157 var qualities = Quality.Select(x => x.Value).ToArray();158 var indices = Enumerable.Range(0, qualities.Length).ToArray();159 Array.Sort(qualities, indices);160 if (!Maximization.Value) Array.Reverse(indices);161 162 var subscopes = ExecutionContext.Scope.SubScopes;163 164 for (int i = 0; i < subscopes.Count; ++i) {165 IOperator op;166 if (range.Start <= i && i < range.End && Random.NextDouble() <= PruningProbability.Value)167 op = PruningOperator;168 else op = emptyOp;169 var index = indices[i];170 var subscope = subscopes[index];171 oc.Add(ExecutionContext.CreateChildOperation(op, subscope));172 }173 return oc;174 }175 176 public override IOperation Apply() {177 UpdateCounter.Value++;178 if (UpdateCounter.Value != UpdateInterval.Value) return base.Apply();179 UpdateCounter.Value = 0;180 181 if (prunedSubtreesReducer == null || prunedTreesReducer == null || valuesCollector == null || resultsCollector == null) { InitializeOperators(); }182 183 var prune = CreatePruningOperation();184 var reducePrunedSubtrees = ExecutionContext.CreateChildOperation(prunedSubtreesReducer);185 var reducePrunedTrees = ExecutionContext.CreateChildOperation(prunedTreesReducer);186 var collectValues = ExecutionContext.CreateChildOperation(valuesCollector);187 var collectResults = ExecutionContext.CreateChildOperation(resultsCollector);188 189 return new OperationCollection { prune, reducePrunedSubtrees, reducePrunedTrees, collectValues, collectResults, base.Apply() };190 284 } 191 285 }
Note: See TracChangeset
for help on using the changeset viewer.