Japanese
言語
English
Japanese
Spanish

更新された Qiskit アルゴリズムの操作

qiskit.algorithms モジュールは、そのすべてのクラスで primitive を活用するように更新されました。実際のところ、これは次のことを意味します:

  1. すべてのアルゴリズムが、 BackendQuantumInstance の代わりに、primitiveを取り込むようになりました。

  2. 一部のアルゴリズムに新しいインポートパスが追加されました

  3. Primitive に特化した新しいアルゴリズムが導入されました

  4. 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)