Primitiveにおけるパラメーター付き回路¶
パラメーター付き回路は、量子アルゴリズム設計のために一般的に使用されるツールです。 backend.run() はパラメーター付き回路を受け付けないため、アルゴリズムワークフローにパラメーター結合ステップを組み込む必要がありました。Primitive はパラメーター結合を内部で行うことができ、アルゴリズム側のロジックを簡略化することができます。
以下の例では、パラメーター付き回路を管理するための新しいワークフローをまとめています。
例¶
パラメーター付き回路を定義しましょう。
from qiskit.circuit import QuantumCircuit, ParameterVector
n = 3
thetas = ParameterVector('θ',n)
qc = QuantumCircuit(n, 1)
qc.h(0)
for i in range(n-1):
qc.cx(i, i+1)
for i,t in enumerate(thetas):
qc.rz(t, i)
for i in reversed(range(n-1)):
qc.cx(i, i+1)
qc.h(0)
qc.measure(0, 0)
qc.draw()
回路に次のパラメーターの値を割り当てます:
import numpy as np
theta_values = [np.pi/2, np.pi/2, np.pi/2]
これまで¶
以前は、パラメーターの値は backend.run() を呼び出す前にそれぞれの回路のパラメーターにバインドする必要がありました。
from qiskit import Aer
bound_circuit = qc.bind_parameters(theta_values)
bound_circuit.draw()
backend = Aer.get_backend('aer_simulator')
job = backend.run(bound_circuit)
counts = job.result().get_counts()
print(counts)
Primitives¶
現在、Primitiveはパラメーター付き回路をパラメーターの値とともに直接取り込み、primitiveのサーバー側でパラメーター割り当て操作をより効率的に行うことができるようになりました。
この機能は、繰り返しアルゴリズムを扱う場合に特に興味深いもので、パラメーターの値が変化しても、パラメーター付き回路は呼び出す間に変化しないためです。Primitiveは、一度トランスパイルしてから、バインドされていない回路をキャッシュすることができ、古典的なリソースをより効率的に使用することができます。さらに、更新されたパラメーターのみがクラウドに転送され、追加の帯域幅を節約することができます。
from qiskit.primitives import Sampler
sampler = Sampler()
job = sampler.run(qc, theta_values)
result = job.result().quasi_dists
print(result)