2

私のプロジェクトでは、またはオブジェクトevaluate=falseを作成するときに使用する必要があります。この場合、これらのオブジェクトに等価チェックを適用すると問題に直面します。問題は、引数の順序によるものです。AddMul

以下の例を検討してください。

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

結果はfalseas k2.argsare(x,y,2)k1.argsare(x,2,y)です。そのため、比較でタプルの等価性がチェックされている間、 が返されますfalse。必要な結果を得る方法はありますか?

また、タプルに何らかの操作を加えると (順序を逆にしてからチェックするなど)、 と が異なるオブジェクトから形成されている場合 ( =と=の場合k1など)に失敗します。k2Mulk1.args2*x,yk2.args2*y,x

Add([x+y,z],evaluate=False)この場合のように、ここでは並べ替えを使用できず、Add([x+z,y],evaluate=False)2 つの異なる式になります。またevalaute=True、この場合はAdd([x+y],x])andAdd([2*x+y])を使用すると同じになりますが、これは望ましくありません。

4

3 に答える 3

1

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

于 2011-11-10T18:20:58.963 に答える
0

以下は役に立ちますか?

print simplify(k1 - k2) == 0 # True
print k1 == k2 # Still False
于 2011-11-11T15:45:31.937 に答える
0

回避策が1つ見つかりました。

式形成時の Add/Mul クラスでは、以下のコードを使用してすべての引数を平坦化します

   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) 

等値チェックの時点で、最初に args リストを並べ替えてからarg_list.sort()2 つのリストを比較する追加のチェックを 1 つ入れています。

于 2011-11-12T11:42:20.600 に答える