import sys from sympy.simplify import old_cse_main # I've let previous cse_main.py and cse_opts.py files as old_*.py in sympy/simplify/ from sympy.simplify import cse_main prev_cse = old_cse_main.cse new_cse = cse_main.cse import sympy from sympy.utilities import numbered_symbols from sympy.core.cache import clear_cache print("Processors:") !grep "model name" /proc/cpuinfo print("\nSystem:") !uname -a print("\nPython:\n%s"%sys.version) print("\nSympy fast_cse branch:") !(cd $my_sympy_path; git show -s) print("\nbased on Sympy version: %s\n"%sympy.__version__) def count(exprs): ops = '=', '+', '-', '*', '/', '**', 'sin', 'cos' s = str(exprs) op_counts = {op: s.count(op) for op in ops} op_counts['='] = len(exprs[0]) if isinstance(exprs, tuple) else 0 op_counts['*'] = op_counts['*'] - op_counts['**'] return '\t'.join([str(op_counts[op]) + ' ' + op for op in ops]) def undo_cse(cse_output): from sympy.matrices import Matrix from sympy.core.compatibility import iterable from sympy import Basic subs = dict((s, e) for (s, e) in cse_output[0]) exprs = cse_output[1] def _recreate(expr): if iterable(expr): out = type(expr)(*map(_recreate, expr)) elif expr in subs: out = _recreate(subs[expr]) elif isinstance(expr, Basic) and expr.is_Atom: out = expr else: out = type(expr)(*map(_recreate, expr.args)) return out single = False if isinstance(exprs, Basic) or isinstance(exprs, Matrix): # if only one expression or one matrix is passed exprs = [exprs] single = True expanded_exprs = [] for expr in exprs: if isinstance(expr, Matrix): expanded_exprs.append(expr.applyfunc(_recreate)) else: expanded_exprs.append(_recreate(expr)) if single: expanded_exprs = expanded_exprs[0] return expanded_exprs def verify_cse(orig_exprs, cse_output): from sympy import Basic if isinstance(orig_exprs, Basic): orig_exprs = [orig_exprs] cse_exprs = undo_cse(cse_output) fail = False for orig_expr, cse_expr in zip(orig_exprs, cse_exprs): diff = orig_expr - cse_expr diff = sympy.simplify(diff).expand() if diff != 0: print(diff) fail = True return not fail large_exprs = sympy.sympify('''[a27*a4 - (a1*a7 + 9.81*a14*cos(a13) + a15*(-a25*a26*sin(a13) + a4*cos(a13)) + a22*(-a25*a26*cos(a13) - a4*sin(a13)) - a25*(-a1*a25*sin(a13) + a10*a25*cos(a13) + a26*a5)*cos(a13) + a26*(a10*a26 - a15*a25*sin(a13) + a21*a25*cos(a13)) - (0.045*sin(a18)**2 + 0.045*cos(a18)**2)*(-a12*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) + a19*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) + a20*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) - (-a25*sin(a13)*sin(a18) - a26*cos(a18))*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (-a25*sin(a13)*cos(a18) + a26*sin(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))))*sin(a18) - 0.55*(a12*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a20*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) - a23*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) - (a25*cos(a13) + a6)*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (a25*sin(a13)*sin(a18) + a26*cos(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))))*sin(a18) - 0.55*(-a19*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a20*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a23*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - (-a25*cos(a13) - a6)*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (a25*sin(a13)*cos(a18) - a26*sin(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))))*cos(a18) + (-a12*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) + a16*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) + a17*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a23*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a3*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - (a25*cos(a13) + a6)*(a16*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a2*(a25*sin(a13)*sin(a18) + a26*cos(a18)) - a23*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a9*(-a25*cos(a13) - a6)) - (a25*sin(a13)*sin(a18) + a26*cos(a18))*(a0*(-a25*cos(a13) - a6) + a12*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a17*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) - a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a9*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) - a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)))*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6))*cos(a18) - (a16*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) + a19*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) + a2*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) - a23*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) + a9*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) - (-a25*cos(a13) - a6)*(-a12*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a16*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a17*(-a25*cos(a13) - a6) + a23*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a3*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (-0.55*a25*sin(a13)*sin(a18) - 0.55*a26*cos(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))) - (a25*sin(a13)*cos(a18) - a26*sin(a18))*(a0*(-a25*cos(a13) - a6) + a12*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a17*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) - a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a9*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))))*sin(a18))*sin(a13) + (-a0*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a10*a7 - a12*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) + 9.81*a14*sin(a13) + a15*(-a25*a26*cos(a13) - a4*sin(a13)) - a17*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) + a19*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a21*(-a25*a26*sin(a13) + a4*cos(a13)) - a25*(-a1*a25*sin(a13) + a10*a25*cos(a13) + a26*a5)*sin(a13) - a26*(a1*a26 + a15*a25*cos(a13) - a22*a25*sin(a13)) - a9*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) + (-a25*sin(a13)*sin(a18) - a26*cos(a18))*(-a12*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a16*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a17*(-a25*cos(a13) - a6) + a23*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a3*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) + (0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) + (-a25*sin(a13)*cos(a18) + a26*sin(a18))*(a16*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a2*(a25*sin(a13)*sin(a18) + a26*cos(a18)) - a23*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a9*(-a25*cos(a13) - a6)) + (0.045*sin(a18)**2 + 0.045*cos(a18)**2)*(-a19*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a20*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a23*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - (-a25*cos(a13) - a6)*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (a25*sin(a13)*cos(a18) - a26*sin(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)))) + (a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18)))*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18) - 0.045*a6))*cos(a13), a1*(-a25*a26*cos(a13) - a4*sin(a13)) + a10*(-a25*a26*sin(a13) + a4*cos(a13)) - 9.81*a11*cos(a13) + a25*(a1*a26 + a15*a25*cos(a13) - a22*a25*sin(a13))*cos(a13) + a25*(a10*a26 - a15*a25*sin(a13) + a21*a25*cos(a13))*sin(a13) + a5*a7 - 9.81*a8*sin(a13) + (0.045*sin(a18)**2 + 0.045*cos(a18)**2)*(-a12*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) + a19*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) + a20*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) - (-a25*sin(a13)*sin(a18) - a26*cos(a18))*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (-a25*sin(a13)*cos(a18) + a26*sin(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))))*cos(a18) + 0.55*(a12*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a20*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) - a23*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) - (a25*cos(a13) + a6)*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (a25*sin(a13)*sin(a18) + a26*cos(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))))*cos(a18) - 0.55*(-a19*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a20*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a23*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - (-a25*cos(a13) - a6)*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (a25*sin(a13)*cos(a18) - a26*sin(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))))*sin(a18) + (-a12*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) + a16*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) + a17*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a23*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + a3*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - (a25*cos(a13) + a6)*(a16*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a2*(a25*sin(a13)*sin(a18) + a26*cos(a18)) - a23*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a9*(-a25*cos(a13) - a6)) - (a25*sin(a13)*sin(a18) + a26*cos(a18))*(a0*(-a25*cos(a13) - a6) + a12*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a17*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) - a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a9*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) - a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)))*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6))*sin(a18) + (a16*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) + a19*(0.045*a6*(a25*sin(a13)*cos(a18) - a26*sin(a18)) + a7*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a18) - 9.81*cos(a13)) + a2*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) - a23*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) + a9*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) - (-a25*cos(a13) - a6)*(-a12*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a16*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a17*(-a25*cos(a13) - a6) + a23*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a3*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) - (-0.55*a25*sin(a13)*sin(a18) - 0.55*a26*cos(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))) - (a25*sin(a13)*cos(a18) - a26*sin(a18))*(a0*(-a25*cos(a13) - a6) + a12*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a17*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) - a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a9*(a25*sin(a13)*sin(a18) + a26*cos(a18))) - (a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))))*cos(a18), -a0*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) - a12*(-0.045*a25*a6*cos(a13) - a6*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18)) + 0.55*a7*cos(a18) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*sin(a18) - 9.81*sin(a13)*cos(a18)) - a17*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - 0.045*a19*(-a24 + a25*a26*sin(a13) - a4*cos(a13)) + a19*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + 0.045*a20*(0.045*a24 - a6*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - 0.55*a7*sin(a18) + (-a25*a26*sin(a13) + a4*cos(a13))*(0.045*sin(a18)**2 + 0.045*cos(a18)**2) - 0.55*(-a25*a26*cos(a13) - a4*sin(a13))*cos(a18) + 9.81*sin(a13)*sin(a18)) + 0.045*a23*(-a6*(-a25*sin(a13)*sin(a18) - a26*cos(a18)) + a7*sin(a18) + (-a25*a26*cos(a13) - a4*sin(a13))*cos(a18)) - a9*(-a6*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a7*cos(a18) - (-a25*a26*cos(a13) - a4*sin(a13))*sin(a18)) - 0.045*(-a25*cos(a13) - a6)*(a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18))) + (-a25*sin(a13)*sin(a18) - a26*cos(a18))*(-a12*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a16*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a17*(-a25*cos(a13) - a6) + a23*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a3*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) + (0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18))*(-a19*(-a25*cos(a13) - a6) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) + 0.55*a25*sin(a13)*cos(a18) - 0.55*a26*sin(a18) + 0.045*a6) + a23*(-a25*sin(a13)*cos(a18) + a26*sin(a18))) + (-a25*sin(a13)*cos(a18) + a26*sin(a18))*(a16*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18)) + a2*(a25*sin(a13)*sin(a18) + a26*cos(a18)) - a23*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) + a9*(-a25*cos(a13) - a6)) - 0.045*(a25*sin(a13)*cos(a18) - a26*sin(a18))*(-a12*(-a25*sin(a13)*cos(a18) + a26*sin(a18)) + a19*(a25*sin(a13)*sin(a18) + a26*cos(a18)) + a20*(a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*sin(a13)*sin(a18) + a26*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a18))) + (a12*(-a25*cos(a13) - a6) + a20*(0.55*a25*sin(a13)*sin(a18) + 0.55*a26*cos(a18)) - a23*(a25*sin(a13)*sin(a18) + a26*cos(a18)))*(-a25*(0.045*sin(a18)**2 + 0.045*cos(a18)**2)*cos(a13) - 0.55*a25*sin(a13)*cos(a18) + 0.55*a26*sin(a18) - 0.045*a6)]''') small_exprs = sympy.sympify('[a*b + sin(a*b*c) + cos(a*b*c*d), 1/sin(a*b*c), -a*b*c*d]') #exprs = small_exprs exprs = large_exprs clear_cache() %time exprs_prevcse_opt = prev_cse(exprs) # external optimizations (cse_opts.py) are done by default %time exprs_prevcse_opt = prev_cse(exprs) clear_cache() %time exprs_prevcse_noopt = prev_cse(exprs, optimizations=[]) # force no external optimizations %time exprs_prevcse_noopt = prev_cse(exprs, optimizations=[]) clear_cache() %time exprs_newcse_opt = new_cse(exprs, optimizations='basic') # uses previous implementation default external optimizations %time exprs_newcse_opt = new_cse(exprs, optimizations='basic') clear_cache() %time exprs_newcse = new_cse(exprs) # no external optimizations are performed by default in new implementation %time exprs_newcse = new_cse(exprs) clear_cache() %time exprs_newcse_noorder = new_cse(exprs, order='none') # do not order Muls and Adds terms, %time exprs_newcse_noorder = new_cse(exprs, order='none') # machine dependent hash ordering is used instead cse_output_names = 'exprs_prevcse_opt', 'exprs_prevcse_noopt', 'exprs_newcse_opt', 'exprs_newcse', 'exprs_newcse_noorder' cse_outputs = [(name, eval(name)) for name in cse_output_names] print("%22s %s"%('original expressions', count(exprs))) for name, cse_output in cse_outputs: print("%22s %s"%(name, count(cse_output))) for name, cse_output in cse_outputs: print(">>> %22s :"%(name)) print(" > %s\n"%('Ok' if verify_cse(exprs, cse_output) else 'Fail'))