public void  向グラフ()
        {
            var gb = new GraphBuilder(8, true);

            gb.Add(0, 1);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(3, 4);
            gb.Add(4, 5);
            gb.Add(5, 6);
            gb.Add(6, 2);
            gb.Add(2, 4);
            gb.Add(4, 7);
            gb.Add(7, 0);
            var(from, edges) = gb.ToGraph().EulerianTrail();
            from.Should().Be(0);
            edges.Should().Equal(new GraphEdge[] {
                new GraphEdge(1),
                new GraphEdge(2),
                new GraphEdge(3),
                new GraphEdge(4),
                new GraphEdge(5),
                new GraphEdge(6),
                new GraphEdge(2),
                new GraphEdge(4),
                new GraphEdge(7),
                new GraphEdge(0),
            });
        }
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(5, true);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(0, 3);
            gb.Add(0, 4);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(2, 4);
            gb.Add(4, 3);
            gb.Add(4, 0);
            var graph = gb.ToGraph();

            graph.ShortestPathBFS(0).Should().Equal(0u, 1u, 1u, 1u, 1u);
            graph.ShortestPathBFS(1).Should().Equal(3u, 0u, 1u, 2u, 2u);
            graph.ShortestPathBFS(2).Should().Equal(2u, 3u, 0u, 1u, 1u);
            graph.ShortestPathBFS(3).Should().Equal(4294967295u, 4294967295u, 4294967295u, 0u, 4294967295u);
            graph.ShortestPathBFS(4).Should().Equal(1u, 2u, 2u, 1u, 0u);

            graph.ShortestPathBFSReverse(0).Should().Equal(0u, 3u, 2u, 4294967295u, 1u);
            graph.ShortestPathBFSReverse(1).Should().Equal(1u, 0u, 3u, 4294967295u, 2u);
            graph.ShortestPathBFSReverse(2).Should().Equal(1u, 1u, 0u, 4294967295u, 2u);
            graph.ShortestPathBFSReverse(3).Should().Equal(1u, 2u, 1u, 0u, 1u);
            graph.ShortestPathBFSReverse(4).Should().Equal(1u, 2u, 1u, 4294967295u, 0u);
        }
Esempio n. 3
0
        public void Random()
        {
            const int N   = 60;
            var       wgb = new WIntGraphBuilder(N, false);
            var       gb  = new GraphBuilder(N, false);
            var       arr = Enumerable.Range(0, N).OrderBy(_ => Guid.NewGuid()).ToArray();

            for (int i = 1; i < arr.Length; i++)
            {
                gb.Add(arr[i - 1], arr[i]);
                wgb.Add(arr[i - 1], arr[i], i);
            }
            for (int r = 0; r < N; r++)
            {
                var tree  = gb.ToTree(r);
                var wtree = wgb.ToTree(r);
                var lca   = tree.LowestCommonAncestor();
                var wlca  = wtree.LowestCommonAncestor();
                for (int i = 0; i < N; i++)
                {
                    for (int j = 0; j < N; j++)
                    {
                        var(expectedLca, expectedDist) = LcaDirect(tree.AsArray(), i, j);
                        lca.Lca(i, j).Should().Be(expectedLca);
                        wlca.Lca(i, j).Should().Be(expectedLca);
                        lca.Distance(i, j).Should().Be(expectedDist);
                        wlca.Distance(i, j).Should().Be(expectedDist);
                    }
                }
            }
        }
        public void 森の連結重みなし()
        {
            var gb = new GraphBuilder(4, false);

            gb.Add(0, 2);
            gb.Add(1, 3);
            gb.Add(2, 3);
            var graph = gb.ToGraph();
            var res   = graph.Kruskal();

            res.Should().HaveCount(1);
            res[0].Should().Equal(
                (0, new GraphEdge(2)),
                (1, new GraphEdge(3)),
                (2, new GraphEdge(3)));
        }
Esempio n. 5
0
        static void Main(string[] args)
        {
            var model = new BocModel();

            if (args[0] == "-b")
            {
                var root = new VectorNode();

                while (true)
                {
                    Console.WriteLine("enter word:");

                    var command = Console.ReadLine();

                    if (string.IsNullOrWhiteSpace(command))
                    {
                        break;
                    }

                    GraphBuilder.Add(root, new VectorNode(model.Tokenize(command).Embeddings[0]), model);
                }

                Console.WriteLine(root.Visualize());

                while (true)
                {
                    Console.WriteLine("enter query:");

                    var command = Console.ReadLine();

                    if (string.IsNullOrWhiteSpace(command))
                    {
                        break;
                    }

                    var hit = PathFinder.ClosestMatch(root, model.Tokenize(command).Embeddings[0], model);

                    Console.WriteLine($"{hit.Score} {hit.Node}");
                }
            }
            else
            {
                var doc1 = new VectorNode(model.Tokenize(args[0]).Embeddings[0]);

                var doc2  = new VectorNode(model.Tokenize(args[1]).Embeddings[0]);
                var angle = model.CosAngle(doc1.Vector, doc2.Vector);
                Console.WriteLine($"similarity: {angle}");
            }
        }
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(5, false);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(0, 3);
            gb.Add(0, 4);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(2, 4);
            gb.Add(4, 3);
            gb.Add(4, 0);
            var graph = gb.ToGraph();

            graph.MinimumSpanningTreeBFS().Should().Equal(
                (0, new GraphEdge(1)),
                (0, new GraphEdge(2)),
                (0, new GraphEdge(3)),
                (0, new GraphEdge(4)));
        }
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(5, false);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(0, 3);
            gb.Add(0, 4);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(2, 4);
            gb.Add(4, 3);
            gb.Add(4, 0);
            var graph = gb.ToGraph();
            var res   = graph.Kruskal();

            res.Should().HaveCount(1);
            res[0].Should().Equal(
                (0, new GraphEdge(1)),
                (0, new GraphEdge(2)),
                (0, new GraphEdge(3)),
                (0, new GraphEdge(4)));
        }
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(8, true);

            gb.Add(0, 1);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(3, 4);
            gb.Add(4, 5);
            gb.Add(5, 6);
            gb.Add(4, 7);
            gb.Add(7, 3);
            var(from, edges) = gb.ToGraph().GetCycleDFS();
            from.Should().Be(3);
            edges.Should().Equal(new GraphEdge[] {
                new GraphEdge(4),
                new GraphEdge(7),
                new GraphEdge(3),
            });
        }
Esempio n. 9
0
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(8, true);

            gb.Add(0, 1);
            gb.Add(1, 2);
            gb.Add(2, 3);
            gb.Add(3, 4);
            gb.Add(4, 5);
            gb.Add(5, 6);
            gb.Add(4, 7);
            gb.Add(7, 3);
            var scc = gb.ToGraph().Scc();

            scc[0].Should().Equal(0);
            scc[1].Should().Equal(1);
            scc[2].Should().Equal(2);
            scc[3].Should().Equal(3, 4, 7);
            scc[4].Should().Equal(5);
            scc[5].Should().Equal(6);
        }
Esempio n. 10
0
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(8, false);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(1, 3);
            gb.Add(1, 4);
            gb.Add(2, 5);
            gb.Add(2, 6);
            gb.Add(3, 7);
            var tree = gb.ToTree();
            var tour = tree.EulerianTour();

            tour.Events.Should().Equal(
                new オイラーツアー <GraphEdge> .Event(-1, new GraphEdge(0), true),
                new オイラーツアー <GraphEdge> .Event(0, new GraphEdge(1), true),
                new オイラーツアー <GraphEdge> .Event(1, new GraphEdge(3), true),
                new オイラーツアー <GraphEdge> .Event(3, new GraphEdge(7), true),
                new オイラーツアー <GraphEdge> .Event(3, new GraphEdge(7), false),
                new オイラーツアー <GraphEdge> .Event(1, new GraphEdge(3), false),
                new オイラーツアー <GraphEdge> .Event(1, new GraphEdge(4), true),
                new オイラーツアー <GraphEdge> .Event(1, new GraphEdge(4), false),
                new オイラーツアー <GraphEdge> .Event(0, new GraphEdge(1), false),
                new オイラーツアー <GraphEdge> .Event(0, new GraphEdge(2), true),
                new オイラーツアー <GraphEdge> .Event(2, new GraphEdge(5), true),
                new オイラーツアー <GraphEdge> .Event(2, new GraphEdge(5), false),
                new オイラーツアー <GraphEdge> .Event(2, new GraphEdge(6), true),
                new オイラーツアー <GraphEdge> .Event(2, new GraphEdge(6), false),
                new オイラーツアー <GraphEdge> .Event(0, new GraphEdge(2), false),
                new オイラーツアー <GraphEdge> .Event(-1, new GraphEdge(0), false));
            Enumerable.Range(0, 8).Select(i => tour[i]).Should().Equal(
                (0, 15), (1, 8), (9, 14), (2, 5), (6, 7), (10, 11), (12, 13), (3, 4));

            var lca = tree.LowestCommonAncestor();

            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    var expectedLca = lca.Lca(i, j);
                    tour.LowestCommonAncestor(i, j).Should().Be(expectedLca, "Lca {0} and {1} → {2}", i, j, expectedLca);
                }
            }
        }
Esempio n. 11
0
        public 木の探索Tests()
        {
            gb = new GraphBuilder(8, false);
            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(1, 3);
            gb.Add(1, 4);
            gb.Add(2, 5);
            gb.Add(2, 6);
            gb.Add(3, 7);

            wgb = new WIntGraphBuilder(8, false);
            wgb.Add(0, 1, 1);
            wgb.Add(0, 2, 2);
            wgb.Add(1, 3, 3);
            wgb.Add(1, 4, 4);
            wgb.Add(2, 5, 5);
            wgb.Add(2, 6, 6);
            wgb.Add(3, 7, 7);
        }
        public void 連結ではない重みなし()
        {
            var gb = new GraphBuilder(8, false);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(1, 2);
            gb.Add(4, 3);
            gb.Add(4, 7);
            gb.Add(6, 5);
            var graph = gb.ToGraph();
            var res   = graph.Kruskal();

            res.Should().HaveCount(3);
            res[0].Should().Equal(
                (0, new GraphEdge(1)),
                (0, new GraphEdge(2)));
            res[1].Should().Equal(
                (3, new GraphEdge(4)),
                (4, new GraphEdge(7)));
            res[2].Should().Equal(
                (5, new GraphEdge(6)));
        }
Esempio n. 13
0
        public void 重みなしグラフ()
        {
            var gb = new GraphBuilder(8, false);

            gb.Add(0, 1);
            gb.Add(0, 2);
            gb.Add(1, 3);
            gb.Add(1, 4);
            gb.Add(2, 5);
            gb.Add(2, 6);
            gb.Add(3, 7);
            var lca0 = gb.ToTree().LowestCommonAncestor();

            lca0.Lca(0, 0).Should().Be(0); lca0.Lca(0, 1).Should().Be(0); lca0.Lca(0, 2).Should().Be(0); lca0.Lca(0, 3).Should().Be(0);
            lca0.Lca(0, 4).Should().Be(0); lca0.Lca(0, 5).Should().Be(0); lca0.Lca(0, 6).Should().Be(0); lca0.Lca(0, 7).Should().Be(0);
            lca0.Lca(1, 0).Should().Be(0); lca0.Lca(1, 1).Should().Be(1); lca0.Lca(1, 2).Should().Be(0); lca0.Lca(1, 3).Should().Be(1);
            lca0.Lca(1, 4).Should().Be(1); lca0.Lca(1, 5).Should().Be(0); lca0.Lca(1, 6).Should().Be(0); lca0.Lca(1, 7).Should().Be(1);
            lca0.Lca(2, 0).Should().Be(0); lca0.Lca(2, 1).Should().Be(0); lca0.Lca(2, 2).Should().Be(2); lca0.Lca(2, 3).Should().Be(0);
            lca0.Lca(2, 4).Should().Be(0); lca0.Lca(2, 5).Should().Be(2); lca0.Lca(2, 6).Should().Be(2); lca0.Lca(2, 7).Should().Be(0);
            lca0.Lca(3, 0).Should().Be(0); lca0.Lca(3, 1).Should().Be(1); lca0.Lca(3, 2).Should().Be(0); lca0.Lca(3, 3).Should().Be(3);
            lca0.Lca(3, 4).Should().Be(1); lca0.Lca(3, 5).Should().Be(0); lca0.Lca(3, 6).Should().Be(0); lca0.Lca(3, 7).Should().Be(3);
            lca0.Lca(4, 0).Should().Be(0); lca0.Lca(4, 1).Should().Be(1); lca0.Lca(4, 2).Should().Be(0); lca0.Lca(4, 3).Should().Be(1);
            lca0.Lca(4, 4).Should().Be(4); lca0.Lca(4, 5).Should().Be(0); lca0.Lca(4, 6).Should().Be(0); lca0.Lca(4, 7).Should().Be(1);
            lca0.Lca(5, 0).Should().Be(0); lca0.Lca(5, 1).Should().Be(0); lca0.Lca(5, 2).Should().Be(2); lca0.Lca(5, 3).Should().Be(0);
            lca0.Lca(5, 4).Should().Be(0); lca0.Lca(5, 5).Should().Be(5); lca0.Lca(5, 6).Should().Be(2); lca0.Lca(5, 7).Should().Be(0);
            lca0.Lca(6, 0).Should().Be(0); lca0.Lca(6, 1).Should().Be(0); lca0.Lca(6, 2).Should().Be(2); lca0.Lca(6, 3).Should().Be(0);
            lca0.Lca(6, 4).Should().Be(0); lca0.Lca(6, 5).Should().Be(2); lca0.Lca(6, 6).Should().Be(6); lca0.Lca(6, 7).Should().Be(0);
            lca0.Lca(7, 0).Should().Be(0); lca0.Lca(7, 1).Should().Be(1); lca0.Lca(7, 2).Should().Be(0); lca0.Lca(7, 3).Should().Be(3);
            lca0.Lca(7, 4).Should().Be(1); lca0.Lca(7, 5).Should().Be(0); lca0.Lca(7, 6).Should().Be(0); lca0.Lca(7, 7).Should().Be(7);

            lca0[0, 0].Should().Be(0); lca0[0, 1].Should().Be(0); lca0[0, 2].Should().Be(0); lca0[0, 3].Should().Be(0);
            lca0[0, 4].Should().Be(0); lca0[0, 5].Should().Be(0); lca0[0, 6].Should().Be(0); lca0[0, 7].Should().Be(0);
            lca0[1, 0].Should().Be(0); lca0[1, 1].Should().Be(1); lca0[1, 2].Should().Be(0); lca0[1, 3].Should().Be(1);
            lca0[1, 4].Should().Be(1); lca0[1, 5].Should().Be(0); lca0[1, 6].Should().Be(0); lca0[1, 7].Should().Be(1);
            lca0[2, 0].Should().Be(0); lca0[2, 1].Should().Be(0); lca0[2, 2].Should().Be(2); lca0[2, 3].Should().Be(0);
            lca0[2, 4].Should().Be(0); lca0[2, 5].Should().Be(2); lca0[2, 6].Should().Be(2); lca0[2, 7].Should().Be(0);
            lca0[3, 0].Should().Be(0); lca0[3, 1].Should().Be(1); lca0[3, 2].Should().Be(0); lca0[3, 3].Should().Be(3);
            lca0[3, 4].Should().Be(1); lca0[3, 5].Should().Be(0); lca0[3, 6].Should().Be(0); lca0[3, 7].Should().Be(3);
            lca0[4, 0].Should().Be(0); lca0[4, 1].Should().Be(1); lca0[4, 2].Should().Be(0); lca0[4, 3].Should().Be(1);
            lca0[4, 4].Should().Be(4); lca0[4, 5].Should().Be(0); lca0[4, 6].Should().Be(0); lca0[4, 7].Should().Be(1);
            lca0[5, 0].Should().Be(0); lca0[5, 1].Should().Be(0); lca0[5, 2].Should().Be(2); lca0[5, 3].Should().Be(0);
            lca0[5, 4].Should().Be(0); lca0[5, 5].Should().Be(5); lca0[5, 6].Should().Be(2); lca0[5, 7].Should().Be(0);
            lca0[6, 0].Should().Be(0); lca0[6, 1].Should().Be(0); lca0[6, 2].Should().Be(2); lca0[6, 3].Should().Be(0);
            lca0[6, 4].Should().Be(0); lca0[6, 5].Should().Be(2); lca0[6, 6].Should().Be(6); lca0[6, 7].Should().Be(0);
            lca0[7, 0].Should().Be(0); lca0[7, 1].Should().Be(1); lca0[7, 2].Should().Be(0); lca0[7, 3].Should().Be(3);
            lca0[7, 4].Should().Be(1); lca0[7, 5].Should().Be(0); lca0[7, 6].Should().Be(0); lca0[7, 7].Should().Be(7);

            lca0.ChildOfLca(0, 0).Should().Be((0, 0)); lca0.ChildOfLca(0, 1).Should().Be((0, 1)); lca0.ChildOfLca(0, 2).Should().Be((0, 2)); lca0.ChildOfLca(0, 3).Should().Be((0, 1));
            lca0.ChildOfLca(0, 4).Should().Be((0, 1)); lca0.ChildOfLca(0, 5).Should().Be((0, 2)); lca0.ChildOfLca(0, 6).Should().Be((0, 2)); lca0.ChildOfLca(0, 7).Should().Be((0, 1));
            lca0.ChildOfLca(1, 0).Should().Be((1, 0)); lca0.ChildOfLca(1, 1).Should().Be((1, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(1, 3).Should().Be((1, 3));
            lca0.ChildOfLca(1, 4).Should().Be((1, 4)); lca0.ChildOfLca(1, 5).Should().Be((1, 2)); lca0.ChildOfLca(1, 6).Should().Be((1, 2)); lca0.ChildOfLca(1, 7).Should().Be((1, 3));
            lca0.ChildOfLca(2, 0).Should().Be((2, 0)); lca0.ChildOfLca(2, 1).Should().Be((2, 1)); lca0.ChildOfLca(2, 2).Should().Be((2, 2)); lca0.ChildOfLca(2, 3).Should().Be((2, 1));
            lca0.ChildOfLca(2, 4).Should().Be((2, 1)); lca0.ChildOfLca(2, 5).Should().Be((2, 5)); lca0.ChildOfLca(2, 6).Should().Be((2, 6)); lca0.ChildOfLca(2, 7).Should().Be((2, 1));
            lca0.ChildOfLca(3, 0).Should().Be((1, 0)); lca0.ChildOfLca(3, 1).Should().Be((3, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(3, 3).Should().Be((3, 3));
            lca0.ChildOfLca(3, 4).Should().Be((3, 4)); lca0.ChildOfLca(3, 5).Should().Be((1, 2)); lca0.ChildOfLca(3, 6).Should().Be((1, 2)); lca0.ChildOfLca(3, 7).Should().Be((3, 7));
            lca0.ChildOfLca(4, 0).Should().Be((1, 0)); lca0.ChildOfLca(4, 1).Should().Be((4, 1)); lca0.ChildOfLca(4, 2).Should().Be((1, 2)); lca0.ChildOfLca(4, 3).Should().Be((4, 3));
            lca0.ChildOfLca(4, 4).Should().Be((4, 4)); lca0.ChildOfLca(4, 5).Should().Be((1, 2)); lca0.ChildOfLca(4, 6).Should().Be((1, 2)); lca0.ChildOfLca(4, 7).Should().Be((4, 3));
            lca0.ChildOfLca(5, 0).Should().Be((2, 0)); lca0.ChildOfLca(5, 1).Should().Be((2, 1)); lca0.ChildOfLca(5, 2).Should().Be((5, 2)); lca0.ChildOfLca(5, 3).Should().Be((2, 1));
            lca0.ChildOfLca(5, 4).Should().Be((2, 1)); lca0.ChildOfLca(5, 5).Should().Be((5, 5)); lca0.ChildOfLca(5, 6).Should().Be((5, 6)); lca0.ChildOfLca(5, 7).Should().Be((2, 1));
            lca0.ChildOfLca(6, 0).Should().Be((2, 0)); lca0.ChildOfLca(6, 1).Should().Be((2, 1)); lca0.ChildOfLca(6, 2).Should().Be((6, 2)); lca0.ChildOfLca(6, 3).Should().Be((2, 1));
            lca0.ChildOfLca(6, 4).Should().Be((2, 1)); lca0.ChildOfLca(6, 5).Should().Be((6, 5)); lca0.ChildOfLca(6, 6).Should().Be((6, 6)); lca0.ChildOfLca(6, 7).Should().Be((2, 1));
            lca0.ChildOfLca(7, 0).Should().Be((1, 0)); lca0.ChildOfLca(7, 1).Should().Be((3, 1)); lca0.ChildOfLca(7, 2).Should().Be((1, 2)); lca0.ChildOfLca(7, 3).Should().Be((7, 3));
            lca0.ChildOfLca(7, 4).Should().Be((3, 4)); lca0.ChildOfLca(7, 5).Should().Be((1, 2)); lca0.ChildOfLca(7, 6).Should().Be((1, 2)); lca0.ChildOfLca(7, 7).Should().Be((7, 7));
        }