/// <summary> /// Assigns a network to this graph inspector. The graph inspector uses /// this network's local probability descriptions and structure. Layout /// must be updated separately. /// </summary> /// <param name="network"></param> public void SetGraph( BayesianNetwork network, IDictionary<string, string> variableAbbreviations) { bool isNewNetwork = _network != network; // Remove nodes and edges. foreach (var node in _nodes.ToList()) { RemoveNode(node); } _nodes.Clear(); // Remember. _network = network; if (network == null) { return; } // Generate new nodes. foreach (var variable in network.VariablesOrdered) { GraphNode node = new GraphNode(); node.Label = variableAbbreviations[variable.Name]; node.Tag = variable; node.ColorSpace = variable.Space.Values.Select(v => variable.Space.GetColor(v)).ToArray(); var cpt = variable.Distributions; AddNode(node); } UpdateEdges(); network.StructureChanged += OnBayesianNetworkStructureChanged; }
private void RemoveNode(GraphNode node) { RandomVariable variable = node.Tag as RandomVariable; variable.UserData = null; xRoot.Children.Remove(node); _nodes.Remove(node); var edgesWithNode = _edges.Where(e => e.To == node || e.From == node); foreach (var edge in edgesWithNode) { if (edge.To.Parent == null && edge.From.Parent == null) { xRoot.Children.Remove(edge); edge.To = null; edge.From = null; } } }
private void UpdateEdges(GraphNode nodeOfInterest = null) { // Clear edges. _edges.ForAll(edge => { xRoot.Children.Remove(edge); }); _edges.Clear(); // For each node already in this inspector. foreach (var graphNode in this._nodes) { RandomVariable variable = (RandomVariable)graphNode.Tag; // Check if this node connects to another node already in the graph. foreach (var parentVariable in variable.Parents.Select(p => _network.GetVariable(p))) { var parentNode = parentVariable.UserData as GraphNode; Debug.Assert(parentNode != null); // Create edge. GraphEdge edge = new GraphEdge(); xRoot.Children.Add(edge); _edges.Add(edge); edge.From = parentNode; edge.To = graphNode; edge.SetValue(Canvas.ZIndexProperty, LayerUnimportantEdges); } } }
private void AddNode(GraphNode graphNode) { // Add to visual tree. xRoot.Children.Add(graphNode); graphNode.SetValue(Canvas.ZIndexProperty, LayerUnimportantNodes); // Add to internal list. _nodes.Add(graphNode); RandomVariable variable = (RandomVariable)graphNode.Tag; variable.UserData = graphNode; // Ensure canvas is large enough. { const double padding = 100; double maxX = _nodes.Max(n => n.Position.X) + padding; double maxY = _nodes.Max(n => n.Position.Y) + padding; xRoot.Width = Math.Max(xRoot.Width, maxX); xRoot.Height = Math.Max(xRoot.Height, maxY); } // Events. graphNode.MouseUp += delegate(object sender, MouseButtonEventArgs e) { if (graphNode.State == GraphNode.StateEnum.Selecting) { App.Current.MainWindow.RequestConfigureVariable(variable); } else { App.Current.MainWindow.RequestSelectVariable(variable); } e.Handled = true; }; graphNode.SliceChosen += delegate(int sliceIndex, int scenarioIndex) { Debug.Assert(scenarioIndex == 1 || scenarioIndex == 2); if (sliceIndex == -1) { App.Current.MainWindow.RequestConfigureVariableWithEvidence(variable, scenarioIndex, null); } else { float evidenceValue = variable.Space.Values.ElementAt(sliceIndex); App.Current.MainWindow.RequestConfigureVariableWithEvidence(variable, scenarioIndex, evidenceValue); } }; }