Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        public void GlobalSetup()
        {
            Graph = GraphHelper.Default.GetGraph(VertexCount);

            _compactExploredSet = ArrayPool <byte> .Shared.Rent(CompactSet.GetByteCount(Graph.VertexCount));

            _fastExploredSet = ArrayPool <byte> .Shared.Rent(Graph.VertexCount);
        }
Ejemplo n.º 3
0
        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("}");
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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("}");
        }