test_subsets.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from sympy.combinatorics.subsets import Subset, ksubsets
  2. from sympy.testing.pytest import raises
  3. def test_subset():
  4. a = Subset(['c', 'd'], ['a', 'b', 'c', 'd'])
  5. assert a.next_binary() == Subset(['b'], ['a', 'b', 'c', 'd'])
  6. assert a.prev_binary() == Subset(['c'], ['a', 'b', 'c', 'd'])
  7. assert a.next_lexicographic() == Subset(['d'], ['a', 'b', 'c', 'd'])
  8. assert a.prev_lexicographic() == Subset(['c'], ['a', 'b', 'c', 'd'])
  9. assert a.next_gray() == Subset(['c'], ['a', 'b', 'c', 'd'])
  10. assert a.prev_gray() == Subset(['d'], ['a', 'b', 'c', 'd'])
  11. assert a.rank_binary == 3
  12. assert a.rank_lexicographic == 14
  13. assert a.rank_gray == 2
  14. assert a.cardinality == 16
  15. assert a.size == 2
  16. assert Subset.bitlist_from_subset(a, ['a', 'b', 'c', 'd']) == '0011'
  17. a = Subset([2, 5, 7], [1, 2, 3, 4, 5, 6, 7])
  18. assert a.next_binary() == Subset([2, 5, 6], [1, 2, 3, 4, 5, 6, 7])
  19. assert a.prev_binary() == Subset([2, 5], [1, 2, 3, 4, 5, 6, 7])
  20. assert a.next_lexicographic() == Subset([2, 6], [1, 2, 3, 4, 5, 6, 7])
  21. assert a.prev_lexicographic() == Subset([2, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7])
  22. assert a.next_gray() == Subset([2, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7])
  23. assert a.prev_gray() == Subset([2, 5], [1, 2, 3, 4, 5, 6, 7])
  24. assert a.rank_binary == 37
  25. assert a.rank_lexicographic == 93
  26. assert a.rank_gray == 57
  27. assert a.cardinality == 128
  28. superset = ['a', 'b', 'c', 'd']
  29. assert Subset.unrank_binary(4, superset).rank_binary == 4
  30. assert Subset.unrank_gray(10, superset).rank_gray == 10
  31. superset = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  32. assert Subset.unrank_binary(33, superset).rank_binary == 33
  33. assert Subset.unrank_gray(25, superset).rank_gray == 25
  34. a = Subset([], ['a', 'b', 'c', 'd'])
  35. i = 1
  36. while a.subset != Subset(['d'], ['a', 'b', 'c', 'd']).subset:
  37. a = a.next_lexicographic()
  38. i = i + 1
  39. assert i == 16
  40. i = 1
  41. while a.subset != Subset([], ['a', 'b', 'c', 'd']).subset:
  42. a = a.prev_lexicographic()
  43. i = i + 1
  44. assert i == 16
  45. raises(ValueError, lambda: Subset(['a', 'b'], ['a']))
  46. raises(ValueError, lambda: Subset(['a'], ['b', 'c']))
  47. raises(ValueError, lambda: Subset.subset_from_bitlist(['a', 'b'], '010'))
  48. assert Subset(['a'], ['a', 'b']) != Subset(['b'], ['a', 'b'])
  49. assert Subset(['a'], ['a', 'b']) != Subset(['a'], ['a', 'c'])
  50. def test_ksubsets():
  51. assert list(ksubsets([1, 2, 3], 2)) == [(1, 2), (1, 3), (2, 3)]
  52. assert list(ksubsets([1, 2, 3, 4, 5], 2)) == [(1, 2), (1, 3), (1, 4),
  53. (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]