Skip to main content
IBM Quantum Platform

QkTranspileLayout

typedef struct QkTranspileLayout QkTranspileLayout

QkTranspileLayout 型は、トランスパイラによって導入される順列をモデル化するために使用される。 一般にQiskitのトランスパイラーは、初期レイアウトと出力順列までユニタリー保存である。 初期レイアウトは、仮想回路上の量子ビットからターゲット上の物理量子ビットへのマッピングであり、出力順列は、トランスパイラ・パイプラインで初期レイアウトが設定される前に、スワップ・ゲートの挿入または順列のエリジョンによって引き起こされる。 この型はこれらの詳細を追跡し、これらの順列を推論するためのインターフェイスを提供する。

例えば、このような回路があったとする:

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {0};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {0, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t cx_1_qargs[2] = {0, 2};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

レイアウトの段階で、トランスパイラがその回路の仮想量子ビットを物理回路にマッピングする:

0 -> 2, 1 -> 1, 2 -> 0

つまり、回路は次のようになる:

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {2};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t cx_1_qargs[2] = {2, 0};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

とすると、 qk_transpile_layout_initial_layout の結果は配列になる: [2, 1, 0]

レイアウト適用後に回路にスワップゲートを挿入する配線が必要な場合、出力順列が設定される。 例えば、スワップがこう挿入されたとする:

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {2};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t swap_qargs[2] = {1, 0};
qk_circuit_gate(qc, QkGate_Swap, swap_qargs, NULL);
uint32_t cx_1_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

この結果、qubit 0の出力状態はqubit 1に、qubit 1’s。 この結果、 qk_transpile_layout_output_permutation は配列: [1, 0, 2] を返し、これが最初のレイアウトマッピング後の各クビットの状態の最終位置であることを示す。 もしトランスパイル中にスワップや並べ替えの消去が行われなければ、トランスパイラによって量子ビットの出力状態が移動されることはないので、これは [0, 1, 2]

そして、この2つを組み合わせることで、入力回路における仮想量子ビットの最終的な位置を追跡するためのレイアウトが完成する。 つまり、上記の例(スワップあり)から、 qk_transpile_layout_final_layout 関数は、 [2, 0, 1] を返すことになります。これは、最初のレイアウトに続いて、どのような配線の並べ替えがあっても、入力回路内の量子ビット0の最終的な位置は物理量子ビット2になり、入力回路内の仮想量子ビット1は物理量子ビット0になり、入力回路内の仮想量子ビット2は物理量子ビット1になるからです。

トランスパイラーは、ターゲットが元の入力回路より多くの量子ビットを利用できる場合、回路にアンシラ量子ビットを割り当てる。 このため、入力回路と出力回路の量子ビット数をそれぞれ追跡する2つの関数 qk_transpile_layout_num_input_qubitsqk_transpile_layout_num_output_qubits が必要になる。 さらに、 qk_transpile_layout_initial_layoutqk_transpile_layout_final_layout 関数は、出力配列からアンシラをフィルターするための引数を取る。 trueに設定された場合、出力配列は、 QkTranspileLayout を生成したトランスパイラ呼び出しの元の入力回路の仮想量子ビットだけにフィルタリングされます。


関数

qk_transpile_layout_num_input_qubits

uint32_t qk_transpile_layout_num_input_qubits(const QkTranspileLayout *layout)

トランスパイラに入力回路の量子ビット数を返す。

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • layout - QkTranspileLayout へのポインタ.

戻り値

入力量子ビット数

qk_transpile_layout_num_output_qubits

uint32_t qk_transpile_layout_num_output_qubits(const QkTranspileLayout *layout)

トランスパイラからの出力回路の量子ビット数を返す。

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • layout - QkTranspileLayout へのポインタ.

戻り値

出力量子ビット数

qk_transpile_layout_initial_layout

bool qk_transpile_layout_initial_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *initial_layout)

QkTranspileLayout の初期レイアウトを問い合わせる。

この関数の出力配列は、元の入力回路の仮想量子ビットから出力回路の物理量子ビットへの対応関係を表しています。 配列のインデックスは仮想量子ビットを表し、その値は物理量子ビットを表します。 たとえば、次のような出力配列:

[1, 0, 2]

は、レイアウトが仮想量子ビット0→物理量子ビット1、仮想量子ビット1→物理量子ビット→0、仮想量子ビット2→物理量子ビット2をマッピングしていることを示す。

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。 initial_layout は、初期レイアウトに必要なサイズを格納するのに十分な大きさのアロケーションを持つ、有効な非NULLポインタでなければならない。 filter_ancillas がtrueの場合は入力量子ビット数(これは qk_transpile_layout_num_input_qubits() で確認できる)、 filter_ancillas がfalseの場合は出力量子ビット数となる(これは qk_transpile_layout_num_output_qubits() で照会できる)。

パラメーター

  • layout - QkTranspileLayout へのポインタ.
  • filter_ancillas – true に設定すると、出力配列にはトランスパイラによって追加されたアンシラのインデックスは一切含まれなくなります。
  • initial_layout - この関数が初期レイアウトを書き込む配列へのポインタ。 filter_ancillas 、それぞれtrueまたはfalseの場合、 qk_transpile_layout_num_input_qubits() または qk_transpile_layout_num_output_qubits()

戻り値

もしinitial_layoutが initial_layout に書き込まれていればtrue、初期レイアウトがなければfalse。

qk_transpile_layout_output_permutation

bool qk_transpile_layout_output_permutation(const QkTranspileLayout *layout, uint32_t *output_permutation)

の出力順列を問い合わせる。 QkTranspileLayout

この関数の出力配列は、トランスパイラによって誘起された並べ替えを表し、インデックスは回路の開始点における量子ビットを示し、値は回路の終了点における量子ビットの位置を示す。 例えば、出力配列は以下のようになる:

[1, 2, 0]

は回路開始時の量子ビット0が回路終了時の量子ビット1にあることを示し、1→2、2→0となる。

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。 output_permutation は、output_permutationに必要なサイズを格納するのに十分な大きさのアロケーションを持つ、有効な非NULLポインタでなければならない。 これは常に、 qk_transpile_layout_num_output_qubits() で照会できる QkTranspileLayout の出力量子ビットの数となる。

パラメーター

  • layout - QkTranspileLayout へのポインタ.
  • output_permutation - この関数が出力順列を書き込む配列へのポインタ. これは、レイアウト上の出力量子ビットの数となる出力用の十分なスペースがなければならない。 これは qk_transpile_layout_num_output_qubits で照会できる。

戻り値

output_permutation QkTranspileLayout に書き込まれた出力順列があれば真、 に書き込まれた出力順列がなければ偽。

qk_transpile_layout_final_layout

void qk_transpile_layout_final_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *final_layout)

の最終レイアウトを問い合わせる。 QkTranspileLayout

出力配列は、元の入力回路の仮想量子ビットから、その量子ビットの状態を持つトランスパイル回路の末端の物理量子ビットへのマッピングを表す。 配列のインデックスは仮想量子ビットを表し、値はその仮想量子ビットの状態を持つトランスパイルド回路の末端の物理量子ビットを表す。 例えば、出力配列は

[2, 0, 1]

は、元の回路における仮想量子ビット 0’s の状態が、トランスパイルされた回路の最後で物理量子ビット2上にあり、1→0、2→1であることを示す。

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。 final_layout は、最終的なレイアウトに必要なサイズを格納するのに十分な大きさのアロケーションを持つ、有効な非NULLポインタでなければならない。 filter_ancillas がtrueの場合は入力量子ビット数(これは qk_transpile_layout_num_input_qubits() で確認できる)、 filter_ancillas がfalseの場合は出力量子ビット数となる(これは qk_transpile_layout_num_output_qubits() で照会できる)。

パラメーター

  • layout - QkTranspileLayout へのポインタ.
  • filter_ancillas – true に設定すると、出力配列にはトランスパイラによって追加されたアンシラのインデックスは一切含まれなくなります。
  • final_layout - この関数が最終レイアウトを書き込む配列へのポインタ。 これは、filter_ancillasの値によって、入力量子ビット数か出力量子ビット数になる出力のための十分なスペースが必要である。

qk_transpile_layout_generate_from_mapping

QkTranspileLayout *qk_transpile_layout_generate_from_mapping(const QkDag *original_dag, const QkTarget *target, const uint32_t *qubit_mapping)

初期レイアウトマッピングから QkTranspileLayout を生成する

これにより、提供されたマッピングから初期レイアウトが設定された(出力順列なしの)が QkTranspileLayout 生成されます。 この関数の目的は、カスタムレイアウトパスを作成できるようにすることです。 qk_transpile_stage_routingこれにより、などの後続のステージ関数で使用できるも同時に QkTranspileLayout 生成されます。

安全

引数 および が target 、それぞれ QkTarget または QkDag への有効な original_dag アラインメント済み非ヌルポインタでない場合、動作は未定義となる。 qubit_mapping は、に示された量子ビット数分の十分なスペースを持つ uint32_t 、連続 targetした配列への有効なポインタでなければならない。

パラメーター

  • original_dag – カスタムレイアウトパスを実行する前の元のDAGへのポインタ。 このダグは、以下のクビット数以下でなければならない target
  • target – レイアウトが実行されたターゲットへのポインタ。 このターゲットには固定数の量子ビットが設定されている必要があります。
  • qubit_mapping – レイアウトマッピング配列へのポインタ。 この配列は、ターゲットの量子ビット数と同じ数の要素を持つ必要があり、各要素は一意の整数であり、すべてが0から の範囲に収まらなければなりません。 num_qubits ここで、 num_qubits は、提供された値で target示される量子ビット数です。 最初の要素は仮想量子ビットを表し、 original_dag その値は仮想量子ビットがマッピングされるターゲット内の物理量子ビットを表す。 例えば、配列は仮想量子ビット0を物理量子ビット1に、仮想量子ビット1を物理量子ビット0に、仮想量子ビット2を物理量子ビット2にそれぞれ [1, 0, 2] 対応させる。 元のDAGに含まれない要素は補助量子ビットとして扱われるが、それでも物理量子ビットにマッピングされなければならない。 この配列は出力にコピー QkTranspileLayout されるため、この関数を呼び出した後も解放する必要があります。

戻り値

初期レイアウトが設定された QkTranspileLayout オブジェクト

qk_transpile_layout_free

void qk_transpile_layout_free(QkTranspileLayout *layout)

QkTranspileLayout オブジェクトを解放する

安全

layoutQkTranspileLayout への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • layout - 解放するレイアウトへのポインタ

qk_transpile_layout_to_python

PyObject *qk_transpile_layout_to_python(const QkTranspileLayout *layout, const QkCircuit *circuit)

. QkTranspileLayoutから Python - TranspileLayout spaceオブジェクトを生成する

作成された Python 空間オブジェクトは、提供された QkTranspileLayout オブジェクトのコピーです。Cと Python ではデータ表現が異なり、他の *_to_python 関数のようにデータが Python に移動されることはありません。

安全

QkTranspileLayoutQkCircuit それぞれ有効な非ヌルポインタでない circuit 場合 layout 、動作は未定義である。 この関数を現在実行しているスレッドが Python のGILを保持していると仮定する。 この関数が返す Python オブジェクトを作成するために必要です。

パラメーター

  • レイアウト –. QkTranspileLayoutへのポインタ
  • 回路 – 元の QkCircuit回路へのポインタ

戻り値

Python 領域の TranspileLayout オブジェクトの PyObject ポインタ。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。