test_spectrum.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import pytest
  2. np = pytest.importorskip("numpy")
  3. pytest.importorskip("scipy")
  4. import networkx as nx
  5. from networkx.generators.degree_seq import havel_hakimi_graph
  6. class TestSpectrum:
  7. @classmethod
  8. def setup_class(cls):
  9. deg = [3, 2, 2, 1, 0]
  10. cls.G = havel_hakimi_graph(deg)
  11. cls.P = nx.path_graph(3)
  12. cls.WG = nx.Graph(
  13. (u, v, {"weight": 0.5, "other": 0.3}) for (u, v) in cls.G.edges()
  14. )
  15. cls.WG.add_node(4)
  16. cls.DG = nx.DiGraph()
  17. nx.add_path(cls.DG, [0, 1, 2])
  18. def test_laplacian_spectrum(self):
  19. "Laplacian eigenvalues"
  20. evals = np.array([0, 0, 1, 3, 4])
  21. e = sorted(nx.laplacian_spectrum(self.G))
  22. np.testing.assert_almost_equal(e, evals)
  23. e = sorted(nx.laplacian_spectrum(self.WG, weight=None))
  24. np.testing.assert_almost_equal(e, evals)
  25. e = sorted(nx.laplacian_spectrum(self.WG))
  26. np.testing.assert_almost_equal(e, 0.5 * evals)
  27. e = sorted(nx.laplacian_spectrum(self.WG, weight="other"))
  28. np.testing.assert_almost_equal(e, 0.3 * evals)
  29. def test_normalized_laplacian_spectrum(self):
  30. "Normalized Laplacian eigenvalues"
  31. evals = np.array([0, 0, 0.7712864461218, 1.5, 1.7287135538781])
  32. e = sorted(nx.normalized_laplacian_spectrum(self.G))
  33. np.testing.assert_almost_equal(e, evals)
  34. e = sorted(nx.normalized_laplacian_spectrum(self.WG, weight=None))
  35. np.testing.assert_almost_equal(e, evals)
  36. e = sorted(nx.normalized_laplacian_spectrum(self.WG))
  37. np.testing.assert_almost_equal(e, evals)
  38. e = sorted(nx.normalized_laplacian_spectrum(self.WG, weight="other"))
  39. np.testing.assert_almost_equal(e, evals)
  40. def test_adjacency_spectrum(self):
  41. "Adjacency eigenvalues"
  42. evals = np.array([-np.sqrt(2), 0, np.sqrt(2)])
  43. e = sorted(nx.adjacency_spectrum(self.P))
  44. np.testing.assert_almost_equal(e, evals)
  45. def test_modularity_spectrum(self):
  46. "Modularity eigenvalues"
  47. evals = np.array([-1.5, 0.0, 0.0])
  48. e = sorted(nx.modularity_spectrum(self.P))
  49. np.testing.assert_almost_equal(e, evals)
  50. # Directed modularity eigenvalues
  51. evals = np.array([-0.5, 0.0, 0.0])
  52. e = sorted(nx.modularity_spectrum(self.DG))
  53. np.testing.assert_almost_equal(e, evals)
  54. def test_bethe_hessian_spectrum(self):
  55. "Bethe Hessian eigenvalues"
  56. evals = np.array([0.5 * (9 - np.sqrt(33)), 4, 0.5 * (9 + np.sqrt(33))])
  57. e = sorted(nx.bethe_hessian_spectrum(self.P, r=2))
  58. np.testing.assert_almost_equal(e, evals)
  59. # Collapses back to Laplacian:
  60. e1 = sorted(nx.bethe_hessian_spectrum(self.P, r=1))
  61. e2 = sorted(nx.laplacian_spectrum(self.P))
  62. np.testing.assert_almost_equal(e1, e2)