test_rules_poly.py 4.5 KB

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