【问题标题】:Sympy: C code from logical expressionSympy:来自逻辑表达式的 C 代码
【发布时间】:2016-07-28 05:56:59
【问题描述】:

从一个 sympy 逻辑表达式,我想得到等效的 C 代码。首先,我注意到您不能使用像 andor 这样的本机逻辑运算符,因为 sympy 会以某种方式将它们剥离。很公平,有& and friends。我试过了

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 表达式。

有什么提示吗?

【问题讨论】:

  • Sympy 不会删除 andor。这些运算符在 Python 中是“硬编码”的,不能被类型重载,因此 Python 会尝试执行它们,但会失败或不会产生您想要的结果。
  • @Nico - 我想删除我的答案。你能把它取消标记为正确吗?

标签: python code-generation sympy


【解决方案1】:

错误消息基于硬编码的 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 被设置为双精度,并且您可能希望它是 int(或 C99 bool)。

我的建议:直接在你的表达式上使用ccode,并手动编写函数包装器。如果您需要更具可扩展性的东西,您也可以使用pycodeexport

【讨论】:

  • 我已经尝试删除(所以不会让我 -_-)我的答案,因为你的答案更正确:)。我看到你是 sympy 的主要开发者。有这方面的计划吗?
  • @RuHasha 是的,有计划改进 sympy 中的代码生成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多