test_prufer.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from sympy.combinatorics.prufer import Prufer
  2. from sympy.testing.pytest import raises
  3. def test_prufer():
  4. # number of nodes is optional
  5. assert Prufer([[0, 1], [0, 2], [0, 3], [0, 4]], 5).nodes == 5
  6. assert Prufer([[0, 1], [0, 2], [0, 3], [0, 4]]).nodes == 5
  7. a = Prufer([[0, 1], [0, 2], [0, 3], [0, 4]])
  8. assert a.rank == 0
  9. assert a.nodes == 5
  10. assert a.prufer_repr == [0, 0, 0]
  11. a = Prufer([[2, 4], [1, 4], [1, 3], [0, 5], [0, 4]])
  12. assert a.rank == 924
  13. assert a.nodes == 6
  14. assert a.tree_repr == [[2, 4], [1, 4], [1, 3], [0, 5], [0, 4]]
  15. assert a.prufer_repr == [4, 1, 4, 0]
  16. assert Prufer.edges([0, 1, 2, 3], [1, 4, 5], [1, 4, 6]) == \
  17. ([[0, 1], [1, 2], [1, 4], [2, 3], [4, 5], [4, 6]], 7)
  18. assert Prufer([0]*4).size == Prufer([6]*4).size == 1296
  19. # accept iterables but convert to list of lists
  20. tree = [(0, 1), (1, 5), (0, 3), (0, 2), (2, 6), (4, 7), (2, 4)]
  21. tree_lists = [list(t) for t in tree]
  22. assert Prufer(tree).tree_repr == tree_lists
  23. assert sorted(Prufer(set(tree)).tree_repr) == sorted(tree_lists)
  24. raises(ValueError, lambda: Prufer([[1, 2], [3, 4]])) # 0 is missing
  25. raises(ValueError, lambda: Prufer([[2, 3], [3, 4]])) # 0, 1 are missing
  26. assert Prufer(*Prufer.edges([1, 2], [3, 4])).prufer_repr == [1, 3]
  27. raises(ValueError, lambda: Prufer.edges(
  28. [1, 3], [3, 4])) # a broken tree but edges doesn't care
  29. raises(ValueError, lambda: Prufer.edges([1, 2], [5, 6]))
  30. raises(ValueError, lambda: Prufer([[]]))
  31. a = Prufer([[0, 1], [0, 2], [0, 3]])
  32. b = a.next()
  33. assert b.tree_repr == [[0, 2], [0, 1], [1, 3]]
  34. assert b.rank == 1
  35. def test_round_trip():
  36. def doit(t, b):
  37. e, n = Prufer.edges(*t)
  38. t = Prufer(e, n)
  39. a = sorted(t.tree_repr)
  40. b = [i - 1 for i in b]
  41. assert t.prufer_repr == b
  42. assert sorted(Prufer(b).tree_repr) == a
  43. assert Prufer.unrank(t.rank, n).prufer_repr == b
  44. doit([[1, 2]], [])
  45. doit([[2, 1, 3]], [1])
  46. doit([[1, 3, 2]], [3])
  47. doit([[1, 2, 3]], [2])
  48. doit([[2, 1, 4], [1, 3]], [1, 1])
  49. doit([[3, 2, 1, 4]], [2, 1])
  50. doit([[3, 2, 1], [2, 4]], [2, 2])
  51. doit([[1, 3, 2, 4]], [3, 2])
  52. doit([[1, 4, 2, 3]], [4, 2])
  53. doit([[3, 1, 4, 2]], [4, 1])
  54. doit([[4, 2, 1, 3]], [1, 2])
  55. doit([[1, 2, 4, 3]], [2, 4])
  56. doit([[1, 3, 4, 2]], [3, 4])
  57. doit([[2, 4, 1], [4, 3]], [4, 4])
  58. doit([[1, 2, 3, 4]], [2, 3])
  59. doit([[2, 3, 1], [3, 4]], [3, 3])
  60. doit([[1, 4, 3, 2]], [4, 3])
  61. doit([[2, 1, 4, 3]], [1, 4])
  62. doit([[2, 1, 3, 4]], [1, 3])
  63. doit([[6, 2, 1, 4], [1, 3, 5, 8], [3, 7]], [1, 2, 1, 3, 3, 5])