def find_opts(expr): if not isinstance(expr, Basic): return if expr.is_Atom: return if isinstance(expr, CSE_NO_DESCEND_CLASSES): return if iterable(expr): for item in expr: find_opts(item) return if expr in seen_subexp: return expr seen_subexp.add(expr) for arg in expr.args: find_opts(arg) if _coeff_isneg(expr): neg_expr = -expr if not neg_expr.is_Atom: opt_subs[expr] = Unevaluated(Mul, (-1, neg_expr)) seen_subexp.add(neg_expr) expr = neg_expr if isinstance(expr, Mul): muls.add(expr) elif isinstance(expr, Add): adds.add(expr) elif isinstance(expr, Pow): base, exp = expr.args if _coeff_isneg(exp): opt_subs[expr] = Unevaluated(Pow, (Pow(base, -exp), -1))
def test_nested_substitution(): # Substitution within a substitution. e = Add(Pow(w*x + y, 2), sqrt(w*x + y)) substs, reduced = cse([e]) assert substs == [(x0, w*x + y)] assert reduced == [sqrt(x0) + x0**2]
def test_cse_single(): # Simple substitution. e = Add(Pow(x + y, 2), sqrt(x + y)) substs, reduced = cse([e]) assert substs == [(x0, x + y)] assert reduced == [sqrt(x0) + x0**2]