Last active
November 22, 2016 12:43
-
-
Save u0078867/a5400ab50c0a71cbbca32981cc965d3d to your computer and use it in GitHub Desktop.
Python converters from SymPy math expression to C code optimized for speed (SymPy CSE, GCC -Ofast)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sympy import Symbol cse, ccode | |
from sympy.utilities import numbered_symbols | |
# Inspired by http://stackoverflow.com/questions/22665990/optimize-code-generated-by-sympy | |
def sympyToC(symname, symfunc): | |
tmpsyms = numbered_symbols("tmp") | |
symbols, simple = cse(symfunc, symbols=tmpsyms) | |
symbolslist = map(lambda x:str(x), list(symfunc.atoms(Symbol)) ) | |
symbolslist.sort() | |
varstring=",".join( " double "+x for x in symbolslist )[1:] | |
c_code = "\n// Needed GCC 4.7+\n\n" | |
c_code += "#pragma GCC push_options\n" | |
c_code += "#pragma GCC optimize (\"Ofast\")\n\n" | |
c_code += "#include \"" + symname + ".h\"\n" | |
c_code += "#include <math.h>\n\n" | |
c_code += "double "+str(symname)+"("+varstring+") {\n" | |
for s in symbols: | |
c_code += " double " +ccode(s[0]) + " = " + ccode(s[1]) + ";\n" | |
c_code += " double r;\n" | |
c_code += " r = " + ccode(simple[0])+";\n" | |
c_code += " return r;\n" | |
c_code += "}\n\n" | |
c_code += "#pragma GCC pop_options\n" | |
return c_code | |
def sympyToH(symname, symfunc): | |
h_code = "\n" | |
h_code += "#ifndef PROJECT__" + symname.upper() + "__H\n" | |
h_code += "#define PROJECT__" + symname.upper() + "__H\n" | |
h_code += "#ifdef __cplusplus\n" | |
h_code += "extern \"C\" {\n" | |
h_code += "#endif\n" | |
symbolslist = map(lambda x:str(x), list(symfunc.atoms(Symbol)) ) | |
symbolslist.sort() | |
varstring=",".join( " double "+x for x in symbolslist )[1:] | |
h_code += "double "+str(symname)+"("+varstring+");\n" | |
h_code += "#ifdef __cplusplus\n" | |
h_code += "}\n" | |
h_code += "#endif\n" | |
h_code += "#endif\n" | |
return h_code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment