test_rules_powers.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from src.rules.powers import match_add_exponents, add_exponents, \
  2. match_subtract_exponents, subtract_exponents, \
  3. match_multiply_exponents, multiply_exponents, \
  4. match_duplicate_exponent, duplicate_exponent, \
  5. match_raised_fraction, raised_fraction, \
  6. match_remove_negative_exponent, remove_negative_exponent, \
  7. match_exponent_to_root, exponent_to_root, \
  8. match_constant_exponent, remove_power_of_zero, remove_power_of_one
  9. from src.node import Scope, ExpressionNode as N
  10. from src.possibilities import Possibility as P
  11. from tests.rulestestcase import RulesTestCase, tree
  12. class TestRulesPowers(RulesTestCase):
  13. def test_match_add_exponents_binary(self):
  14. a, p, q = tree('a,p,q')
  15. n0, n1 = root = a ** p * a ** q
  16. possibilities = match_add_exponents(root)
  17. self.assertEqualPos(possibilities,
  18. [P(root, add_exponents, (Scope(root), n0, n1, a, p, q))])
  19. def test_match_add_exponents_ternary(self):
  20. a, p, q, r = tree('a,p,q,r')
  21. (n0, n1), n2 = root = a ** p * a ** q * a ** r
  22. possibilities = match_add_exponents(root)
  23. self.assertEqualPos(possibilities,
  24. [P(root, add_exponents, (Scope(root), n0, n1, a, p, q)),
  25. P(root, add_exponents, (Scope(root), n0, n2, a, p, r)),
  26. P(root, add_exponents, (Scope(root), n1, n2, a, q, r))])
  27. def test_match_add_exponents_multiple_identifiers(self):
  28. a, b, p, q = tree('a,b,p,q')
  29. ((a0, b0), a1), b1 = root = a ** p * b ** p * a ** q * b ** q
  30. possibilities = match_add_exponents(root)
  31. self.assertEqualPos(possibilities,
  32. [P(root, add_exponents, (Scope(root), a0, a1, a, p, q)),
  33. P(root, add_exponents, (Scope(root), b0, b1, b, p, q))])
  34. def test_match_add_exponents_nary_multiplication(self):
  35. a, p, q = tree('a,p,q')
  36. (n0, l1), n1 = root = a ** p * 2 * a ** q
  37. possibilities = match_add_exponents(root)
  38. self.assertEqualPos(possibilities,
  39. [P(root, add_exponents, (Scope(root), n0, n1, a, p, q))])
  40. def test_match_add_exponents_negated(self):
  41. a, q = tree('a,q')
  42. n0, n1 = root = (-a) * a ** q
  43. possibilities = match_add_exponents(root)
  44. self.assertEqualPos(possibilities,
  45. [P(root, add_exponents, (Scope(root), n0, n1, a, 1, q))])
  46. def test_match_subtract_exponents_powers(self):
  47. a, p, q = tree('a,p,q')
  48. root = a ** p / a ** q
  49. possibilities = match_subtract_exponents(root)
  50. self.assertEqualPos(possibilities,
  51. [P(root, subtract_exponents, (a, p, q))])
  52. def test_match_subtract_power_id(self):
  53. a, p = tree('a,p')
  54. root = a ** p / a
  55. possibilities = match_subtract_exponents(root)
  56. self.assertEqualPos(possibilities,
  57. [P(root, subtract_exponents, (a, p, 1))])
  58. def test_match_subtract_id_power(self):
  59. a, q = tree('a,q')
  60. root = a / a ** q
  61. possibilities = match_subtract_exponents(root)
  62. self.assertEqualPos(possibilities,
  63. [P(root, subtract_exponents, (a, 1, q))])
  64. def test_match_multiply_exponents(self):
  65. a, p, q = tree('a,p,q')
  66. root = (a ** p) ** q
  67. possibilities = match_multiply_exponents(root)
  68. self.assertEqualPos(possibilities,
  69. [P(root, multiply_exponents, (a, p, q))])
  70. def test_match_duplicate_exponent(self):
  71. a, b, p = tree('a,b,p')
  72. root = (a * b) ** p
  73. possibilities = match_duplicate_exponent(root)
  74. self.assertEqualPos(possibilities,
  75. [P(root, duplicate_exponent, ([a, b], p))])
  76. def test_match_raised_fraction(self):
  77. ab, p = root = tree('(a / b) ^ p')
  78. self.assertEqualPos(match_raised_fraction(root),
  79. [P(root, raised_fraction, (ab, p))])
  80. def test_raised_fraction(self):
  81. ab, p = root = tree('(a / b) ^ p')
  82. a, b = ab
  83. self.assertEqual(raised_fraction(root, (ab, p)), a ** p / b ** p)
  84. def test_match_remove_negative_exponent(self):
  85. a, p = tree('a,p')
  86. root = a ** -p
  87. possibilities = match_remove_negative_exponent(root)
  88. self.assertEqualPos(possibilities,
  89. [P(root, remove_negative_exponent, (a, -p))])
  90. def test_match_exponent_to_root(self):
  91. a, n, m, l1 = tree('a,n,m,1')
  92. root = a ** (n / m)
  93. possibilities = match_exponent_to_root(root)
  94. self.assertEqualPos(possibilities,
  95. [P(root, exponent_to_root, (a, n, m))])
  96. root = a ** (l1 / m)
  97. possibilities = match_exponent_to_root(root)
  98. self.assertEqualPos(possibilities,
  99. [P(root, exponent_to_root, (a, 1, m))])
  100. def test_add_exponents(self):
  101. a, p, q = tree('a,p,q')
  102. n0, n1 = root = a ** p * a ** q
  103. self.assertEqualNodes(add_exponents(root,
  104. (Scope(root), n0, n1, a, p, q)), a ** (p + q))
  105. def test_subtract_exponents(self):
  106. a, p, q = tree('a,p,q')
  107. root = a ** p / a ** q
  108. self.assertEqualNodes(subtract_exponents(root, (a, p, q)),
  109. a ** (p - q))
  110. def test_multiply_exponents(self):
  111. a, p, q = tree('a,p,q')
  112. root = (a ** p) ** q
  113. self.assertEqualNodes(multiply_exponents(root, (a, p, q)),
  114. a ** (p * q))
  115. def test_duplicate_exponent(self):
  116. a, b, c, p = tree('a,b,c,p')
  117. root = (a * b) ** p
  118. self.assertEqualNodes(duplicate_exponent(root, ([a, b], p)),
  119. a ** p * b ** p)
  120. root = (a * b * c) ** p
  121. self.assertEqualNodes(duplicate_exponent(root, ([a, b, c], p)),
  122. a ** p * b ** p * c ** p)
  123. def test_remove_negative_exponent(self):
  124. a, p, l1 = tree('a,-p,1')
  125. root = a ** p
  126. self.assertEqualNodes(remove_negative_exponent(root, (a, p)),
  127. l1 / a ** +p)
  128. def test_exponent_to_root(self):
  129. a, n, m, l1 = tree('a,n,m,1')
  130. root = a ** (n / m)
  131. self.assertEqualNodes(exponent_to_root(root, (a, n, m)),
  132. N('sqrt', a ** n, m))
  133. self.assertEqualNodes(exponent_to_root(root, (a, l1, m)),
  134. N('sqrt', a, m))
  135. def test_match_constant_exponent(self):
  136. a0, a1, a2 = tree('a ^ 0, a ^ 1, a ^ 2')
  137. self.assertEqualPos(match_constant_exponent(a0),
  138. [P(a0, remove_power_of_zero, ())])
  139. self.assertEqualPos(match_constant_exponent(a1),
  140. [P(a1, remove_power_of_one, ())])
  141. self.assertEqualPos(match_constant_exponent(a2), [])
  142. def test_remove_power_of_zero(self):
  143. self.assertEqual(remove_power_of_zero(tree('a0'), ()), 1)
  144. def test_remove_power_of_one(self):
  145. a1 = tree('a1')
  146. self.assertEqual(remove_power_of_one(a1, ()), a1[0])