在sympy中将分配与autowrap一起使用

时间:2018-10-04 04:13:12

标签: python sympy

我正在编写一些代码,这些代码使用sympy构造一个复杂的数学表达式,然后使用autowrap函数对其进行编译并对其进行反复评估。

不幸的是,在某些情况下,我的表情越来越大。为了防止这种情况,我想生成包含赋值语句的表达式。就是说,我想以(伪代码)

结尾
x1 = f(a,a);
x2 = f(x1,x1);
x3 = f(x2,x2);
x4 = f(x3,x3);

代替

f(f(f(a,a),f(a,a)),f(f(a,a),f(a,a))),f(f(a,a),f(a,a)),f(f(a,a),f(a,a))))

其中每个子表达式已被替换两次。

似乎有一种机制,形式为sympy.codegen.ast.CodeBlock。但是,如果确实可以,我似乎还无法弄清楚如何使其与autowrap一起使用。

如果我尝试这样做

>>> f = autowrap(ast.CodeBlock(ast.Assignment(y,sym.sin(x))),backend='cython')

然后我得到一个长堆栈跟踪,以

结尾
wrapped_code_12.c:5:22: error: use of undeclared identifier 'y'
   autofunc_result = y = sin(x);
                     ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

对我来说,直接在autowrap内部使用CodeBlock并不是正确的方法。 (我在使用Fortran后端时遇到类似的错误。)

问题是,有正确的方法吗?是否可以在CodeBlock中使用autowrap,还是可以通过其他方式使用autowrap生成中间变量,而不是始终使我的sympy表达式完全展开?

0 个答案:

没有答案