test_rules_poly.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from src.rules.poly import match_combine_polynomes, combine_polynomes
  2. from src.rules.numerics import add_numerics
  3. from src.possibilities import Possibility as P
  4. from tests.rulestestcase import RulesTestCase, tree
  5. class TestRulesPoly(RulesTestCase):
  6. def test_identifiers_basic(self):
  7. a1, a2 = root = tree('a+a')
  8. possibilities = match_combine_polynomes(root)
  9. self.assertEqualPos(possibilities,
  10. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 1))])
  11. def test_identifiers_normal(self):
  12. a1, a2 = root = tree('a+2a')
  13. possibilities = match_combine_polynomes(root)
  14. self.assertEqualPos(possibilities,
  15. [P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
  16. def test_identifiers_reverse(self):
  17. a1, a2 = root = tree('a+a*2')
  18. possibilities = match_combine_polynomes(root)
  19. self.assertEqualPos(possibilities,
  20. [P(root, combine_polynomes, (a1, a2, 1, 2, a1, 1))])
  21. def test_identifiers_exponent(self):
  22. a1, a2 = root = tree('a2+a2')
  23. possibilities = match_combine_polynomes(root)
  24. self.assertEqualPos(possibilities,
  25. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 2))])
  26. def test_identifiers_coeff_exponent_left(self):
  27. a1, a2 = root = tree('2a3+a3')
  28. possibilities = match_combine_polynomes(root)
  29. self.assertEqualPos(possibilities,
  30. [P(root, combine_polynomes, (a1, a2, 2, 1, 'a', 3))])
  31. def test_identifiers_coeff_exponent_both(self):
  32. a1, a2 = root = tree('2a3+2a3')
  33. possibilities = match_combine_polynomes(root)
  34. self.assertEqualPos(possibilities,
  35. [P(root, combine_polynomes, (a1, a2, 2, 2, 'a', 3))])
  36. def test_basic_subexpressions(self):
  37. a_b, c, d = tree('a+b,c,d')
  38. left, right = root = tree('(a+b)^d + (a+b)^d')
  39. self.assertEqual(left, right)
  40. possibilities = match_combine_polynomes(root)
  41. self.assertEqualPos(possibilities,
  42. [P(root, combine_polynomes, (left, right, 1, 1, a_b, d))])
  43. left, right = root = tree('5(a+b)^d + 7(a+b)^d')
  44. possibilities = match_combine_polynomes(root)
  45. self.assertEqualPos(possibilities,
  46. [P(root, combine_polynomes, (left, right, 5, 7, a_b, d))])
  47. # TODO: Move to other strategy
  48. #left, right = root = tree('c(a+b)^d + c(a+b)^d')
  49. #self.assertEqual(left, right)
  50. #possibilities = match_combine_polynomes(root)
  51. #self.assertEqualPos(possibilities,
  52. # [P(root, combine_polynomes, (left, right, c, c, a_b, d))])
  53. def test_match_add_numerics(self):
  54. l0, l1, l2 = tree('0,1,2')
  55. root = l0 + l1 + l2
  56. possibilities = match_combine_polynomes(root)
  57. self.assertEqualPos(possibilities,
  58. [P(root, add_numerics, (l0, l1, l0, l1)),
  59. P(root, add_numerics, (l0, l2, l0, l2)),
  60. P(root, add_numerics, (l1, l2, l1, l2))])
  61. def test_match_add_numerics_explicit_powers(self):
  62. l0, l1, l2 = tree('0^1,1*1,1*2^1')
  63. root = l0 + l1 + l2
  64. possibilities = match_combine_polynomes(root)
  65. self.assertEqualPos(possibilities,
  66. [P(root, add_numerics, (l0, l1, l0[0], l1[1])),
  67. P(root, add_numerics, (l0, l2, l0[0], l2[1][0])),
  68. P(root, add_numerics, (l1, l2, l1[1], l2[1][0]))])
  69. def test_combine_polynomes(self):
  70. # 2a + 3a -> (2 + 3) * a
  71. l0, a, l1, l2 = tree('2,a,3,1')
  72. root = l0 * a + l1 * a
  73. left, right = root
  74. replacement = combine_polynomes(root, (left, right, l0, l1, a, 1))
  75. self.assertEqualNodes(replacement, (l0 + l1) * a)
  76. # a + 3a -> (1 + 3) * a
  77. root = a + l1 * a
  78. left, right = root
  79. replacement = combine_polynomes(root, (left, right, l2, l1, a, 1))
  80. self.assertEqualNodes(replacement, (l2 + l1) * a)
  81. # 2a + a -> (2 + 1) * a
  82. root = l0 * a + a
  83. left, right = root
  84. replacement = combine_polynomes(root, (left, right, l0, l2, a, 1))
  85. self.assertEqualNodes(replacement, (l0 + 1) * a)
  86. # a + a -> (1 + 1) * a
  87. root = a + a
  88. left, right = root
  89. replacement = combine_polynomes(root, (left, right, l2, l2, a, 1))
  90. self.assertEqualNodes(replacement, (l2 + 1) * a)