Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/03/12 15:09:52 (12 years ago)
Author:
bburlacu
Message:

#1772: Modified genealogy graph chart and view to reflect changes in the class hierarchy.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphView.cs

    r8248 r8556  
    3636  [Content(typeof(SymbolicExpressionTreeGenealogyGraph), IsDefaultView = true)]
    3737  public sealed partial class GenealogyGraphView : ItemView {
    38     private VisualSymbolicExpressionTreeNode _selectedVisualSymbolicExpressionTreeNode;
    39 
     38    private VisualSymbolicExpressionTreeNode selectedVisualSymbExprTreeNode;
    4039    public new SymbolicExpressionTreeGenealogyGraph Content {
    4140      get { return (SymbolicExpressionTreeGenealogyGraph)base.Content; }
     
    4342    }
    4443
     44    private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> clonedNodeMap;
     45
    4546    public GenealogyGraphView()
    4647      : base() {
    4748      InitializeComponent();
     49      // set button icons here because if set in the designer file, they get overwritten
     50      this.moveModeButton.Image = Common.Resources.VSImageLibrary.Pointer;
     51      this.zoomModeButton.Image = Common.Resources.VSImageLibrary.Zoom;
     52      this.selectModeButton.Image = Common.Resources.VSImageLibrary.Object;
     53
     54
    4855      similarityModeSelector.SelectedIndex = 0; // set default similarity mode to "exact"
    4956    }
     
    6168      genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked;
    6269      symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked += treeChart_SymbolicExpressionTreeNodeClicked;
     70      symbolicExpressionTreeChart.SymbolicExpressionTreeNodeDoubleClicked += treeChart_SymbolicExpressionTreeNodeDoubleClicked;
    6371    }
    6472
     
    7179      else {
    7280        genealogyGraphChart.Graph = Content;
    73         var best = Content.Values.OrderByDescending(x => genealogyGraphChart.Graph[x].Quality).First();
    74         symbolicExpressionTreeChart.Tree = (ISymbolicExpressionTree)best.Data;
     81        var best = Content.Nodes.OrderByDescending(x => x.Quality).First();
     82        symbolicExpressionTreeChart.Tree = best.SymbolicExpressionTree;
    7583      }
    7684    }
     
    9199      // the type hierarchy goes like this: VisualGenealogyGraphNode --> GenealogyGraphNode --> symbolicExpressionTree
    92100      var visualGenealogyGraphNode = (VisualGenealogyGraphNode)sender;
    93       var genealogyGraphNode = (GenealogyGraphNode)visualGenealogyGraphNode.Data;
    94       symbolicExpressionTreeChart.Tree = (ISymbolicExpressionTree)genealogyGraphNode.Data;
     101      var genealogyGraphNode = (SymbolicExpressionGenealogyGraphNode)visualGenealogyGraphNode.Data;
     102      symbolicExpressionTreeChart.Tree = genealogyGraphNode.SymbolicExpressionTree;
    95103      // highlight the relevant fragment in the symbolic expression tree
    96       if (_selectedVisualSymbolicExpressionTreeNode != null) {
     104      selectedVisualSymbExprTreeNode = null;
     105
     106      bool repaint = false;
     107
     108      // paint highlighted nodes in symbolic expression tree
     109      if (selectedVisualSymbExprTreeNode != null) {
     110        // clear selected subtree from the tree chart
    97111        var nodes = symbolicExpressionTreeChart.Tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
    98         var fragments = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
    99         int index = SymbolicExpressionTreeMatching.FindMatch(nodes, fragments, similarityModeSelector.SelectedIndex);
     112        var fragments = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>;
     113        var similarityLevel = Enum.GetNames(typeof(SimilarityLevel))[similarityModeSelector.SelectedIndex];
     114        int index = SymbolicExpressionTreeMatching.FindMatch(nodes, fragments, (SimilarityLevel)Enum.Parse(typeof(SimilarityLevel), similarityLevel));
    100115        if (index != -1) {
    101           _selectedVisualSymbolicExpressionTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index]);
    102           var subtree = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode;
    103           foreach (var visualNode in subtree.IterateNodesBreadth().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node))) {
    104             visualNode.FillColor = Color.LightBlue;
    105           }
    106           symbolicExpressionTreeChart.Repaint();
     116          selectedVisualSymbExprTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index]);
     117          var subtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode;
     118          foreach (var node in subtree.IterateNodesBreadth()) {
     119            var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
     120            visualNode.LineColor = Color.Blue;
     121          }
     122          repaint = true;
    107123        }
    108124      }
     125      // paint graph nodes
    109126      var tree = symbolicExpressionTreeChart.Tree;
    110       var graphNode = Content.GetNode(tree);
    111       if (graphNode.InEdges != null) {
    112         var arc = graphNode.InEdges.Find(a => a.Data != null);
    113         if (arc != null) {
    114           var fragment = arc.Data as ISymbolicExpressionTreeNode;
    115           foreach (var node in fragment.IterateNodesBreadth()) {
    116             var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
    117             if (visualNode == null)
    118               continue;
    119             visualNode.FillColor = Color.LightGreen;
    120           }
    121           symbolicExpressionTreeChart.Repaint();
    122         }
    123       }
     127      var graphNodes = Content.Nodes.Where(n => n.SymbolicExpressionTree == tree).ToList();
     128      if (graphNodes.Count > 0) {
     129        foreach (var graphNode in graphNodes)
     130          if (graphNode != null && graphNode.InEdges != null) {
     131            var arc = graphNode.InEdges.Find(a => a.Data != null);
     132            if (arc != null) {
     133              var fragment = arc.Data as ISymbolicExpressionTreeNode;
     134              foreach (var node in fragment.IterateNodesBreadth()) {
     135                var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
     136                if (visualNode == null)
     137                  continue;
     138                visualNode.LineColor = Color.Orange;
     139              }
     140            }
     141            repaint = true;
     142          }
     143      }
     144      if (repaint)
     145        symbolicExpressionTreeChart.Repaint();
    124146    }
    125147
     
    140162
    141163    private void treeChart_SymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) {
    142       _selectedVisualSymbolicExpressionTreeNode = (VisualSymbolicExpressionTreeNode)sender;
    143       // find out which individuals in the genealogy graph contain this specific subtree
    144       var treeNode = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode;
     164      ISymbolicExpressionTreeNode selectedSubtree = null;
     165      genealogyGraphChart.Chart.UpdateEnabled = false;
     166      switch (e.Button) {
     167        case MouseButtons.Left: {
     168            selectedVisualSymbExprTreeNode = (VisualSymbolicExpressionTreeNode)sender;
     169            if (selectedVisualSymbExprTreeNode == null) return;
     170            // find out which individuals in the genealogy graph contain this specific subtree
     171            selectedSubtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode;
     172            // clone every node in the selected subtree so that edit operations are possible without altering the original subtree
     173            // save the originalNode-->clone mapping to make it easier to work with subtrees
     174            if (clonedNodeMap == null)
     175              clonedNodeMap = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>();
     176            clonedNodeMap.Clear();
     177            var selectedSubtreeClone = selectedSubtree.Clone() as SymbolicExpressionTreeNode;
     178            var subtreeNodes = selectedSubtree.IterateNodesPostfix().ToList();
     179            var cloneNodes = selectedSubtreeClone.IterateNodesPostfix().ToList();
     180            for (int i = 0; i != subtreeNodes.Count; ++i)
     181              clonedNodeMap.Add(subtreeNodes[i], cloneNodes[i]);
     182            // highlight subtree nodes in the tree chart
     183            foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPostfix()) {
     184              var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
     185              visualNode.FillColor = Color.Transparent;
     186            }
     187            selectedSubtree.ForEachNodePostfix(node => {
     188              symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.LightBlue;
     189            });
     190          }
     191          break;
     192        case MouseButtons.Middle: {
     193            var visualNode = (VisualSymbolicExpressionTreeNode)sender;
     194            if (selectedVisualSymbExprTreeNode == null || selectedVisualSymbExprTreeNode == visualNode)
     195              return;
     196            selectedSubtree = clonedNodeMap[selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode];
     197            var selectedNode = visualNode.SymbolicExpressionTreeNode;
     198            if (clonedNodeMap.ContainsKey(selectedNode)) {
     199              var selected = clonedNodeMap[selectedNode];
     200              var parent = selected.Parent;
     201              parent.RemoveSubtree(parent.IndexOfSubtree(selected));
     202              selectedNode.ForEachNodePostfix(node => {
     203                symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent;
     204                clonedNodeMap.Remove(node);
     205              });
     206            }
     207          }
     208          break;
     209      }
     210      // update visual graph nodes that contain matching trees
    145211      Color[] colors = { Color.LightSkyBlue, Color.PaleGreen, Color.Tan };
    146       // update visual graph nodes
    147       genealogyGraphChart.Chart.UpdateEnabled = false;
    148212      genealogyGraphChart.ClearAllNodes(); // clear node colors
    149       // color each graph node according to the degree to which it matches the selected tree fragment
    150       foreach (var i in Enum.GetValues(typeof(SymbolicExpressionTreeMatching.SimilarityLevel)).Cast<int>().Reverse()) {
    151         var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, i).ToList();
    152         if (owners.Any()) genealogyGraphChart.HighlightNodes(owners, colors[i]); // highlight matching individuals from the genealogy
     213      // color each graph node according to the degree to which it matches the selected tree fragment
     214      var similarityValues = Enum.GetValues(typeof(SimilarityLevel)).Cast<SimilarityLevel>().ToList();
     215      foreach (var graphNode in genealogyGraphChart.Graph.Nodes) {
     216        var tree = graphNode.SymbolicExpressionTree;
     217        for (int i = 0; i != similarityValues.Count; ++i) {
     218          if (tree.ContainsFragment(selectedSubtree, similarityValues[i])) {
     219            genealogyGraphChart.HighlightNode(graphNode, colors[i]);
     220            break;
     221          }
     222        }
    153223      }
    154224      genealogyGraphChart.Chart.UpdateEnabled = true;
    155225      genealogyGraphChart.Chart.EnforceUpdate();
    156 
    157       // highlight subtree nodes in the tree chart
    158       foreach (var visualNode in symbolicExpressionTreeChart.Tree.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))
    159         visualNode.FillColor = Color.Transparent;
    160 
    161       foreach (var visualNode in treeNode.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))
    162         visualNode.FillColor = Color.LightBlue;
    163 
    164226      // refresh the tree chart
    165227      symbolicExpressionTreeChart.Repaint();
    166228    }
    167229
     230    private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) {
     231    }
     232
    168233    private void similarityModeSelector_SelectedIndexChanged(object sender, EventArgs e) {
    169       if (_selectedVisualSymbolicExpressionTreeNode == null) return;
    170       var treeNode = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode;
    171       var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, similarityModeSelector.SelectedIndex).ToList();
     234      if (selectedVisualSymbExprTreeNode == null) return;
     235      var treeNode = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode;
     236      var similarityLevel = Enum.GetNames(typeof(SimilarityLevel))[similarityModeSelector.SelectedIndex];
     237      var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, (SimilarityLevel)Enum.Parse(typeof(SimilarityLevel), similarityLevel)).ToList();
    172238      if (owners.Any()) {
    173239        genealogyGraphChart.Chart.UpdateEnabled = false;
    174240        genealogyGraphChart.ClearAllNodes(); // clear the fill color of all nodes
    175         genealogyGraphChart.HighlightNodes(owners, Color.LightSkyBlue); // highlight matching individuals from the genealogy
     241        genealogyGraphChart.HighlightNodes(owners, Color.LightSkyBlue);
     242        // highlight matching individuals from the genealogy
    176243        genealogyGraphChart.Chart.UpdateEnabled = true;
    177244      }
    178245      genealogyGraphChart.Chart.EnforceUpdate();
    179246      // highlight subtree nodes in the tree chart
    180       foreach (var visualNode in symbolicExpressionTreeChart.Tree.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))
     247      foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPostfix()) {
     248        var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
    181249        visualNode.FillColor = Color.Transparent;
    182       foreach (var visualNode in treeNode.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))
     250      }
     251      foreach (var node in treeNode.IterateNodesPostfix()) {
     252        var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node);
    183253        visualNode.FillColor = Color.LightBlue;
     254      }
    184255    }
    185256    #endregion
Note: See TracChangeset for help on using the changeset viewer.