test_all_random_functions.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import pytest
  2. np = pytest.importorskip("numpy")
  3. import random
  4. import networkx as nx
  5. from networkx.algorithms import approximation as approx
  6. from networkx.algorithms import threshold
  7. progress = 0
  8. # store the random numbers after setting a global seed
  9. np.random.seed(42)
  10. np_rv = np.random.rand()
  11. random.seed(42)
  12. py_rv = random.random()
  13. def t(f, *args, **kwds):
  14. """call one function and check if global RNG changed"""
  15. global progress
  16. progress += 1
  17. print(progress, ",", end="")
  18. f(*args, **kwds)
  19. after_np_rv = np.random.rand()
  20. # if np_rv != after_np_rv:
  21. # print(np_rv, after_np_rv, "don't match np!")
  22. assert np_rv == after_np_rv
  23. np.random.seed(42)
  24. after_py_rv = random.random()
  25. # if py_rv != after_py_rv:
  26. # print(py_rv, after_py_rv, "don't match py!")
  27. assert py_rv == after_py_rv
  28. random.seed(42)
  29. def run_all_random_functions(seed):
  30. n = 20
  31. m = 10
  32. k = l = 2
  33. s = v = 10
  34. p = q = p1 = p2 = p_in = p_out = 0.4
  35. alpha = radius = theta = 0.75
  36. sizes = (20, 20, 10)
  37. colors = [1, 2, 3]
  38. G = nx.barbell_graph(12, 20)
  39. H = nx.cycle_graph(3)
  40. H.add_weighted_edges_from((u, v, 0.2) for u, v in H.edges)
  41. deg_sequence = [3, 2, 1, 3, 2, 1, 3, 2, 1, 2, 1, 2, 1]
  42. in_degree_sequence = w = sequence = aseq = bseq = deg_sequence
  43. # print("starting...")
  44. t(nx.maximal_independent_set, G, seed=seed)
  45. t(nx.rich_club_coefficient, G, seed=seed, normalized=False)
  46. t(nx.random_reference, G, seed=seed)
  47. t(nx.lattice_reference, G, seed=seed)
  48. t(nx.sigma, G, 1, 2, seed=seed)
  49. t(nx.omega, G, 1, 2, seed=seed)
  50. # print("out of smallworld.py")
  51. t(nx.double_edge_swap, G, seed=seed)
  52. # print("starting connected_double_edge_swap")
  53. t(nx.connected_double_edge_swap, nx.complete_graph(9), seed=seed)
  54. # print("ending connected_double_edge_swap")
  55. t(nx.random_layout, G, seed=seed)
  56. t(nx.fruchterman_reingold_layout, G, seed=seed)
  57. t(nx.algebraic_connectivity, G, seed=seed)
  58. t(nx.fiedler_vector, G, seed=seed)
  59. t(nx.spectral_ordering, G, seed=seed)
  60. # print('starting average_clustering')
  61. t(approx.average_clustering, G, seed=seed)
  62. t(approx.simulated_annealing_tsp, H, "greedy", source=1, seed=seed)
  63. t(approx.threshold_accepting_tsp, H, "greedy", source=1, seed=seed)
  64. t(
  65. approx.traveling_salesman_problem,
  66. H,
  67. method=lambda G, wt: approx.simulated_annealing_tsp(G, "greedy", wt, seed=seed),
  68. )
  69. t(
  70. approx.traveling_salesman_problem,
  71. H,
  72. method=lambda G, wt: approx.threshold_accepting_tsp(G, "greedy", wt, seed=seed),
  73. )
  74. t(nx.betweenness_centrality, G, seed=seed)
  75. t(nx.edge_betweenness_centrality, G, seed=seed)
  76. t(nx.approximate_current_flow_betweenness_centrality, G, seed=seed)
  77. # print("kernighan")
  78. t(nx.algorithms.community.kernighan_lin_bisection, G, seed=seed)
  79. # nx.algorithms.community.asyn_lpa_communities(G, seed=seed)
  80. t(nx.algorithms.tree.greedy_branching, G, seed=seed)
  81. t(nx.algorithms.tree.Edmonds, G, seed=seed)
  82. # print('done with graph argument functions')
  83. t(nx.spectral_graph_forge, G, alpha, seed=seed)
  84. t(nx.algorithms.community.asyn_fluidc, G, k, max_iter=1, seed=seed)
  85. t(
  86. nx.algorithms.connectivity.edge_augmentation.greedy_k_edge_augmentation,
  87. G,
  88. k,
  89. seed=seed,
  90. )
  91. t(nx.algorithms.coloring.strategy_random_sequential, G, colors, seed=seed)
  92. cs = ["d", "i", "i", "d", "d", "i"]
  93. t(threshold.swap_d, cs, seed=seed)
  94. t(nx.configuration_model, deg_sequence, seed=seed)
  95. t(
  96. nx.directed_configuration_model,
  97. in_degree_sequence,
  98. in_degree_sequence,
  99. seed=seed,
  100. )
  101. t(nx.expected_degree_graph, w, seed=seed)
  102. t(nx.random_degree_sequence_graph, sequence, seed=seed)
  103. joint_degrees = {
  104. 1: {4: 1},
  105. 2: {2: 2, 3: 2, 4: 2},
  106. 3: {2: 2, 4: 1},
  107. 4: {1: 1, 2: 2, 3: 1},
  108. }
  109. t(nx.joint_degree_graph, joint_degrees, seed=seed)
  110. joint_degree_sequence = [
  111. (1, 0),
  112. (1, 0),
  113. (1, 0),
  114. (2, 0),
  115. (1, 0),
  116. (2, 1),
  117. (0, 1),
  118. (0, 1),
  119. ]
  120. t(nx.random_clustered_graph, joint_degree_sequence, seed=seed)
  121. constructor = [(3, 3, 0.5), (10, 10, 0.7)]
  122. t(nx.random_shell_graph, constructor, seed=seed)
  123. t(nx.random_triad, G.to_directed(), seed=seed)
  124. mapping = {1: 0.4, 2: 0.3, 3: 0.3}
  125. t(nx.utils.random_weighted_sample, mapping, k, seed=seed)
  126. t(nx.utils.weighted_choice, mapping, seed=seed)
  127. t(nx.algorithms.bipartite.configuration_model, aseq, bseq, seed=seed)
  128. t(nx.algorithms.bipartite.preferential_attachment_graph, aseq, p, seed=seed)
  129. def kernel_integral(u, w, z):
  130. return z - w
  131. t(nx.random_kernel_graph, n, kernel_integral, seed=seed)
  132. sizes = [75, 75, 300]
  133. probs = [[0.25, 0.05, 0.02], [0.05, 0.35, 0.07], [0.02, 0.07, 0.40]]
  134. t(nx.stochastic_block_model, sizes, probs, seed=seed)
  135. t(nx.random_partition_graph, sizes, p_in, p_out, seed=seed)
  136. # print("starting generator functions")
  137. t(threshold.random_threshold_sequence, n, p, seed=seed)
  138. t(nx.tournament.random_tournament, n, seed=seed)
  139. t(nx.relaxed_caveman_graph, l, k, p, seed=seed)
  140. t(nx.planted_partition_graph, l, k, p_in, p_out, seed=seed)
  141. t(nx.gaussian_random_partition_graph, n, s, v, p_in, p_out, seed=seed)
  142. t(nx.gn_graph, n, seed=seed)
  143. t(nx.gnr_graph, n, p, seed=seed)
  144. t(nx.gnc_graph, n, seed=seed)
  145. t(nx.scale_free_graph, n, seed=seed)
  146. t(nx.directed.random_uniform_k_out_graph, n, k, seed=seed)
  147. t(nx.random_k_out_graph, n, k, alpha, seed=seed)
  148. N = 1000
  149. t(nx.partial_duplication_graph, N, n, p, q, seed=seed)
  150. t(nx.duplication_divergence_graph, n, p, seed=seed)
  151. t(nx.random_geometric_graph, n, radius, seed=seed)
  152. t(nx.soft_random_geometric_graph, n, radius, seed=seed)
  153. t(nx.geographical_threshold_graph, n, theta, seed=seed)
  154. t(nx.waxman_graph, n, seed=seed)
  155. t(nx.navigable_small_world_graph, n, seed=seed)
  156. t(nx.thresholded_random_geometric_graph, n, radius, theta, seed=seed)
  157. t(nx.uniform_random_intersection_graph, n, m, p, seed=seed)
  158. t(nx.k_random_intersection_graph, n, m, k, seed=seed)
  159. t(nx.general_random_intersection_graph, n, 2, [0.1, 0.5], seed=seed)
  160. t(nx.fast_gnp_random_graph, n, p, seed=seed)
  161. t(nx.gnp_random_graph, n, p, seed=seed)
  162. t(nx.dense_gnm_random_graph, n, m, seed=seed)
  163. t(nx.gnm_random_graph, n, m, seed=seed)
  164. t(nx.newman_watts_strogatz_graph, n, k, p, seed=seed)
  165. t(nx.watts_strogatz_graph, n, k, p, seed=seed)
  166. t(nx.connected_watts_strogatz_graph, n, k, p, seed=seed)
  167. t(nx.random_regular_graph, 3, n, seed=seed)
  168. t(nx.barabasi_albert_graph, n, m, seed=seed)
  169. t(nx.extended_barabasi_albert_graph, n, m, p, q, seed=seed)
  170. t(nx.powerlaw_cluster_graph, n, m, p, seed=seed)
  171. t(nx.random_lobster, n, p1, p2, seed=seed)
  172. t(nx.random_powerlaw_tree, n, seed=seed, tries=5000)
  173. t(nx.random_powerlaw_tree_sequence, 10, seed=seed, tries=5000)
  174. t(nx.random_tree, n, seed=seed)
  175. t(nx.utils.powerlaw_sequence, n, seed=seed)
  176. t(nx.utils.zipf_rv, 2.3, seed=seed)
  177. cdist = [0.2, 0.4, 0.5, 0.7, 0.9, 1.0]
  178. t(nx.utils.discrete_sequence, n, cdistribution=cdist, seed=seed)
  179. t(nx.algorithms.bipartite.random_graph, n, m, p, seed=seed)
  180. t(nx.algorithms.bipartite.gnmk_random_graph, n, m, k, seed=seed)
  181. LFR = nx.generators.LFR_benchmark_graph
  182. t(
  183. LFR,
  184. 25,
  185. 3,
  186. 1.5,
  187. 0.1,
  188. average_degree=3,
  189. min_community=10,
  190. seed=seed,
  191. max_community=20,
  192. )
  193. t(nx.random_internet_as_graph, n, seed=seed)
  194. # print("done")
  195. # choose to test an integer seed, or whether a single RNG can be everywhere
  196. # np_rng = np.random.RandomState(14)
  197. # seed = np_rng
  198. # seed = 14
  199. @pytest.mark.slow
  200. # print("NetworkX Version:", nx.__version__)
  201. def test_rng_interface():
  202. global progress
  203. # try different kinds of seeds
  204. for seed in [14, np.random.RandomState(14)]:
  205. np.random.seed(42)
  206. random.seed(42)
  207. run_all_random_functions(seed)
  208. progress = 0
  209. # check that both global RNGs are unaffected
  210. after_np_rv = np.random.rand()
  211. # if np_rv != after_np_rv:
  212. # print(np_rv, after_np_rv, "don't match np!")
  213. assert np_rv == after_np_rv
  214. after_py_rv = random.random()
  215. # if py_rv != after_py_rv:
  216. # print(py_rv, after_py_rv, "don't match py!")
  217. assert py_rv == after_py_rv
  218. # print("\nDone testing seed:", seed)
  219. # test_rng_interface()