Inheritance: System.Windows.Controls.UserControl
Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }
Ejemplo n.º 4
0
        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);
                }
            };
        }