qiskit.circuit.library.n_local
qiskit.circuit.library.n_local(num_qubits, rotation_blocks, entanglement_blocks, entanglement='full', reps=3, insert_barriers=False, parameter_prefix='θ', overwrite_block_parameters=True, skip_final_rotation_layer=False, skip_unentangled_qubits=False, name='nlocal')
n-局所変分回路を構成する。
nローカル回路の構造は、回転層とエンタングルメント層が交互に配置されている。 どちらのレイヤーでも、パラメータ化された回路ブロックが、定義された方法で回路に作用する。 回転レイヤーでは、ブロックは互いに重ねられて適用され、エンタングルメントレイヤーでは、 entanglement 戦略に従って適用される。 回路ブロックは任意のサイズ(回路内の量子ビット数に等しい小さいサイズ)を持つことができる。 各レイヤーは reps 回繰り返され、デフォルトでは最後の回転レイヤーが追加される。
例えば、2量子ビットの回転ブロックと、 "linear" エンタングルメントを使った4量子ビットのエンタングルメント・ブロックは、次のような回路になる。
┌──────┐ ░ ┌──────┐ ░ ┌──────┐
┤0 ├─░─┤0 ├──────────────── ... ─░─┤0 ├
│ Rot │ ░ │ │┌──────┐ ░ │ Rot │
┤1 ├─░─┤1 ├┤0 ├──────── ... ─░─┤1 ├
├──────┤ ░ │ Ent ││ │┌──────┐ ░ ├──────┤
┤0 ├─░─┤2 ├┤1 ├┤0 ├ ... ─░─┤0 ├
│ Rot │ ░ │ ││ Ent ││ │ ░ │ Rot │
┤1 ├─░─┤3 ├┤2 ├┤1 ├ ... ─░─┤1 ├
├──────┤ ░ └──────┘│ ││ Ent │ ░ ├──────┤
┤0 ├─░─────────┤3 ├┤2 ├ ... ─░─┤0 ├
│ Rot │ ░ └──────┘│ │ ░ │ Rot │
┤1 ├─░─────────────────┤3 ├ ... ─░─┤1 ├
└──────┘ ░ └──────┘ ░ └──────┘
| |
+---------------------------------+
repeated reps times絡み合い:
エンタングルメントは、エンタングルメント層のゲートの接続を記述する。 例えば2量子ビットゲートの場合、エンタングルメントには、ゲートが作用すべき量子ビットのペアが含まれる(例えば [[ctrl0, target0], [ctrl1, target1], ...] )。 デフォルトのエンタングルメント・ストラテジーのセットが用意されており、名前で選択することができる:
-
"full"エンタングルメントとは、各量子ビットが他のすべての量子ビットとエンタングルメント状態にある状態を指します。 -
"linear"量子もつれは量子ビット と量子ビット のもつれであるfor all , は量子ビットの総数である。
-
"reverse_linear"量子もつれは量子ビット と量子ビット のもつれであるfor all , は量子ビットの総数である。
entanglement_blocks=="cx"の場合、このオプションは、"full"と同じユニタリーを、より少ないエンタングルゲートで提供することに注意。 -
"pairwise"エンタングルメントは、量子ビット が量子ビットとエンタングルする一つの層であるのすべての偶数値に対して、そして次に、 のすべての奇数値に対して、 の量子ビットと量子ビットがエンタングルされる第二層。
-
"circular"エンタングルメントは線形エンタングルメントであるが、それに加えて線形部分の前の最初と最後の量子ビット。
-
"sca"(シフト円形交互)もつれは一般化され修正されたバージョンであるの回路14を提案した。 これは、最初の量子ビットと最後の量子ビットを結ぶ "長い "エンタングルメントがブロックごとに1つずつシフトする円形のエンタングルメントで構成されている。 さらに、コントロール量子ビットとターゲット量子ビットの役割はブロックごとに入れ替わる(つまり交互に入れ替わる)。
エンタングルメントレイヤーが複数のブロックを含む場合、エンタングルメントは各ブロックのエンタングルメントのリストとして与えられるべきである。 例:
entanglement_blocks = ["rxx", "ryy"]
entanglement = ["full", "linear"] # full for rxx and linear for ryyまたは:
structure_rxx = [[0, 1], [2, 3]]
structure_ryy = [[0, 2]]
entanglement = [structure_rxx, structure_ryy]最後に、エンタングルメントは回路の繰り返しごとに変化する。 このために、レイヤーのインデックスを入力とし、そのレイヤーのエンタングルメントを上記のフォーマットで返すcallableを渡すことをサポートする。 具体的な例については、以下の例を参照のこと。
例:
回転ゲートとエンタングルメントゲートは、レイヤーごとに1つのブロックで構成されていれば、単一のストリングで指定することができる:
from qiskit.circuit.library import n_local
circuit = n_local(3, "ry", "cx", "linear", reps=2, insert_barriers=True)
circuit.draw("mpl")
リストを渡すことで、レイヤーごとに複数のゲートを設定できる。 ここでは例えば、回転レイヤーでパウリ-Y回転とパウリ-Z回転を使っている:
circuit = n_local(3, ["ry", "rz"], "cz", "full", reps=1, insert_barriers=True)
circuit.draw("mpl")
回転レイヤーやエンタングルメント・レイヤーを省略するには、ブロックに空のリストを設定する:
circuit = n_local(4, [], "cry", reps=2)
circuit.draw("mpl")
エンタングルメントは、 entanglement 引数で明示的に設定できる:
entangler_map = [[0, 1], [2, 0]]
circuit = n_local(3, "x", "crx", entangler_map, reps=2)
circuit.draw("mpl")
各レイヤーごとに異なるエンタングルメントを設定するには、現在のレイヤーインデックスを受け取り、エンタングルメント構造体を返すコールバック関数を指定します。 たとえば、以下では奇数層と偶数層で異なるエンタングルメントを使用しています:
def entanglement(layer_index):
if layer_index % 2 == 0:
return [[0, 1], [0, 2]]
return [[1, 2]]
circuit = n_local(3, "x", "cx", entanglement, reps=3, insert_barriers=True)
circuit.draw("mpl")
パラメーター
- num_qubits (int) – 回路の量子ビット数。
- rotation_blocks (str |Gate |Iterable[str |Gate]) – 回転レイヤーで使用されるブロック。 複数渡された場合、これらは(新しいサブレイヤーのように)次々に適用されます。
- entanglement_blocks (str |Gate |Iterable[str |Gate]) – エンタングルメント層で使用されるブロック。 複数渡された場合、これらは順番に適用されます。
- entanglement (str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]] | Callable[[int], str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]]]) – 入力ブロックが作用する量子ビットを指定するインデックス。 これは、エンタングルメント戦略を記述する文字列(追加情報参照)または量子ビット接続のリストによって指定されます。 エンタングルメントブロックのリストを渡した場合、エンタングルメントのリストを渡すことで各ブロックごとに異なるエンタングルメントを指定できます。 各反復ごとに異なるエンタングルメントを指定するには、入力としてレイヤーを受け取り、そのレイヤーに対するエンタングルメントを返す呼び出し可能オブジェクトを渡します。 デフォルトは
"full"、全対全のエンタングルメント構造を意味する。 - reps (int) – 回転ブロックともつれブロックを繰り返す頻度を指定する。
- insert_barriers (bool) –
Trueの場合、各層の間にバリアが挿入される。Falseの場合、バリアは挿入されない。 - parameter_prefix (str) – デフォルトのパラメータが生成される場合に使用する接頭辞。
- overwrite_block_parameters (bool) – 追加したブロックのパラメータを上書きする場合。
Falseの場合、ブロック内のパラメータは変更されない。 - skip_final_rotation_layer (bool) – 回路に最終回転層を追加するかどうか。
- skip_unentangled_qubits (bool) –
Trueの場合、回転ゲートはエンタングルされた量子ビットにのみ作用する。Falseの場合、回転ゲートはすべての量子ビットに作用する。 - name (str | None) – 回路の名前。
戻り値
nローカル回路。
戻りの型