m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
5.9 KiB

6 months ago
  1. # -*- coding: utf-8 -*-
  2. from sympy.core.function import Function
  3. from sympy.integrals.integrals import Integral
  4. from sympy.printing.latex import latex
  5. from sympy.printing.pretty import pretty as xpretty
  6. from sympy.vector import CoordSys3D, Vector, express
  7. from sympy.abc import a, b, c
  8. from sympy.testing.pytest import XFAIL
  9. def pretty(expr):
  10. """ASCII pretty-printing"""
  11. return xpretty(expr, use_unicode=False, wrap_line=False)
  12. def upretty(expr):
  13. """Unicode pretty-printing"""
  14. return xpretty(expr, use_unicode=True, wrap_line=False)
  15. # Initialize the basic and tedious vector/dyadic expressions
  16. # needed for testing.
  17. # Some of the pretty forms shown denote how the expressions just
  18. # above them should look with pretty printing.
  19. N = CoordSys3D('N')
  20. C = N.orient_new_axis('C', a, N.k) # type: ignore
  21. v = []
  22. d = []
  23. v.append(Vector.zero)
  24. v.append(N.i) # type: ignore
  25. v.append(-N.i) # type: ignore
  26. v.append(N.i + N.j) # type: ignore
  27. v.append(a*N.i) # type: ignore
  28. v.append(a*N.i - b*N.j) # type: ignore
  29. v.append((a**2 + N.x)*N.i + N.k) # type: ignore
  30. v.append((a**2 + b)*N.i + 3*(C.y - c)*N.k) # type: ignore
  31. f = Function('f')
  32. v.append(N.j - (Integral(f(b)) - C.x**2)*N.k) # type: ignore
  33. upretty_v_8 = """\
  34. 2 \n\
  35. j_N + x_C - f(b) db k_N\n\
  36. \
  37. """
  38. pretty_v_8 = """\
  39. j_N + / / \\\n\
  40. | 2 | |\n\
  41. |x_C - | f(b) db|\n\
  42. | | |\n\
  43. \\ / / \
  44. """
  45. v.append(N.i + C.k) # type: ignore
  46. v.append(express(N.i, C)) # type: ignore
  47. v.append((a**2 + b)*N.i + (Integral(f(b)))*N.k) # type: ignore
  48. upretty_v_11 = """\
  49. 2 \n\
  50. a + b i_N + f(b) db k_N\n\
  51. \
  52. """
  53. pretty_v_11 = """\
  54. / 2 \\ + / / \\\n\
  55. \\a + b/ i_N| | |\n\
  56. | | f(b) db|\n\
  57. | | |\n\
  58. \\/ / \
  59. """
  60. for x in v:
  61. d.append(x | N.k) # type: ignore
  62. s = 3*N.x**2*C.y # type: ignore
  63. upretty_s = """\
  64. 2\n\
  65. 3y_Cx_N \
  66. """
  67. pretty_s = """\
  68. 2\n\
  69. 3*y_C*x_N \
  70. """
  71. # This is the pretty form for ((a**2 + b)*N.i + 3*(C.y - c)*N.k) | N.k
  72. upretty_d_7 = """\
  73. 2 \n\
  74. a + b (i_N|k_N) + (3y_C - 3c) (k_N|k_N)\
  75. """
  76. pretty_d_7 = """\
  77. / 2 \\ (i_N|k_N) + (3*y_C - 3*c) (k_N|k_N)\n\
  78. \\a + b/ \
  79. """
  80. def test_str_printing():
  81. assert str(v[0]) == '0'
  82. assert str(v[1]) == 'N.i'
  83. assert str(v[2]) == '(-1)*N.i'
  84. assert str(v[3]) == 'N.i + N.j'
  85. assert str(v[8]) == 'N.j + (C.x**2 - Integral(f(b), b))*N.k'
  86. assert str(v[9]) == 'C.k + N.i'
  87. assert str(s) == '3*C.y*N.x**2'
  88. assert str(d[0]) == '0'
  89. assert str(d[1]) == '(N.i|N.k)'
  90. assert str(d[4]) == 'a*(N.i|N.k)'
  91. assert str(d[5]) == 'a*(N.i|N.k) + (-b)*(N.j|N.k)'
  92. assert str(d[8]) == ('(N.j|N.k) + (C.x**2 - ' +
  93. 'Integral(f(b), b))*(N.k|N.k)')
  94. @XFAIL
  95. def test_pretty_printing_ascii():
  96. assert pretty(v[0]) == '0'
  97. assert pretty(v[1]) == 'i_N'
  98. assert pretty(v[5]) == '(a) i_N + (-b) j_N'
  99. assert pretty(v[8]) == pretty_v_8
  100. assert pretty(v[2]) == '(-1) i_N'
  101. assert pretty(v[11]) == pretty_v_11
  102. assert pretty(s) == pretty_s
  103. assert pretty(d[0]) == '(0|0)'
  104. assert pretty(d[5]) == '(a) (i_N|k_N) + (-b) (j_N|k_N)'
  105. assert pretty(d[7]) == pretty_d_7
  106. assert pretty(d[10]) == '(cos(a)) (i_C|k_N) + (-sin(a)) (j_C|k_N)'
  107. def test_pretty_print_unicode_v():
  108. assert upretty(v[0]) == '0'
  109. assert upretty(v[1]) == 'i_N'
  110. assert upretty(v[5]) == '(a) i_N + (-b) j_N'
  111. # Make sure the printing works in other objects
  112. assert upretty(v[5].args) == '((a) i_N, (-b) j_N)'
  113. assert upretty(v[8]) == upretty_v_8
  114. assert upretty(v[2]) == '(-1) i_N'
  115. assert upretty(v[11]) == upretty_v_11
  116. assert upretty(s) == upretty_s
  117. assert upretty(d[0]) == '(0|0)'
  118. assert upretty(d[5]) == '(a) (i_N|k_N) + (-b) (j_N|k_N)'
  119. assert upretty(d[7]) == upretty_d_7
  120. assert upretty(d[10]) == '(cos(a)) (i_C|k_N) + (-sin(a)) (j_C|k_N)'
  121. def test_latex_printing():
  122. assert latex(v[0]) == '\\mathbf{\\hat{0}}'
  123. assert latex(v[1]) == '\\mathbf{\\hat{i}_{N}}'
  124. assert latex(v[2]) == '- \\mathbf{\\hat{i}_{N}}'
  125. assert latex(v[5]) == ('(a)\\mathbf{\\hat{i}_{N}} + ' +
  126. '(- b)\\mathbf{\\hat{j}_{N}}')
  127. assert latex(v[6]) == ('(\\mathbf{{x}_{N}} + a^{2})\\mathbf{\\hat{i}_' +
  128. '{N}} + \\mathbf{\\hat{k}_{N}}')
  129. assert latex(v[8]) == ('\\mathbf{\\hat{j}_{N}} + (\\mathbf{{x}_' +
  130. '{C}}^{2} - \\int f{\\left(b \\right)}\\,' +
  131. ' db)\\mathbf{\\hat{k}_{N}}')
  132. assert latex(s) == '3 \\mathbf{{y}_{C}} \\mathbf{{x}_{N}}^{2}'
  133. assert latex(d[0]) == '(\\mathbf{\\hat{0}}|\\mathbf{\\hat{0}})'
  134. assert latex(d[4]) == ('(a)\\left(\\mathbf{\\hat{i}_{N}}{\\middle|}' +
  135. '\\mathbf{\\hat{k}_{N}}\\right)')
  136. assert latex(d[9]) == ('\\left(\\mathbf{\\hat{k}_{C}}{\\middle|}' +
  137. '\\mathbf{\\hat{k}_{N}}\\right) + \\left(' +
  138. '\\mathbf{\\hat{i}_{N}}{\\middle|}\\mathbf{' +
  139. '\\hat{k}_{N}}\\right)')
  140. assert latex(d[11]) == ('(a^{2} + b)\\left(\\mathbf{\\hat{i}_{N}}' +
  141. '{\\middle|}\\mathbf{\\hat{k}_{N}}\\right) + ' +
  142. '(\\int f{\\left(b \\right)}\\, db)\\left(' +
  143. '\\mathbf{\\hat{k}_{N}}{\\middle|}\\mathbf{' +
  144. '\\hat{k}_{N}}\\right)')
  145. def test_custom_names():
  146. A = CoordSys3D('A', vector_names=['x', 'y', 'z'],
  147. variable_names=['i', 'j', 'k'])
  148. assert A.i.__str__() == 'A.i'
  149. assert A.x.__str__() == 'A.x'
  150. assert A.i._pretty_form == 'i_A'
  151. assert A.x._pretty_form == 'x_A'
  152. assert A.i._latex_form == r'\mathbf{{i}_{A}}'
  153. assert A.x._latex_form == r"\mathbf{\hat{x}_{A}}"