Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphView.cs @ 9084

Last change on this file since 9084 was 9084, checked in by bburlacu, 11 years ago

#1772: HeuristicLab.EvolutionaryTracking.Views: refactored the GenealogyGraphChart and the GenealogyGraphView. Fixed lineage display bug.

File size: 9.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using System.Windows.Forms;
27using HeuristicLab.Core.Views;
28using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
29using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
30using HeuristicLab.MainForm;
31using HeuristicLab.Problems.DataAnalysis.Symbolic;
32using HeuristicLab.Visualization;
33
34namespace HeuristicLab.EvolutionaryTracking.Views {
35  [View("SymbolicExpressionTreeGenealogyGraph")]
36  [Content(typeof(SymbolicExpressionTreeGenealogyGraph), IsDefaultView = true)]
37  public sealed partial class GenealogyGraphView : ItemView {
38    private VisualSymbolicExpressionTreeNode selectedVisualSymbExprTreeNode;
39    private SymbolicExpressionTreeNodeSimilarityComparer comparer;
40    private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> clonedNodes;
41
42    public new SymbolicExpressionTreeGenealogyGraph Content {
43      get { return (SymbolicExpressionTreeGenealogyGraph)base.Content; }
44      set { base.Content = value; }
45    }
46
47    public GenealogyGraphView()
48      : base() {
49      InitializeComponent();
50      // set button icons here because if set in the designer file, they get overwritten
51      this.moveModeButton.Image = Common.Resources.VSImageLibrary.Pointer;
52      this.zoomModeButton.Image = Common.Resources.VSImageLibrary.Zoom;
53      this.selectModeButton.Image = Common.Resources.VSImageLibrary.Object;
54      comparer = new SymbolicExpressionTreeNodeSimilarityComparer {
55        MatchConstantValues = true,
56        MatchVariableWeights = true,
57        MatchVariableNames = true
58      };
59    }
60
61    protected override void DeregisterContentEvents() {
62      // TODO: Deregister your event handlers here
63      genealogyGraphChart.GenealogyGraphNodeClicked -= graphChart_GenealogyGraphNodeClicked;
64      symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked -= treeChart_SymbolicExpressionTreeNodeClicked;
65      base.DeregisterContentEvents();
66    }
67
68    protected override void RegisterContentEvents() {
69      base.RegisterContentEvents();
70      // TODO: Register your event handlers here
71      genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked;
72      symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked += treeChart_SymbolicExpressionTreeNodeClicked;
73      symbolicExpressionTreeChart.SymbolicExpressionTreeNodeDoubleClicked += treeChart_SymbolicExpressionTreeNodeDoubleClicked;
74    }
75
76    #region Event Handlers (Content)
77    // TODO: Put event handlers of the content here
78    protected override void OnContentChanged() {
79      base.OnContentChanged();
80      if (Content == null)
81        genealogyGraphChart.Graph = null;
82      else {
83        genealogyGraphChart.Graph = Content;
84        var best = Content.Nodes.OrderByDescending(x => x.Quality).First();
85        symbolicExpressionTreeChart.Tree = best.SymbolicExpressionTree;
86      }
87    }
88
89    private void Content_GraphChanged(object sender, EventArgs e) {
90    }
91
92    protected override void SetEnabledStateOfControls() {
93      base.SetEnabledStateOfControls();
94      genealogyGraphChart.Enabled = Content != null;
95    }
96    #endregion
97
98    #region Event Handlers (child controls)
99
100    // TODO: Put event handlers of child controls here.
101    private void graphChart_GenealogyGraphNodeClicked(object sender, MouseEventArgs e) {
102      // the type hierarchy goes like this: VisualGenealogyGraphNode --> GenealogyGraphNode --> SymbolicExpressionTree
103      var visualGenealogyGraphNode = (VisualGenealogyGraphNode)sender;
104      var genealogyGraphNode = visualGenealogyGraphNode.Data;
105      symbolicExpressionTreeChart.Tree = genealogyGraphNode.SymbolicExpressionTree;
106      if (genealogyGraphNode.InEdges == null) return;
107      var arc = genealogyGraphNode.InEdges.First(x => x.Source != x.Target && x.Data != null);
108      if (arc == null) return;
109      var fragment = (IFragment)arc.Data;
110      foreach (var node in fragment.Root.IterateNodesBreadth()) {
111        var visualSymbExprTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
112        visualSymbExprTreeNode.LineColor = Color.OrangeRed;
113      }
114      symbolicExpressionTreeChart.Repaint(); // pain orange nodes
115    }
116
117    private void moveModeButton_CheckedChanged(object sender, EventArgs e) {
118      var btn = (RadioButton)sender;
119      if (btn.Checked) { genealogyGraphChart.Chart.Mode = ChartMode.Move; }
120    }
121
122    private void zoomModeButton_CheckedChanged(object sender, EventArgs e) {
123      var btn = (RadioButton)sender;
124      if (btn.Checked) { genealogyGraphChart.Chart.Mode = ChartMode.Zoom; }
125    }
126
127    private void selectModeButton_CheckedChanged(object sender, EventArgs e) {
128      var btn = (RadioButton)sender;
129      if (btn.Checked) { genealogyGraphChart.Chart.Mode = ChartMode.Select; }
130    }
131
132    private void treeChart_SymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) {
133      genealogyGraphChart.Chart.UpdateEnabled = false;
134      switch (e.Button) {
135        case MouseButtons.Left: {
136            selectedVisualSymbExprTreeNode = (VisualSymbolicExpressionTreeNode)sender;
137            if (selectedVisualSymbExprTreeNode == null) return;
138            ISymbolicExpressionTreeNode selectedSubtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode;
139            var clonedSubtree = (ISymbolicExpressionTreeNode)selectedSubtree.Clone();
140            // map original nodes to cloned nodes
141            clonedNodes = selectedSubtree.IterateNodesPrefix()
142                                         .Zip(clonedSubtree.IterateNodesPrefix(), (original, clone) => new { original, clone })
143                                         .ToDictionary(p => p.original, p => p.clone);
144
145            foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPrefix()) {
146              symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent;
147            }
148            foreach (var node in selectedSubtree.IterateNodesPrefix()) {
149              symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.LightBlue;
150            }
151            break;
152          }
153        case MouseButtons.Middle: {
154            var visualNode = (VisualSymbolicExpressionTreeNode)sender;
155            if (selectedVisualSymbExprTreeNode == null || selectedVisualSymbExprTreeNode == visualNode) return;
156            var selectedNode = visualNode.SymbolicExpressionTreeNode;
157            if (clonedNodes.ContainsKey(selectedNode)) {
158              var selectedClone = clonedNodes[selectedNode];
159              var parent = selectedClone.Parent;
160              parent.RemoveSubtree(parent.IndexOfSubtree(selectedClone));
161              foreach (var node in selectedNode.IterateNodesPrefix()) {
162                symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent;
163              }
164            }
165            break;
166          }
167      }
168      if (selectedVisualSymbExprTreeNode == null || clonedNodes == null) return;
169      // update visual graph nodes that contain matching trees
170      MatchNodesAndRepaint();
171      // refresh the tree chart
172      symbolicExpressionTreeChart.Repaint();
173    }
174
175    void MatchNodesAndRepaint() {
176      genealogyGraphChart.Chart.UpdateEnabled = false;
177      genealogyGraphChart.ClearAllNodes(); // clear node colors
178      var fragment = new Fragment(clonedNodes[selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode]);
179      var fragmentLength = fragment.Length;
180      genealogyGraphChart.HighlightNodes(from node in genealogyGraphChart.Graph.Nodes
181                                         let tree = node.SymbolicExpressionTree
182                                         where tree.Length >= fragmentLength
183                                         where tree.Root.ContainsFragment(fragment, comparer)
184                                         select tree, Color.DodgerBlue);
185      genealogyGraphChart.Chart.UpdateEnabled = true;
186      genealogyGraphChart.Chart.EnforceUpdate();
187    }
188
189    private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) {
190    }
191    #endregion
192    private void matchConstantsCheckBox_CheckedChanged(object sender, EventArgs e) {
193      comparer.MatchConstantValues = matchConstantsCheckBox.Checked;
194      if (selectedVisualSymbExprTreeNode != null)
195        MatchNodesAndRepaint();
196    }
197
198    private void matchVariableWeightsCheckBox_CheckedChanged(object sender, EventArgs e) {
199      comparer.MatchVariableWeights = matchVariableWeightsCheckBox.Checked;
200      if (selectedVisualSymbExprTreeNode != null)
201        MatchNodesAndRepaint();
202    }
203
204    private void matchVariableNamesCheckBox_CheckedChanged(object sender, EventArgs e) {
205      comparer.MatchVariableNames = matchVariableNamesCheckBox.Checked;
206      if (selectedVisualSymbExprTreeNode != null)
207        MatchNodesAndRepaint();
208    }
209  }
210}
Note: See TracBrowser for help on using the repository browser.