public override bool Traverse(GraphT graph, VisitVertex visitVertex, bool breakIt, bool breakOnFalse) { graph.Vertices.Select(v => { v.Value.SetVisited(false); return(0); }).Count(); _pendingVertices.Clear(); _pendingVertices.UnionWith(graph.GetRootVertices(_isDownStream)); while (_pendingVertices.Count != 0) { foreach (var v in _pendingVertices) { var isAllDirectionalVerticesSatisfied = true; if (_isDownStream) { if (v.InVertices.Any(inVertex => !inVertex.IsVisited())) { isAllDirectionalVerticesSatisfied = false; } } else { if (v.OutVertices.Any(outVertex => !outVertex.IsVisited())) { isAllDirectionalVerticesSatisfied = false; } } if (!isAllDirectionalVerticesSatisfied) { continue; } var r = visitVertex(v); if (breakIt) { if (r != breakOnFalse) { return(r); } } v.SetVisited(true); _pendingVertices.Remove(v); _pendingVertices.UnionWith(_isDownStream ? v.OutVertices : v.InVertices); break; } } return(true); }
private bool TraverseWithPendingStartPoints(VisitVertex visitVertex, bool breakIt, bool breakOnFalse) { while (_pendingVertices.Count != 0) { var v = _pendingVertices[0]; _pendingVertices.RemoveAt(0); var r = visitVertex(v); if (breakIt) { if (r != breakOnFalse) { return(r); } } _visitedVertices.Add(v); if (!_isDownStream) { foreach (var vv in v.InVertices) { if (!_visitedVertices.Contains(vv)) { _pendingVertices.Add(vv); } } } else { foreach (var vv in v.OutVertices) { if (!_visitedVertices.Contains(vv)) { _pendingVertices.Add(vv); } } } } return(true); }
public override bool Traverse(GraphT graph, VisitVertex visitVertex, bool breakIt, bool breakOnFalse) { graph.Vertices.Select(v => { v.Value.SetVisited(false); return(0); }).Count(); _pendingVertices = graph.GetRootVertices(true); return(TraverseWithPendingStartPoints(visitVertex, breakIt, breakOnFalse)); }
public abstract bool Traverse(GraphT graph, VisitVertex visitor, bool breakIt, bool breakOnFalse);