Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/27/12 20:09:33 (11 years ago)
Author:
ascheibe
Message:

#1986 merged trunk into SlaveShutdown branch

Location:
branches/SlaveShutdown
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/SlaveShutdown

  • branches/SlaveShutdown/HeuristicLab.Problems.DataAnalysis.Symbolic.Views

    • Property svn:mergeinfo set to (toggle deleted branches)
      /branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Viewsmergedeligible
      /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Viewsmergedeligible
      /branches/Algorithms.GradientDescent/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5516-5520
      /branches/Benchmarking/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views6917-7005
      /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Views4656-4721
      /branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5471-5808
      /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5815-6180
      /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Views4458-4459,​4462,​4464
      /branches/GP.Grammar.Editor/HeuristicLab.Problems.DataAnalysis.Symbolic.Views6284-6795
      /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5060
      /branches/NET40/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5138-5162
      /branches/ParallelEngine/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5175-5192
      /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Problems.DataAnalysis.Symbolic.Views7568-7810
      /branches/QAPAlgorithms/HeuristicLab.Problems.DataAnalysis.Symbolic.Views6350-6627
      /branches/Restructure trunk solution/HeuristicLab.Problems.DataAnalysis.Symbolic.Views6828
      /branches/ScatterSearch (trunk integration)/HeuristicLab.Problems.DataAnalysis.Symbolic.Views7787-8333
      /branches/SuccessProgressAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5370-5682
      /branches/Trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Views6829-6865
      /branches/VNS/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5594-5752
      /branches/histogram/HeuristicLab.Problems.DataAnalysis.Symbolic.Views5959-6341
  • branches/SlaveShutdown/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4

    • Property svn:ignore
      •  

        old new  
         1*.user
         2Plugin.cs
        13bin
        24obj
        3 *.user
        4 HeuristicLabProblemsDataAnalysisSymbolicViewsPlugin.cs
        5 *.vs10x
        6 Plugin.cs
  • branches/SlaveShutdown/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs

    r7259 r8954  
    3434    private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> replacementNodes;
    3535    private Dictionary<ISymbolicExpressionTreeNode, double> nodeImpacts;
    36     private bool updateInProgress = false;
     36    private Dictionary<ISymbolicExpressionTreeNode, double> originalValues;
     37    private Dictionary<ISymbolicExpressionTreeNode, string> originalVariableNames;
    3738
    3839    public InteractiveSymbolicDataAnalysisSolutionSimplifierView() {
    3940      InitializeComponent();
    40       this.replacementNodes = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>();
    41       this.nodeImpacts = new Dictionary<ISymbolicExpressionTreeNode, double>();
     41      replacementNodes = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>();
     42      nodeImpacts = new Dictionary<ISymbolicExpressionTreeNode, double>();
     43      originalValues = new Dictionary<ISymbolicExpressionTreeNode, double>();
     44      originalVariableNames = new Dictionary<ISymbolicExpressionTreeNode, string>();
     45
    4246      this.Caption = "Interactive Solution Simplifier";
    4347    }
     
    5054    protected override void RegisterContentEvents() {
    5155      base.RegisterContentEvents();
    52       Content.ModelChanged += new EventHandler(Content_ModelChanged);
    53       Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
     56      Content.ModelChanged += Content_Changed;
     57      Content.ProblemDataChanged += Content_Changed;
    5458    }
    5559    protected override void DeregisterContentEvents() {
    5660      base.DeregisterContentEvents();
    57       Content.ModelChanged -= new EventHandler(Content_ModelChanged);
    58       Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
    59     }
    60 
    61     private void Content_ModelChanged(object sender, EventArgs e) {
    62       OnModelChanged();
    63     }
    64     private void Content_ProblemDataChanged(object sender, EventArgs e) {
    65       OnProblemDataChanged();
    66     }
    67 
    68     protected virtual void OnModelChanged() {
    69       this.CalculateReplacementNodesAndNodeImpacts();
    70     }
    71 
    72     protected virtual void OnProblemDataChanged() {
    73       this.CalculateReplacementNodesAndNodeImpacts();
     61      Content.ModelChanged -= Content_Changed;
     62      Content.ProblemDataChanged -= Content_Changed;
     63    }
     64
     65    private void Content_Changed(object sender, EventArgs e) {
     66      UpdateView();
    7467    }
    7568
    7669    protected override void OnContentChanged() {
    7770      base.OnContentChanged();
    78       this.CalculateReplacementNodesAndNodeImpacts();
    79       this.viewHost.Content = this.Content;
    80     }
    81 
    82     private void CalculateReplacementNodesAndNodeImpacts() {
    83       if (Content != null && Content.Model != null && Content.ProblemData != null) {
    84         var tree = Content.Model.SymbolicExpressionTree;
    85         var replacementValues = CalculateReplacementValues(tree);
    86         foreach (var pair in replacementValues) {
    87           if (!(pair.Key is ConstantTreeNode)) {
    88             replacementNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
    89           }
    90         }
    91         nodeImpacts = CalculateImpactValues(Content.Model.SymbolicExpressionTree);
    92 
    93         if (!updateInProgress) {
    94           // automatically fold all branches with impact = 1
    95           List<ISymbolicExpressionTreeNode> nodeList = Content.Model.SymbolicExpressionTree.Root.GetSubtree(0).IterateNodesPrefix().ToList();
    96           foreach (var parent in nodeList) {
    97             for (int subTreeIndex = 0; subTreeIndex < parent.SubtreeCount; subTreeIndex++) {
    98               var child = parent.GetSubtree(subTreeIndex);
    99               if (!(child.Symbol is Constant) && nodeImpacts[child].IsAlmost(0.0)) {
    100                 SwitchNodeWithReplacementNode(parent, subTreeIndex);
    101               }
    102             }
    103           }
    104         }
    105 
    106         // show only interesting part of solution
    107         if (tree.Root.SubtreeCount > 1)
    108           this.treeChart.Tree = new SymbolicExpressionTree(tree.Root); // RPB + ADFs
    109         else
    110           this.treeChart.Tree = new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0)); // 1st child of RPB
    111         this.PaintNodeImpacts();
    112       }
     71      UpdateView();
     72      viewHost.Content = this.Content;
     73    }
     74
     75    private void UpdateView() {
     76      if (Content == null || Content.Model == null || Content.ProblemData == null) return;
     77      var tree = Content.Model.SymbolicExpressionTree;
     78
     79      var replacementValues = CalculateReplacementValues(tree);
     80      foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
     81        replacementNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
     82      }
     83
     84      nodeImpacts = CalculateImpactValues(tree);
     85
     86      var model = Content.Model.SymbolicExpressionTree;
     87      treeChart.Tree = model.Root.SubtreeCount > 1 ? new SymbolicExpressionTree(model.Root) : new SymbolicExpressionTree(model.Root.GetSubtree(0).GetSubtree(0));
     88      PaintNodeImpacts();
    11389    }
    11490
     
    11793    protected abstract void UpdateModel(ISymbolicExpressionTree tree);
    11894
    119     private ConstantTreeNode MakeConstantTreeNode(double value) {
    120       Constant constant = new Constant();
    121       constant.MinValue = value - 1;
    122       constant.MaxValue = value + 1;
    123       ConstantTreeNode constantTreeNode = (ConstantTreeNode)constant.CreateTreeNode();
     95    private static ConstantTreeNode MakeConstantTreeNode(double value) {
     96      var constant = new Constant { MinValue = value - 1, MaxValue = value + 1 };
     97      var constantTreeNode = (ConstantTreeNode)constant.CreateTreeNode();
    12498      constantTreeNode.Value = value;
    12599      return constantTreeNode;
     
    127101
    128102    private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) {
    129       VisualSymbolicExpressionTreeNode visualTreeNode = (VisualSymbolicExpressionTreeNode)sender;
     103      if (!treeChart.TreeValid) return;
     104      var visualNode = (VisualSymbolicExpressionTreeNode)sender;
     105      var symbExprTreeNode = (SymbolicExpressionTreeNode)visualNode.SymbolicExpressionTreeNode;
     106      if (symbExprTreeNode == null) return;
    130107      var tree = Content.Model.SymbolicExpressionTree;
    131       foreach (SymbolicExpressionTreeNode treeNode in tree.IterateNodesPostfix()) {
    132         for (int i = 0; i < treeNode.SubtreeCount; i++) {
    133           ISymbolicExpressionTreeNode subTree = treeNode.GetSubtree(i);
    134           // only allow to replace nodes for which a replacement value is known (replacement value for ADF nodes are not available)
    135           if (subTree == visualTreeNode.SymbolicExpressionTreeNode && replacementNodes.ContainsKey(subTree)) {
    136             SwitchNodeWithReplacementNode(treeNode, i);
    137 
    138             // show only interesting part of solution
    139             if (tree.Root.SubtreeCount > 1)
    140               this.treeChart.Tree = new SymbolicExpressionTree(tree.Root); // RPB + ADFs
    141             else
    142               this.treeChart.Tree = new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0)); // 1st child of RPB
    143 
    144             updateInProgress = true;
    145             UpdateModel(tree);
    146             updateInProgress = false;
    147             return; // break all loops
     108
     109      bool update = false;
     110      // check if the node value/weight has been altered
     111      // if so, the first double click will return the node to its original value/weight/variable name
     112      // the next double click will replace the ConstantNode with the original SymbolicExpressionTreeNode
     113      if (originalVariableNames.ContainsKey(symbExprTreeNode)) {
     114        var variable = (VariableTreeNode)symbExprTreeNode;
     115        variable.VariableName = originalVariableNames[symbExprTreeNode];
     116        originalVariableNames.Remove(variable);
     117        update = true;
     118      } else if (originalValues.ContainsKey(symbExprTreeNode)) {
     119        double value = originalValues[symbExprTreeNode];
     120        if (symbExprTreeNode.Symbol is Constant) {
     121          var constantTreeNode = (ConstantTreeNode)symbExprTreeNode;
     122          constantTreeNode.Value = value;
     123        } else if (symbExprTreeNode.Symbol is Variable) {
     124          var variable = (VariableTreeNode)symbExprTreeNode;
     125          variable.Weight = value;
     126        }
     127        originalValues.Remove(symbExprTreeNode);
     128        update = true;
     129      } else if (replacementNodes.ContainsKey(symbExprTreeNode)) {
     130        foreach (var treeNode in tree.IterateNodesPostfix()) {
     131          for (int i = 0; i < treeNode.SubtreeCount; i++) {
     132            var subtree = treeNode.GetSubtree(i);
     133            if (subtree == symbExprTreeNode) {
     134              SwitchNodeWithReplacementNode(treeNode, i);
     135              // show only interesting part of solution
     136              treeChart.Tree = tree.Root.SubtreeCount > 1
     137                                 ? new SymbolicExpressionTree(tree.Root)
     138                                 : new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0));
     139              update = true;
     140            }
    148141          }
    149         }
     142          if (update) break;
     143        }
     144      }
     145      if (update) UpdateModel(tree);
     146    }
     147
     148    private void treeChart_SymbolicExpressionTreeChanged(object sender, EventArgs e) {
     149      UpdateModel(Content.Model.SymbolicExpressionTree);
     150      UpdateView();
     151    }
     152
     153    private void treeChart_SymbolicExpressionTreeNodeChanged(object sender, EventArgs e) {
     154      var dialog = (ValueChangeDialog)sender;
     155      bool flag1 = false, flag2 = false;
     156      var node = dialog.Content;
     157
     158      if (node is VariableTreeNode) {
     159        var variable = (VariableTreeNode)node;
     160        var weight = double.Parse(dialog.newValueTextBox.Text);
     161        var name = (string)dialog.variableNamesCombo.SelectedItem;
     162        if (!variable.Weight.Equals(weight)) {
     163          flag1 = true;
     164          originalValues[variable] = variable.Weight;
     165          variable.Weight = weight;
     166        }
     167        if (!variable.VariableName.Equals(name)) {
     168          flag2 = true;
     169          originalVariableNames[variable] = variable.VariableName;
     170          variable.VariableName = name;
     171        }
     172      } else if (node is ConstantTreeNode) {
     173        var constant = (ConstantTreeNode)node;
     174        var value = double.Parse(dialog.newValueTextBox.Text);
     175        if (!constant.Value.Equals(value)) {
     176          flag1 = true;
     177          originalValues[constant] = constant.Value;
     178          constant.Value = value;
     179        }
     180      }
     181      if (flag1 || flag2) {
     182        UpdateView();
    150183      }
    151184    }
     
    168201      double min = impacts.Min();
    169202      foreach (ISymbolicExpressionTreeNode treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) {
     203        VisualSymbolicExpressionTreeNode visualTree = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode);
     204        bool flag1 = replacementNodes.ContainsKey(treeNode);
     205        bool flag2 = originalValues.ContainsKey(treeNode);
     206        bool flag3 = treeNode is ConstantTreeNode;
     207
     208        if (flag2) // constant or variable node was changed
     209          visualTree.ToolTip += Environment.NewLine + "Original value: " + originalValues[treeNode];
     210        else if (flag1 && flag3) // symbol node was folded to a constant
     211          visualTree.ToolTip += Environment.NewLine + "Original node: " + replacementNodes[treeNode];
     212
    170213        if (!(treeNode is ConstantTreeNode) && nodeImpacts.ContainsKey(treeNode)) {
    171214          double impact = nodeImpacts[treeNode];
    172           VisualSymbolicExpressionTreeNode visualTree = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode);
    173215
    174216          // impact = 0 if no change
     
    197239    private void PaintCollapsedNodes() {
    198240      foreach (ISymbolicExpressionTreeNode treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) {
    199         if (treeNode is ConstantTreeNode && replacementNodes.ContainsKey(treeNode))
    200           this.treeChart.GetVisualSymbolicExpressionTreeNode(treeNode).LineColor = Color.DarkOrange;
    201         else {
    202           VisualSymbolicExpressionTreeNode visNode = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode);
    203           if (visNode != null)
    204             visNode.LineColor = Color.Black;
     241        bool flag1 = replacementNodes.ContainsKey(treeNode);
     242        bool flag2 = originalValues.ContainsKey(treeNode);
     243        if (flag1 && treeNode is ConstantTreeNode) {
     244          this.treeChart.GetVisualSymbolicExpressionTreeNode(treeNode).LineColor = flag2 ? Color.DarkViolet : Color.DarkOrange;
     245        } else if (flag2) {
     246          this.treeChart.GetVisualSymbolicExpressionTreeNode(treeNode).LineColor = Color.DodgerBlue;
    205247        }
    206248      }
     
    208250
    209251    private void btnSimplify_Click(object sender, EventArgs e) {
    210       SymbolicDataAnalysisExpressionTreeSimplifier simplifier = new SymbolicDataAnalysisExpressionTreeSimplifier();
     252      var simplifier = new SymbolicDataAnalysisExpressionTreeSimplifier();
    211253      var simplifiedExpressionTree = simplifier.Simplify(Content.Model.SymbolicExpressionTree);
    212254      UpdateModel(simplifiedExpressionTree);
Note: See TracChangeset for help on using the changeset viewer.