Changeset 12231 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking
- Timestamp:
- 03/20/15 18:20:59 (10 years ago)
- Location:
- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/Analyzers/SymbolicDataAnalysisSubtreeSampleCountAnalyzer.cs
r12210 r12231 20 20 #endregion 21 21 22 using System;23 22 using System.Linq; 24 using HeuristicLab.Analysis;25 23 using HeuristicLab.Common; 26 24 using HeuristicLab.Core; … … 28 26 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 29 27 using HeuristicLab.EvolutionTracking; 30 using HeuristicLab.Optimization;31 28 using HeuristicLab.Parameters; 32 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 33 30 34 31 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Tracking.Analyzers { 35 [Item("SymbolicDataAnalysis TraceOverlapAnalyzer", "An analyzer for trace graph overlap.")]32 [Item("SymbolicDataAnalysisSubtreeSampleCountAnalyzer", "An analyzer for trace graph overlap.")] 36 33 [StorableClass] 37 public class SymbolicDataAnalysisTraceOverlapAnalyzer : EvolutionTrackingAnalyzer<ISymbolicExpressionTree> { 38 private const string PercentageOfBestSolutionsParameterName = "PercentageOfBestSolutions"; 34 public class SymbolicDataAnalysisSubtreeSampleCountAnalyzer : EvolutionTrackingAnalyzer<ISymbolicExpressionTree> { 35 private const string CacheTraceNodesParameterName = "CacheTraceNodes"; 36 private readonly TraceCalculator traceCalculator = new TraceCalculator { UpdateVertexWeights = true, UpdateSubtreeWeights = true, CacheTraceNodes = true }; 39 37 40 38 #region parameters 41 public IFixedValueParameter< DoubleValue> PercentageOfBestSolutionsParameter {42 get { return (IFixedValueParameter< DoubleValue>)Parameters[PercentageOfBestSolutionsParameterName]; }39 public IFixedValueParameter<BoolValue> CacheTraceNodesParameter { 40 get { return (IFixedValueParameter<BoolValue>)Parameters[CacheTraceNodesParameterName]; } 43 41 } 44 42 #endregion 45 43 46 public SymbolicDataAnalysisTraceOverlapAnalyzer() { 47 UpdateCounterParameter.ActualName = "TraceOverlapAnalyzerUpdateCounter"; 48 Parameters.Add(new FixedValueParameter<DoubleValue>(PercentageOfBestSolutionsParameterName, new DoubleValue(1.0))); 44 #region parameter properties 45 public bool CacheTraceNodes { 46 get { return CacheTraceNodesParameter.Value.Value; } 47 set { CacheTraceNodesParameter.Value.Value = value; } 48 } 49 #endregion 50 51 public SymbolicDataAnalysisSubtreeSampleCountAnalyzer() { 52 UpdateCounterParameter.ActualName = "SubtreeSampleCountAnalyzerUpdateCounter"; 53 54 Parameters.Add(new FixedValueParameter<BoolValue>(CacheTraceNodesParameterName, new BoolValue(true))); 49 55 } 50 56 51 private SymbolicDataAnalysis TraceOverlapAnalyzer(SymbolicDataAnalysisTraceOverlapAnalyzer original, Cloner cloner)57 private SymbolicDataAnalysisSubtreeSampleCountAnalyzer(SymbolicDataAnalysisSubtreeSampleCountAnalyzer original, Cloner cloner) 52 58 : base(original, cloner) { 53 59 } 54 60 55 61 public override IDeepCloneable Clone(Cloner cloner) { 56 return new SymbolicDataAnalysisTraceOverlapAnalyzer(this, cloner); 62 return new SymbolicDataAnalysisSubtreeSampleCountAnalyzer(this, cloner); 63 } 64 65 public override void ClearState() { 66 base.ClearState(); 67 traceCalculator.ResetState(); 68 } 69 70 public override void InitializeState() { 71 traceCalculator.ResetState(); 57 72 } 58 73 59 74 [StorableConstructor] 60 private SymbolicDataAnalysis TraceOverlapAnalyzer(bool deserializing) : base(deserializing) { }75 private SymbolicDataAnalysisSubtreeSampleCountAnalyzer(bool deserializing) : base(deserializing) { } 61 76 62 77 public override IOperation Apply() { … … 79 94 return base.Apply(); 80 95 81 var bestSolutionsPercentage = PercentageOfBestSolutionsParameter.Value.Value; 82 int n = (int)Math.Round(bestSolutionsPercentage * PopulationSize.Value); 83 double avgTraceOverlap = 0; 96 traceCalculator.CacheTraceNodes = CacheTraceNodes; 97 if (Generation.Value > 0) { 98 var rank = PopulationGraph.GetByRank(Generation.Value).Cast<IGenealogyGraphNode<ISymbolicExpressionTree>>().ToList(); 99 foreach (var n in rank) 100 traceCalculator.Trace(n, 2, false); // during this call weights will be updated 84 101 85 if (Generation.Value > 0) { 86 var nodes = PopulationGraph.GetByRank(Generation.Value).Cast<IGenealogyGraphNode<ISymbolicExpressionTree>>().OrderByDescending(x => x.Quality).Take(n); 87 avgTraceOverlap = nodes.Average(x => TraceCalculator.TraceSubtree(x, 2).Vertices.Count()); 88 } 89 90 DataTable table; 91 if (!Results.ContainsKey("AverageTraceOverlap")) { 92 table = new DataTable("Average trace overlap"); 93 var row = new DataRow("Average trace overlap") { VisualProperties = { StartIndexZero = true } }; 94 row.Values.Add(avgTraceOverlap); 95 table.Rows.Add(row); 96 Results.Add(new Result("AverageTraceOverlap", table)); 97 } else { 98 table = (DataTable)Results["AverageTraceOverlap"].Value; 99 table.Rows["Average trace overlap"].Values.Add(avgTraceOverlap); 102 foreach (var v in traceCalculator.TraceGraph.Vertices) { 103 var g = PopulationGraph.GetByContent(v.Data); 104 g.Weight = v.Weight; 105 } 100 106 } 101 107 return base.Apply(); -
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/TraceCalculator.cs
r12225 r12231 160 160 if (UpdateSubtreeWeights) { 161 161 var arcs = (List<IArc>)((IVertex)n).InArcs; // at this moment n will have been added as a child to the next trace node 162 163 // TODO: try to simplify the code below 162 164 for (int i = 0; i < arcs.Count; ++i) { 163 165 var td = (TraceData)((IArc<IDeepCloneable>)arcs[i]).Data; 164 166 var p = (IGenealogyGraphNode<ISymbolicExpressionTree>)arcs[i].Source; 165 // TODO: the first part of the check below represents a necessary but not sufficient condition166 // TODO: therefore, a Difference check is also performed, it would be nice to make this code more ellegant167 if (td.LastFragmentIndex == td.SubtreeIndex && fragment.Root.Difference(NodeAt(p.Data, td.SubtreeIndex)) == null) {168 arcs[i].Weight++; 167 var s = NodeAt(p.Data, td.SubtreeIndex); 168 if (td.LastFragmentIndex == td.SubtreeIndex && fragment.Root.Difference(s) == null) { 169 foreach (var ss in s.IterateNodesPrefix()) ss.NodeWeight++; // the node weight will represent the total sample count for a given node 170 arcs[i].Weight++; // the arc weights (since there are multiple arcs) will sum up to the same count but give more detail 169 171 break; 170 172 }
Note: See TracChangeset
for help on using the changeset viewer.