test_swap.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import pytest
  2. import networkx as nx
  3. def test_directed_edge_swap():
  4. graph = nx.path_graph(200, create_using=nx.DiGraph)
  5. in_degrees = sorted((n, d) for n, d in graph.in_degree())
  6. out_degrees = sorted((n, d) for n, d in graph.out_degree())
  7. G = nx.directed_edge_swap(graph, nswap=40, max_tries=500, seed=1)
  8. assert in_degrees == sorted((n, d) for n, d in G.in_degree())
  9. assert out_degrees == sorted((n, d) for n, d in G.out_degree())
  10. def test_edge_cases_directed_edge_swap():
  11. # Tests cases when swaps are impossible, either too few edges exist, or self loops/cycles are unavoidable
  12. # TODO: Rewrite function to explicitly check for impossible swaps and raise error
  13. e = (
  14. "Maximum number of swap attempts \\(11\\) exceeded "
  15. "before desired swaps achieved \\(\\d\\)."
  16. )
  17. graph = nx.DiGraph([(0, 0), (0, 1), (1, 0), (2, 3), (3, 2)])
  18. with pytest.raises(nx.NetworkXAlgorithmError, match=e):
  19. nx.directed_edge_swap(graph, nswap=1, max_tries=10, seed=1)
  20. def test_double_edge_swap():
  21. graph = nx.barabasi_albert_graph(200, 1)
  22. degrees = sorted(d for n, d in graph.degree())
  23. G = nx.double_edge_swap(graph, 40)
  24. assert degrees == sorted(d for n, d in graph.degree())
  25. def test_double_edge_swap_seed():
  26. graph = nx.barabasi_albert_graph(200, 1)
  27. degrees = sorted(d for n, d in graph.degree())
  28. G = nx.double_edge_swap(graph, 40, seed=1)
  29. assert degrees == sorted(d for n, d in graph.degree())
  30. def test_connected_double_edge_swap():
  31. graph = nx.barabasi_albert_graph(200, 1)
  32. degrees = sorted(d for n, d in graph.degree())
  33. G = nx.connected_double_edge_swap(graph, 40, seed=1)
  34. assert nx.is_connected(graph)
  35. assert degrees == sorted(d for n, d in graph.degree())
  36. def test_connected_double_edge_swap_low_window_threshold():
  37. graph = nx.barabasi_albert_graph(200, 1)
  38. degrees = sorted(d for n, d in graph.degree())
  39. G = nx.connected_double_edge_swap(graph, 40, _window_threshold=0, seed=1)
  40. assert nx.is_connected(graph)
  41. assert degrees == sorted(d for n, d in graph.degree())
  42. def test_connected_double_edge_swap_star():
  43. # Testing ui==xi in connected_double_edge_swap
  44. graph = nx.star_graph(40)
  45. degrees = sorted(d for n, d in graph.degree())
  46. G = nx.connected_double_edge_swap(graph, 1, seed=4)
  47. assert nx.is_connected(graph)
  48. assert degrees == sorted(d for n, d in graph.degree())
  49. def test_connected_double_edge_swap_star_low_window_threshold():
  50. # Testing ui==xi in connected_double_edge_swap with low window threshold
  51. graph = nx.star_graph(40)
  52. degrees = sorted(d for n, d in graph.degree())
  53. G = nx.connected_double_edge_swap(graph, 1, _window_threshold=0, seed=4)
  54. assert nx.is_connected(graph)
  55. assert degrees == sorted(d for n, d in graph.degree())
  56. def test_directed_edge_swap_small():
  57. with pytest.raises(nx.NetworkXError):
  58. G = nx.directed_edge_swap(nx.path_graph(3, create_using=nx.DiGraph))
  59. def test_directed_edge_swap_tries():
  60. with pytest.raises(nx.NetworkXError):
  61. G = nx.directed_edge_swap(
  62. nx.path_graph(3, create_using=nx.DiGraph), nswap=1, max_tries=0
  63. )
  64. def test_directed_exception_undirected():
  65. graph = nx.Graph([(0, 1), (2, 3)])
  66. with pytest.raises(nx.NetworkXNotImplemented):
  67. G = nx.directed_edge_swap(graph)
  68. def test_directed_edge_max_tries():
  69. with pytest.raises(nx.NetworkXAlgorithmError):
  70. G = nx.directed_edge_swap(
  71. nx.complete_graph(4, nx.DiGraph()), nswap=1, max_tries=5
  72. )
  73. def test_double_edge_swap_small():
  74. with pytest.raises(nx.NetworkXError):
  75. G = nx.double_edge_swap(nx.path_graph(3))
  76. def test_double_edge_swap_tries():
  77. with pytest.raises(nx.NetworkXError):
  78. G = nx.double_edge_swap(nx.path_graph(10), nswap=1, max_tries=0)
  79. def test_double_edge_directed():
  80. graph = nx.DiGraph([(0, 1), (2, 3)])
  81. with pytest.raises(nx.NetworkXError, match="not defined for directed graphs."):
  82. G = nx.double_edge_swap(graph)
  83. def test_double_edge_max_tries():
  84. with pytest.raises(nx.NetworkXAlgorithmError):
  85. G = nx.double_edge_swap(nx.complete_graph(4), nswap=1, max_tries=5)
  86. def test_connected_double_edge_swap_small():
  87. with pytest.raises(nx.NetworkXError):
  88. G = nx.connected_double_edge_swap(nx.path_graph(3))
  89. def test_connected_double_edge_swap_not_connected():
  90. with pytest.raises(nx.NetworkXError):
  91. G = nx.path_graph(3)
  92. nx.add_path(G, [10, 11, 12])
  93. G = nx.connected_double_edge_swap(G)
  94. def test_degree_seq_c4():
  95. G = nx.cycle_graph(4)
  96. degrees = sorted(d for n, d in G.degree())
  97. G = nx.double_edge_swap(G, 1, 100)
  98. assert degrees == sorted(d for n, d in G.degree())
  99. def test_fewer_than_4_nodes():
  100. G = nx.DiGraph()
  101. G.add_nodes_from([0, 1, 2])
  102. with pytest.raises(nx.NetworkXError, match=".*fewer than four nodes."):
  103. nx.directed_edge_swap(G)
  104. def test_less_than_3_edges():
  105. G = nx.DiGraph([(0, 1), (1, 2)])
  106. G.add_nodes_from([3, 4])
  107. with pytest.raises(nx.NetworkXError, match=".*fewer than 3 edges"):
  108. nx.directed_edge_swap(G)
  109. G = nx.Graph()
  110. G.add_nodes_from([0, 1, 2, 3])
  111. with pytest.raises(nx.NetworkXError, match=".*fewer than 2 edges"):
  112. nx.double_edge_swap(G)