예제 #1
0
        public void SetInferenceResults(
            IDictionary <string, DiscreteDistribution> results,
            int scenarioId,
            FAI.Bayesian.Observation evidence)
        {
            if (scenarioId <= 0)
            {
                throw new ArgumentOutOfRangeException("ScenarioId");
            }

            if (results != null && results.Count != 0)
            {
                foreach (var node in _nodes)
                {
                    FRandomVariable      variable = (FRandomVariable)node.Tag;
                    DiscreteDistribution distribution;

                    // See if this variable has a result in the incoming results.
                    if (results.TryGetValue(variable.Name, out distribution))
                    {
                        bool isEvidence = evidence.TryValueForVariable(variable.Name) != null;

                        var slices
                            = distribution
                              .Masses
                              .OrderBy(p => p.Key)
                              .Select(p => p.Value)
                              .ToArray();

                        node.SetSlices(slices, scenarioId, isEvidence);
                    }
                }
            }
            else
            {
                foreach (var node in _nodes)
                {
                    FRandomVariable variable = (FRandomVariable)node.Tag;
                    bool            isEvidence
                        = evidence != null &&
                          evidence.TryValueForVariable(variable.Name) != null;
                    node.SetSlices(new double[0], scenarioId, isEvidence);
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Configures the graph to emphasize the nodes listed.
        /// </summary>
        public void SetInterestVariables(IEnumerable <string> variableNames)
        {
            if (variableNames == null)
            {
                // Reset.

                foreach (var node in _nodes)
                {
                    if (node.State == GraphNode.StateEnum.Minimized)
                    {
                        node.State = GraphNode.StateEnum.Idling;
                    }
                }

                foreach (var edge in _edges)
                {
                    edge.State = GraphEdge.StateEnum.Normal;
                }

                _interestVariables = null;
            }
            else
            {
                // Minimize non-interest nodes. Reset interest nodes.
                List <GraphNode> nodesNotMinimized = new List <GraphNode>();
                foreach (var node in _nodes)
                {
                    FRandomVariable rv = (FRandomVariable)node.Tag;
                    if (variableNames.Contains(rv.Name))
                    {
                        nodesNotMinimized.Add(node);
                        if (node.State == GraphNode.StateEnum.Minimized)
                        {
                            node.State = GraphNode.StateEnum.Idling;
                        }
                    }
                    else
                    {
                        if (node.State != GraphNode.StateEnum.Minimized &&
                            node.State == GraphNode.StateEnum.Idling)
                        {
                            node.State = GraphNode.StateEnum.Minimized;

                            _edges
                            .Where(e => e.To == node || e.From == node)
                            .ForAll(n => n.State = GraphEdge.StateEnum.Minimized);
                        }
                    }
                }

                // Ensure edges that are between non-minimized nodes are set
                // to normal state.
                foreach (var edge in _edges)
                {
                    if (nodesNotMinimized.Contains(edge.To) &&
                        nodesNotMinimized.Contains(edge.From))
                    {
                        edge.State = GraphEdge.StateEnum.Normal;
                    }
                }

                // Store.
                _interestVariables = variableNames.ToList();
            }
        }
예제 #3
0
        /// <summary>
        /// Provides a graph layout for this inspector to use.
        /// </summary>
        /// <param name="layout"></param>
        public void SetGraphLayout(IDictionary <string, Point> layout)
        {
            // Shift layout into view.
            Point vertexShift;
            Size  canvasSize;

            if (layout.Any())
            {
                double minX = double.MaxValue;
                double minY = double.MaxValue;
                double maxX = double.MinValue;
                double maxY = double.MinValue;
                foreach (var point in layout.Values)
                {
                    minX = Math.Min(point.X, minX);
                    minY = Math.Min(point.Y, minY);
                    maxX = Math.Max(point.X, maxX);
                    maxY = Math.Max(point.Y, maxY);
                }

                vertexShift = new Point(minX, minY).Multiply(-1);
                canvasSize  = new Size(maxX - minX, maxY - minY);
            }
            else
            {
                vertexShift = new Point();
                canvasSize  = new Size();
            }

            // Pad position and canvas size.
            const float Padding = 300;

            vertexShift        = vertexShift.Add(new Point(Padding * 0.5, Padding * 0.5));
            canvasSize.Height += Padding;
            canvasSize.Width  += Padding;

            // Update positions.
            foreach (var node in _nodes)
            {
                FRandomVariable variable = node.Tag as FRandomVariable;
                Point           position;
                if (layout.TryGetValue(variable.Name, out position))
                {
                    node.Position = position.Add(vertexShift);
                }
                else
                {
                    node.Position = new Point();
                }
            }

            // Update canvas.
            xRoot.Width  = canvasSize.Width * xRootScaleTransform.ScaleX;
            xRoot.Height = canvasSize.Height * xRootScaleTransform.ScaleY;

            // Edge thickness.
            foreach (var edge in _edges)
            {
                edge.LineThickness = this._layoutOptions.EdgeThickness;
            }

            // Sizes.
            this.UpdateNodeSizes();
        }