Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/22/12 15:03:32 (12 years ago)
Author:
bburlacu
Message:

#1763: Bugfixes and refactoring as suggested in the comments above.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs

    r8916 r8935  
    9696      if (Content == null || Content.Model == null || Content.ProblemData == null) return;
    9797      var tree = model;
     98      CalculateReplacementNodesAndNodeImpacts(tree);
     99    }
     100
     101    private void CalculateReplacementNodesAndNodeImpacts(ISymbolicExpressionTree tree) {
    98102      var replacementValues = CalculateReplacementValues(tree);
    99103      foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
     
    117121    }
    118122
    119     private void CalculateReplacementNodesAndNodeImpacts(ISymbolicExpressionTree tree) {
    120       var replacementValues = CalculateReplacementValues(tree);
    121       foreach (var pair in replacementValues.Where(pair => !(pair.Key is ConstantTreeNode))) {
    122         replacementNodes[pair.Key] = MakeConstantTreeNode(pair.Value);
    123       }
    124       nodeImpacts = CalculateImpactValues(tree);
    125 
    126       if (!updateInProgress) {
    127         // automatically fold all branches with impact = 0
    128         List<ISymbolicExpressionTreeNode> nodeList = tree.Root.GetSubtree(0).IterateNodesPrefix().ToList();
    129         foreach (var parent in nodeList) {
    130           for (int subTreeIndex = 0; subTreeIndex < parent.SubtreeCount; subTreeIndex++) {
    131             var child = parent.GetSubtree(subTreeIndex);
    132             if (!(child.Symbol is Constant) && nodeImpacts[child].IsAlmost(0.0)) {
    133               SwitchNodeWithReplacementNode(parent, subTreeIndex);
    134             }
    135           }
    136         }
    137       }
    138       PaintModel();
    139     }
    140 
    141123    private void PaintModel() {
    142124      // show only interesting part of solution
     
    149131    protected abstract void UpdateModel(ISymbolicExpressionTree tree);
    150132
    151     private ConstantTreeNode MakeConstantTreeNode(double value) {
    152       Constant constant = new Constant();
    153       constant.MinValue = value - 1;
    154       constant.MaxValue = value + 1;
    155       ConstantTreeNode constantTreeNode = (ConstantTreeNode)constant.CreateTreeNode();
     133    private static ConstantTreeNode MakeConstantTreeNode(double value) {
     134      var constant = new Constant { MinValue = value - 1, MaxValue = value + 1 };
     135      var constantTreeNode = (ConstantTreeNode)constant.CreateTreeNode();
    156136      constantTreeNode.Value = value;
    157137      return constantTreeNode;
     
    164144      if (symbExprTreeNode == null) return;
    165145      var tree = model;
     146
     147      bool update = false;
    166148      // check if the node value/weight has been altered
    167149      // if so, the first double click will return the node to its original value/weight/variable name
     
    171153        variable.VariableName = originalVariableNames[symbExprTreeNode];
    172154        originalVariableNames.Remove(variable);
     155        update = true;
     156      } else if (originalValues.ContainsKey(symbExprTreeNode)) {
     157        double value = originalValues[symbExprTreeNode];
     158        if (symbExprTreeNode.Symbol is Constant) {
     159          var constantTreeNode = (ConstantTreeNode)symbExprTreeNode;
     160          constantTreeNode.Value = value;
     161        } else if (symbExprTreeNode.Symbol is Variable) {
     162          var variable = (VariableTreeNode)symbExprTreeNode;
     163          variable.Weight = value;
     164        }
     165        originalValues.Remove(symbExprTreeNode);
     166        update = true;
     167      } else if (replacementNodes.ContainsKey(symbExprTreeNode)) {
     168        foreach (var treeNode in tree.IterateNodesPostfix()) {
     169          for (int i = 0; i < treeNode.SubtreeCount; i++) {
     170            var subtree = treeNode.GetSubtree(i);
     171            if (subtree == symbExprTreeNode) {
     172              SwitchNodeWithReplacementNode(treeNode, i);
     173              // show only interesting part of solution
     174              treeChart.Tree = tree.Root.SubtreeCount > 1
     175                                 ? new SymbolicExpressionTree(tree.Root)
     176                                 : new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0));
     177              update = true;
     178            }
     179          }
     180          if (update) break;
     181        }
     182      }
     183      if (update) {
    173184        updateInProgress = true;
    174185        UpdateModel(tree);
    175186        updateInProgress = false;
    176         return;
    177       }
    178       if (originalValues.ContainsKey(symbExprTreeNode)) {
    179         double value = originalValues[symbExprTreeNode];
    180         if (symbExprTreeNode.Symbol is Constant)
    181           ((ConstantTreeNode)symbExprTreeNode).Value = value;
    182         else if (symbExprTreeNode.Symbol is Variable)
    183           ((VariableTreeNode)symbExprTreeNode).Weight = value;
    184         originalValues.Remove(symbExprTreeNode);
    185         updateInProgress = true;
    186         UpdateModel(tree);
    187         updateInProgress = false;
    188         return;
    189       }
    190       foreach (SymbolicExpressionTreeNode treeNode in tree.IterateNodesPostfix()) {
    191         for (int i = 0; i < treeNode.SubtreeCount; i++) {
    192           ISymbolicExpressionTreeNode subTree = treeNode.GetSubtree(i);
    193           // only allow to replace nodes for which a replacement value is known (replacement value for ADF nodes are not available)
    194           if (subTree == symbExprTreeNode && replacementNodes.ContainsKey(subTree)) {
    195             SwitchNodeWithReplacementNode(treeNode, i);
    196             // show only interesting part of solution
    197             treeChart.Tree = tree.Root.SubtreeCount > 1 ? new SymbolicExpressionTree(tree.Root) : new SymbolicExpressionTree(tree.Root.GetSubtree(0).GetSubtree(0));
    198             updateInProgress = true;
    199             UpdateModel(tree);
    200             updateInProgress = false;
    201             return; // break all loops
    202           }
    203         }
    204187      }
    205188    }
     
    222205
    223206      if (node is VariableTreeNode) {
    224         var variable = dialog.Content as VariableTreeNode;
    225         var weight = double.Parse(dialog.NewValueTextBox.Text);
    226         var name = (string)dialog.VariableNameComboBox.SelectedItem;
     207        var variable = (VariableTreeNode)node;
     208        var weight = double.Parse(dialog.newValueTextBox.Text);
     209        var name = (string)dialog.variableNamesCombo.SelectedItem;
    227210        if (!variable.Weight.Equals(weight)) {
    228211          flag1 = true;
     
    236219        }
    237220      } else if (node is ConstantTreeNode) {
    238         var constant = dialog.Content as ConstantTreeNode;
    239         var value = double.Parse(dialog.NewValueTextBox.Text);
     221        var constant = (ConstantTreeNode)node;
     222        var value = double.Parse(dialog.newValueTextBox.Text);
    240223        if (!constant.Value.Equals(value)) {
    241224          flag1 = true;
     
    355338      } else if (e.Error != null) {
    356339        // There was an error during the operation.
    357         // Error-handling
    358340      } else {
    359341        // The operation completed normally. We can update the model
Note: See TracChangeset for help on using the changeset viewer.