test_sathandlers.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from sympy.assumptions.ask import Q
  2. from sympy.core.basic import Basic
  3. from sympy.core.expr import Expr
  4. from sympy.core.mul import Mul
  5. from sympy.core.symbol import symbols
  6. from sympy.logic.boolalg import (And, Or)
  7. from sympy.assumptions.sathandlers import (ClassFactRegistry, allargs,
  8. anyarg, exactlyonearg,)
  9. x, y, z = symbols('x y z')
  10. def test_class_handler_registry():
  11. my_handler_registry = ClassFactRegistry()
  12. # The predicate doesn't matter here, so just pass
  13. @my_handler_registry.register(Mul)
  14. def fact1(expr):
  15. pass
  16. @my_handler_registry.multiregister(Expr)
  17. def fact2(expr):
  18. pass
  19. assert my_handler_registry[Basic] == (frozenset(), frozenset())
  20. assert my_handler_registry[Expr] == (frozenset(), frozenset({fact2}))
  21. assert my_handler_registry[Mul] == (frozenset({fact1}), frozenset({fact2}))
  22. def test_allargs():
  23. assert allargs(x, Q.zero(x), x*y) == And(Q.zero(x), Q.zero(y))
  24. assert allargs(x, Q.positive(x) | Q.negative(x), x*y) == And(Q.positive(x) | Q.negative(x), Q.positive(y) | Q.negative(y))
  25. def test_anyarg():
  26. assert anyarg(x, Q.zero(x), x*y) == Or(Q.zero(x), Q.zero(y))
  27. assert anyarg(x, Q.positive(x) & Q.negative(x), x*y) == \
  28. Or(Q.positive(x) & Q.negative(x), Q.positive(y) & Q.negative(y))
  29. def test_exactlyonearg():
  30. assert exactlyonearg(x, Q.zero(x), x*y) == \
  31. Or(Q.zero(x) & ~Q.zero(y), Q.zero(y) & ~Q.zero(x))
  32. assert exactlyonearg(x, Q.zero(x), x*y*z) == \
  33. Or(Q.zero(x) & ~Q.zero(y) & ~Q.zero(z), Q.zero(y)
  34. & ~Q.zero(x) & ~Q.zero(z), Q.zero(z) & ~Q.zero(x) & ~Q.zero(y))
  35. assert exactlyonearg(x, Q.positive(x) | Q.negative(x), x*y) == \
  36. Or((Q.positive(x) | Q.negative(x)) &
  37. ~(Q.positive(y) | Q.negative(y)), (Q.positive(y) | Q.negative(y)) &
  38. ~(Q.positive(x) | Q.negative(x)))