Changeset 12231 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4
- Timestamp:
- 03/20/15 18:20:59 (10 years ago)
- Location:
- branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking
- Files:
-
- 1 deleted
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymbolicDataAnalysisGenealogyGraphView.cs
r12225 r12231 100 100 var fragment = data as IFragment<ISymbolicExpressionTreeNode>; 101 101 var td = data as TraceData; 102 // double max = Content.Vertices.SelectMany(x => x.Data.IterateNodesPrefix()).Max(x => x.NodeWeight); 103 102 // double max = Content.Vertices.Max(x => x.Data.IterateNodesPrefix().Max(y => y.NodeWeight)); 103 104 // calculate max only in the current generation 105 double max = Content.GetByRank(graphNode.Rank).Max(x => ((IGenealogyGraphNode<ISymbolicExpressionTree>)x).Data.IterateNodesPrefix().Max(y => y.NodeWeight)); 106 if (max.IsAlmost(0)) max = 1; 107 int c = ColorGradient.Colors.Count - 1; 108 const int alpha = 100; 104 109 if (fragment != null) { 105 // treeChart_HighlightSubtree(graphNode.Data.NodeAt(fragment.Index1)); 110 // highlight the fragment with a blue line color 111 foreach (var n in graphNode.Data.NodeAt(fragment.Index1).IterateNodesPrefix()) { 112 treeChart_HighlightSubtree(n, Color.CornflowerBlue); 113 } 114 // highlight all the nodes according to their sample count 106 115 var nodes = graphNode.Data.IterateNodesPrefix().ToList(); 107 int c = ColorGradient.Colors.Count - 1; 116 foreach (var n in nodes.Skip(1)) { 117 var i = (int)Math.Round(n.NodeWeight / max * c); 118 var fillColor = Color.FromArgb(alpha, ColorGradient.Colors[i]); 119 treeChart_HighlightSubtree(n, null, fillColor); 120 } 121 } else if (td != null) { 122 var nodes = graphNode.Data.IterateNodesPrefix().ToList(); 108 123 foreach (var n in nodes.Skip(1)) { // skip program root symbol 109 // var i = (int)Math.Round(n.NodeWeight / max * c); 110 // const int alpha = 50; 111 // var fillColor = Color.FromArgb(alpha, ColorGradient.Colors[i]); 112 113 // treeChart_HighlightSubtree(n, null, fillColor); 114 } 115 } else if (td != null) { 116 117 var nodes = graphNode.Data.IterateNodesPrefix().ToList(); 118 int c = ColorGradient.Colors.Count - 1; 119 foreach (var n in nodes.Skip(1)) { // skip program root symbol 120 // var i = (int)Math.Round(n.NodeWeight / max * c); 121 // const int alpha = 50; 122 // var fillColor = Color.FromArgb(alpha, ColorGradient.Colors[i]); 123 124 // treeChart_HighlightSubtree(n, null, fillColor); 125 } 126 124 var i = (int)Math.Round(n.NodeWeight / max * c); 125 var fillColor = Color.FromArgb(alpha, ColorGradient.Colors[i]); 126 treeChart_HighlightSubtree(n, null, fillColor); 127 } 127 128 treeChart_HighlightSubtree(nodes[td.LastSubtreeIndex], Color.Orange); 128 129 treeChart_HighlightSubtree(nodes[td.LastFragmentIndex], Color.CornflowerBlue); … … 141 142 142 143 switch (args.Button) { 143 case MouseButtons.Left: 144 SelectedSubtree = subtree; 145 if (trace) { 146 // perform fragment tracing 147 var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)genealogyGraphChart.SelectedGraphNode; 148 var subtreeIndex = graphNode.Data.IterateNodesPrefix().ToList().IndexOf(subtree); 149 var traceGraph = TraceCalculator.TraceSubtree(graphNode, subtreeIndex, updateVertexWeights: true, updateSubtreeWeights: true, cacheTraceNodes: true); 150 if (traceGraph.Vertices.Any()) { 151 genealogyGraphChart.UpdateEnabled = false; 152 genealogyGraphChart.ClearPrimitives(); 153 var traceVertices = traceGraph.Vertices.ToList(); 154 var genealogyNodes = traceVertices.Select(v => Content.GetByContent(v.Data)).ToList(); 155 // color graph vertices according to their weight 156 double max = traceGraph.Vertices.Max(x => x.Data.IterateNodesPrefix().Max(n => x.Weight)); 157 for (int i = 0; i < genealogyNodes.Count; ++i) { 158 var g = genealogyNodes[i]; 159 g.Weight = traceVertices[i].Weight; 160 var v = genealogyGraphChart.GetMappedNode(g); 161 if (v != null) { 162 v.Brush = new SolidBrush(ColorGradient.Colors[(int)Math.Round(g.Weight * (ColorGradient.Colors.Count - 1) / max)]); 144 case MouseButtons.Left: { 145 SelectedSubtree = subtree; 146 if (trace) { 147 // TODO: maybe highlight based on per generation maximum 148 double max = Content.Vertices.Max(x => x.Data.IterateNodesPrefix().Average(y => y.NodeWeight)); 149 // perform fragment tracing 150 var graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)genealogyGraphChart.SelectedGraphNode; 151 var subtreeIndex = graphNode.Data.IterateNodesPrefix().ToList().IndexOf(subtree); 152 var traceGraph = TraceCalculator.TraceSubtree(graphNode, subtreeIndex, updateVertexWeights: false, updateSubtreeWeights: false, cacheTraceNodes: true); 153 if (traceGraph.Vertices.Any()) { 154 var vertices = traceGraph.Vertices.Select(x => Content.GetByContent(x.Data)); 155 genealogyGraphChart.UpdateEnabled = false; 156 genealogyGraphChart.ClearPrimitives(); 157 foreach (var v in vertices) { 158 var vNode = genealogyGraphChart.GetMappedNode(v); 159 var wSum = v.Data.IterateNodesPrefix().Average(x => x.NodeWeight); 160 // use a grayscal gradient 161 var color = ColorGradient.GrayscaledColors[(int)Math.Round(wSum / max * (ColorGradient.GrayscaledColors.Count - 1))]; 162 vNode.Brush = new SolidBrush(color); 163 } 164 genealogyGraphChart.UpdateEnabled = true; 165 genealogyGraphChart.EnforceUpdate(); 166 167 if (openNew_CheckBox.Checked) { 168 MainFormManager.MainForm.ShowContent(traceGraph); // display the fragment graph on the screen 163 169 } 164 170 } 165 166 genealogyGraphChart.UpdateEnabled = true; 167 genealogyGraphChart.EnforceUpdate(); 168 169 if (openNew_CheckBox.Checked) 170 MainFormManager.MainForm.ShowContent(traceGraph); // display the fragment graph on the screen 171 } else { 172 // perform matching like it was done before 173 // currently there is no possibility to specify the subtree matching criteria 174 var trees = Content.Vertices.Select(x => x.Data); 175 var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(subtree, comparer)); 176 177 var matchingVertices = matchingTrees.Select(x => Content.GetByContent(x)); 178 graphChart_HighlightMatchingVertices(matchingVertices); 171 179 } 172 } else { 173 // perform matching like it was done before 174 // currently there is no possibility to specify the subtree matching criteria 175 var trees = Content.Vertices.Select(x => x.Data); 176 var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(subtree, comparer)); 177 178 var matchingVertices = matchingTrees.Select(x => Content.GetByContent(x)); 179 graphChart_HighlightMatchingVertices(matchingVertices); 180 } 181 break; 182 case MouseButtons.Middle: 183 var index = SelectedSubtree.IterateNodesPrefix().ToList().IndexOf(subtree); 184 if (index > 0) { 185 var s = ClonedSubtree.NodeAt(index); 186 s.Parent.RemoveSubtree(s.Parent.IndexOfSubtree(s)); 187 188 var trees = Content.Vertices.Select(x => x.Data); 189 var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(ClonedSubtree, comparer)); 190 191 var matchingVertices = matchingTrees.Select(x => Content.GetByContent(x)); 192 treeChart_HighlightSubtree(subtree, Color.Black, Color.White); 193 graphChart_HighlightMatchingVertices(matchingVertices); 194 } 195 break; 180 break; 181 } 182 case MouseButtons.Middle: { 183 var index = SelectedSubtree.IterateNodesPrefix().ToList().IndexOf(subtree); 184 if (index > 0) { 185 var s = ClonedSubtree.NodeAt(index); 186 s.Parent.RemoveSubtree(s.Parent.IndexOfSubtree(s)); 187 188 var trees = Content.Vertices.Select(x => x.Data); 189 var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(ClonedSubtree, comparer)); 190 191 var matchingVertices = matchingTrees.Select(x => Content.GetByContent(x)); 192 treeChart_HighlightSubtree(subtree, Color.Black, Color.White); 193 graphChart_HighlightMatchingVertices(matchingVertices); 194 } 195 break; 196 } 196 197 } 197 198 }
Note: See TracChangeset
for help on using the changeset viewer.