Sympy:从逻辑表达式生成C代码

3

我希望能从sympy的逻辑表达式中得到相应的C代码。首先,我注意到你不能使用原生的逻辑运算符,如andor,因为sympy会将其过滤掉。没关系,现在可以使用&和相关函数了。我尝试了

from sympy import *
from sympy.utilities.codegen import codegen

x = Symbol('x')
is_valid = Symbol('is_valid')

# f = x > 0 and is_valid  # TypeError: cannot determine truth value of
f = (x > 0) & is_valid  # And(is_valid, x > 0)

# TypeError: The first argument must be a sympy expression.
[(c_name, c_code), (h_name, c_header)] = codegen(("f", f), "C")

但是出现了某些问题,我得到了以下错误信息:

TypeError: 第一个参数必须是 sympy 表达式。

有什么提示吗?

1
Sympy不会去掉andor。这些运算符在Python中是“硬编码”的,无法被类型重载,因此Python尝试执行它们,但会失败或产生您不想要的结果。 - BlackJack
1
@Nico - 我想要删除我的回答。你能请取消标记它正确的状态吗? - Ru Hasha
1个回答

2
错误信息基于硬编码的 isinstance 检查。如果将其删除,我会得到
#include "f.h"
#include <math.h>

double f(double is_valid, double x) {

   double f_result;
   f_result = is_valid && x > 0;
   return f_result;

}

请注意,这可能仍然不是您想要的,因为is_valid被设置为double类型,而您可能希望它是int类型(或C99 bool类型)。
我的建议是:直接在表达式上使用ccode,并手动编写函数包装器。如果需要更可扩展的解决方案,您也可以使用pycodeexport

我已经尝试删除我的回答(SO不让我-_-),因为你的回答更正确 :)。我看到你是sympy的首席开发人员。对此有什么计划吗? - Ru Hasha
2
@RuHasha 是的,sympy 有改进代码生成的计划。 - asmeurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接