order_terms
order_terms(op, key, *, reverse=False)
ユーザーが指定したキーに基づいて項の順序を並べ替えた演算子のコピーを返します。
係数に依存しない単一の固定順序を課す とは異なり canonical_order()、この関数を使用すると、任意の基準に従って項を並べ替えることができます。つまり、各項に対して 関 key 数が とまったく同じ sorted() ように適用され、その結果得られた順序で、項が同じ型の新しい演算子として再構築されます。 これは、後続の計算において項の順序が重要となる場合(例えば、ランダム化積形式サンプリングなど)に有用です。なぜなら、演算子がたまたまどのように組み合わされたかとは無関係に、決定的で再現性のある順序が得られるからです。
式そのものは変更されません。これは単に項の順序を入れ替えるだけであり、式を簡略化したり、演算子の順序を標準的な順序に整えたりするものではありません。 これは、この OperatorTrait プロトコルを実装する組み込み演算子タイプであればどれでも機能します。返される演算子は、入力と同じ型になります。
は、各項を、演算子の が iter_terms() 返すのと同じタプルとして受け取ります key 。あるいは、演算子がグループを追跡する場合(を参照 groups)、 から返されるより長いタプルを受け取ります iter_terms_with_groups()。このタプルの末尾の要素は、その項のグループインデックスです。 この項自体の正確な構成は、演算子の種類によって異なります。 グループインデックスは保持されます。つまり、各項は移動する際にそのグループインデックスを保持したままになります。また、入力にグループが含まれていない場合、結果にもグループは含まれません。
>>> from qiskit_fermions.operators import FermionOperator
>>> from qiskit_fermions.operators.terms.ordering import order_terms
>>> op = FermionOperator.from_dict(
... {
... ((True, 1), (False, 0)): 1.0, # a†_1 a_0, |coeff| = 1
... ((True, 0), (False, 1)): 3.0, # a†_0 a_1, |coeff| = 3
... }
... )
>>> ordered = order_terms(op, key=lambda term: abs(term[1]), reverse=True)
>>> list(ordered.iter_terms())
[([(True, 0), (False, 1)], (3+0j)), ([(True, 1), (False, 0)], (1+0j))]
パラメーター
- op (OperatorTrait) – 順序を変更する項を持つ演算子。
- key (Callable[[tuple], Any]) – 単一の項からなる関数であり、まさに の引数
keyとして用いられるsorted()。 各項を、上記の注記に記載されているタプルとして受け取ります。 - reverse (bool) – の場合
True、項は の降順で並べ替えられますkey。
戻り値
要求された順序で項が並んだ、同じ種類の新しい演算子。
戻りの型