/test/unit/symbolics/testreducegip.py

https://bitbucket.org/mapdes/ffc · Python · 240 lines · 193 code · 15 blank · 32 comment · 3 complexity · 2df47a37e3491299140162efd4a083d8 MD5 · raw file

  1. #!/usr/bin/env python
  2. # Copyright (C) 2010 Kristian B. Oelgaard
  3. #
  4. # This file is part of FFC.
  5. #
  6. # FFC is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU Lesser General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # FFC is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Lesser General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public License
  17. # along with FFC. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. # First added: 2010-01-06
  20. # Last changed: 2010-02-01
  21. # Pyhton modules
  22. import unittest
  23. import time
  24. # FFC modules
  25. from ffc.quadrature.symbolics import *
  26. from ffc.cpp import format, set_float_formatting
  27. from ffc.parameters import FFC_PARAMETERS
  28. set_float_formatting(FFC_PARAMETERS['precision'])
  29. class TestReduceGIP(unittest.TestCase):
  30. def testReduceGIP(self):
  31. expr = Sum([
  32. Product([
  33. Symbol("F17", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F18", IP),
  34. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G0", GEO)
  35. ]),
  36. Product([
  37. Symbol("F11", IP), Symbol("F11", IP), Symbol("F13", IP), Symbol("F13", IP),
  38. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G1", GEO)
  39. ]),
  40. Product([
  41. Symbol("F11", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F13", IP),
  42. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G2", GEO)
  43. ]),
  44. Product([
  45. Symbol("F10", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F20", IP),
  46. Symbol("F3", IP), Symbol("F8", IP), Symbol("W9", IP), Symbol("G2", GEO)
  47. ]),
  48. Product([
  49. Symbol("F17", IP), Symbol("F18", IP), Symbol("F20", IP), Symbol("F3", IP),
  50. Symbol("F8", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G3", GEO)
  51. ]),
  52. Product([
  53. Symbol("F10", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F20", IP),
  54. Symbol("F8", IP), Symbol("W9", IP), Symbol("G4", GEO)
  55. ]),
  56. Product([
  57. Symbol("F10", IP), Symbol("F20", IP), Symbol("F8", IP), Symbol("F8", IP),
  58. Symbol("F9", IP), Symbol("W9", IP), Symbol("G4", GEO)
  59. ]),
  60. Product([
  61. Symbol("F11", IP), Symbol("F13", IP), Symbol("F17", IP), Symbol("F18", IP),
  62. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G2", GEO)
  63. ]),
  64. Product([
  65. Symbol("F20", IP), Symbol("F8", IP), Symbol("F8", IP), Symbol("F9", IP),
  66. Symbol("F9", IP), Symbol("W9", IP), Symbol("G5", GEO)
  67. ]),
  68. Product([
  69. Symbol("F11", IP), Symbol("F12", IP), Symbol("F17", IP), Symbol("F18", IP),
  70. Symbol("F20", IP), Symbol("W9", IP), Symbol("G6", GEO)
  71. ]),
  72. Product([
  73. Symbol("F10", IP), Symbol("F10", IP), Symbol("F20", IP), Symbol("F3", IP),
  74. Symbol("F8", IP), Symbol("F8", IP), Symbol("W9", IP), Symbol("G1", GEO)
  75. ]),
  76. Product([
  77. Symbol("F10", IP), Symbol("F10", IP), Symbol("F20", IP), Symbol("F8", IP),
  78. Symbol("F8", IP), Symbol("W9", IP), Symbol("G7", GEO)
  79. ]),
  80. Product([
  81. Symbol("F17", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F19", IP),
  82. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G2", GEO)
  83. ]),
  84. Product([
  85. Symbol("F11", IP), Symbol("F12", IP), Symbol("F17", IP), Symbol("F19", IP),
  86. Symbol("F20", IP), Symbol("W9", IP), Symbol("G4", GEO)
  87. ]),
  88. Product([
  89. Symbol("F11", IP), Symbol("F11", IP), Symbol("F13", IP), Symbol("F13", IP),
  90. Symbol("F20", IP), Symbol("W9", IP), Symbol("G7", GEO)
  91. ]),
  92. Product([
  93. Symbol("F10", IP), Symbol("F17", IP), Symbol("F19", IP), Symbol("F20", IP),
  94. Symbol("F3", IP), Symbol("F8", IP), Symbol("W9", IP), Symbol("G8", GEO)
  95. ]),
  96. Product([
  97. Symbol("F17", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F18", IP),
  98. Symbol("F20", IP), Symbol("W9", IP), Symbol("G5", GEO)
  99. ]),
  100. Product([
  101. Symbol("F10", IP), Symbol("F17", IP), Symbol("F19", IP), Symbol("F20", IP),
  102. Symbol("F8", IP), Symbol("W9", IP), Symbol("G9", GEO)
  103. ]),
  104. Product([
  105. Symbol("F10", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F20", IP),
  106. Symbol("F3", IP), Symbol("F8", IP), Symbol("W9", IP), Symbol("G2", GEO)
  107. ]),
  108. Product([
  109. Symbol("F17", IP), Symbol("F18", IP), Symbol("F20", IP), Symbol("F8", IP),
  110. Symbol("F9", IP), Symbol("W9", IP), Symbol("G6", GEO)
  111. ]),
  112. Product([
  113. Symbol("F10", IP), Symbol("F11", IP), Symbol("F13", IP), Symbol("F20", IP),
  114. Symbol("F3", IP), Symbol("F8", IP), Symbol("W9", IP), Symbol("G8", GEO)
  115. ]),
  116. Product([
  117. Symbol("F11", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F13", IP),
  118. Symbol("F20", IP), Symbol("W9", IP), Symbol("G4", GEO)
  119. ]),
  120. Product([
  121. Symbol("F10", IP), Symbol("F11", IP), Symbol("F13", IP), Symbol("F20", IP),
  122. Symbol("F8", IP), Symbol("W9", IP), Symbol("G9", GEO)
  123. ]),
  124. Product([
  125. Symbol("F11", IP), Symbol("F13", IP), Symbol("F20", IP), Symbol("F3", IP),
  126. Symbol("F8", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G2", GEO)
  127. ]),
  128. Product([
  129. Symbol("F11", IP), Symbol("F12", IP), Symbol("F17", IP), Symbol("F18", IP),
  130. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G3", GEO)
  131. ]),
  132. Product([
  133. Symbol("F10", IP), Symbol("F20", IP), Symbol("F3", IP), Symbol("F8", IP),
  134. Symbol("F8", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G2", GEO)
  135. ]),
  136. Product([
  137. Symbol("F17", IP), Symbol("F19", IP), Symbol("F20", IP), Symbol("F8", IP),
  138. Symbol("F9", IP), Symbol("W9", IP), Symbol("G4", GEO)
  139. ]),
  140. Product([
  141. Symbol("F11", IP), Symbol("F13", IP), Symbol("F17", IP), Symbol("F19", IP),
  142. Symbol("F20", IP), Symbol("W9", IP), Symbol("G9", GEO)
  143. ]),
  144. Product([
  145. Symbol("F11", IP), Symbol("F13", IP), Symbol("F17", IP), Symbol("F18", IP),
  146. Symbol("F20", IP), Symbol("W9", IP), Symbol("G4", GEO)
  147. ]),
  148. Product([
  149. Symbol("F11", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F12", IP),
  150. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G0", GEO)
  151. ]),
  152. Product([
  153. Symbol("F17", IP), Symbol("F17", IP), Symbol("F19", IP), Symbol("F19", IP),
  154. Symbol("F20", IP), Symbol("W9", IP), Symbol("G7", GEO)
  155. ]),
  156. Product([
  157. Symbol("F17", IP), Symbol("F17", IP), Symbol("F18", IP), Symbol("F19", IP),
  158. Symbol("F20", IP), Symbol("W9", IP), Symbol("G4", GEO)
  159. ]),
  160. Product([
  161. Symbol("F20", IP), Symbol("F3", IP), Symbol("F8", IP), Symbol("F8", IP),
  162. Symbol("F9", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G0", GEO)
  163. ]),
  164. Product([
  165. Symbol("F11", IP), Symbol("F12", IP), Symbol("F20", IP), Symbol("F8", IP),
  166. Symbol("F9", IP), Symbol("W9", IP), Symbol("G6", GEO)
  167. ]),
  168. Product([
  169. Symbol("F11", IP), Symbol("F13", IP), Symbol("F17", IP), Symbol("F19", IP),
  170. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G8", GEO)
  171. ]),
  172. Product([
  173. Symbol("F17", IP), Symbol("F19", IP), Symbol("F20", IP), Symbol("F3", IP),
  174. Symbol("F8", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G2", GEO)
  175. ]),
  176. Product([
  177. Symbol("F10", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F20", IP),
  178. Symbol("F8", IP), Symbol("W9", IP), Symbol("G4", GEO)
  179. ]),
  180. Product([
  181. Symbol("F11", IP), Symbol("F13", IP), Symbol("F20", IP), Symbol("F8", IP),
  182. Symbol("F9", IP), Symbol("W9", IP), Symbol("G4", GEO)
  183. ]),
  184. Product([
  185. Symbol("F11", IP), Symbol("F11", IP), Symbol("F12", IP), Symbol("F12", IP),
  186. Symbol("F20", IP), Symbol("W9", IP), Symbol("G5", GEO)
  187. ]),
  188. Product([
  189. Symbol("F11", IP), Symbol("F12", IP), Symbol("F20", IP), Symbol("F3", IP),
  190. Symbol("F8", IP), Symbol("F9", IP), Symbol("W9", IP), Symbol("G3", GEO)
  191. ]),
  192. Product([
  193. Symbol("F17", IP), Symbol("F17", IP), Symbol("F19", IP), Symbol("F19", IP),
  194. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G1", GEO)
  195. ]),
  196. Product([
  197. Symbol("F11", IP), Symbol("F12", IP), Symbol("F17", IP), Symbol("F19", IP),
  198. Symbol("F20", IP), Symbol("F3", IP), Symbol("W9", IP), Symbol("G2", GEO)
  199. ])
  200. ])
  201. # print "\nReduceGIP"
  202. start = time.time()
  203. expr_exp = expr.expand()
  204. # print "ReduceGIP: time, expand() ", time.time() - start
  205. start = time.time()
  206. expr_red = expr_exp.reduce_ops()
  207. # print "ReduceGIP: time, reduce_ops(): ", time.time() - start
  208. # print "expr.ops(): ", expr.ops()
  209. # print "expr_exp.ops(): ", expr_exp.ops()
  210. # print "expr_red.ops(): ", expr_red.ops()
  211. # print "expr: ", expr
  212. # print "exp: ", expr_exp
  213. # print "red: ", expr_red
  214. W9 = 9
  215. F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20 = [0.123 * i for i in range(1,21)]
  216. G0, G1, G2, G3, G4, G5, G6, G7, G8, G9 = [2.64 + 1.0/i for i in range(20, 30)]
  217. self.assertAlmostEqual(eval(str(expr)), eval(str(expr_exp)))
  218. self.assertAlmostEqual(eval(str(expr)), eval(str(expr_red)))
  219. self.assertEqual(expr.ops(), 314)
  220. self.assertEqual(expr_exp.ops(), 314)
  221. self.assertEqual(expr_red.ops(), 120)
  222. if __name__ == "__main__":
  223. # Run all returned tests
  224. runner = unittest.TextTestRunner()
  225. runner.run(TestReduceGIP('testReduceGIP'))