2016-04-07 16 views
2

sympyの論理式から、同等のCコードを取得したいと思います。まず、andorのようなネイティブ論理演算子を使用することができないことに気付きました。十分に公正で、& and friendsがあります。私はSympy:論理式のCコード

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: The first argument must be a sympy expression.

任意のヒントを取得していますを試してみましたか?

+1

Sympyは 'and'と' or'を削除しません。これらの演算子はPythonでは "ハードコーディング"されており、型によってオーバーロードされることはありません。したがって、Pythonはそれらを実行しようとしますが、失敗するか、結果が得られません。 – BlackJack

+1

@Nico - 私は自分の答えを削除したいと思います。それを正しいと断ってください。 –

答えて

2

エラーメッセージは、ハードコードされたisinstanceチェックに基づいています。それが削除された場合、私はis_validが二重に設定されているので、これは、あなたが望むものおそらくまだでないことが

#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; 

} 

注意を取得し、あなたはおそらく、それがint(またはC99ブール値)になりたいです。

私の提案:式に直接ccodeを使用し、関数ラッパーを手動で記述します。よりスケーラブルなものが必要な場合は、pycodeexportを使用することもできます。

+0

私はあなたの答えがより正確であるため、削除を試みました(私はあなたに私の答えをさせません)。私はあなたがsympyのリード開発者だと思う。これに関する計画はありますか? –

+2

@RuHashaうん、sympyでのコード生成を改善する計画がある。 – asmeurer