更新された Qiskit アルゴリズムの操作¶
qiskit.algorithms
モジュールは、そのすべてのクラスで primitive を活用するように更新されました。実際のところ、これは次のことを意味します:
すべてのアルゴリズムが、
Backend
やQuantumInstance
の代わりに、primitiveを取り込むようになりました。一部のアルゴリズムに新しいインポートパスが追加されました
Primitive に特化した新しいアルゴリズムが導入されました
Primitive のリファクタリングの副作用として、
qiskit.opflow
を使用しないqiskit.algorithms
がとなりました。
Runtime Sessions の使用は、変分アルゴリズムを扱う場合に特に有利です。変分アルゴリズムは、反復ごとに複数のジョブを投入するため、反復作業負荷が発生します。さらに、 runtime primitives を使用することで、アルゴリズムに変更を加えることなく、簡単なオプション設定だけで、さまざまなエラー緩和技術を試すことができます。
注釈
次のエンドツーエンドの例は、 qiskit.algorithms
からリファクタリングされたアルゴリズムの1つをQiskit Runtime primitive で使用する方法を示しています。他のアルゴリズム移行シナリオの詳細な説明については、 Qiskitアルゴリズム移行ガイド を参照してください。
例:VQE¶
以前の``VQE`` アルゴリズムは、2つの新しい実装に分割されました:
VQE
: Estimatorに基づくものSamplingVQE
: Samplerをベースとした対角演算子用
量子状態に対応する確率分布にアクセスしたいのか (SamplingVQE
) 、基底状態のエネルギーを推定し、例えば複数基底での測定が必要なのか (VQE
) など、使用ケースによって実装を選択する必要があります。
それでは、EstimatorベースのVQEを実現するためのワークフローの変更点を見てみましょう:
ステップ 1: 問題の定義¶
問題定義ステップは、ハミルトニアン、ansatz、オプティマイザー、初期点の定義という新旧のワークフローに共通するものです。
唯一の違いは、演算子の定義が qiskit.opflow
の代わりに qiskit.quantum_info
に依存するようになったことです。 実際には、これはすべての PauliSumOp
依存性を SparsePauliOp
で置き換える必要があることを意味しています。
注釈
qiskit.algorithms
のリファクタリングされたクラスはすべて、 PauliSumOp
の代わりに``SparsePauliOp`` のインスタンスとして演算子を取り込むようになりました。
Ansatz、オプティマイザー、初期点は同じように定義されています。¶
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import TwoLocal
# define ansatz and optimizer
num_qubits = 2
ansatz = TwoLocal(num_qubits, "ry", "cz")
optimizer = SLSQP(maxiter=100)
# define initial point
init_pt = [-0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1]
# hamiltonian/operator --> use SparsePauliOp or Operator
from qiskit.quantum_info import SparsePauliOp
hamiltonian = SparsePauliOp.from_list(
[
("II", -1.052373245772859),
("IZ", 0.39793742484318045),
("ZI", -0.39793742484318045),
("ZZ", -0.01128010425623538),
("XX", 0.18093119978423156),
]
)
演算子の定義が変わります¶
Legacy VQE
from qiskit.opflow import PauliSumOp
hamiltonian = PauliSumOp.from_list(
[
("II", -1.052373245772859),
("IZ", 0.39793742484318045),
("ZI", -0.39793742484318045),
("ZZ", -0.01128010425623538),
("XX", 0.18093119978423156),
]
)
New VQE
from qiskit.quantum_info import SparsePauliOp
hamiltonian = SparsePauliOp.from_list(
[
("II", -1.052373245772859),
("IZ", 0.39793742484318045),
("ZI", -0.39793742484318045),
("ZZ", -0.01128010425623538),
("XX", 0.18093119978423156),
]
)
ステップ2: バックエンドの設定¶
例えば、クラウド上の ibmq_qasm_simulator
上でVQEを実行したいとします。以前は、IBMQアカウントをロードし、プロバイダーから対応するバックエンドを取得し、それを使って QuantumInstance
をセットアップしていました。今は、 QiskitRuntimeService
を初期化して session を開き、それを使って Estimator
をインスタンス化する必要があります。
Legacy VQE
from qiskit.utils import QuantumInstance
from qiskit import IBMQ
IBMQ.load_account()
provider = IBMQ.get_provider(hub='MY_HUB')
my_backend = provider.get_backend("ibmq_qasm_simulator")
qi = QuantumInstance(backend=my_backend)
New VQE
from qiskit_ibm_runtime import Estimator, QiskitRuntimeService, Session
# no more IBMQ import or .load_account()
service = QiskitRuntimeService(channel="ibm_quantum")
session = Session(service, backend="ibmq_qasm_simulator") # open session
estimator = Estimator(session = session)
ステップ3: VQEの実行¶
これで問題と実行パスの両方が設定されたので、VQEをインスタンス化して実行することができます。すべてのジョブが終了し、セッション内でこれ以上ジョブを実行する必要がない場合にのみ、セッションを終了してください。
重要
VQE
は、インポートパスが変更されたアルゴリズムの1つです。インポート時にフルパスを指定しないと、レガシーコードとのコンフリクトに遭遇する可能性があります。
Legacy VQE
from qiskit.algorithms.minimum_eigen_solvers import VQE
vqe = VQE(ansatz, optimizer, quantum_instance=qi)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
New VQE
# note change of namespace
from qiskit.algorithms.minimum_eigensolvers import VQE
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
# close session!
session.close()
コンテキストマネージャーを使う¶
Primitive を初期化し、コンテキストマネージャーを使ってアルゴリズムを実行することをお勧めします。そうすると、ステップ2とステップ3のコードは次のようになります:
from qiskit_ibm_runtime import Estimator, QiskitRuntimeService, Session
from qiskit.algorithms.minimum_eigensolvers import VQE
service = QiskitRuntimeService(channel="ibm_quantum")
with Session(service, backend="ibmq_qasm_simulator") as session:
estimator = Estimator() # no need to pass the session explicitly
vqe = VQE(estimator, ansatz, optimizer, gradient=gradient, initial_point=init_pt)
result = vqe.compute_minimum_eigenvalue(hamiltonian)