Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }