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); }
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))); }
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), }); }
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); }
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); } } }
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))); }
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)); }