/// <summary> /// Adds a node to a segment in the graph /// </summary> private NodeSegmentAssignment AddAssignment(Node node, Segment segment) { var assignment = new NodeSegmentAssignment { Node = node, Segment = segment, DependentNodes = new List <IList <Node> >() }; foreach (var dependentNode in node.DependentNodes) { assignment.DependentNodes.Add(dependentNode.ToList()); } node.AssignedSegments.Add(assignment); segment.AssignedNodes.Add(assignment); return(assignment); }
/// <summary> /// Takes a node, and a list of alternate dependencies and chooses which /// of the dependencies will be satisfied by the segmentation graph for /// this particular segment assignment /// </summary> private Node ResolveMultiChoiceDependency( NodeSegmentAssignment assignment, IList <Node> choices) { // First look for a dependant in the same segment var result = assignment.Segment.AssignedNodes.Select(a => a.Node).FirstOrDefault(choices.Contains); // Second look for a dependant in an ancestor segment if (result == null) { var ancestor = SegmentAncestors(assignment.Segment) .FirstOrDefault(s => s.AssignedNodes.Select(a => a.Node).Any(choices.Contains)); if (ancestor != null) { result = ancestor.AssignedNodes.Select(a => a.Node).FirstOrDefault(choices.Contains); } } return(result); }