Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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));
 }
Exemplo n.º 4
0
 public abstract bool Traverse(GraphT graph, VisitVertex visitor, bool breakIt, bool breakOnFalse);