test_decompogen.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from sympy.solvers.decompogen import decompogen, compogen
  2. from sympy.core.symbol import symbols
  3. from sympy.functions.elementary.complexes import Abs
  4. from sympy.functions.elementary.exponential import exp
  5. from sympy.functions.elementary.miscellaneous import sqrt, Max
  6. from sympy.functions.elementary.trigonometric import (cos, sin)
  7. from sympy.testing.pytest import XFAIL, raises
  8. x, y = symbols('x y')
  9. def test_decompogen():
  10. assert decompogen(sin(cos(x)), x) == [sin(x), cos(x)]
  11. assert decompogen(sin(x)**2 + sin(x) + 1, x) == [x**2 + x + 1, sin(x)]
  12. assert decompogen(sqrt(6*x**2 - 5), x) == [sqrt(x), 6*x**2 - 5]
  13. assert decompogen(sin(sqrt(cos(x**2 + 1))), x) == [sin(x), sqrt(x), cos(x), x**2 + 1]
  14. assert decompogen(Abs(cos(x)**2 + 3*cos(x) - 4), x) == [Abs(x), x**2 + 3*x - 4, cos(x)]
  15. assert decompogen(sin(x)**2 + sin(x) - sqrt(3)/2, x) == [x**2 + x - sqrt(3)/2, sin(x)]
  16. assert decompogen(Abs(cos(y)**2 + 3*cos(x) - 4), x) == [Abs(x), 3*x + cos(y)**2 - 4, cos(x)]
  17. assert decompogen(x, y) == [x]
  18. assert decompogen(1, x) == [1]
  19. assert decompogen(Max(3, x), x) == [Max(3, x)]
  20. raises(TypeError, lambda: decompogen(x < 5, x))
  21. u = 2*x + 3
  22. assert decompogen(Max(sqrt(u),(u)**2), x) == [Max(sqrt(x), x**2), u]
  23. assert decompogen(Max(u, u**2, y), x) == [Max(x, x**2, y), u]
  24. assert decompogen(Max(sin(x), u), x) == [Max(2*x + 3, sin(x))]
  25. def test_decompogen_poly():
  26. assert decompogen(x**4 + 2*x**2 + 1, x) == [x**2 + 2*x + 1, x**2]
  27. assert decompogen(x**4 + 2*x**3 - x - 1, x) == [x**2 - x - 1, x**2 + x]
  28. @XFAIL
  29. def test_decompogen_fails():
  30. A = lambda x: x**2 + 2*x + 3
  31. B = lambda x: 4*x**2 + 5*x + 6
  32. assert decompogen(A(x*exp(x)), x) == [x**2 + 2*x + 3, x*exp(x)]
  33. assert decompogen(A(B(x)), x) == [x**2 + 2*x + 3, 4*x**2 + 5*x + 6]
  34. assert decompogen(A(1/x + 1/x**2), x) == [x**2 + 2*x + 3, 1/x + 1/x**2]
  35. assert decompogen(A(1/x + 2/(x + 1)), x) == [x**2 + 2*x + 3, 1/x + 2/(x + 1)]
  36. def test_compogen():
  37. assert compogen([sin(x), cos(x)], x) == sin(cos(x))
  38. assert compogen([x**2 + x + 1, sin(x)], x) == sin(x)**2 + sin(x) + 1
  39. assert compogen([sqrt(x), 6*x**2 - 5], x) == sqrt(6*x**2 - 5)
  40. assert compogen([sin(x), sqrt(x), cos(x), x**2 + 1], x) == sin(sqrt(
  41. cos(x**2 + 1)))
  42. assert compogen([Abs(x), x**2 + 3*x - 4, cos(x)], x) == Abs(cos(x)**2 +
  43. 3*cos(x) - 4)
  44. assert compogen([x**2 + x - sqrt(3)/2, sin(x)], x) == (sin(x)**2 + sin(x) -
  45. sqrt(3)/2)
  46. assert compogen([Abs(x), 3*x + cos(y)**2 - 4, cos(x)], x) == \
  47. Abs(3*cos(x) + cos(y)**2 - 4)
  48. assert compogen([x**2 + 2*x + 1, x**2], x) == x**4 + 2*x**2 + 1
  49. # the result is in unsimplified form
  50. assert compogen([x**2 - x - 1, x**2 + x], x) == -x**2 - x + (x**2 + x)**2 - 1