test_delta.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. from sympy.concrete import Sum
  2. from sympy.concrete.delta import deltaproduct as dp, deltasummation as ds, _extract_delta
  3. from sympy.core import Eq, S, symbols, oo
  4. from sympy.functions import KroneckerDelta as KD, Piecewise, piecewise_fold
  5. from sympy.logic import And
  6. from sympy.testing.pytest import raises
  7. i, j, k, l, m = symbols("i j k l m", integer=True, finite=True)
  8. x, y = symbols("x y", commutative=False)
  9. def test_deltaproduct_trivial():
  10. assert dp(x, (j, 1, 0)) == 1
  11. assert dp(x, (j, 1, 3)) == x**3
  12. assert dp(x + y, (j, 1, 3)) == (x + y)**3
  13. assert dp(x*y, (j, 1, 3)) == (x*y)**3
  14. assert dp(KD(i, j), (k, 1, 3)) == KD(i, j)
  15. assert dp(x*KD(i, j), (k, 1, 3)) == x**3*KD(i, j)
  16. assert dp(x*y*KD(i, j), (k, 1, 3)) == (x*y)**3*KD(i, j)
  17. def test_deltaproduct_basic():
  18. assert dp(KD(i, j), (j, 1, 3)) == 0
  19. assert dp(KD(i, j), (j, 1, 1)) == KD(i, 1)
  20. assert dp(KD(i, j), (j, 2, 2)) == KD(i, 2)
  21. assert dp(KD(i, j), (j, 3, 3)) == KD(i, 3)
  22. assert dp(KD(i, j), (j, 1, k)) == KD(i, 1)*KD(k, 1) + KD(k, 0)
  23. assert dp(KD(i, j), (j, k, 3)) == KD(i, 3)*KD(k, 3) + KD(k, 4)
  24. assert dp(KD(i, j), (j, k, l)) == KD(i, l)*KD(k, l) + KD(k, l + 1)
  25. def test_deltaproduct_mul_x_kd():
  26. assert dp(x*KD(i, j), (j, 1, 3)) == 0
  27. assert dp(x*KD(i, j), (j, 1, 1)) == x*KD(i, 1)
  28. assert dp(x*KD(i, j), (j, 2, 2)) == x*KD(i, 2)
  29. assert dp(x*KD(i, j), (j, 3, 3)) == x*KD(i, 3)
  30. assert dp(x*KD(i, j), (j, 1, k)) == x*KD(i, 1)*KD(k, 1) + KD(k, 0)
  31. assert dp(x*KD(i, j), (j, k, 3)) == x*KD(i, 3)*KD(k, 3) + KD(k, 4)
  32. assert dp(x*KD(i, j), (j, k, l)) == x*KD(i, l)*KD(k, l) + KD(k, l + 1)
  33. def test_deltaproduct_mul_add_x_y_kd():
  34. assert dp((x + y)*KD(i, j), (j, 1, 3)) == 0
  35. assert dp((x + y)*KD(i, j), (j, 1, 1)) == (x + y)*KD(i, 1)
  36. assert dp((x + y)*KD(i, j), (j, 2, 2)) == (x + y)*KD(i, 2)
  37. assert dp((x + y)*KD(i, j), (j, 3, 3)) == (x + y)*KD(i, 3)
  38. assert dp((x + y)*KD(i, j), (j, 1, k)) == \
  39. (x + y)*KD(i, 1)*KD(k, 1) + KD(k, 0)
  40. assert dp((x + y)*KD(i, j), (j, k, 3)) == \
  41. (x + y)*KD(i, 3)*KD(k, 3) + KD(k, 4)
  42. assert dp((x + y)*KD(i, j), (j, k, l)) == \
  43. (x + y)*KD(i, l)*KD(k, l) + KD(k, l + 1)
  44. def test_deltaproduct_add_kd_kd():
  45. assert dp(KD(i, k) + KD(j, k), (k, 1, 3)) == 0
  46. assert dp(KD(i, k) + KD(j, k), (k, 1, 1)) == KD(i, 1) + KD(j, 1)
  47. assert dp(KD(i, k) + KD(j, k), (k, 2, 2)) == KD(i, 2) + KD(j, 2)
  48. assert dp(KD(i, k) + KD(j, k), (k, 3, 3)) == KD(i, 3) + KD(j, 3)
  49. assert dp(KD(i, k) + KD(j, k), (k, 1, l)) == KD(l, 0) + \
  50. KD(i, 1)*KD(l, 1) + KD(j, 1)*KD(l, 1) + \
  51. KD(i, 1)*KD(j, 2)*KD(l, 2) + KD(j, 1)*KD(i, 2)*KD(l, 2)
  52. assert dp(KD(i, k) + KD(j, k), (k, l, 3)) == KD(l, 4) + \
  53. KD(i, 3)*KD(l, 3) + KD(j, 3)*KD(l, 3) + \
  54. KD(i, 2)*KD(j, 3)*KD(l, 2) + KD(i, 3)*KD(j, 2)*KD(l, 2)
  55. assert dp(KD(i, k) + KD(j, k), (k, l, m)) == KD(l, m + 1) + \
  56. KD(i, m)*KD(l, m) + KD(j, m)*KD(l, m) + \
  57. KD(i, m)*KD(j, m - 1)*KD(l, m - 1) + KD(i, m - 1)*KD(j, m)*KD(l, m - 1)
  58. def test_deltaproduct_mul_x_add_kd_kd():
  59. assert dp(x*(KD(i, k) + KD(j, k)), (k, 1, 3)) == 0
  60. assert dp(x*(KD(i, k) + KD(j, k)), (k, 1, 1)) == x*(KD(i, 1) + KD(j, 1))
  61. assert dp(x*(KD(i, k) + KD(j, k)), (k, 2, 2)) == x*(KD(i, 2) + KD(j, 2))
  62. assert dp(x*(KD(i, k) + KD(j, k)), (k, 3, 3)) == x*(KD(i, 3) + KD(j, 3))
  63. assert dp(x*(KD(i, k) + KD(j, k)), (k, 1, l)) == KD(l, 0) + \
  64. x*KD(i, 1)*KD(l, 1) + x*KD(j, 1)*KD(l, 1) + \
  65. x**2*KD(i, 1)*KD(j, 2)*KD(l, 2) + x**2*KD(j, 1)*KD(i, 2)*KD(l, 2)
  66. assert dp(x*(KD(i, k) + KD(j, k)), (k, l, 3)) == KD(l, 4) + \
  67. x*KD(i, 3)*KD(l, 3) + x*KD(j, 3)*KD(l, 3) + \
  68. x**2*KD(i, 2)*KD(j, 3)*KD(l, 2) + x**2*KD(i, 3)*KD(j, 2)*KD(l, 2)
  69. assert dp(x*(KD(i, k) + KD(j, k)), (k, l, m)) == KD(l, m + 1) + \
  70. x*KD(i, m)*KD(l, m) + x*KD(j, m)*KD(l, m) + \
  71. x**2*KD(i, m - 1)*KD(j, m)*KD(l, m - 1) + \
  72. x**2*KD(i, m)*KD(j, m - 1)*KD(l, m - 1)
  73. def test_deltaproduct_mul_add_x_y_add_kd_kd():
  74. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, 1, 3)) == 0
  75. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, 1, 1)) == \
  76. (x + y)*(KD(i, 1) + KD(j, 1))
  77. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, 2, 2)) == \
  78. (x + y)*(KD(i, 2) + KD(j, 2))
  79. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, 3, 3)) == \
  80. (x + y)*(KD(i, 3) + KD(j, 3))
  81. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, 1, l)) == KD(l, 0) + \
  82. (x + y)*KD(i, 1)*KD(l, 1) + (x + y)*KD(j, 1)*KD(l, 1) + \
  83. (x + y)**2*KD(i, 1)*KD(j, 2)*KD(l, 2) + \
  84. (x + y)**2*KD(j, 1)*KD(i, 2)*KD(l, 2)
  85. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, l, 3)) == KD(l, 4) + \
  86. (x + y)*KD(i, 3)*KD(l, 3) + (x + y)*KD(j, 3)*KD(l, 3) + \
  87. (x + y)**2*KD(i, 2)*KD(j, 3)*KD(l, 2) + \
  88. (x + y)**2*KD(i, 3)*KD(j, 2)*KD(l, 2)
  89. assert dp((x + y)*(KD(i, k) + KD(j, k)), (k, l, m)) == KD(l, m + 1) + \
  90. (x + y)*KD(i, m)*KD(l, m) + (x + y)*KD(j, m)*KD(l, m) + \
  91. (x + y)**2*KD(i, m - 1)*KD(j, m)*KD(l, m - 1) + \
  92. (x + y)**2*KD(i, m)*KD(j, m - 1)*KD(l, m - 1)
  93. def test_deltaproduct_add_mul_x_y_mul_x_kd():
  94. assert dp(x*y + x*KD(i, j), (j, 1, 3)) == (x*y)**3 + \
  95. x*(x*y)**2*KD(i, 1) + (x*y)*x*(x*y)*KD(i, 2) + (x*y)**2*x*KD(i, 3)
  96. assert dp(x*y + x*KD(i, j), (j, 1, 1)) == x*y + x*KD(i, 1)
  97. assert dp(x*y + x*KD(i, j), (j, 2, 2)) == x*y + x*KD(i, 2)
  98. assert dp(x*y + x*KD(i, j), (j, 3, 3)) == x*y + x*KD(i, 3)
  99. assert dp(x*y + x*KD(i, j), (j, 1, k)) == \
  100. (x*y)**k + Piecewise(
  101. ((x*y)**(i - 1)*x*(x*y)**(k - i), And(1 <= i, i <= k)),
  102. (0, True)
  103. )
  104. assert dp(x*y + x*KD(i, j), (j, k, 3)) == \
  105. (x*y)**(-k + 4) + Piecewise(
  106. ((x*y)**(i - k)*x*(x*y)**(3 - i), And(k <= i, i <= 3)),
  107. (0, True)
  108. )
  109. assert dp(x*y + x*KD(i, j), (j, k, l)) == \
  110. (x*y)**(-k + l + 1) + Piecewise(
  111. ((x*y)**(i - k)*x*(x*y)**(l - i), And(k <= i, i <= l)),
  112. (0, True)
  113. )
  114. def test_deltaproduct_mul_x_add_y_kd():
  115. assert dp(x*(y + KD(i, j)), (j, 1, 3)) == (x*y)**3 + \
  116. x*(x*y)**2*KD(i, 1) + (x*y)*x*(x*y)*KD(i, 2) + (x*y)**2*x*KD(i, 3)
  117. assert dp(x*(y + KD(i, j)), (j, 1, 1)) == x*(y + KD(i, 1))
  118. assert dp(x*(y + KD(i, j)), (j, 2, 2)) == x*(y + KD(i, 2))
  119. assert dp(x*(y + KD(i, j)), (j, 3, 3)) == x*(y + KD(i, 3))
  120. assert dp(x*(y + KD(i, j)), (j, 1, k)) == \
  121. (x*y)**k + Piecewise(
  122. ((x*y)**(i - 1)*x*(x*y)**(k - i), And(1 <= i, i <= k)),
  123. (0, True)
  124. ).expand()
  125. assert dp(x*(y + KD(i, j)), (j, k, 3)) == \
  126. ((x*y)**(-k + 4) + Piecewise(
  127. ((x*y)**(i - k)*x*(x*y)**(3 - i), And(k <= i, i <= 3)),
  128. (0, True)
  129. )).expand()
  130. assert dp(x*(y + KD(i, j)), (j, k, l)) == \
  131. ((x*y)**(-k + l + 1) + Piecewise(
  132. ((x*y)**(i - k)*x*(x*y)**(l - i), And(k <= i, i <= l)),
  133. (0, True)
  134. )).expand()
  135. def test_deltaproduct_mul_x_add_y_twokd():
  136. assert dp(x*(y + 2*KD(i, j)), (j, 1, 3)) == (x*y)**3 + \
  137. 2*x*(x*y)**2*KD(i, 1) + 2*x*y*x*x*y*KD(i, 2) + 2*(x*y)**2*x*KD(i, 3)
  138. assert dp(x*(y + 2*KD(i, j)), (j, 1, 1)) == x*(y + 2*KD(i, 1))
  139. assert dp(x*(y + 2*KD(i, j)), (j, 2, 2)) == x*(y + 2*KD(i, 2))
  140. assert dp(x*(y + 2*KD(i, j)), (j, 3, 3)) == x*(y + 2*KD(i, 3))
  141. assert dp(x*(y + 2*KD(i, j)), (j, 1, k)) == \
  142. (x*y)**k + Piecewise(
  143. (2*(x*y)**(i - 1)*x*(x*y)**(k - i), And(1 <= i, i <= k)),
  144. (0, True)
  145. ).expand()
  146. assert dp(x*(y + 2*KD(i, j)), (j, k, 3)) == \
  147. ((x*y)**(-k + 4) + Piecewise(
  148. (2*(x*y)**(i - k)*x*(x*y)**(3 - i), And(k <= i, i <= 3)),
  149. (0, True)
  150. )).expand()
  151. assert dp(x*(y + 2*KD(i, j)), (j, k, l)) == \
  152. ((x*y)**(-k + l + 1) + Piecewise(
  153. (2*(x*y)**(i - k)*x*(x*y)**(l - i), And(k <= i, i <= l)),
  154. (0, True)
  155. )).expand()
  156. def test_deltaproduct_mul_add_x_y_add_y_kd():
  157. assert dp((x + y)*(y + KD(i, j)), (j, 1, 3)) == ((x + y)*y)**3 + \
  158. (x + y)*((x + y)*y)**2*KD(i, 1) + \
  159. (x + y)*y*(x + y)**2*y*KD(i, 2) + \
  160. ((x + y)*y)**2*(x + y)*KD(i, 3)
  161. assert dp((x + y)*(y + KD(i, j)), (j, 1, 1)) == (x + y)*(y + KD(i, 1))
  162. assert dp((x + y)*(y + KD(i, j)), (j, 2, 2)) == (x + y)*(y + KD(i, 2))
  163. assert dp((x + y)*(y + KD(i, j)), (j, 3, 3)) == (x + y)*(y + KD(i, 3))
  164. assert dp((x + y)*(y + KD(i, j)), (j, 1, k)) == \
  165. ((x + y)*y)**k + Piecewise(
  166. (((x + y)*y)**(-1)*((x + y)*y)**i*(x + y)*((x + y)*y
  167. )**k*((x + y)*y)**(-i), (i >= 1) & (i <= k)), (0, True))
  168. assert dp((x + y)*(y + KD(i, j)), (j, k, 3)) == (
  169. (x + y)*y)**4*((x + y)*y)**(-k) + Piecewise((((x + y)*y)**i*(
  170. (x + y)*y)**(-k)*(x + y)*((x + y)*y)**3*((x + y)*y)**(-i),
  171. (i >= k) & (i <= 3)), (0, True))
  172. assert dp((x + y)*(y + KD(i, j)), (j, k, l)) == \
  173. (x + y)*y*((x + y)*y)**l*((x + y)*y)**(-k) + Piecewise(
  174. (((x + y)*y)**i*((x + y)*y)**(-k)*(x + y)*((x + y)*y
  175. )**l*((x + y)*y)**(-i), (i >= k) & (i <= l)), (0, True))
  176. def test_deltaproduct_mul_add_x_kd_add_y_kd():
  177. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, 1, 3)) == \
  178. KD(i, 1)*(KD(i, k) + x)*((KD(i, k) + x)*y)**2 + \
  179. KD(i, 2)*(KD(i, k) + x)*y*(KD(i, k) + x)**2*y + \
  180. KD(i, 3)*((KD(i, k) + x)*y)**2*(KD(i, k) + x) + \
  181. ((KD(i, k) + x)*y)**3
  182. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, 1, 1)) == \
  183. (x + KD(i, k))*(y + KD(i, 1))
  184. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, 2, 2)) == \
  185. (x + KD(i, k))*(y + KD(i, 2))
  186. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, 3, 3)) == \
  187. (x + KD(i, k))*(y + KD(i, 3))
  188. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, 1, k)) == \
  189. ((KD(i, k) + x)*y)**k + Piecewise(
  190. (((KD(i, k) + x)*y)**(-1)*((KD(i, k) + x)*y)**i*(KD(i, k) + x
  191. )*((KD(i, k) + x)*y)**k*((KD(i, k) + x)*y)**(-i), (i >= 1
  192. ) & (i <= k)), (0, True))
  193. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, k, 3)) == (
  194. (KD(i, k) + x)*y)**4*((KD(i, k) + x)*y)**(-k) + Piecewise(
  195. (((KD(i, k) + x)*y)**i*((KD(i, k) + x)*y)**(-k)*(KD(i, k)
  196. + x)*((KD(i, k) + x)*y)**3*((KD(i, k) + x)*y)**(-i),
  197. (i >= k) & (i <= 3)), (0, True))
  198. assert dp((x + KD(i, k))*(y + KD(i, j)), (j, k, l)) == (
  199. KD(i, k) + x)*y*((KD(i, k) + x)*y)**l*((KD(i, k) + x)*y
  200. )**(-k) + Piecewise((((KD(i, k) + x)*y)**i*((KD(i, k) + x
  201. )*y)**(-k)*(KD(i, k) + x)*((KD(i, k) + x)*y)**l*((KD(i, k) + x
  202. )*y)**(-i), (i >= k) & (i <= l)), (0, True))
  203. def test_deltasummation_trivial():
  204. assert ds(x, (j, 1, 0)) == 0
  205. assert ds(x, (j, 1, 3)) == 3*x
  206. assert ds(x + y, (j, 1, 3)) == 3*(x + y)
  207. assert ds(x*y, (j, 1, 3)) == 3*x*y
  208. assert ds(KD(i, j), (k, 1, 3)) == 3*KD(i, j)
  209. assert ds(x*KD(i, j), (k, 1, 3)) == 3*x*KD(i, j)
  210. assert ds(x*y*KD(i, j), (k, 1, 3)) == 3*x*y*KD(i, j)
  211. def test_deltasummation_basic_numerical():
  212. n = symbols('n', integer=True, nonzero=True)
  213. assert ds(KD(n, 0), (n, 1, 3)) == 0
  214. # return unevaluated, until it gets implemented
  215. assert ds(KD(i**2, j**2), (j, -oo, oo)) == \
  216. Sum(KD(i**2, j**2), (j, -oo, oo))
  217. assert Piecewise((KD(i, k), And(1 <= i, i <= 3)), (0, True)) == \
  218. ds(KD(i, j)*KD(j, k), (j, 1, 3)) == \
  219. ds(KD(j, k)*KD(i, j), (j, 1, 3))
  220. assert ds(KD(i, k), (k, -oo, oo)) == 1
  221. assert ds(KD(i, k), (k, 0, oo)) == Piecewise((1, S.Zero <= i), (0, True))
  222. assert ds(KD(i, k), (k, 1, 3)) == \
  223. Piecewise((1, And(1 <= i, i <= 3)), (0, True))
  224. assert ds(k*KD(i, j)*KD(j, k), (k, -oo, oo)) == j*KD(i, j)
  225. assert ds(j*KD(i, j), (j, -oo, oo)) == i
  226. assert ds(i*KD(i, j), (i, -oo, oo)) == j
  227. assert ds(x, (i, 1, 3)) == 3*x
  228. assert ds((i + j)*KD(i, j), (j, -oo, oo)) == 2*i
  229. def test_deltasummation_basic_symbolic():
  230. assert ds(KD(i, j), (j, 1, 3)) == \
  231. Piecewise((1, And(1 <= i, i <= 3)), (0, True))
  232. assert ds(KD(i, j), (j, 1, 1)) == Piecewise((1, Eq(i, 1)), (0, True))
  233. assert ds(KD(i, j), (j, 2, 2)) == Piecewise((1, Eq(i, 2)), (0, True))
  234. assert ds(KD(i, j), (j, 3, 3)) == Piecewise((1, Eq(i, 3)), (0, True))
  235. assert ds(KD(i, j), (j, 1, k)) == \
  236. Piecewise((1, And(1 <= i, i <= k)), (0, True))
  237. assert ds(KD(i, j), (j, k, 3)) == \
  238. Piecewise((1, And(k <= i, i <= 3)), (0, True))
  239. assert ds(KD(i, j), (j, k, l)) == \
  240. Piecewise((1, And(k <= i, i <= l)), (0, True))
  241. def test_deltasummation_mul_x_kd():
  242. assert ds(x*KD(i, j), (j, 1, 3)) == \
  243. Piecewise((x, And(1 <= i, i <= 3)), (0, True))
  244. assert ds(x*KD(i, j), (j, 1, 1)) == Piecewise((x, Eq(i, 1)), (0, True))
  245. assert ds(x*KD(i, j), (j, 2, 2)) == Piecewise((x, Eq(i, 2)), (0, True))
  246. assert ds(x*KD(i, j), (j, 3, 3)) == Piecewise((x, Eq(i, 3)), (0, True))
  247. assert ds(x*KD(i, j), (j, 1, k)) == \
  248. Piecewise((x, And(1 <= i, i <= k)), (0, True))
  249. assert ds(x*KD(i, j), (j, k, 3)) == \
  250. Piecewise((x, And(k <= i, i <= 3)), (0, True))
  251. assert ds(x*KD(i, j), (j, k, l)) == \
  252. Piecewise((x, And(k <= i, i <= l)), (0, True))
  253. def test_deltasummation_mul_add_x_y_kd():
  254. assert ds((x + y)*KD(i, j), (j, 1, 3)) == \
  255. Piecewise((x + y, And(1 <= i, i <= 3)), (0, True))
  256. assert ds((x + y)*KD(i, j), (j, 1, 1)) == \
  257. Piecewise((x + y, Eq(i, 1)), (0, True))
  258. assert ds((x + y)*KD(i, j), (j, 2, 2)) == \
  259. Piecewise((x + y, Eq(i, 2)), (0, True))
  260. assert ds((x + y)*KD(i, j), (j, 3, 3)) == \
  261. Piecewise((x + y, Eq(i, 3)), (0, True))
  262. assert ds((x + y)*KD(i, j), (j, 1, k)) == \
  263. Piecewise((x + y, And(1 <= i, i <= k)), (0, True))
  264. assert ds((x + y)*KD(i, j), (j, k, 3)) == \
  265. Piecewise((x + y, And(k <= i, i <= 3)), (0, True))
  266. assert ds((x + y)*KD(i, j), (j, k, l)) == \
  267. Piecewise((x + y, And(k <= i, i <= l)), (0, True))
  268. def test_deltasummation_add_kd_kd():
  269. assert ds(KD(i, k) + KD(j, k), (k, 1, 3)) == piecewise_fold(
  270. Piecewise((1, And(1 <= i, i <= 3)), (0, True)) +
  271. Piecewise((1, And(1 <= j, j <= 3)), (0, True)))
  272. assert ds(KD(i, k) + KD(j, k), (k, 1, 1)) == piecewise_fold(
  273. Piecewise((1, Eq(i, 1)), (0, True)) +
  274. Piecewise((1, Eq(j, 1)), (0, True)))
  275. assert ds(KD(i, k) + KD(j, k), (k, 2, 2)) == piecewise_fold(
  276. Piecewise((1, Eq(i, 2)), (0, True)) +
  277. Piecewise((1, Eq(j, 2)), (0, True)))
  278. assert ds(KD(i, k) + KD(j, k), (k, 3, 3)) == piecewise_fold(
  279. Piecewise((1, Eq(i, 3)), (0, True)) +
  280. Piecewise((1, Eq(j, 3)), (0, True)))
  281. assert ds(KD(i, k) + KD(j, k), (k, 1, l)) == piecewise_fold(
  282. Piecewise((1, And(1 <= i, i <= l)), (0, True)) +
  283. Piecewise((1, And(1 <= j, j <= l)), (0, True)))
  284. assert ds(KD(i, k) + KD(j, k), (k, l, 3)) == piecewise_fold(
  285. Piecewise((1, And(l <= i, i <= 3)), (0, True)) +
  286. Piecewise((1, And(l <= j, j <= 3)), (0, True)))
  287. assert ds(KD(i, k) + KD(j, k), (k, l, m)) == piecewise_fold(
  288. Piecewise((1, And(l <= i, i <= m)), (0, True)) +
  289. Piecewise((1, And(l <= j, j <= m)), (0, True)))
  290. def test_deltasummation_add_mul_x_kd_kd():
  291. assert ds(x*KD(i, k) + KD(j, k), (k, 1, 3)) == piecewise_fold(
  292. Piecewise((x, And(1 <= i, i <= 3)), (0, True)) +
  293. Piecewise((1, And(1 <= j, j <= 3)), (0, True)))
  294. assert ds(x*KD(i, k) + KD(j, k), (k, 1, 1)) == piecewise_fold(
  295. Piecewise((x, Eq(i, 1)), (0, True)) +
  296. Piecewise((1, Eq(j, 1)), (0, True)))
  297. assert ds(x*KD(i, k) + KD(j, k), (k, 2, 2)) == piecewise_fold(
  298. Piecewise((x, Eq(i, 2)), (0, True)) +
  299. Piecewise((1, Eq(j, 2)), (0, True)))
  300. assert ds(x*KD(i, k) + KD(j, k), (k, 3, 3)) == piecewise_fold(
  301. Piecewise((x, Eq(i, 3)), (0, True)) +
  302. Piecewise((1, Eq(j, 3)), (0, True)))
  303. assert ds(x*KD(i, k) + KD(j, k), (k, 1, l)) == piecewise_fold(
  304. Piecewise((x, And(1 <= i, i <= l)), (0, True)) +
  305. Piecewise((1, And(1 <= j, j <= l)), (0, True)))
  306. assert ds(x*KD(i, k) + KD(j, k), (k, l, 3)) == piecewise_fold(
  307. Piecewise((x, And(l <= i, i <= 3)), (0, True)) +
  308. Piecewise((1, And(l <= j, j <= 3)), (0, True)))
  309. assert ds(x*KD(i, k) + KD(j, k), (k, l, m)) == piecewise_fold(
  310. Piecewise((x, And(l <= i, i <= m)), (0, True)) +
  311. Piecewise((1, And(l <= j, j <= m)), (0, True)))
  312. def test_deltasummation_mul_x_add_kd_kd():
  313. assert ds(x*(KD(i, k) + KD(j, k)), (k, 1, 3)) == piecewise_fold(
  314. Piecewise((x, And(1 <= i, i <= 3)), (0, True)) +
  315. Piecewise((x, And(1 <= j, j <= 3)), (0, True)))
  316. assert ds(x*(KD(i, k) + KD(j, k)), (k, 1, 1)) == piecewise_fold(
  317. Piecewise((x, Eq(i, 1)), (0, True)) +
  318. Piecewise((x, Eq(j, 1)), (0, True)))
  319. assert ds(x*(KD(i, k) + KD(j, k)), (k, 2, 2)) == piecewise_fold(
  320. Piecewise((x, Eq(i, 2)), (0, True)) +
  321. Piecewise((x, Eq(j, 2)), (0, True)))
  322. assert ds(x*(KD(i, k) + KD(j, k)), (k, 3, 3)) == piecewise_fold(
  323. Piecewise((x, Eq(i, 3)), (0, True)) +
  324. Piecewise((x, Eq(j, 3)), (0, True)))
  325. assert ds(x*(KD(i, k) + KD(j, k)), (k, 1, l)) == piecewise_fold(
  326. Piecewise((x, And(1 <= i, i <= l)), (0, True)) +
  327. Piecewise((x, And(1 <= j, j <= l)), (0, True)))
  328. assert ds(x*(KD(i, k) + KD(j, k)), (k, l, 3)) == piecewise_fold(
  329. Piecewise((x, And(l <= i, i <= 3)), (0, True)) +
  330. Piecewise((x, And(l <= j, j <= 3)), (0, True)))
  331. assert ds(x*(KD(i, k) + KD(j, k)), (k, l, m)) == piecewise_fold(
  332. Piecewise((x, And(l <= i, i <= m)), (0, True)) +
  333. Piecewise((x, And(l <= j, j <= m)), (0, True)))
  334. def test_deltasummation_mul_add_x_y_add_kd_kd():
  335. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, 1, 3)) == piecewise_fold(
  336. Piecewise((x + y, And(1 <= i, i <= 3)), (0, True)) +
  337. Piecewise((x + y, And(1 <= j, j <= 3)), (0, True)))
  338. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, 1, 1)) == piecewise_fold(
  339. Piecewise((x + y, Eq(i, 1)), (0, True)) +
  340. Piecewise((x + y, Eq(j, 1)), (0, True)))
  341. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, 2, 2)) == piecewise_fold(
  342. Piecewise((x + y, Eq(i, 2)), (0, True)) +
  343. Piecewise((x + y, Eq(j, 2)), (0, True)))
  344. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, 3, 3)) == piecewise_fold(
  345. Piecewise((x + y, Eq(i, 3)), (0, True)) +
  346. Piecewise((x + y, Eq(j, 3)), (0, True)))
  347. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, 1, l)) == piecewise_fold(
  348. Piecewise((x + y, And(1 <= i, i <= l)), (0, True)) +
  349. Piecewise((x + y, And(1 <= j, j <= l)), (0, True)))
  350. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, l, 3)) == piecewise_fold(
  351. Piecewise((x + y, And(l <= i, i <= 3)), (0, True)) +
  352. Piecewise((x + y, And(l <= j, j <= 3)), (0, True)))
  353. assert ds((x + y)*(KD(i, k) + KD(j, k)), (k, l, m)) == piecewise_fold(
  354. Piecewise((x + y, And(l <= i, i <= m)), (0, True)) +
  355. Piecewise((x + y, And(l <= j, j <= m)), (0, True)))
  356. def test_deltasummation_add_mul_x_y_mul_x_kd():
  357. assert ds(x*y + x*KD(i, j), (j, 1, 3)) == \
  358. Piecewise((3*x*y + x, And(1 <= i, i <= 3)), (3*x*y, True))
  359. assert ds(x*y + x*KD(i, j), (j, 1, 1)) == \
  360. Piecewise((x*y + x, Eq(i, 1)), (x*y, True))
  361. assert ds(x*y + x*KD(i, j), (j, 2, 2)) == \
  362. Piecewise((x*y + x, Eq(i, 2)), (x*y, True))
  363. assert ds(x*y + x*KD(i, j), (j, 3, 3)) == \
  364. Piecewise((x*y + x, Eq(i, 3)), (x*y, True))
  365. assert ds(x*y + x*KD(i, j), (j, 1, k)) == \
  366. Piecewise((k*x*y + x, And(1 <= i, i <= k)), (k*x*y, True))
  367. assert ds(x*y + x*KD(i, j), (j, k, 3)) == \
  368. Piecewise(((4 - k)*x*y + x, And(k <= i, i <= 3)), ((4 - k)*x*y, True))
  369. assert ds(x*y + x*KD(i, j), (j, k, l)) == Piecewise(
  370. ((l - k + 1)*x*y + x, And(k <= i, i <= l)), ((l - k + 1)*x*y, True))
  371. def test_deltasummation_mul_x_add_y_kd():
  372. assert ds(x*(y + KD(i, j)), (j, 1, 3)) == \
  373. Piecewise((3*x*y + x, And(1 <= i, i <= 3)), (3*x*y, True))
  374. assert ds(x*(y + KD(i, j)), (j, 1, 1)) == \
  375. Piecewise((x*y + x, Eq(i, 1)), (x*y, True))
  376. assert ds(x*(y + KD(i, j)), (j, 2, 2)) == \
  377. Piecewise((x*y + x, Eq(i, 2)), (x*y, True))
  378. assert ds(x*(y + KD(i, j)), (j, 3, 3)) == \
  379. Piecewise((x*y + x, Eq(i, 3)), (x*y, True))
  380. assert ds(x*(y + KD(i, j)), (j, 1, k)) == \
  381. Piecewise((k*x*y + x, And(1 <= i, i <= k)), (k*x*y, True))
  382. assert ds(x*(y + KD(i, j)), (j, k, 3)) == \
  383. Piecewise(((4 - k)*x*y + x, And(k <= i, i <= 3)), ((4 - k)*x*y, True))
  384. assert ds(x*(y + KD(i, j)), (j, k, l)) == Piecewise(
  385. ((l - k + 1)*x*y + x, And(k <= i, i <= l)), ((l - k + 1)*x*y, True))
  386. def test_deltasummation_mul_x_add_y_twokd():
  387. assert ds(x*(y + 2*KD(i, j)), (j, 1, 3)) == \
  388. Piecewise((3*x*y + 2*x, And(1 <= i, i <= 3)), (3*x*y, True))
  389. assert ds(x*(y + 2*KD(i, j)), (j, 1, 1)) == \
  390. Piecewise((x*y + 2*x, Eq(i, 1)), (x*y, True))
  391. assert ds(x*(y + 2*KD(i, j)), (j, 2, 2)) == \
  392. Piecewise((x*y + 2*x, Eq(i, 2)), (x*y, True))
  393. assert ds(x*(y + 2*KD(i, j)), (j, 3, 3)) == \
  394. Piecewise((x*y + 2*x, Eq(i, 3)), (x*y, True))
  395. assert ds(x*(y + 2*KD(i, j)), (j, 1, k)) == \
  396. Piecewise((k*x*y + 2*x, And(1 <= i, i <= k)), (k*x*y, True))
  397. assert ds(x*(y + 2*KD(i, j)), (j, k, 3)) == Piecewise(
  398. ((4 - k)*x*y + 2*x, And(k <= i, i <= 3)), ((4 - k)*x*y, True))
  399. assert ds(x*(y + 2*KD(i, j)), (j, k, l)) == Piecewise(
  400. ((l - k + 1)*x*y + 2*x, And(k <= i, i <= l)), ((l - k + 1)*x*y, True))
  401. def test_deltasummation_mul_add_x_y_add_y_kd():
  402. assert ds((x + y)*(y + KD(i, j)), (j, 1, 3)) == Piecewise(
  403. (3*(x + y)*y + x + y, And(1 <= i, i <= 3)), (3*(x + y)*y, True))
  404. assert ds((x + y)*(y + KD(i, j)), (j, 1, 1)) == \
  405. Piecewise(((x + y)*y + x + y, Eq(i, 1)), ((x + y)*y, True))
  406. assert ds((x + y)*(y + KD(i, j)), (j, 2, 2)) == \
  407. Piecewise(((x + y)*y + x + y, Eq(i, 2)), ((x + y)*y, True))
  408. assert ds((x + y)*(y + KD(i, j)), (j, 3, 3)) == \
  409. Piecewise(((x + y)*y + x + y, Eq(i, 3)), ((x + y)*y, True))
  410. assert ds((x + y)*(y + KD(i, j)), (j, 1, k)) == Piecewise(
  411. (k*(x + y)*y + x + y, And(1 <= i, i <= k)), (k*(x + y)*y, True))
  412. assert ds((x + y)*(y + KD(i, j)), (j, k, 3)) == Piecewise(
  413. ((4 - k)*(x + y)*y + x + y, And(k <= i, i <= 3)),
  414. ((4 - k)*(x + y)*y, True))
  415. assert ds((x + y)*(y + KD(i, j)), (j, k, l)) == Piecewise(
  416. ((l - k + 1)*(x + y)*y + x + y, And(k <= i, i <= l)),
  417. ((l - k + 1)*(x + y)*y, True))
  418. def test_deltasummation_mul_add_x_kd_add_y_kd():
  419. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, 1, 3)) == piecewise_fold(
  420. Piecewise((KD(i, k) + x, And(1 <= i, i <= 3)), (0, True)) +
  421. 3*(KD(i, k) + x)*y)
  422. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, 1, 1)) == piecewise_fold(
  423. Piecewise((KD(i, k) + x, Eq(i, 1)), (0, True)) +
  424. (KD(i, k) + x)*y)
  425. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, 2, 2)) == piecewise_fold(
  426. Piecewise((KD(i, k) + x, Eq(i, 2)), (0, True)) +
  427. (KD(i, k) + x)*y)
  428. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, 3, 3)) == piecewise_fold(
  429. Piecewise((KD(i, k) + x, Eq(i, 3)), (0, True)) +
  430. (KD(i, k) + x)*y)
  431. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, 1, k)) == piecewise_fold(
  432. Piecewise((KD(i, k) + x, And(1 <= i, i <= k)), (0, True)) +
  433. k*(KD(i, k) + x)*y)
  434. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, k, 3)) == piecewise_fold(
  435. Piecewise((KD(i, k) + x, And(k <= i, i <= 3)), (0, True)) +
  436. (4 - k)*(KD(i, k) + x)*y)
  437. assert ds((x + KD(i, k))*(y + KD(i, j)), (j, k, l)) == piecewise_fold(
  438. Piecewise((KD(i, k) + x, And(k <= i, i <= l)), (0, True)) +
  439. (l - k + 1)*(KD(i, k) + x)*y)
  440. def test_extract_delta():
  441. raises(ValueError, lambda: _extract_delta(KD(i, j) + KD(k, l), i))