Changeset 9420 for branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/LineageExplorerView.cs
- Timestamp:
- 05/02/13 13:21:35 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/LineageExplorerView.cs
r9250 r9420 7 7 using HeuristicLab.Core.Views; 8 8 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 9 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views; 9 10 using HeuristicLab.MainForm; 10 11 using HeuristicLab.Problems.DataAnalysis.Symbolic; … … 17 18 private List<SymbolicExpressionGenealogyGraphNode> lineage; 18 19 20 private Dictionary<ISymbolicExpressionTree, Dictionary<ISymbolicExpressionTreeNode, double>> fragmentFrequencies; 21 19 22 public new LineageExplorer Content { 20 23 get { return (LineageExplorer)base.Content; } … … 66 69 var treeNode = scopeListTreeView.SelectedNode; 67 70 var symbExprTree = treeMap[treeNode]; 71 72 fragmentFrequencies = fragmentFrequencies ?? new Dictionary<ISymbolicExpressionTree, Dictionary<ISymbolicExpressionTreeNode, double>>(); 73 74 if (fragmentFrequencies.ContainsKey(symbExprTree) && false) { 75 // colorize tree nodes according to fragment frequencies 76 symbolicExpressionTreeChart.SuspendRepaint = true; 77 var frequencies = fragmentFrequencies[symbExprTree]; 78 79 foreach (var node in symbExprTree.IterateNodesBreadth()) { 80 double freq = frequencies[node]; 81 int index = (int)Math.Floor(freq * ColorGradient.Colors.Count / scopeListTreeView.GetNodeCount(false)); 82 if (index == ColorGradient.Colors.Count) index--; 83 var color = ColorGradient.Colors[index]; 84 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 85 visualNode.FillColor = Color.FromArgb(200, color); 86 } 87 symbolicExpressionTreeChart.SuspendRepaint = false; 88 symbolicExpressionTreeChart.Repaint(); 89 } 90 // highlight crossover fragment 68 91 HighlightFragment(symbExprTree); 69 92 70 var graphNode = Content.GenealogyGraph.GetGraphNodes(symbExprTree). First();93 var graphNode = Content.GenealogyGraph.GetGraphNodes(symbExprTree).Last(); 71 94 lineage = lineage ?? new List<SymbolicExpressionGenealogyGraphNode>(); 72 95 lineage.Clear(); … … 78 101 lineage.Add(gn); 79 102 } 80 lineage.Reverse(); // incre sing order by generation103 lineage.Reverse(); // increasing order by generation 81 104 82 105 // update the righthand side tree view … … 108 131 return; 109 132 } 110 var fragment = (IFragment)graphNode.InEdges[0].Data;133 var fragment = graphNode.InEdges.Count == 1 ? (IFragment)graphNode.InEdges[0].Data : (IFragment)graphNode.InEdges[1].Data; 111 134 if (fragment.Root == null) { 112 135 symbolicExpressionTreeChart.SuspendRepaint = false; … … 130 153 // the individual can occur multiple times in the graph if it is(was) elite. we take the first occurence. 131 154 var graphNode = Content.GenealogyGraph.GetGraphNodes(symbolicExpressionTreeChart.Tree).First(); 155 var trees = Content.GenealogyGraph.Nodes.Where(x => x.Rank.IsAlmost(graphNode.Rank)).Select(x => x.SymbolicExpressionTree).ToList(); 156 132 157 var fragments = graphNode.SymbolicExpressionTree.IterateNodesBreadth().Select(n => new Fragment(n)); 133 var trees = Content.Trees.Select(t => t.Item1).ToList();134 var hashset = new HashSet<ISymbolicExpressionTree>();135 158 136 159 var similarityComparer = new SymbolicExpressionTreeNodeSimilarityComparer { … … 140 163 }; 141 164 165 var canonicalSorter = new SymbolicExpressionTreeCanonicalSorter(); 166 167 fragmentFrequencies = fragmentFrequencies ?? new Dictionary<ISymbolicExpressionTree, Dictionary<ISymbolicExpressionTreeNode, double>>(); 168 169 if (!fragmentFrequencies.ContainsKey(graphNode.SymbolicExpressionTree)) { 170 fragmentFrequencies[graphNode.SymbolicExpressionTree] = new Dictionary<ISymbolicExpressionTreeNode, double>(); 171 } 172 173 fragmentFrequencies[graphNode.SymbolicExpressionTree].Clear(); 174 142 175 symbolicExpressionTreeChart.SuspendRepaint = true; 143 176 foreach (var f in fragments) { 144 177 double freq = 0; 178 145 179 foreach (var t in trees) { 146 180 if (t.Root.ContainsFragment(f, similarityComparer)) ++freq; 147 int index = (int)Math.Floor(freq * ColorGradient.Colors.Count / trees.Count); 148 if (index == ColorGradient.Colors.Count) index--; 149 var color = ColorGradient.Colors[index]; 150 foreach (var node in f.Root.IterateNodesBreadth()) { 151 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 152 visualNode.FillColor = Color.FromArgb(200, color); 153 } 154 } 155 } 181 } 182 183 fragmentFrequencies[graphNode.SymbolicExpressionTree].Add(f.Root, freq); 184 185 // colorize tree nodes according to fragment frequencies 186 int index = (int)Math.Floor(freq * ColorGradient.Colors.Count / trees.Count); 187 if (index == ColorGradient.Colors.Count) index--; 188 var color = ColorGradient.Colors[index]; 189 foreach (var node in f.Root.IterateNodesBreadth()) { 190 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 191 visualNode.FillColor = Color.FromArgb(200, color); 192 } 193 } 194 156 195 symbolicExpressionTreeChart.SuspendRepaint = false; 157 196 symbolicExpressionTreeChart.Repaint(); … … 172 211 } 173 212 using (var dialog = new GenealogyGraphDialog { Graph = graph }) { 213 dialog.ShowDialog(this); 214 } 215 } 216 217 private void button1_Click(object sender, EventArgs e) { 218 using (var dialog = new FrequentFragmentsDialog()) { 219 var panel = new Panel { Dock = DockStyle.Left, Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom }; 220 221 panel.Controls.Add(new SymbolicExpressionTreeChart() { Tree = treeMap.Values.First() }); 222 panel.Controls.Add(new Label { Text = "Fragment frequency." }); 223 224 dialog.fragmentsPanel.Controls.Add(panel); 225 226 dialog.ShowDialog(this); 227 } 228 } 229 230 private void showFrequentFragmentsButton_Click(object sender, EventArgs e) { 231 int bestN; 232 bool success = int.TryParse(bestNTextBox.Text, out bestN); 233 if (!success) bestN = 10; 234 var tuples = Content.Trees.Select(t => new { Tree = t.Item1, Quality = t.Item2 }).OrderByDescending(x => x.Quality).ToList(); 235 var bestTrees = tuples.Take(bestN).Select(x => x.Tree).ToList(); 236 237 var similarityComparer = new SymbolicExpressionTreeNodeSimilarityComparer { 238 MatchConstantValues = false, 239 MatchVariableNames = true, 240 MatchVariableWeights = false 241 }; 242 243 var fragments = bestTrees.SelectMany(t => t.IterateNodesBreadth()).Where(n => n.GetLength() >= 3).Distinct(similarityComparer).Select(n => new Fragment(n)); 244 245 double bestNQuality = tuples.Take(bestN).Sum(x => x.Quality); // average quality of best N individuals in the population 246 247 using (var dialog = new FrequentFragmentsDialog()) { 248 foreach (var fragment in fragments.Take(20)) { 249 double avgQuality = bestNQuality; 250 double frequency = bestN; 251 foreach (var t in tuples.Skip(bestN)) { 252 var tree = t.Tree; 253 if (tree.Root.ContainsFragment(fragment, similarityComparer)) { 254 avgQuality += t.Quality; 255 frequency++; 256 } 257 } 258 if (frequency > 0.2) { 259 var panel = new Panel { 260 Dock = DockStyle.Left, 261 Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom 262 }; 263 264 panel.Controls.Add(new SymbolicExpressionTreeChart() { Tree = treeMap.Values.First() }); 265 panel.Controls.Add(new Label { Text = "Fragment frequency." }); 266 267 dialog.fragmentsPanel.Controls.Add(panel); 268 } 269 } 174 270 dialog.ShowDialog(this); 175 271 }
Note: See TracChangeset
for help on using the changeset viewer.