はじめに
量子プログラミング用SDKであるPennyLaneには、template circuitsがいくつも用意されています。
非常に便利な機能です。
PennyLaneの公式APIドキュメントでも説明されています1が、
具体的にパラメータを設定したときにどんな回路になるか想像するのはやや難しいです。
かつ、PennyLaneのデフォルトの回路図示機能はasciiのみで、なかなか見にくいです。
確かにPennyLane自体には高度な図示機能はないですが、qiskitに変換し、qiskitのdraw機能を使うことが出来ます。2
この機能で具体的に図示することで、templateがどうなっているのか納得したいと思います。
qiskit経由での可視化
pip install
pip install pennylane-qiskit
import
import pennylane as qml
from pennylane import numpy as np
backend(今回はqiskit)の指定と回路作成
dev = qml.device("qiskit.aer", wires=1)
@qml.qnode(dev)
def f(x):
qml.RX(x, wires=0)
return qml.expval(qml.PauliZ(0))
f(0.3)
可視化
dev._circuit.draw('mpl')
確かに可視化が出来ました。
templatesを可視化してみる
3 qubits,1 layerとします。
AngleEmbedding
n_qubits = 3
n_layers = 1
dev = qml.device("qiskit.aer", wires=n_qubits)
weights = np.random.rand(n_layers, n_qubits,3)*(2*np.pi)
x = np.ones(n_qubits)*np.pi
@qml.qnode(dev)
def circ(x):
qml.templates.AngleEmbedding(x, wires=range(n_qubits),rotation='X')
return qml.expval(qml.PauliZ(0))
circ(x)
dev._circuit.draw('mpl')
入力パラメータをRXゲートの回転角度とする回路になっていますね。
AmplitudeEmbedding
x = np.ones(2**n_qubits)*np.pi
qml.templates.embeddings.AmplitudeEmbedding(x, wires=range(n_qubits), normalize='true')
入力パラメータを量子状態振幅としてsetする回路です。
BasicEntanglerLayers
weights = np.random.rand(n_layers, n_qubits)*(2*np.pi)
qml.templates.layers.BasicEntanglerLayers
RX→CNOT(あらゆる隣接ビット間) となっています。
StronglyEntanglingLayers
weights = np.random.rand(n_layers, n_qubits,3)*(2*np.pi)
qml.templates.StronglyEntanglingLayers(weights, wires=range(n_qubits))
RZ→RY→RZ→CNOT(あらゆる隣接ビット間) となっています。
まとめ
この応用で、好きな回路を可視化できます。
qiskitの回路図で表示できると、かなり便利ではないでしょうか。
デバッグに大活躍です。
-
https://pennylane.readthedocs.io/en/stable/introduction/templates.html ↩
-
これを探すのに結構苦労しました・・・。 ↩