private static string E(IndexedIncidenceGraph g, int e) { string head = g.TryGetHead(e, out int h) ? V(h) : "?"; string tail = g.TryGetTail(e, out int t) ? V(t) : "?"; return(string.Concat(tail, " -> ", head)); }
public void GlobalSetup() { Graph = GraphHelper.Default.GetGraph(VertexCount); _compactExploredSet = ArrayPool <byte> .Shared.Rent(CompactSet.GetByteCount(Graph.VertexCount)); _fastExploredSet = ArrayPool <byte> .Shared.Rent(Graph.VertexCount); }
private static void DemoShuffle() { IndexedIncidenceGraph.Builder builder = new(10); using (TextReader textReader = IndexedGraphs.GetTextReader("08")) { IEnumerable <Endpoints> edges = IndexedEdgeListParser.ParseEdges(textReader); foreach (Endpoints edge in edges) { builder.Add(edge.Tail, edge.Head); } } IndexedIncidenceGraph graph = builder.ToGraph(); Console.Write($"{nameof(graph.VertexCount)}: {graph.VertexCount.ToString(F)}"); Console.WriteLine($", {nameof(graph.EdgeCount)}: {graph.EdgeCount.ToString(F)}"); TextWriter w = Console.Out; w.WriteLine("digraph Shuffled {"); w.WriteLine(" node [shape=circle fontname=\"Times-Italic\"]"); // Enumerate vertices. for (int v = 0; v < graph.VertexCount; ++v) { w.Write(v == 0 ? " " : " "); w.Write(V(v)); } w.WriteLine(); int[] permutation = Enumerable.Range(0, graph.EdgeCount) .OrderBy(i => new Random(i).Next()).ToArray(); for (int i = 0; i < graph.EdgeCount; ++i) { int e = permutation[i]; w.Write(" "); w.Write(E(graph, e)); w.WriteLine($" [label={i.ToString(F)}]"); } w.WriteLine("}"); }
private static IndexedIncidenceGraph GenerateIncidenceGraph(int vertexCount, double densityPower) { int edgeCount = (int)Math.Ceiling(Math.Pow(vertexCount, densityPower)); IndexedIncidenceGraph.Builder builder = new(vertexCount); Random prng = new(1729); for (int e = 0; e < edgeCount; ++e) { int tail = prng.Next(vertexCount); int head = prng.Next(vertexCount); builder.Add(tail, head); } IndexedIncidenceGraph result = builder.ToGraph(); return(result); }
private static void DemoRecursiveDfs() { const int vertexCount = 10000; const double densityPower = 1.5; IndexedIncidenceGraph graph = GenerateIncidenceGraph(vertexCount, densityPower); byte[] backingStore = ArrayPool <byte> .Shared.Rent(vertexCount); Array.Clear(backingStore, 0, backingStore.Length); IndexedColorDictionary colorMap = new(backingStore); List <int> steps = new(); DfsHandler <IndexedIncidenceGraph, int, int> dfsHandler = CreateDfsHandler(steps); RecursiveDfs <IndexedIncidenceGraph, int, int, EdgeEnumerator> dfs = default; dfs.Traverse(graph, 0, colorMap, dfsHandler); Console.WriteLine(steps.Count); ArrayPool <byte> .Shared.Return(backingStore, true); }
private static void Main() { IndexedIncidenceGraph.Builder builder = new(0, 31); using (TextReader textReader = IndexedGraphs.GetTextReader("09")) { IEnumerable <Endpoints> edges = IndexedEdgeListParser.ParseEdges(textReader); foreach (Endpoints edge in edges) { builder.Add(edge.Tail, edge.Head); } } IndexedIncidenceGraph graph = builder.ToGraph(); Console.Write($"{nameof(graph.VertexCount)}: {graph.VertexCount.ToString(F)}"); Console.WriteLine($", {nameof(graph.EdgeCount)}: {graph.EdgeCount.ToString(F)}"); TextWriter w = Console.Out; EagerBfs <IndexedIncidenceGraph, int, int, ArraySegment <int> .Enumerator> bfs = default; w.WriteLine($"digraph \"{bfs.GetType().Name}\" {{"); w.WriteLine(" node [shape=circle style=dashed fontname=\"Times-Italic\"]"); // Enumerate vertices. for (int v = 0; v < graph.VertexCount; ++v) { w.Write(v == 0 ? " " : " "); w.Write(V(v)); } w.WriteLine(); IndexEnumerator sources = new(2); byte[] backingStore = ArrayPool <byte> .Shared.Rent(graph.VertexCount); Array.Clear(backingStore, 0, backingStore.Length); IndexedColorDictionary colorMap = new(backingStore); HashSet <int> examinedEdges = new(graph.EdgeCount); BfsHandler <IndexedIncidenceGraph, int, int> handler = CreateHandler(w, examinedEdges); bfs.Traverse(graph, sources, colorMap, handler); ArrayPool <byte> .Shared.Return(backingStore); // Enumerate sources. w.WriteLine(); sources.Reset(); while (sources.MoveNext()) { int v = sources.Current; w.WriteLine($" {V(v)} [style=filled]"); } // Enumerate rest of edges. w.WriteLine(); for (int v = 0; v < graph.VertexCount; ++v) { ArraySegment <int> .Enumerator outEdges = graph.EnumerateOutEdges(v); while (outEdges.MoveNext()) { int e = outEdges.Current; if (examinedEdges.Contains(e)) { continue; } w.WriteLine($" {E(graph, e)} [label={e} style=dotted]"); } } w.WriteLine("}"); }