2011-11-10 14 views
2

私のプロジェクトでは、AddまたはMulオブジェクトを作成するときにevaluate=falseを使用する必要があります。この場合、これらのオブジェクトに対して等価チェックを適用すると問題に直面しています。問題は、議論の順序が原因です。Python-Sympy評価= Falseの場合の式の等価チェックに関する問題

以下の例を検討してください:結果はk2.argsとしてfalseある

k2=Mul(*[x,y,2],evaluate=False) 
k1=Mul(*[x,2,y],evaluate=False) 
print k1==k2 

(x,y,2)あるとk1.args(x,2,y)です。 したがって、タプルの等しいかどうかの比較チェックでは、falseが返されます。 希望の結果を得る方法はありますか?

私は(順序を逆にして、チェックなど)タプルに何らかの操作を置けば​​とk2が(ときk1.args = 2*x,yと= 2*y,xk2.argsのような)異なるMulオブジェクト

から形成されている場合にも、それはケースに失敗しました

ここでソートを使用することはできません。この場合、Add([x+y,z],evaluate=False)Add([x+z,y],evaluate=False)は2つの異なる表現になります。また、私がevalaute=Trueを使用している場合、この場合Add([x+y],x])Add([2*x+y])は同じで、私は欲しくないでしょう。

答えて

0

が見つかりました。表現の形成 での追加/ムルクラスで

コード

flatten_args = [] 
      for arg in args: 
       if (arg.__class__==cls): 
        flatten_args.extend(arg.args) 
       else: 
        flatten_args.append(arg) 

      obj = Expr.__new__(cls, *flatten_args) 

と平等のチェックの時に、私は1つの余分なチェック ソート引数リストを最初arg_list.sort()とよりを入れています下に使用してすべての引数をフラット化2つのリストを比較してください

1

Mulは、xとyの両方がスカラを表すことを知らない。行列の乗算は引数の順序に依存するので、あなたの例ではk1とk2は必ずしも等しいとは限りません。 あなたのプログラムでxとyが常にスカラー(または乗法が可換性で連想性のある他の型の値)であることがわかっている場合は、各項の定数を取り除き、定数を比較し、用語リスト。

+0

私はこの質問を投稿しました。はい、私の乗算は常に可換です。私の質問の編集されたセクション – gsagrawal

0

次はあなたを助けますか?

print simplify(k1 - k2) == 0 # True 
print k1 == k2 # Still False 
+0

を実際に参照してください。この場合 "x + 2y"と "x + y + y"は同じです.iはsympyに任意の操作を実行させたくありません。 1つの回避策が見つかりました。私は最初にそれをソートして比較するよりも、すべての議論を平らにしています。 – gsagrawal