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); } } }
/// <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(); } }
/// <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(); }