プロトコル
このモジュールは、パッケージ全体で使用されるさまざまなプロトコルを提供します。
A は typing.Protocol 、クラスが明示的に継承することなく、構造的に実装できるインターフェースである。 たとえば、ある __len__ メソッドを実装するクラスは、そのクラス階層のどこかにその旨が明記されているかどうかにかかわらず Sized、その条件を満たします。
このモジュールに含まれるプロトコルも同様の考え方に基づいていますが、それぞれが、一見すると特に目立たない単一の「dunderスタイル」メソッド(例: _majorana_operator_)を中心に構成されています。 その1つのメソッドを実装するクラスは、それによって対応するプロトコル(SupportsMajoranaOperator この例では)を満たし、明示的な登録を行うことなく、そのプロトコルが要求されるあらゆる場面で使用可能になります。 なお、「プロトコル」という用語は、インターフェースそのものではなく、プロトコルを基盤として構築された型非依存のディスパッチ関数(例: fermion_operator())を指す場合にも、大まかな意味で用いられることがある点に注意してください。この区別は文脈から明らかであるはずです。
以下のプロトコルのいくつかは、型に依存しない小さなヘルパー 関数と組み合わされており、この関数は渡されたオブジェクトが何であれ、そのプロトコルのメソッドを呼び出します。
プロトコル | メソッド | ヘルパー関数 |
|---|---|---|
SupportsFermionOperator | _fermion_operator_(self) | fermion_operator() |
SupportsMajoranaOperator | _majorana_operator_(self) | majorana_operator() |
SupportsApplyUnitaryPlaced | _apply_unitary_placed_(self, vec, norb, nelec, copy, freg_indices) | – |
SupportsCommutators | _commutator_, _anti_commutator_, _double_commutator_ (すべて @staticmethod) | commutator(), anti_commutator(), double_commutator() |
コラム「 1 」 | コラム「 2 」 |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | . のパッケージ固有の拡張機能 ffsim.SupportsApplyUnitary。 |
SupportsCommutators(*args, **kwargs) | 効率的なコミューテータ生成への対応を示すプロトコル。 |
SupportsFermionOperator(*args, **kwargs) | このパッケージの演算子変換契約は、演算子を. に変換するものです FermionOperator。 |
SupportsMajoranaOperator(*args, **kwargs) | マジョラナ演算子を対象とした、当該プロトコル SupportsFermionOperator に相当するもの。 |
ffsim から実装されたプロトコル
シミュレーションについてはffsimが扱っており、そのプロトコルについては、ここでは改めて説明せず、ffsimで定義されています。 このパッケージのゲートおよびオペレータは以下を実装しているため、ffsimのディスパッチャはそれらを直接受け入れます:
ffsimプロトコル | メソッド | 実装元 |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit そしてすべての FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator このメソッド名は本パッケージのメソッド _fermion_operator_ 名と同じですが SupportsFermionOperator、両者は異なる契約です。本パッケージのメソッドは、ffsim の無関係な型ではなく FermionOperator 、本パッケージの型を返します。 このメソッドはメソッド名のみで処理 ffsim.fermion_operator() を行うため、このパッケージのオブジェクトに対して呼び出すと、当パッケージの型が返されます。