TwoLocal
class qiskit.circuit.library.TwoLocal(num_qubits=None, rotation_blocks=None, entanglement_blocks=None, entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='TwoLocal', flatten=None)
ベース: NLocal
2ローカル回路。
2ローカル回路は、回転層とエンタングルメント層が交互に配置されたパラメータ化された回路である。 回転層は、すべての量子ビットに適用される単一量子ビットゲートである。 エンタングルメント層は2量子ビットゲートを使い、 entanglement を使って設定された戦略に従って量子ビットをエンタングルする。 回転ゲートもエンタングルメントゲートも文字列で指定できる(例えば 'ry' または 'cx' )、ゲートタイプ(例えば RYGate または CXGate )または QuantumCircuit (例えば1量子ビット回路または2量子ビット回路)として。
デフォルトのエンタングルメントストラテジーのセットが提供される:
'full'エンタングルメントとは、各量子ビットが他のすべての量子ビットとエンタングルメント状態にある状態を指します。'linear'ここで、 は量子ビットの総数である。'reverse_linear'ここで、 は量子ビットの総数である。entanglement_blocks = 'cx'の場合、このオプションは、'full'と同じユニタリーを、より少ないエンタングルゲートで提供することに注意。'pairwise'エンタングルメントとは、 のすべての偶数値について、量子ビット が量子ビット とエンタングルされる1つのレイヤーと、 のすべての奇数値について、量子ビット が量子ビット とエンタングルされる2つ目のレイヤーのことである。'circular'エンタングルメントは線形エンタングルメントであるが、線形部分の前に最初と最後の量子ビットのエンタングルメントが追加されている。'sca'(shifted-circular-alternating)エンタングルメントは、 Simらが提案した回路14を一般化し、修正したものである。 これは、最初の量子ビットと最後の量子ビットを結ぶ "長い "もつれがブロックごとに1つずつシフトする円形のもつれからなる。 さらに、コントロール量子ビットとターゲット量子ビットの役割はブロックごとに入れ替わる(つまり交互に入れ替わる)。
エンタングルメントはさらに、以下のようなインデックスペアのリストであるエンタングラー・マップを用いて指定することができる
>>> entangler_map = [(0, 1), (1, 2), (2, 0)]ブロックごとに異なるエンタングルメントを使用する場合は、エンタングラー・マップのリストを提供する。 この使い方は以下の例を参照。
>>> entanglement = [entangler_map_layer_1, entangler_map_layer_2, ... ]バリアは、 insert_barriers 属性を使用して、より良い視覚化のために異なるレイヤーの間に挿入することができます。
パラメータ化された各ゲートに対して、 ParameterVector を用いて新しいパラメータが生成される。 これらのパラメーターの名前は、 parameter_prefix を使って選ぶことができる。
例
>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
>>> print(two.decompose()) # decompose the layers into standard gates
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├
├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤
q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
>>> qc = QuantumCircuit(3)
>>> qc &= two
>>> print(qc.draw())
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
q_1: ┤ Ry(θ[1]) ├┤ Rz(θ[4]) ├─░──■──┼──■──░─┤ Ry(θ[7]) ├┤ Rz(θ[10]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤├───────────┤
q_2: ┤ Ry(θ[2]) ├┤ Rz(θ[5]) ├─░─────■──■──░─┤ Ry(θ[8]) ├┤ Rz(θ[11]) ├
└──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘>>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
>>> print(two) # note: no barriers inserted this time!
┌───┐ ┌──────────┐┌───┐
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
├───┤┌────┴─────┐ ┌───┐└─────┬────┘└───┘
q_1: |0>┤ X ├┤ Rx(θ[0]) ├─────■──────┤ X ├──────┼──────────
├───┤└──────────┘┌────┴─────┐└───┘ │ ┌───┐
q_2: |0>┤ X ├────────────┤ Rx(θ[1]) ├───────────■─────┤ X ├
└───┘ └──────────┘ └───┘>>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
>>> circuit = two.compose(two)
>>> print(circuit.draw()) # note, that the parameters are the same!
q_0: ─────■───────────■───────────■───────────■──────
│ │ │ │
q_1: ─────┼───────────┼───────────┼───────────┼──────
│ ┌────┴─────┐ │ ┌────┴─────┐
q_2: ─────┼──────┤ Ry(θ[1]) ├─────┼──────┤ Ry(θ[1]) ├
┌────┴─────┐└──────────┘┌────┴─────┐└──────────┘
q_3: ┤ Ry(θ[0]) ├────────────┤ Ry(θ[0]) ├────────────
└──────────┘ └──────────┘>>> layer_1 = [(0, 1), (0, 2)]
>>> layer_2 = [(1, 2)]
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
... flatten=True)
>>> print(two)
┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
├───┤ ░ ┌─┴─┐ │ ░ ├───┤ ░ ░ ├───┤
q_1: ┤ X ├─░─┤ X ├──┼───░─┤ X ├─░───■───░─┤ X ├
├───┤ ░ └───┘┌─┴─┐ ░ ├───┤ ░ ┌─┴─┐ ░ ├───┤
q_2: ┤ X ├─░──────┤ X ├─░─┤ X ├─░─┤ X ├─░─┤ X ├
└───┘ ░ └───┘ ░ └───┘ ░ └───┘ ░ └───┘クラス qiskit.circuit.library.n_local.two_local.TwoLocal は Qiskit 2.1 で非推奨となりました。 Qiskit 3.0 で削除されます。 代わりに関数 qiskit.circuit.library.n_local。
パラメーター
- num_qubits (int | None) – 2ローカル回路の量子ビット数。
- rotation_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – 回転層で使用されるゲート。 ゲートの名前(例:
'ry')を指定することで設定可能です あるいはゲートタイプそのもの(例:RYGate)。 ゲートが1つしか用意されていない場合、各量子ビットには同じゲートが適用される。 ゲートのリストが指定された場合、すべてのゲートが指定された順序で各量子ビットに適用されます。 詳細については、「例」のセクションをご覧ください。 - entanglement_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – エンタングルメント層で使用されるゲート。 .
rotation_blocksと同じ形式で指定できます。 - entanglement (str |list[list[int]] | Callable[[int], list[int]]) – エンタングルメント構造を指定する。 文字列(
'full','linear','reverse_linear','circular'or'sca')、互いにエンタングルされた量子ビットのインデックスを指定する整数対のリスト、またはエンタングルメントレイヤーのインデックスを指定してそのようなリストを返す callable である。 デフォルトは'full'。entanglement_blocks = 'cx'の場合、'full'のエンタングルメントは、'reverse_linear'と同じユニタリーを提供するが、後者のオプションはエンタングルゲートの数が少ないことに注意。 詳しくは例のセクションを参照。 - reps (int) – 回転層とエンタングルメント層からなるブロックが繰り返される頻度を指定する。
- skip_unentangled_qubits (bool) –
Trueの場合、単一量子ビットゲートは、別の量子ビットともつれた量子ビットにのみ適用される。Falseの場合、シングル量子ビット・ゲートはアンサッツの各量子ビットに適用される。 デフォルトはFalse。 - skip_final_rotation_layer (bool) –
Falseの場合、アンサッツの最後に回転レイヤーが追加される。Trueの場合、回転レイヤーは追加されない。 - parameter_prefix (str) – パラメータ化ゲートでは、パラメータを定義する必要がある。
Parameter. 各パラメーターの名前は、この指定された接頭辞とそのインデックスになります。 - insert_barriers (bool) –
Trueの場合、各層の間にバリアが挿入される。Falseの場合、バリアは挿入されない。 デフォルトはFalse。 - initial_state (QuantumCircuit | None) – A
QuantumCircuitオブジェクトを回路の前に追加する。 - name (str) – 生成される回路に付ける名前。
- flatten (bool | None) – これを
Trueに設定すると、ゲートオブジェクトの複数のレイヤーの中に入れ子にする代わりに、フラットな回路を出力する。 現在デフォルトでは、出力回路の内容は、よりきれいに視覚化するためにネストされたオブジェクトにラップされる。 しかし、この回路を視覚化以外に使用する場合は、パラメータ・バインディングの大きなパフォーマンス・オーバーヘッドを避けるために、このフラグをTrueに設定することを強くお勧めします。
属性
name
タイプ: str
人間が読める回路名。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit