test_graycode.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from sympy.combinatorics.graycode import (GrayCode, bin_to_gray,
  2. random_bitstring, get_subset_from_bitstring, graycode_subsets,
  3. gray_to_bin)
  4. from sympy.testing.pytest import raises
  5. def test_graycode():
  6. g = GrayCode(2)
  7. got = []
  8. for i in g.generate_gray():
  9. if i.startswith('0'):
  10. g.skip()
  11. got.append(i)
  12. assert got == '00 11 10'.split()
  13. a = GrayCode(6)
  14. assert a.current == '0'*6
  15. assert a.rank == 0
  16. assert len(list(a.generate_gray())) == 64
  17. codes = ['011001', '011011', '011010',
  18. '011110', '011111', '011101', '011100', '010100', '010101', '010111',
  19. '010110', '010010', '010011', '010001', '010000', '110000', '110001',
  20. '110011', '110010', '110110', '110111', '110101', '110100', '111100',
  21. '111101', '111111', '111110', '111010', '111011', '111001', '111000',
  22. '101000', '101001', '101011', '101010', '101110', '101111', '101101',
  23. '101100', '100100', '100101', '100111', '100110', '100010', '100011',
  24. '100001', '100000']
  25. assert list(a.generate_gray(start='011001')) == codes
  26. assert list(
  27. a.generate_gray(rank=GrayCode(6, start='011001').rank)) == codes
  28. assert a.next().current == '000001'
  29. assert a.next(2).current == '000011'
  30. assert a.next(-1).current == '100000'
  31. a = GrayCode(5, start='10010')
  32. assert a.rank == 28
  33. a = GrayCode(6, start='101000')
  34. assert a.rank == 48
  35. assert GrayCode(6, rank=4).current == '000110'
  36. assert GrayCode(6, rank=4).rank == 4
  37. assert [GrayCode(4, start=s).rank for s in
  38. GrayCode(4).generate_gray()] == [0, 1, 2, 3, 4, 5, 6, 7, 8,
  39. 9, 10, 11, 12, 13, 14, 15]
  40. a = GrayCode(15, rank=15)
  41. assert a.current == '000000000001000'
  42. assert bin_to_gray('111') == '100'
  43. a = random_bitstring(5)
  44. assert type(a) is str
  45. assert len(a) == 5
  46. assert all(i in ['0', '1'] for i in a)
  47. assert get_subset_from_bitstring(
  48. ['a', 'b', 'c', 'd'], '0011') == ['c', 'd']
  49. assert get_subset_from_bitstring('abcd', '1001') == ['a', 'd']
  50. assert list(graycode_subsets(['a', 'b', 'c'])) == \
  51. [[], ['c'], ['b', 'c'], ['b'], ['a', 'b'], ['a', 'b', 'c'],
  52. ['a', 'c'], ['a']]
  53. raises(ValueError, lambda: GrayCode(0))
  54. raises(ValueError, lambda: GrayCode(2.2))
  55. raises(ValueError, lambda: GrayCode(2, start=[1, 1, 0]))
  56. raises(ValueError, lambda: GrayCode(2, rank=2.5))
  57. raises(ValueError, lambda: get_subset_from_bitstring(['c', 'a', 'c'], '1100'))
  58. raises(ValueError, lambda: list(GrayCode(3).generate_gray(start="1111")))
  59. def test_live_issue_117():
  60. assert bin_to_gray('0100') == '0110'
  61. assert bin_to_gray('0101') == '0111'
  62. for bits in ('0100', '0101'):
  63. assert gray_to_bin(bin_to_gray(bits)) == bits