QDriftTrotterization
class QDriftTrotterization(num_terms, *, filter_trivial=False, rng=None)
基底: GenericPass[DAGCircuit, DAGCircuit]
qDRIFT プロトコルを介してゲートを Evolution 「トロッター化」するためのトランスパイレーションパス。
このパスは、各ゲ Evolution ートの厳密な遷移式 を、ランダム化された積の式に置き換えます。具体的には、ハミルトニアンの項(または groups、指定されている場合は )からサンプル num_terms を抽出し、各項は係数の大きさに比例する確率でサンプリングされ、サンプルごとに1つの Evolution ゲートを出力します。 サンプリングされた各ゲートは、同じ時間だけその(振幅が1で、符号が保存される)項を変化させる
ここで、 は、サンプリングされた項/グループの係数である。 サンプリングされた進化の順序積は、 を正確に再現するわけではない。むしろ、サンプリングに対するその期待値が正確な進化を近似しており、その誤差は が増加 num_terms するにつれて減少する。 出力はランダムな抽出結果に依存するため、固定値が指定 rng されない限り、実行ごとに異なる結果となります。
qDRIFT プロトコルは、 arXiv:1811.08017 で導入されました。
このトランスパイラー・パスの初期化は、以下に挙げる引数を使用して行うことができます。
パラメーター
- num_terms (int) – qDRIFT のトロッター化において、サンプリングする項の数。 これは、入力ゲート1つあたりに放出されるゲ
Evolutionートの数に相当します。この値を大きくすると、回路の深さが増すという代償を払う代わりに、トロッター化誤差を低減できます。 - filter_trivial (bool) – に設定すると
True、サンプリングループは、占有されていることがわかっているモードと、未占有であることがわかっているモードを結びつけない限り、サンプリングされた項を拒否します。 これら2つの集合のうちの1つでのみ作用する項は、占有状態を変更することはできないため、サンプリングされたビット列には何の影響も与えません。したがって、再抽出を行うことで、その項にスロnum_termsットの1つを無駄に割り当てることを回避できます。 これには、トロッター化される ゲEvolutionートの前に またはInitializeModesPrepareSlaterDeterminantゲートが存在する必要があります(初期の占有モード集合および非占有モード集合の初期値を設定するため)。もしそのようなゲートが見つからない場合、あるいはそのゲートによって設定されるモード集合がすべて占有状態、またはすべて非占有状態である場合は、そのゲートに対するフィルタリングはスキップされ、代わりに が出力UserWarningされます。 これらのゲEvolutionートの前やその間に存在する任意のOrbitalRotationゲートも、これらの集合を更新します。つまり、そのゲートが作用するすべてのモードは、「不確定」となります(回転によって、そのゲートが接触する他の任意のモードと混ざり合う可能性があるため)。これは、 qDRIFT 項が受け入れられた場合に接触するモードと同じです。 ゲートPrepareSlaterDeterminantは、これらの集合を、その およびInitializeModesコンポーネントOrbitalRotationが順次適用された場合と同じ方法で更新します。つまり、まず から占有/非占有の集合の初期値を設定しoccupation、その後、回転の影響により、作用するすべてのモードを直ちに「不確定」としてマークします。 正確な受け入れルールについては、docstringrun()を参照してください。 - rng (np.random.Generator | int | None) – 使用する乱数生成器(RNG)。 これが の場合
int、内部の乱数生成器は で初期化されますnp.random.default_rng(seed=rng)。
属性
MAX_SAMPLE_RETRIES
デフォルト値: 1000000
が処理を run() 断念して を発生させる filter_trivial 前に許容できる、連続して拒否されたサンプルの最大数 RuntimeError。 これは、ハミルトニアンの残りの項が、追跡対象の占有モード集合と非占有モード集合を橋渡しできない場合――例えば、両方の集合が小さくかつ互いに交わらない状態(占有または非占有とマークされたモードが少なく、まだ「不確定」となったモードがない)であり、かつ残りの項の支持集合が両方に接していない場合――に、無限ループが発生するのを防ぐものである。
num_terms
qDRIFT のトロッター化に含める項の数。
filter_trivial
サンプリングされたビット列に影響を与えないサンプリングされた項を拒否するかどうか(引数 filter_trivial についてはクラスのドキュメント文字列を参照)。
方法
run
run(dag)
このトランスパイル処理を実行します。
各ノード Evolution は、サンプリング num_terms された単項ゲート Evolution に置き換えられます(クラスのドキュメント文字列を参照)。 ゲート Evolution ではないノードは、変更されることなく出力にコピーされます。 サンプリングはランダムに行われるため、シードが指定 rng されていない限り、実行ごとに結果は異なります。
が filter_trivial 設定されると、このメソッドは、回路内の ゲート Evolution に先行する任意の ゲート InitializeModes (スピンセクターごとに1つずつなど、並列に配置されたいくつかのゲート)を初期値として、占有されているか未占有であることが判明しているモードの集合を追跡します。 サンプリングされた用語は、そのサポートが両方の集合と交差する場合、すなわち、既知の占有モードと既知の非占有モードを結びつける場合にのみ受け入れられます。そうでない場合は、サンプリングされたビット列に影響を与えることができないため、その用語は破棄され、再サンプリングされます。 用語が承認されると、その用語がサポートするすべてのモードは「不確定」となり、 両方のセットに追加されるため、その後のサンプルにおいてどちらの役割でも使用可能となる。 回路内に見つかるどの OrbitalRotation ゲートも、同じ方法でこれらの集合を更新します。つまり、そのゲートが作用するすべてのモードも「不確定」となります。なぜなら、回転によって、そのモードがその支持集合内の他のどのモードとも混ざり合う可能性があるからです。 ゲート PrepareSlaterDeterminant は、その および InitializeModes の成分 OrbitalRotation が背中合わせに適用されたものとして扱われる。すなわち、まず occupation が占有/非占有の集合を初期化し、その後、そのゲートが作用するすべてのモードは、回転も伴うため、直ちに「不確定」とマークされる。
パラメーター
dag (DAGCircuit) – フェルミオンベースの命令を用いた入力回路。 インスタンス FermionicGate が である DAGOpNode 場合にのみ、これ op らがサポートされます。
戻り値
依然としてフェルミオンレジスタに作用している出力回路。
昇給
RuntimeError – が であり filter_trivial 、 True かつ、出力すべき非自明な項が見つからないまま、連続 MAX_SAMPLE_RETRIES する 個のサンプルが却下された場合。
戻りの型
継承されるメソッド
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) – 現在のタスクの完了状況。
戻り値
パスマネージャーの状態を更新しました。
戻りの型