Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/29/17 16:43:29 (7 years ago)
Author:
bburlacu
Message:

#1772: Refactor SymbolicDataAnalysisGenealogyGraphView

Location:
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymbolicDataAnalysisGenealogyGraphView.Designer.cs

    r12406 r15561  
    4545    /// </summary>
    4646    private void InitializeComponent() {
    47       this.groupBox1 = new System.Windows.Forms.GroupBox();
    48       this.nodeWeightLabel = new System.Windows.Forms.Label();
    49       this.nodeWeightLabelLabel = new System.Windows.Forms.Label();
     47      this.selectedNodeStatusStrip = new System.Windows.Forms.StatusStrip();
     48      this.colorModeLabel = new System.Windows.Forms.Label();
     49      this.nodeColorsComboBox = new System.Windows.Forms.ComboBox();
     50      this.traceCheckBox = new System.Windows.Forms.CheckBox();
     51      this.createNewViewCheckBox = new System.Windows.Forms.CheckBox();
    5052      this.navigateRightButton = new System.Windows.Forms.Button();
    5153      this.navigateLeftButton = new System.Windows.Forms.Button();
    52       this.nodeDegreeLabel = new System.Windows.Forms.Label();
    53       this.nodeDegreeLabelLabel = new System.Windows.Forms.Label();
    54       this.nodeRankLabel = new System.Windows.Forms.Label();
    55       this.nodeRankLabelLabel = new System.Windows.Forms.Label();
    56       this.nodeQualityLabel = new System.Windows.Forms.Label();
    57       this.nodeQualityLabelLabel = new System.Windows.Forms.Label();
    58       this.matchingModeButton = new System.Windows.Forms.CheckBox();
     54      this.lockCheckBox = new System.Windows.Forms.CheckBox();
    5955      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
    6056      this.splitContainer.Panel1.SuspendLayout();
    6157      this.splitContainer.Panel2.SuspendLayout();
    6258      this.splitContainer.SuspendLayout();
    63       this.groupBox1.SuspendLayout();
    6459      this.SuspendLayout();
    6560      //
    6661      // splitContainer
    6762      //
    68       this.splitContainer.Size = new System.Drawing.Size(1241, 700);
     63      this.splitContainer.Location = new System.Drawing.Point(3, 31);
     64      //
     65      // splitContainer.Panel1
     66      //
     67      this.splitContainer.Panel1.Controls.Add(this.selectedNodeStatusStrip);
     68      this.splitContainer.Size = new System.Drawing.Size(1241, 721);
    6969      this.splitContainer.SplitterDistance = 617;
    7070      //
    7171      // viewHost
    7272      //
    73       this.viewHost.Size = new System.Drawing.Size(617, 697);
     73      this.viewHost.Size = new System.Drawing.Size(617, 770);
    7474      //
    7575      // genealogyGraphChart
    7676      //
    77       this.genealogyGraphChart.Size = new System.Drawing.Size(614, 697);
    78       //
    79       // groupBox1
    80       //
    81       this.groupBox1.Controls.Add(this.matchingModeButton);
    82       this.groupBox1.Controls.Add(this.nodeWeightLabel);
    83       this.groupBox1.Controls.Add(this.nodeWeightLabelLabel);
    84       this.groupBox1.Controls.Add(this.navigateRightButton);
    85       this.groupBox1.Controls.Add(this.navigateLeftButton);
    86       this.groupBox1.Controls.Add(this.nodeDegreeLabel);
    87       this.groupBox1.Controls.Add(this.nodeDegreeLabelLabel);
    88       this.groupBox1.Controls.Add(this.nodeRankLabel);
    89       this.groupBox1.Controls.Add(this.nodeRankLabelLabel);
    90       this.groupBox1.Controls.Add(this.nodeQualityLabel);
    91       this.groupBox1.Controls.Add(this.nodeQualityLabelLabel);
    92       this.groupBox1.Location = new System.Drawing.Point(624, 4);
    93       this.groupBox1.Name = "groupBox1";
    94       this.groupBox1.Size = new System.Drawing.Size(617, 44);
    95       this.groupBox1.TabIndex = 2;
    96       this.groupBox1.TabStop = false;
    97       this.groupBox1.Text = "Current Node";
    98       //
    99       // nodeWeightLabel
    100       //
    101       this.nodeWeightLabel.AutoSize = true;
    102       this.nodeWeightLabel.Location = new System.Drawing.Point(285, 20);
    103       this.nodeWeightLabel.Name = "nodeWeightLabel";
    104       this.nodeWeightLabel.Size = new System.Drawing.Size(0, 13);
    105       this.nodeWeightLabel.TabIndex = 8;
    106       //
    107       // nodeWeightLabelLabel
    108       //
    109       this.nodeWeightLabelLabel.AutoSize = true;
    110       this.nodeWeightLabelLabel.Location = new System.Drawing.Point(241, 20);
    111       this.nodeWeightLabelLabel.Name = "nodeWeightLabelLabel";
    112       this.nodeWeightLabelLabel.Size = new System.Drawing.Size(44, 13);
    113       this.nodeWeightLabelLabel.TabIndex = 7;
    114       this.nodeWeightLabelLabel.Text = "Weight:";
     77      this.genealogyGraphChart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
     78      this.genealogyGraphChart.Dock = System.Windows.Forms.DockStyle.Fill;
     79      this.genealogyGraphChart.Size = new System.Drawing.Size(617, 699);
     80      //
     81      // selectedNodeStatusStrip
     82      //
     83      this.selectedNodeStatusStrip.Location = new System.Drawing.Point(0, 699);
     84      this.selectedNodeStatusStrip.Name = "selectedNodeStatusStrip";
     85      this.selectedNodeStatusStrip.Size = new System.Drawing.Size(617, 22);
     86      this.selectedNodeStatusStrip.TabIndex = 1;
     87      this.selectedNodeStatusStrip.Text = "statusStrip1";
     88      //
     89      // colorModeLabel
     90      //
     91      this.colorModeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
     92      this.colorModeLabel.AutoSize = true;
     93      this.colorModeLabel.Location = new System.Drawing.Point(453, 9);
     94      this.colorModeLabel.Name = "colorModeLabel";
     95      this.colorModeLabel.Size = new System.Drawing.Size(39, 13);
     96      this.colorModeLabel.TabIndex = 1;
     97      this.colorModeLabel.Text = "Colors:";
     98      //
     99      // nodeColorsComboBox
     100      //
     101      this.nodeColorsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
     102      this.nodeColorsComboBox.FormattingEnabled = true;
     103      this.nodeColorsComboBox.Items.AddRange(new object[] {
     104            "Quality",
     105            "Weight"});
     106      this.nodeColorsComboBox.Location = new System.Drawing.Point(498, 6);
     107      this.nodeColorsComboBox.Name = "nodeColorsComboBox";
     108      this.nodeColorsComboBox.Size = new System.Drawing.Size(62, 21);
     109      this.nodeColorsComboBox.TabIndex = 2;
     110      this.nodeColorsComboBox.Text = "Quality";
     111      this.nodeColorsComboBox.SelectedIndexChanged += new System.EventHandler(this.nodeColorsComboBox_SelectedIndexChanged);
     112      //
     113      // traceCheckBox
     114      //
     115      this.traceCheckBox.AutoSize = true;
     116      this.traceCheckBox.Location = new System.Drawing.Point(3, 8);
     117      this.traceCheckBox.Name = "traceCheckBox";
     118      this.traceCheckBox.Size = new System.Drawing.Size(54, 17);
     119      this.traceCheckBox.TabIndex = 3;
     120      this.traceCheckBox.Text = "Trace";
     121      this.traceCheckBox.UseVisualStyleBackColor = true;
     122      //
     123      // createNewViewCheckBox
     124      //
     125      this.createNewViewCheckBox.AutoSize = true;
     126      this.createNewViewCheckBox.Location = new System.Drawing.Point(63, 8);
     127      this.createNewViewCheckBox.Name = "createNewViewCheckBox";
     128      this.createNewViewCheckBox.Size = new System.Drawing.Size(105, 17);
     129      this.createNewViewCheckBox.TabIndex = 4;
     130      this.createNewViewCheckBox.Text = "Create new view";
     131      this.createNewViewCheckBox.UseVisualStyleBackColor = true;
    115132      //
    116133      // navigateRightButton
    117134      //
     135      this.navigateRightButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
    118136      this.navigateRightButton.Image = global::HeuristicLab.Problems.DataAnalysis.Symbolic.Views.Properties.Resources.LargeLeftDiagonal_235;
    119       this.navigateRightButton.Location = new System.Drawing.Point(589, 14);
     137      this.navigateRightButton.Location = new System.Drawing.Point(595, 4);
    120138      this.navigateRightButton.Name = "navigateRightButton";
    121       this.navigateRightButton.Size = new System.Drawing.Size(22, 22);
    122       this.navigateRightButton.TabIndex = 6;
     139      this.navigateRightButton.Size = new System.Drawing.Size(23, 23);
     140      this.navigateRightButton.TabIndex = 5;
    123141      this.navigateRightButton.UseVisualStyleBackColor = true;
    124142      this.navigateRightButton.Click += new System.EventHandler(this.navigateRightButton_Click);
     
    126144      // navigateLeftButton
    127145      //
     146      this.navigateLeftButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
    128147      this.navigateLeftButton.Image = global::HeuristicLab.Problems.DataAnalysis.Symbolic.Views.Properties.Resources.LargeRightDiagonal_238;
    129       this.navigateLeftButton.Location = new System.Drawing.Point(561, 14);
     148      this.navigateLeftButton.Location = new System.Drawing.Point(566, 4);
    130149      this.navigateLeftButton.Name = "navigateLeftButton";
    131       this.navigateLeftButton.Size = new System.Drawing.Size(22, 22);
     150      this.navigateLeftButton.Size = new System.Drawing.Size(23, 23);
    132151      this.navigateLeftButton.TabIndex = 6;
    133152      this.navigateLeftButton.UseVisualStyleBackColor = true;
    134153      this.navigateLeftButton.Click += new System.EventHandler(this.navigateLeftButton_Click);
    135154      //
    136       // nodeDegreeLabel
    137       //
    138       this.nodeDegreeLabel.AutoSize = true;
    139       this.nodeDegreeLabel.Location = new System.Drawing.Point(205, 20);
    140       this.nodeDegreeLabel.Name = "nodeDegreeLabel";
    141       this.nodeDegreeLabel.Size = new System.Drawing.Size(0, 13);
    142       this.nodeDegreeLabel.TabIndex = 5;
    143       //
    144       // nodeDegreeLabelLabel
    145       //
    146       this.nodeDegreeLabelLabel.AutoSize = true;
    147       this.nodeDegreeLabelLabel.Location = new System.Drawing.Point(154, 20);
    148       this.nodeDegreeLabelLabel.Name = "nodeDegreeLabelLabel";
    149       this.nodeDegreeLabelLabel.Size = new System.Drawing.Size(45, 13);
    150       this.nodeDegreeLabelLabel.TabIndex = 4;
    151       this.nodeDegreeLabelLabel.Text = "Degree:";
    152       //
    153       // nodeRankLabel
    154       //
    155       this.nodeRankLabel.AutoSize = true;
    156       this.nodeRankLabel.Location = new System.Drawing.Point(123, 20);
    157       this.nodeRankLabel.Name = "nodeRankLabel";
    158       this.nodeRankLabel.Size = new System.Drawing.Size(0, 13);
    159       this.nodeRankLabel.TabIndex = 3;
    160       //
    161       // nodeRankLabelLabel
    162       //
    163       this.nodeRankLabelLabel.AutoSize = true;
    164       this.nodeRankLabelLabel.Location = new System.Drawing.Point(81, 20);
    165       this.nodeRankLabelLabel.Name = "nodeRankLabelLabel";
    166       this.nodeRankLabelLabel.Size = new System.Drawing.Size(36, 13);
    167       this.nodeRankLabelLabel.TabIndex = 2;
    168       this.nodeRankLabelLabel.Text = "Rank:";
    169       //
    170       // nodeQualityLabel
    171       //
    172       this.nodeQualityLabel.AutoSize = true;
    173       this.nodeQualityLabel.Location = new System.Drawing.Point(54, 20);
    174       this.nodeQualityLabel.Name = "nodeQualityLabel";
    175       this.nodeQualityLabel.Size = new System.Drawing.Size(0, 13);
    176       this.nodeQualityLabel.TabIndex = 1;
    177       //
    178       // nodeQualityLabelLabel
    179       //
    180       this.nodeQualityLabelLabel.AutoSize = true;
    181       this.nodeQualityLabelLabel.Location = new System.Drawing.Point(6, 20);
    182       this.nodeQualityLabelLabel.Name = "nodeQualityLabelLabel";
    183       this.nodeQualityLabelLabel.Size = new System.Drawing.Size(42, 13);
    184       this.nodeQualityLabelLabel.TabIndex = 0;
    185       this.nodeQualityLabelLabel.Text = "Quality:";
    186       //
    187       // matchingModeButton
    188       //
    189       this.matchingModeButton.AutoSize = true;
    190       this.matchingModeButton.Checked = true;
    191       this.matchingModeButton.CheckState = System.Windows.Forms.CheckState.Checked;
    192       this.matchingModeButton.Location = new System.Drawing.Point(455, 18);
    193       this.matchingModeButton.Name = "matchingModeButton";
    194       this.matchingModeButton.Size = new System.Drawing.Size(100, 17);
    195       this.matchingModeButton.TabIndex = 9;
    196       this.matchingModeButton.Text = "Exact Matching";
    197       this.matchingModeButton.UseVisualStyleBackColor = true;
     155      // lockCheckBox
     156      //
     157      this.lockCheckBox.AutoSize = true;
     158      this.lockCheckBox.Location = new System.Drawing.Point(174, 8);
     159      this.lockCheckBox.Name = "lockCheckBox";
     160      this.lockCheckBox.Size = new System.Drawing.Size(50, 17);
     161      this.lockCheckBox.TabIndex = 7;
     162      this.lockCheckBox.Text = "Lock";
     163      this.lockCheckBox.UseVisualStyleBackColor = true;
     164      this.lockCheckBox.CheckedChanged += new System.EventHandler(this.lockCheckBox_CheckedChanged);
    198165      //
    199166      // SymbolicDataAnalysisGenealogyGraphView
     
    201168      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    202169      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    203       this.Controls.Add(this.groupBox1);
     170      this.Controls.Add(this.lockCheckBox);
     171      this.Controls.Add(this.navigateLeftButton);
     172      this.Controls.Add(this.navigateRightButton);
     173      this.Controls.Add(this.createNewViewCheckBox);
     174      this.Controls.Add(this.traceCheckBox);
     175      this.Controls.Add(this.nodeColorsComboBox);
     176      this.Controls.Add(this.colorModeLabel);
    204177      this.Name = "SymbolicDataAnalysisGenealogyGraphView";
    205178      this.Size = new System.Drawing.Size(1247, 755);
    206179      this.Controls.SetChildIndex(this.splitContainer, 0);
    207       this.Controls.SetChildIndex(this.groupBox1, 0);
     180      this.Controls.SetChildIndex(this.colorModeLabel, 0);
     181      this.Controls.SetChildIndex(this.nodeColorsComboBox, 0);
     182      this.Controls.SetChildIndex(this.traceCheckBox, 0);
     183      this.Controls.SetChildIndex(this.createNewViewCheckBox, 0);
     184      this.Controls.SetChildIndex(this.navigateRightButton, 0);
     185      this.Controls.SetChildIndex(this.navigateLeftButton, 0);
     186      this.Controls.SetChildIndex(this.lockCheckBox, 0);
    208187      this.splitContainer.Panel1.ResumeLayout(false);
     188      this.splitContainer.Panel1.PerformLayout();
    209189      this.splitContainer.Panel2.ResumeLayout(false);
    210190      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
    211191      this.splitContainer.ResumeLayout(false);
    212       this.groupBox1.ResumeLayout(false);
    213       this.groupBox1.PerformLayout();
    214192      this.ResumeLayout(false);
     193      this.PerformLayout();
    215194
    216195    }
    217196
    218197    #endregion
    219 
    220     private System.Windows.Forms.GroupBox groupBox1;
    221     private System.Windows.Forms.Label nodeQualityLabelLabel;
    222     private System.Windows.Forms.Label nodeQualityLabel;
    223     private System.Windows.Forms.Label nodeRankLabelLabel;
    224     private System.Windows.Forms.Label nodeRankLabel;
    225     private System.Windows.Forms.Label nodeDegreeLabel;
    226     private System.Windows.Forms.Label nodeDegreeLabelLabel;
     198    private System.Windows.Forms.StatusStrip selectedNodeStatusStrip;
     199    private System.Windows.Forms.Label colorModeLabel;
     200    private System.Windows.Forms.ComboBox nodeColorsComboBox;
     201    private System.Windows.Forms.CheckBox traceCheckBox;
     202    private System.Windows.Forms.CheckBox createNewViewCheckBox;
    227203    private System.Windows.Forms.Button navigateRightButton;
    228204    private System.Windows.Forms.Button navigateLeftButton;
    229     private System.Windows.Forms.Label nodeWeightLabelLabel;
    230     private System.Windows.Forms.Label nodeWeightLabel;
    231     private System.Windows.Forms.CheckBox matchingModeButton;
     205    private System.Windows.Forms.CheckBox lockCheckBox;
    232206  }
    233207}
  • branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/Tracking/SymbolicDataAnalysisGenealogyGraphView.cs

    r13892 r15561  
    103103      lastTd = null;
    104104
    105       nodeQualityLabel.Text = string.Format("{0:0.000}", graphNode.Quality);
    106       nodeRankLabel.Text = string.Format("{0:0.0}", graphNode.Rank);
    107       nodeDegreeLabel.Text = string.Format("{0} / {1}", graphNode.InDegree, graphNode.OutDegree);
    108       nodeWeightLabel.Text = string.Format("{0:0.00}", graphNode.Weight);
     105      selectedNodeStatusStrip.Text = string.Format("Quality: {0:0.00}, Rank: {1:0.0}, Degree: {2}/{3}, Weight: {4:0.00}",
     106        graphNode.Quality, graphNode.Rank, graphNode.InDegree, graphNode.OutDegree, graphNode.Weight);
    109107
    110108      // update the righthand side tree view when another genealogy graph node is selected
     
    113111      if (!graphNode.InArcs.Any()) return; // node has no ancestors, nothing to do
    114112
    115       if (openNew_CheckBox.Checked) {
     113      if (createNewViewCheckBox.Checked) {
    116114        // get the ancestors into a new view
    117115        var cloner = new Cloner();
     
    169167    private void OnTreeNodeLeftClicked(ISymbolicExpressionTreeNode node) {
    170168      SelectedSubtree = node;
    171       bool trace = genealogyGraphChart.TraceFragments;
     169      bool trace = traceCheckBox.Checked;
    172170
    173171      // check whether we are in 'trace' or 'match' mode
     
    183181        genealogyGraphChart.SuspendRendering();
    184182        genealogyGraphChart.ClearPrimitives(); // clear everything
    185         var rankMaximums = new Dictionary<double, double>();
    186 
    187         if (openNew_CheckBox.Checked) {
     183        bool newView = createNewViewCheckBox.Checked;
     184        if (newView) {
    188185          MainFormManager.MainForm.ShowContent(traceGraph);
    189186        } else {
    190         }
    191         // fill each vertex in the graph with a grayscale color according to average subtree weight
    192 
    193         /*
    194                 var colorGradient = ColorGradient.GrayscaledColors;
    195                 var colorCount = colorGradient.Count - 1;
    196                 foreach (var r in Content.Ranks) {
    197                   var vertices = r.Value.Cast<IGenealogyGraphNode<ISymbolicExpressionTree>>().ToList();
    198                   var averages = vertices.Select(x => x.Data.IterateNodesPrefix().Average(n => n.NodeWeight)).ToList();
    199                   var max = averages.Max();
    200                   rankMaximums.Add(r.Key, max);
    201                   if (max.IsAlmost(0.0)) continue;
    202                   for (int i = 0; i < vertices.Count; ++i) {
    203                     var color = colorGradient[(int)Math.Round(averages[i] / max * colorCount)];
    204                     var vNode = genealogyGraphChart.GetMappedNode(vertices[i]);
    205                     vNode.Brush = new SolidBrush(color);
    206                   }
    207                 }
    208                 // fill vertices that are part of the trace with a rgb color according to average subtree weight
    209                 if (traceGraph.Vertices.Any()) {
    210                   var ranks = traceGraph.Vertices.Select(x => Content.GetByContent(x.Data)).GroupBy(x => x.Rank);
    211                   foreach (var g in ranks) {
    212                     var vertices = g.ToList();
    213                     var averages = vertices.Select(x => x.Data.IterateNodesPrefix().Average(n => n.NodeWeight)).ToList();
    214                     double max = rankMaximums[g.Key];
    215                     if (max.IsAlmost(0.0)) continue;
    216                     for (int i = 0; i < vertices.Count; ++i) {
    217                       var vNode = genealogyGraphChart.GetMappedNode(vertices[i]);
    218                       // use a grayscale gradient
    219                       var color = colorGradient[(int)Math.Round(averages[i] / max * colorCount)];
    220                       vNode.Brush = new SolidBrush(color);
    221                     }
    222                   }
    223                   */
    224 
    225         //          if (openNew_CheckBox.Checked) {
    226         //            MainFormManager.MainForm.ShowContent(traceGraph); // display the fragment graph on the screen
    227         //          }
    228         //        }
    229         genealogyGraphChart.ResumeRendering();
     187          genealogyGraphChart.SuspendRendering();
     188          genealogyGraphChart.HighlightNodes(traceGraph.Vertices);
     189          genealogyGraphChart.ResumeRendering();
     190        }
    230191      } else {
    231192        // perform matching like it was done before
    232193        // currently there is no possibility to specify the subtree matching criteria
    233194        var trees = Content.Vertices.Select(x => x.Data);
    234         comparer.MatchVariableWeights = matchingModeButton.Checked;
    235         comparer.MatchConstantValues = matchingModeButton.Checked;
     195        //comparer.MatchVariableWeights = matchingModeButton.Checked;
     196        //comparer.MatchConstantValues = matchingModeButton.Checked;
    236197        var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(node, comparer));
    237198
     
    251212
    252213      var trees = Content.Vertices.Select(x => x.Data);
    253       comparer.MatchVariableWeights = comparer.MatchConstantValues = matchingModeButton.Checked;
     214      //comparer.MatchVariableWeights = comparer.MatchConstantValues = matchingModeButton.Checked;
    254215      var matchingTrees = trees.Where(x => x.Root.ContainsSubtree(clonedSubtree, comparer));
    255216
     
    281242    #endregion
    282243
    283 
    284 
    285244    private void graphChart_HighlightMatchingVertices(IEnumerable<IGenealogyGraphNode> vertices) {
    286245      genealogyGraphChart.SuspendRendering();
     
    290249    }
    291250
     251    #region treechart methods
    292252    private void treeChart_ClearColors() {
    293253      foreach (var node in SymbolicExpressionTreeChart.Tree.IterateNodesPrefix()) {
     
    319279      SymbolicExpressionTreeChart.RepaintNodes();
    320280    }
     281    #endregion
    321282
    322283    #region navigate the genealogy / trace graph
     
    372333         });
    373334        }
    374 
    375 
    376335      }
    377336      if (arc == null) return;
    378337      lastTd = arc.Data as TraceData;
    379338      genealogyGraphChart.SelectedGraphNode = arc.Source;
    380       UpdateTreeChart((IGenealogyGraphNode<ISymbolicExpressionTree>)arc.Source);
     339      graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)arc.Source;
     340      UpdateTreeChart(graphNode);
     341
     342      var inDegreeDistinct = graphNode.InArcs.Select(x => x.Source).Distinct().Count();
     343      var outDegreeDistinct = graphNode.OutArcs.Select(x => x.Target).Distinct().Count();
     344
     345      selectedNodeStatusStrip.Text = string.Format("Quality: {0:0.00}, Rank: {1:0.0}, Degree: {2}/{3}, Weight: {4:0.00}",
     346        graphNode.Quality, graphNode.Rank, inDegreeDistinct, outDegreeDistinct, graphNode.Weight);
    381347    }
    382348
     
    412378      lastTd = arc.Data as TraceData;
    413379      genealogyGraphChart.SelectedGraphNode = arc.Source;
    414       UpdateTreeChart((IGenealogyGraphNode<ISymbolicExpressionTree>)arc.Source);
     380      graphNode = (IGenealogyGraphNode<ISymbolicExpressionTree>)arc.Source;
     381      UpdateTreeChart(graphNode);
     382
     383      var inDegreeDistinct = graphNode.InArcs.Select(x => x.Source).Distinct().Count();
     384      var outDegreeDistinct = graphNode.OutArcs.Select(x => x.Target).Distinct().Count();
     385
     386      selectedNodeStatusStrip.Text = string.Format("Quality: {0:0.00}, Rank: {1:0.0}, Degree: {2}/{3}, Weight: {4:0.00}",
     387        graphNode.Quality, graphNode.Rank, inDegreeDistinct, outDegreeDistinct, graphNode.Weight);
     388    }
     389
     390    private void nodeColorsComboBox_SelectedIndexChanged(object sender, EventArgs e) {
     391      switch (nodeColorsComboBox.SelectedIndex) {
     392        case 0: // color by quality
     393          genealogyGraphChart.ColorSelector = node => ColorGradient.Colors[(int)Math.Round(node.Quality * 255)];
     394          genealogyGraphChart.SuspendRendering();
     395          genealogyGraphChart.HighlightAll();
     396          genealogyGraphChart.ResumeRendering();
     397          break;
     398        case 1: // color by weight
     399          var weights = Content.Vertices.ToDictionary(v => (IGenealogyGraphNode)v, v => v.Data.IterateNodesPrefix().Average(x => x.NodeWeight));
     400          var max = weights.Values.Max();
     401          genealogyGraphChart.ColorSelector = node => ColorGradient.GrayscaledColors[(int)Math.Round(weights[node] / max * 255)];
     402          genealogyGraphChart.SuspendRendering();
     403          genealogyGraphChart.HighlightAll();
     404          genealogyGraphChart.ResumeRendering();
     405          break;
     406        default:
     407          break;
     408      }
     409    }
     410
     411    private void lockCheckBox_CheckedChanged(object sender, EventArgs e) {
     412      genealogyGraphChart.LockGenealogy = lockCheckBox.Checked;
    415413    }
    416414  }
Note: See TracChangeset for help on using the changeset viewer.