def test_numbered_symbols(): ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice(ns, 0, 10)) == [Symbol('y%s'%i) for i in range(0, 10)] ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice(ns, 10, 20)) == [Symbol('y%s'%i) for i in range(10, 20)] ns = cse_main.numbered_symbols() assert list(itertools.islice(ns, 0, 10)) == [Symbol('x%s'%i) for i in range(0, 10)]
def optimize(exprs, subs, rearrange = False): # map expressions with tokens to token token_exprs = {} for (q,e) in exprs: for t in tokens(e): if not t in token_exprs: token_exprs[t] = [] token_exprs[t] += [e] # expressions with common tokens/terms T = numbered_symbols("f") subs += [(T.next(), k) for (k,v) in token_exprs.items() if len(v) > 1] # replace common terms with Tn symbol subs_exprs = [] for (q,e) in exprs: for (T,t) in subs: e = e._eval_subs(t, T) subs_exprs += [(q,e)] if rearrange: cmp = lambda x,y: len(x[1].atoms(Symbol)) - len(y[1].atoms(Symbol)) Q = sorted(subs_exprs, cmp, reverse = True) subs_exprs = [Q.pop()] while Q: a = subs_exprs[-1][1].atoms(Symbol) (p,s) = Q[-1] for (q,t) in Q[:-1]: if len(t.atoms(Symbol) | a) < len(s.atoms(Symbol) | a): (p,s) = (q,t) subs_exprs.append((p,s)) Q.remove((p,s)) subs_exprs.reverse() return (subs_exprs, subs)
def optimize(exprs, subs, rearrange=False): # map expressions with tokens to token token_exprs = {} for (q, e) in exprs: for t in tokens(e): if not t in token_exprs: token_exprs[t] = [] token_exprs[t] += [e] # expressions with common tokens/terms T = numbered_symbols("f") subs += [(T.next(), k) for (k, v) in token_exprs.items() if len(v) > 1] # replace common terms with Tn symbol subs_exprs = [] for (q, e) in exprs: for (T, t) in subs: e = e._eval_subs(t, T) subs_exprs += [(q, e)] if rearrange: cmp = lambda x, y: len(x[1].atoms(Symbol)) - len(y[1].atoms(Symbol)) Q = sorted(subs_exprs, cmp, reverse=True) subs_exprs = [Q.pop()] while Q: a = subs_exprs[-1][1].atoms(Symbol) (p, s) = Q[-1] for (q, t) in Q[:-1]: if len(t.atoms(Symbol) | a) < len(s.atoms(Symbol) | a): (p, s) = (q, t) subs_exprs.append((p, s)) Q.remove((p, s)) subs_exprs.reverse() return (subs_exprs, subs)
import itertools from sympy import (Add, Mul, Pow, Symbol, exp, sqrt, symbols, sympify, cse, Matrix, S, sin, Eq) from sympy.simplify import cse_main, cse_opts from sympy.utilities.pytest import XFAIL w,x,y,z = symbols('w,x,y,z') x0,x1,x2 = list(itertools.islice(cse_main.numbered_symbols(), 0, 3)) negone = sympify(-1) def test_numbered_symbols(): ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice(ns, 0, 10)) == [Symbol('y%s'%i) for i in range(0, 10)] ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice(ns, 10, 20)) == [Symbol('y%s'%i) for i in range(10, 20)] ns = cse_main.numbered_symbols() assert list(itertools.islice(ns, 0, 10)) == [Symbol('x%s'%i) for i in range(0, 10)] # Dummy "optimization" functions for testing. def opt1(expr): return expr+y def opt2(expr): return expr*z def test_preprocess_for_cse(): assert cse_main.preprocess_for_cse(x, [(opt1, None)]) == x+y assert cse_main.preprocess_for_cse(x, [(None, opt1)]) == x assert cse_main.preprocess_for_cse(x, [(None, None)]) == x
import itertools from sympy import (Add, Mul, Pow, Symbol, exp, sqrt, symbols, sympify, cse, Matrix, S, cos, sin, Eq) from sympy.functions.special.hyper import meijerg from sympy.simplify import cse_main, cse_opts from sympy.utilities.pytest import XFAIL w, x, y, z = symbols('w,x,y,z') x0, x1, x2 = list(itertools.islice(cse_main.numbered_symbols(), 0, 3)) negone = sympify(-1) def test_numbered_symbols(): ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice( ns, 0, 10)) == [Symbol('y%s' % i) for i in range(0, 10)] ns = cse_main.numbered_symbols(prefix='y') assert list(itertools.islice( ns, 10, 20)) == [Symbol('y%s' % i) for i in range(10, 20)] ns = cse_main.numbered_symbols() assert list(itertools.islice( ns, 0, 10)) == [Symbol('x%s' % i) for i in range(0, 10)] # Dummy "optimization" functions for testing. def opt1(expr): return expr + y