def __init__(self, ex: Union[str, Number, sympy.Expr]) -> None: """Create an Expression object. Receives the mathematical expression which shall be represented by the object as a string which will be parsed using py_expression_eval. For available operators, functions and constants see SymPy documentation Args: ex (string): The mathematical expression represented as a string """ super().__init__() if isinstance(ex, sympy.Expr): self._original_expression = None self._sympified_expression = ex self._variables = get_variables(self._sympified_expression) elif isinstance(ex, ExpressionScalar): self._original_expression = ex._original_expression self._sympified_expression = ex._sympified_expression self._variables = ex._variables elif isinstance(ex, (int, float)): self._original_expression = ex self._sympified_expression = sympify(ex) self._variables = () else: self._original_expression = ex self._sympified_expression = sympify(ex) self._variables = get_variables(self._sympified_expression) self._exact_rational_lambdified = None
def evaluate(self, expression: Union[sympy.Expr, np.ndarray], parameters): if isinstance(expression, np.ndarray): variables = set.union( *map(set, map(get_variables, expression.flat))) else: variables = get_variables(expression) return evaluate_lamdified_exact_rational(expression, variables=list(variables), parameters=parameters, lambdified=None)[0]
def test_get_variables_indexed(self): expr = a_[i] * IndexedBase(a * b)[j] self.assertEqual({'a', 'b', 'i', 'j'}, set(get_variables(expr)))
def test_get_variables(self): expr = a * b / 5 self.assertEqual({'a', 'b'}, set(get_variables(expr)))