Python “sympy.codegen.ast”能否与“sympy.utilities.autowrap”一起使用?

Python “sympy.codegen.ast”能否与“sympy.utilities.autowrap”一起使用?,python,sympy,Python,Sympy,我正在使用该模块的sympy.code.autowrap,特别是make_例程,autowrap,以及ufuncify函数来生成编译函数。我希望能够使用sympy.codegen.ast生成要包装的代码。例如: import sympy as sy from sympy.codegen.ast import (Assignment, CodeBlock, Return, Element, Pointer, Declaration,

我正在使用该模块的
sympy.code.autowrap
,特别是
make_例程
autowrap
,以及
ufuncify
函数来生成编译函数。我希望能够使用
sympy.codegen.ast
生成要包装的代码。例如:

import sympy as sy
from sympy.codegen.ast import (Assignment, CodeBlock, Return, Element, 
                               Pointer, Declaration, float64,
                               FunctionPrototype, FunctionDefinition)
zlist = sy.symarray('z', (5,), real=True)
d1expz = sy.apply_finite_diff(1, x_list=range(-2,3), y_list=zlist)
d2expz = sy.apply_finite_diff(2, x_list=range(-2,3), y_list=zlist)
d1p = Pointer('d1p', float64)
d2p = Pointer('d2p', float64)
d1p0 = Element('d1p', '0')
d2p0 = Element('d2p', '0')
d12fpa = FunctionPrototype(float64, 'd12funca', [d1p, d2p] + list(zlist))
body12a = [
    CodeBlock(
        Assignment(d1p0, d1expz),
        Assignment(d2p0, d2expz),
    ).cse(),
]
d12funca = FunctionDefinition.from_FunctionPrototype(
    d12fpa, body12a
)
print(sy.ccode(d12funca))
这将生成以下C代码,看起来不错:

double d12funca(double * d1p, double * d2p, double z_0, double z_1, double z_2, double z_3, double z_4){
   x0 = (1.0/12.0)*z_0;
   x1 = -1.0/12.0*z_4;
   d1p[0] = x0 + x1 - 2.0/3.0*z_1 + (2.0/3.0)*z_3;
   d2p[0] = -x0 + x1 + (4.0/3.0)*z_1 - 5.0/2.0*z_2 + (4.0/3.0)*z_3;
}
sympy.utilities.codegen.codegen
也理解这一点,例如,以下内容产生的结果正是您期望的结果

[(c_name, c_code), (h_name, c_header)] = codegen(
    ('d12func',
    [
        sy.Eq(sy.Symbol('d1'), d1expz),
        sy.Eq(sy.Symbol('d2'), d2expz)
    ]),
    language='c'
)
我还可以生成一个包装得很好的函数,它的功能基本上与以下相同:

from sympy.utilities.autowrap import autowrap
autowrap_dir = <some path>
derivs = sy.Matrix(
    [[
        d1expz,
        d2expz
    ]]
)
dvraw = autowrap(
    expr=derivs,
    args=list(zlist),
    backend='Cython',
    tempdir=autowrap_dir,
    verbose=True
)
从sympy.utilities.autowrap导入autowrap
自动换行目录=
derivs=sy.矩阵(
[[
d1expz,
d2expz
]]
)
dvraw=自动换行(
expr=derivs,
args=列表(zlist),
backend='Cython',
tempdir=autowrap_dir,
详细=正确
)
但是有没有办法使用
ast
模块来指定要用
autowrap
包装的函数?看来,
autowrap
make_例程
ufuncify
不能接受任意代码。它们采用的表达式可以是直接的
symphy
表达式列表,也可以是
symphy.Eq
表达式列表(在这种情况下,包装函数将每个等式的RHS分配给其LHS,并将每个LHS作为输出参数返回)

问题是我希望能够包装更多涉及的函数,包括循环和分支之类的东西。
ast
模块提供了编写此类函数的工具。但据我所知,
autowrap
ast
根本不玩


任何关于如何实现这一目标的想法都将不胜感激。谢谢。

Symphy.codegen模块旨在取代autowrap,尽管它仍在进行中。这项工作可能需要Symphy的一些上游改进。