Changeset 5729 for branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4
- Timestamp:
- 03/17/11 12:25:30 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicDataAnalysisSolutionSimplifierView.cs
r5722 r5729 33 33 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views { 34 34 public abstract partial class InteractiveSymbolicDataAnalysisSolutionSimplifierView : AsynchronousContentView { 35 private Dictionary<ISymbolicExpressionTreeNode, ConstantTreeNode> replacementNodes;35 private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> replacementNodes; 36 36 private Dictionary<ISymbolicExpressionTreeNode, double> nodeImpacts; 37 37 38 38 public InteractiveSymbolicDataAnalysisSolutionSimplifierView() { 39 39 InitializeComponent(); 40 this.replacementNodes = new Dictionary<ISymbolicExpressionTreeNode, ConstantTreeNode>();40 this.replacementNodes = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(); 41 41 this.nodeImpacts = new Dictionary<ISymbolicExpressionTreeNode, double>(); 42 42 this.Caption = "Interactive Solution Simplifier"; … … 81 81 82 82 private void CalculateReplacementNodesAndNodeImpacts() { 83 replacementNodes.Clear();84 83 if (Content != null && Content.Model != null && Content.ProblemData != null) { 85 84 var tree = Content.Model.SymbolicExpressionTree; 86 85 var replacementValues = CalculateReplacementValues(tree); 87 86 foreach (var pair in replacementValues) { 88 replacementNodes.Add(pair.Key, MakeConstantTreeNode(pair.Value)); 87 if (!(pair.Key is ConstantTreeNode)) { 88 replacementNodes[pair.Key] = MakeConstantTreeNode(pair.Value); 89 } 89 90 } 90 91 nodeImpacts = CalculateImpactValues(Content.Model.SymbolicExpressionTree); … … 96 97 var child = parent.GetSubTree(subTreeIndex); 97 98 if (!(child.Symbol is Constant) && nodeImpacts[child].IsAlmost(1.0)) { 98 ReplaceNodeWithConstant(parent, subTreeIndex);99 SwitchNodeWithReplacementNode(parent, subTreeIndex); 99 100 } 100 101 } … … 126 127 ISymbolicExpressionTreeNode subTree = treeNode.GetSubTree(i); 127 128 if (subTree == visualTreeNode.SymbolicExpressionTreeNode) { 128 ReplaceNodeWithConstant(treeNode, i);129 SwitchNodeWithReplacementNode(treeNode, i); 129 130 } 130 131 } … … 138 139 } 139 140 140 private void ReplaceNodeWithConstant(ISymbolicExpressionTreeNode parent, int subTreeIndex) {141 private void SwitchNodeWithReplacementNode(ISymbolicExpressionTreeNode parent, int subTreeIndex) { 141 142 ISymbolicExpressionTreeNode subTree = parent.GetSubTree(subTreeIndex); 142 143 parent.RemoveSubTree(subTreeIndex); 143 if (replacementNodes.ContainsKey(subTree)) 144 parent.InsertSubTree(subTreeIndex, replacementNodes[subTree]); 145 else if (subTree is ConstantTreeNode && replacementNodes.ContainsValue((ConstantTreeNode)subTree)) 146 parent.InsertSubTree(subTreeIndex, replacementNodes.Where(v => v.Value == subTree).Single().Key); 147 else if (!(subTree is ConstantTreeNode)) 144 if (replacementNodes.ContainsKey(subTree)) { 145 var replacementNode = replacementNodes[subTree]; 146 parent.InsertSubTree(subTreeIndex, replacementNode); 147 // exchange key and value 148 replacementNodes.Remove(subTree); 149 replacementNodes.Add(replacementNode, subTree); 150 } else { 148 151 throw new InvalidOperationException("Could not find replacement value."); 152 } 149 153 } 150 154 … … 155 159 foreach (ISymbolicExpressionTreeNode treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) { 156 160 if (!(treeNode is ConstantTreeNode) && nodeImpacts.ContainsKey(treeNode)) { 157 double impact = this.nodeImpacts[treeNode]; 158 double replacementValue = this.replacementNodes[treeNode].Value; 161 double impact = nodeImpacts[treeNode]; 159 162 VisualSymbolicExpressionTreeNode visualTree = treeChart.GetVisualSymbolicExpressionTreeNode(treeNode); 160 163 … … 163 166 // impact > 0 if new solution is worse 164 167 if (impact < 0.0) { 168 // min is guaranteed to be < 0 165 169 visualTree.FillColor = Color.FromArgb((int)(impact / min * 255), Color.Red); 170 } else if (impact.IsAlmost(0.0)) { 171 visualTree.FillColor = Color.White; 166 172 } else { 173 // max is guaranteed to be > 0 167 174 visualTree.FillColor = Color.FromArgb((int)(impact / max * 255), Color.Green); 168 175 } 169 176 visualTree.ToolTip += Environment.NewLine + "Node impact: " + impact; 170 visualTree.ToolTip += Environment.NewLine + "Replacement value: " + replacementValue; 177 var constantReplacementNode = replacementNodes[treeNode] as ConstantTreeNode; 178 if (constantReplacementNode != null) { 179 visualTree.ToolTip += Environment.NewLine + "Replacement value: " + constantReplacementNode.Value; 180 } 171 181 } 172 182 } … … 177 187 private void PaintCollapsedNodes() { 178 188 foreach (ISymbolicExpressionTreeNode treeNode in Content.Model.SymbolicExpressionTree.IterateNodesPostfix()) { 179 if (treeNode is ConstantTreeNode && replacementNodes.Contains Value((ConstantTreeNode)treeNode))189 if (treeNode is ConstantTreeNode && replacementNodes.ContainsKey(treeNode)) 180 190 this.treeChart.GetVisualSymbolicExpressionTreeNode(treeNode).LineColor = Color.DarkOrange; 181 191 else {
Note: See TracChangeset
for help on using the changeset viewer.