Changeset 10269 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphView.cs
- Timestamp:
- 12/23/13 11:42:24 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.EvolutionTracking.Views/3.4/GenealogyGraphView.cs
r10264 r10269 21 21 22 22 using System; 23 using System.Collections.Generic;24 using System.Drawing;25 23 using System.Linq; 26 24 using System.Windows.Forms; 27 25 using HeuristicLab.Core.Views; 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;29 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;30 26 using HeuristicLab.MainForm; 31 using HeuristicLab.Problems.DataAnalysis.Symbolic;32 27 33 28 namespace HeuristicLab.EvolutionaryTracking.Views { 34 [View(" SymbolicExpressionTreeGenealogyGraph")]35 [Content(typeof( SymbolicExpressionTreeGenealogyGraph), IsDefaultView = true)]29 [View("GenealogyGraph")] 30 [Content(typeof(GenealogyGraph), IsDefaultView = true)] 36 31 public sealed partial class GenealogyGraphView : ItemView { 37 private VisualSymbolicExpressionTreeNode selectedVisualSymbExprTreeNode; 38 private SymbolicExpressionTreeNodeSimilarityComparer comparer; 39 private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> clonedNodes; 40 41 public new SymbolicExpressionTreeGenealogyGraph Content { 42 get { return (SymbolicExpressionTreeGenealogyGraph)base.Content; } 32 public new GenealogyGraph Content { 33 get { return (GenealogyGraph)base.Content; } 43 34 set { base.Content = value; } 44 35 } … … 51 42 this.simpleLineagesCheckBox.Image = Common.Resources.VSImageLibrary.ArrowDown; 52 43 this.lockGenealogyCheckBox.Image = Common.Resources.VSImageLibrary.ProtectForm; 53 54 comparer = new SymbolicExpressionTreeNodeSimilarityComparer {55 MatchConstantValues = true,56 MatchVariableWeights = true,57 MatchVariableNames = true58 };59 44 } 60 45 61 46 protected override void DeregisterContentEvents() { 62 47 // TODO: Deregister your event handlers here 63 genealogyGraphChart.GenealogyGraphNodeClicked -= graphChart_GenealogyGraphNodeClicked; 64 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked -= treeChart_SymbolicExpressionTreeNodeClicked; 65 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeDoubleClicked -= treeChart_SymbolicExpressionTreeNodeDoubleClicked; 66 Content.GraphUpdated -= genealogyGraphUpdated; 48 Content.GraphUpdated -= GenealogyGraphUpdated; 67 49 base.DeregisterContentEvents(); 68 50 } … … 71 53 base.RegisterContentEvents(); 72 54 // TODO: Register your event handlers here 73 genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked; 74 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked += treeChart_SymbolicExpressionTreeNodeClicked; 75 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeDoubleClicked += treeChart_SymbolicExpressionTreeNodeDoubleClicked; 76 Content.GraphUpdated += genealogyGraphUpdated; 55 Content.GraphUpdated += GenealogyGraphUpdated; 77 56 } 78 57 … … 81 60 protected override void OnContentChanged() { 82 61 base.OnContentChanged(); 83 if (Content == null) 84 genealogyGraphChart.Graph = null; 85 else { 86 genealogyGraphChart.Graph = Content; 87 // var best = Content.Nodes.OrderByDescending(x => x.Quality).First(); 88 // symbolicExpressionTreeChart.Tree = best.SymbolicExpressionTree; 89 } 62 genealogyGraphChart.GenealogyGraph = Content ?? null; 90 63 } 91 92 64 private void Content_GraphChanged(object sender, EventArgs e) { 93 65 } 94 95 66 protected override void SetEnabledStateOfControls() { 96 67 base.SetEnabledStateOfControls(); … … 100 71 101 72 #region Event Handlers (child controls) 102 103 // TODO: Put event handlers of child controls here. 104 private void graphChart_GenealogyGraphNodeClicked(object sender, MouseEventArgs e) { 105 // the type hierarchy goes like this: VisualGenealogyGraphNode --> GenealogyGraphNode --> SymbolicExpressionTree 106 var visualGenealogyGraphNode = (VisualGenealogyGraphNode)sender; 107 var genealogyGraphNode = visualGenealogyGraphNode.Data; 108 symbolicExpressionTreeChart.Tree = genealogyGraphNode.SymbolicExpressionTree; 109 110 if (genealogyGraphNode.InEdges == null) return; 111 var arc = genealogyGraphNode.InEdges.Last(x => x.Source != x.Target); 112 if (arc == null || arc.Data == null) return; 113 var fragment = (IFragment)arc.Data; 114 if (fragment.Root == null) return; 115 foreach (var node in fragment.Root.IterateNodesBreadth()) { 116 var visualSymbExprTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 117 visualSymbExprTreeNode.LineColor = Color.OrangeRed; 118 } 119 symbolicExpressionTreeChart.Repaint(); 73 private void GenealogyGraphUpdated(object sender, EventArgs args) { 74 genealogyGraphChart.GenealogyGraph = Content; 120 75 } 121 122 private void genealogyGraphUpdated(object sender, EventArgs args) {123 genealogyGraphChart.Graph = Content;124 }125 126 private void treeChart_SymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) {127 genealogyGraphChart.Chart.UpdateEnabled = false;128 switch (e.Button) {129 case MouseButtons.Left: {130 selectedVisualSymbExprTreeNode = (VisualSymbolicExpressionTreeNode)sender;131 if (selectedVisualSymbExprTreeNode == null) return;132 ISymbolicExpressionTreeNode selectedSubtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode;133 var clonedSubtree = (ISymbolicExpressionTreeNode)selectedSubtree.Clone();134 // map original nodes to cloned nodes135 clonedNodes = selectedSubtree.IterateNodesPrefix()136 .Zip(clonedSubtree.IterateNodesPrefix(), (original, clone) => new { original, clone })137 .ToDictionary(p => p.original, p => p.clone);138 139 foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPrefix()) {140 symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent;141 }142 foreach (var node in selectedSubtree.IterateNodesPrefix()) {143 symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.LightBlue;144 }145 break;146 }147 case MouseButtons.Middle: {148 var visualNode = (VisualSymbolicExpressionTreeNode)sender;149 if (selectedVisualSymbExprTreeNode == null || selectedVisualSymbExprTreeNode == visualNode) return;150 var selectedNode = visualNode.SymbolicExpressionTreeNode;151 if (clonedNodes.ContainsKey(selectedNode)) {152 var selectedClone = clonedNodes[selectedNode];153 var parent = selectedClone.Parent;154 if (parent == null) break;155 int index = parent.IndexOfSubtree(selectedClone);156 if (index == -1) break;157 parent.RemoveSubtree(parent.IndexOfSubtree(selectedClone));158 foreach (var node in selectedNode.IterateNodesPrefix()) {159 symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent;160 }161 }162 break;163 }164 }165 if (selectedVisualSymbExprTreeNode == null || clonedNodes == null) return;166 // update visual graph nodes that contain matching trees167 MatchNodesAndRepaint();168 // refresh the tree chart169 symbolicExpressionTreeChart.Repaint();170 }171 172 76 void MatchNodesAndRepaint() { 173 77 genealogyGraphChart.Chart.UpdateEnabled = false; 174 genealogyGraphChart.ClearAllNodes(); // clear node colors 175 var fragment = new Fragment { Root = clonedNodes[selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode] }; 176 var fragmentLength = fragment.Length; 177 // highlight nodes 178 genealogyGraphChart.HighlightNodes(from node in genealogyGraphChart.Graph.Nodes 179 let tree = node.SymbolicExpressionTree 180 where tree.Length >= fragmentLength 181 where tree.Root.ContainsFragment(fragment, comparer) 182 select tree); 183 // highlight edges that contain a matching fragment 184 var fragmentSimilarityComparer = new SymbolicExpressionTreeFragmentSimilarityComparer { 185 SimilarityComparer = comparer 186 }; 187 var matchingEdges = genealogyGraphChart.Graph.Nodes.Where(n => n.InEdges != null) 188 .SelectMany(n => n.InEdges).Where(edge => edge.Data != null && ((IFragment)edge.Data).Root != null) 189 .Where(edge => fragmentSimilarityComparer.Equals(fragment, (IFragment)edge.Data)); 190 genealogyGraphChart.HighlightArcs(matchingEdges, Color.DodgerBlue); 191 78 genealogyGraphChart.ClearPrimitives(); // clear node colors 192 79 193 80 genealogyGraphChart.Chart.UpdateEnabled = true; … … 198 85 } 199 86 #endregion 200 201 private void matchConstantsCheckBox_CheckedChanged(object sender, EventArgs e) {202 comparer.MatchConstantValues = matchConstantsCheckBox.Checked;203 if (selectedVisualSymbExprTreeNode != null)204 MatchNodesAndRepaint();205 }206 207 private void matchVariableWeightsCheckBox_CheckedChanged(object sender, EventArgs e) {208 comparer.MatchVariableWeights = matchVariableWeightsCheckBox.Checked;209 if (selectedVisualSymbExprTreeNode != null)210 MatchNodesAndRepaint();211 }212 213 private void matchVariableNamesCheckBox_CheckedChanged(object sender, EventArgs e) {214 comparer.MatchVariableNames = matchVariableNamesCheckBox.Checked;215 if (selectedVisualSymbExprTreeNode != null)216 MatchNodesAndRepaint();217 }218 219 87 private void simpleLineagesCheckBox_CheckedChanged(object sender, EventArgs e) { 220 88 genealogyGraphChart.SimpleLineages = simpleLineagesCheckBox.Checked; … … 222 90 223 91 private void highlightAllButton_Click(object sender, EventArgs e) { 224 symbolicExpressionTreeChart.Repaint();225 genealogyGraphChart.HighlightAll();226 92 } 227 93 … … 231 97 232 98 private void highlightRootParentsButton_Click(object sender, EventArgs e) { 233 var nodes = genealogyGraphChart.G raph.Nodes.Where(n => n.InEdges != null && n.InEdges.Count == 2).Select(n => (SymbolicExpressionTreeGenealogyGraphNode)n.InEdges[0].Source).ToList();99 var nodes = genealogyGraphChart.GenealogyGraph.Nodes.Where(n => n.InArcs != null && n.InArcs.Count == 2).Select(n => (GenealogyGraphNode)n.InArcs[0].Source).ToList(); 234 100 genealogyGraphChart.HighlightNodes(nodes); 235 101 } 236 102 237 103 private void highlightSecondaryParentsButton_Click(object sender, EventArgs e) { 238 var nodes = genealogyGraphChart.G raph.Nodes.Where(n => n.InEdges != null && n.InEdges.Count == 2).Select(n => (SymbolicExpressionTreeGenealogyGraphNode)n.InEdges[1].Source).ToList();104 var nodes = genealogyGraphChart.GenealogyGraph.Nodes.Where(n => n.InArcs != null && n.InArcs.Count == 2).Select(n => (GenealogyGraphNode)n.InArcs[1].Source).ToList(); 239 105 genealogyGraphChart.HighlightNodes(nodes); 240 106 }
Note: See TracChangeset
for help on using the changeset viewer.