RelabelModes
class RelabelModes(permutation=None, *, solver=None, **kwargs)
基底: GenericPass[DAGCircuit, DAGCircuit]
フェルミオンモードのラベルを再割り当てするためのトランスパイレーションパス。
このパスは、回路のフェルミオンモードの順序を入れ替えます。 この並べ替えはリスト permutation によって記述され、これは元のモードから新しいモードのインデックスへの対応関係として解釈される。つまり、元のモードは、ラベルが付け直された回路 permutation[i] 内の新しいインデックスの位置に配置 i される。 たとえば、元のモードを新しいインデックス 1 に配置 permutation = [0, 2, 4, 1, 3, 5] し 2、元のモードを新しいインデックス 2 に配置し 4、というように続けます。 順列であるため、各添字はちょうど1回ずつ現れなければなりません。
後処理
この再ラベル付けにより、フェルミオンモードの順序が入れ替わり、その結果、後の合成段階において選択されるフェルミオンから量子ビットへのマッピング(ひいては実現可能な回路の深さ)に影響を及ぼす。 モードの順序が変更されるため、最終回路からサンプリングされたビット列は新しいモード順序で表現されることになり、これを解釈するには、 元の順序にマッピングし直す必要があります。 実際に適用された再ラベル付けは、返された FermionicDAGCircuitの フィールド permutation に記録されます metadata。
. ではなく、必ず回路のメタデータから再ラベル付けの内容を確認してください permutation。 自動最適化を使用する場合(すなわち、 permutation ( None)の場合、適用された順列はメタデータからのみ取得可能であり、たとえ が明示的に指定 permutation された場合でも、メタデータにはそのパスでの処理内容が確実に反映される。
なお、この permutation メタデータフィールドは、パスが実際に回路のラベルを再割り当てした場合にのみ存在することに注意してください。 パスが効果を持たない場合(たとえば、オプションの依存 pyomo 関係や が欠落 solver しているため自動最適化が実行できない場合など)、返される回路は変更されず、メタデータ permutation も含まれないため、慎重にアクセスしてください(例: qcirc.metadata.get("permutation"))。
概念的には、再ラベル付けを元に戻すことは、各元のモードに対して、新しいモードで測定された m 値を割り当てることとなります permutation[m]。 実際には、モード FermionicRegister とQiskitの古典ビットが逆の順序(リトルエンディアン)で実行されるため、この処理は複雑になります。そのため、モード空間でのギャザー処理は、カウントビット列に対してインデックスの符号反転(~idx)を行った後、最終的に逆順変換([::-1])を行うという手順になります。
以下の例では、6モードのシステムについて、ブロック化されたスピン秩序([u0, u1, u2, d0, d1, d2])からインターリーブされたスピン秩序([u0, d0, u1, d1, u2, d2])へと再ラベル付けを行っています。これは実装の深さを減らすための一般的な手法であり、その後、サンプリングされたカウントに対してこの再ラベル付けを元に戻しています:
>>> from qiskit.passmanager import MultiStagePassManager
>>> from qiskit.providers.basic_provider import BasicSimulator
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import InitializeModes
>>> from qiskit_fermions.transpiler import FermionicCircuitToDAG, QuantumDAGToCircuit
>>> from qiskit_fermions.transpiler.passes import (
... F2QSynthesis, F2QSynthesisPluginManager, RelabelModes, TrivialF2QLayout,
... )
>>>
>>> # blocked occupation: spin-up orbitals 0 and 1 and spin-down orbital 0 are occupied
>>> circ = FermionicCircuit(6)
>>> circ.append(InitializeModes([1, 1, 0, 1, 0, 0]), circ.modes)
>>>
>>> synth_plugins = F2QSynthesisPluginManager()
>>> synth = F2QSynthesis()
>>> synth.methods["InitializeModes"] = synth_plugins.method("InitializeModes", "TrivialOccupation")()
>>>
>>> # map blocked mode order onto the interleaved one
>>> relabel = RelabelModes(permutation=[0, 2, 4, 1, 3, 5])
>>>
>>> pm = MultiStagePassManager(
... init=FermionicCircuitToDAG(),
... optimization=relabel,
... layout=TrivialF2QLayout(),
... synthesis=synth,
... output=QuantumDAGToCircuit(),
... )
>>>
>>> qcirc = pm.run(circ)
>>> qcirc.measure_all()
>>>
>>> bit_permutation = qcirc.metadata.get("permutation")
>>> print(bit_permutation)
[0, 2, 4, 1, 3, 5]
>>>
>>> res = BasicSimulator().run(qcirc, shots=1).result()
>>> counts = res.get_counts()
>>> print(counts) # measured in the interleaved ordering
{'000111': 1}
>>>
>>> # undo the relabeling to recover the counts in the original blocked ordering
>>> post_processed = {
... "".join(bitstring[~idx] for idx in bit_permutation)[::-1]: count
... for bitstring, count in counts.items()
... }
>>> print(post_processed) # recovered in the original blocked ordering
{'001011': 1}
このトランスパイラー・パスの初期化は、以下に挙げる引数を使用して行うことができます。
パラメーター
- permutation (list[int] | None) – フェルミオンモードのインデックスに新しいラベルを割り当てるために使用されるインデックスの順列。 これがの場合
None、に基づいて順列が自動的に決定されますbuild_excitation_span_minimization_model()。 詳細permutationについては、こちらもご参照ください。 - solver (pyomo.opt.SolverFactory | None) – この
build_excitation_span_minimization_model()問題を解くために使用された最適化問題ソルバーのインスタンス。 これがの場合None、自動的に を決定することはできませんpermutation。 詳細solverについては、こちらもご参照ください。 - kwargs – 追加のキーワード引数はすべて に渡されます
build_excitation_span_minimization_model()。
属性
permutation
フェルミオンモードの添字を再割り当てするために使用される添字の順列。
これは、元のモードインデックス i を新しいモードインデックス にマッピングするものか list[int]、あるいは( permutation[i] 詳細についてはクラスのドキュメント文字列を参照)。 その長さは、トランスパイルされる回路のフェルミオンモードの数と一致する必要があり、各添字は正確に1回だけ出現する必要があります。 したがって、このシナリオでは、トランスパイラ・パスをユーザーの回路に合わせて非常に具体的に調整する必要があります。
あるいは、その可能性もある None。その場合は、この関 build_excitation_span_minimization_model() 数を用いて、発生するすべてのフェルミオン励起のスパンを最小化しようとする最適化問題を定義する。 この場合、適用された順列は、トランスパイルされた回路のメタデータからのみ取得可能です(クラスのドキュメント文字列を参照)。
この最適化モデルの使用は、インスタンス FermionOperator を含む時間発展ゲートに対してのみ実装されています。
solver
を自動的に見つけるための最適化問題ソルバーのインスタンス permutation。
permutation が のとき None、によって定義される最適化問題を用いて build_excitation_span_minimization_model() 、モードインデックスの適切な順列を自動的に求める。 そのような場合、ユーザーはこのモデルを解くためのオプティマイザを用意する必要があります。
方法
find_permutation
find_permutation(dag)
ユーザーによって指定されていない permutation 場合、モードインデックスを検索します。
この関数は、ユーザーが を指定 permutation していない場合(つまり、 が である場合 None)にのみ呼び出されます。 その場合は、次のように動作します:
- オプションの依存関係であるpyomoがインストールされていることを確認してください。 そうでない場合、最適化は行われず、このトランスパイラーのパスは効果を発揮しません。
- a が指定
solverされていることを確認してください。 そうでない場合、最適化は行われず、このトランスパイラーのパスは効果を発揮しません。 - その
FermionOperatorインスタンスを含む任意のEvolutionゲートからのすべてのフェルミオン励起を集める。 - を使用して最適化問題を構築し
build_excitation_span_minimization_model()、このトランスパイラ・パスが構築された際に渡された追加のキーワード引数 (kwargs) を転送する。 - を用いて最適化問題を解き
solver、最終的な順列を抽出する。
パラメーター
dag (FermionicDAGCircuit) – トランスパイル対象の回路。
戻り値
使用する順列。 の場合 None、このトランスパイラ・パスは効果を発揮しません。
昇給
NotImplementedError – インスタンス FermionOperator ではない演算子が含まれるゲート Evolution に遭遇した場合。
戻りの型
タプル [ リスト [ int ] | None, pyomo.opt.results.results_.SolverResults | None]
run
run(dag)
このトランスパイル処理を実行します。
パラメーター
dag (DAGCircuit) – フェルミオンベースの命令を用いた入力回路。 インスタンス FermionicGate が である DAGOpNode 場合のみ、サポート op されています。
戻り値
依然としてフェルミオンレジスタに作用している出力回路。
昇給
NotImplementedError – 指定された入力回路に複数のレジスタが含まれている場合。
戻りの型
継承されるメソッド
execute
execute(passmanager_ir, state, callback=None)
入力された Qiskit IR に対して最適化タスクを実行します。
パラメーター
- passmanager_ir (IR) – 最適化対象のQiskit IR。
- state (PassManagerState) – パスマネージャー自身によるワークフローの実行に関連付けられた状態。
- callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – 最適化タスクの実行ごとに呼び出されるコールバック関数。
戻り値
Qiskit IRの最適化とワークフローの現状。
戻りの型
タプル [ IR_OUT, PassManagerState ]
name
update_status
update_status(state, run_state)
ワークフローのステータスを更新します。
パラメーター
- state (PassManagerState) – 更新対象のマネージャーの状態を渡します。
- run_state (RunState) – 現在のタスクの完了状況。
戻り値
パスマネージャーの状態を更新しました。
戻りの型