private HashSet <NodeReference> getBackwardTargets(SemanticPart part, IEnumerable <NodeReference> endingNodes = null) { if (endingNodes == null) { endingNodes = new List <NodeReference>(new[] { part.StartNode }); } var result = new HashSet <NodeReference>(); foreach (var path in part.Paths) { var currentLayer = endingNodes; for (var i = path.Length - 1; i >= 0; --i) { var edge = path.GetEdge(i).Inverse(); var nextLayer = new List <NodeReference>(); foreach (var node in currentLayer) { var targets = Graph.Targets(node, edge); nextLayer.AddRange(targets); } currentLayer = nextLayer; } result.UnionWith(currentLayer); } return(result); }
private IEnumerable <SemanticPart> lastRelevantUtterances(string question, NodeReference answer) { var result = new List <SemanticPart>(); foreach (var word in UtteranceParser.Parse(question).Words) { var fromNode = Graph.GetNode(word); var paths = Graph.GetPaths(fromNode, answer, MaximumGraphDepth, MaximumGraphWidth).Take(1).ToArray(); if (paths.Length == 0) { //there is no evidence continue; } var part = new SemanticPart(question, paths); result.Add(part); } return(result); }