void DFS_VISIT(Vertex <T> v) { CycleChecker.Add(v, true); Console.WriteLine("Node visited : " + v.Data.ToString()); foreach (var n in v.Neighbors) { // if (GraphType == TypeOfGraph.Directed && CycleChecker.ContainsKey(n) && CycleChecker[n]) { IsThereACycle = true; } if (Visited.ContainsKey(n)) { //This node is visited (n) and its not v's parent means there exist a cycle in undirected graph if (GraphType == TypeOfGraph.Undirected && Visited[v] != n) { IsThereACycle = true; } continue; } Visited.Add(n, v); DFS_VISIT(n); } CycleChecker[v] = false; }
public override Entity Resolve(Entity owner, string key, bool fallback = false) { using (cycleChecker = cycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle, () => cycleChecker = null)) { fallback = false; IEntityContentProvider provider = GetContentProvider(); if (provider == null) { fallback = true; provider = GetContentProvider(); } if (provider == null) { throw new ContentProviderException(key, owner); } cycleChecker.AddItem(new Resolution(owner, key, provider)); return(provider.Resolve(owner, key, fallback)); } IEntityContentProvider GetContentProvider() { return(contentResolvers.Where(r => !cycleChecker.HasItem(new Resolution(owner, key, r))) .FirstOrDefault(r => r.CanResolve(owner, key, fallback)) ?? contentResolvers.FirstOrDefault(r => r.CanResolve(owner, key, fallback))); } }
public void Test_Has_SelfLoop() { Graph graph = new Graph(1); graph.AddEdge(0, 0); Assert.True(CycleChecker.HasCycle(graph)); }
public void Test_NoCycle() { Graph graph = new Graph(3); graph.AddEdge(0, 1); graph.AddEdge(1, 2); Assert.False(CycleChecker.HasCycle(graph)); }
public void Test_Has_ParallelEdge() { Graph graph = new Graph(2); graph.AddEdge(0, 1); graph.AddEdge(0, 1); Assert.True(CycleChecker.HasCycle(graph)); }
public void Test_NoCycle() { Digraph graph = new Digraph(3); graph.AddEdge(0, 1); graph.AddEdge(0, 2); CycleChecker checker = CycleChecker.Create(graph); Assert.False(checker.HasCycle); }
public void Test_HasCycle() { Digraph graph = new Digraph(3); graph.AddEdge(0, 1); graph.AddEdge(1, 2); graph.AddEdge(2, 0); CycleChecker checker = CycleChecker.Create(graph); Assert.True(checker.HasCycle); }
public void Test_GetCycle() { Digraph graph = new Digraph(3); graph.AddEdge(0, 1); graph.AddEdge(1, 2); graph.AddEdge(2, 0); CycleChecker checker = CycleChecker.Create(graph); AssertUtilities.Sequence(new Int32[4] { 2, 0, 1, 2 }, checker.GetCycle()); }
public override bool CanResolve(Entity owner, string key, bool fallback = false) { if (cycleChecker?.HasItem(new Resolution(owner, key)) == true) { //break cycles before they form return(false); } using (canCycleChecker = canCycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle, () => canCycleChecker = null)) { Resolution resolution = new Resolution(owner, key); canCycleChecker.AddItem(resolution); bool result = contentResolvers.Any(r => r.CanResolve(owner, key, false)); if (!result) { canCycleChecker.RemoveAfter(resolution); result = contentResolvers.Any(r => r.CanResolve(owner, key, true)); } return(result); } }