60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from contextlib import contextmanager
|
|
from threading import local
|
|
|
|
from sympy.core.function import expand_mul
|
|
from sympy.simplify.simplify import dotprodsimp as _dotprodsimp
|
|
|
|
|
|
class DotProdSimpState(local):
|
|
def __init__(self):
|
|
self.state = None
|
|
|
|
_dotprodsimp_state = DotProdSimpState()
|
|
|
|
@contextmanager
|
|
def dotprodsimp(x):
|
|
old = _dotprodsimp_state.state
|
|
|
|
try:
|
|
_dotprodsimp_state.state = x
|
|
yield
|
|
finally:
|
|
_dotprodsimp_state.state = old
|
|
|
|
def _get_intermediate_simp(deffunc=lambda x: x, offfunc=lambda x: x,
|
|
onfunc=_dotprodsimp, dotprodsimp=None):
|
|
"""Support function for controlling intermediate simplification. Returns a
|
|
simplification function according to the global setting of dotprodsimp
|
|
operation.
|
|
|
|
``deffunc`` - Function to be used by default.
|
|
``offfunc`` - Function to be used if dotprodsimp has been turned off.
|
|
``onfunc`` - Function to be used if dotprodsimp has been turned on.
|
|
``dotprodsimp`` - True, False or None. Will be overridden by global
|
|
_dotprodsimp_state.state if that is not None.
|
|
"""
|
|
|
|
if dotprodsimp is False or _dotprodsimp_state.state is False:
|
|
return offfunc
|
|
if dotprodsimp is True or _dotprodsimp_state.state is True:
|
|
return onfunc
|
|
|
|
return deffunc # None, None
|
|
|
|
def _get_intermediate_simp_bool(default=False, dotprodsimp=None):
|
|
"""Same as ``_get_intermediate_simp`` but returns bools instead of functions
|
|
by default."""
|
|
|
|
return _get_intermediate_simp(default, False, True, dotprodsimp)
|
|
|
|
|
|
def _iszero(x):
|
|
"""Returns True if x is zero."""
|
|
return getattr(x, 'is_zero', None)
|
|
|
|
|
|
def _is_zero_after_expand_mul(x):
|
|
"""Tests by expand_mul only, suitable for polynomials and rational
|
|
functions."""
|
|
return expand_mul(x) == 0
|