Qiskit Optimization v0.5 移行ガイド#

このチュートリアルでは、コードを Qiskit Optimization v0.4 から v0.5 へマイグレーションするプロセスをガイドします。

概要#

Qiskit Terra v0.22 では、Qiskit Primitives (Estimator および Sampler) を活用する新しいアルゴリズムの実装が導入されています。 opflow を利用する以前のアルゴリズムの実装は、将来のリリースで廃止される予定です。

Qiskit Optimization v0.5は、Qiskit Terra v0.22の新アルゴリズムと旧アルゴリズムの両方を、旧アルゴリズムが非推奨になるまでサポートします。

この移行ガイドでPrimitives の詳細な説明を提供することは意図していません。 代わりに Qiskit Terra ドキュメントの 対応するリソース を読むことをお勧めします。

本ガイドでは、Samplerの実装例として qiskit.primitives.Sampler を使用します。これは qiskit.primitives.BaseSampler インターフェースに従った実装です。 BackendSampler (qiskit-terra), AerSampler (qiskit-aer), Qiskit Runtime Sampler (qiskit-ibm-runtime) などの他のSampler実装も使用することが可能です。

MinimumEigenOptimizer#

前のアルゴリズムは qiskit.algorithms.minimum_eigen_solvers に存在し、 qiskit.algorithms.* によってアクセスすることができました。一方、新しいアルゴリズムは qiskit.algorithms.minimum_eigensolvers に存在し、 qiskit.algorithms.minimum_eigensolvers.* によってアクセスすることができます。違いは minimum_eigen_solvers (旧) と minimum_eigensolvers (新) であることに注意してください。

Qiskit Optimization の MinimumEigenOptimizer は、旧アルゴリズムの qiskit.algorithms.MinimumEigenSolver インターフェースと新アルゴリズムの qiskit.algorithms.minimum_eigensolvers.SamplingMinimumEigensolver インターフェースを利用することができます。なお、 MinimumEigenOptimizer は基本的に新しいアルゴリズムの qiskit.algorithms.minimum_eigensolvers.MinimumEigensolver を扱うことができません。しかし、例外があります。MinimumEigenOptimizer`` は qiskit.algorithms.minimum_eigensolvers.MinimumEigensolver を継承していますが、 algorithms.minimum_eigensolver.NumPyMinimumEigensolver をハンドリングすることができます。これは algorithms.minimum_eigensolver.NumPyMinimumEigensolver が固有値にアクセスするための拡張を持っているからです。

対応する表を以下に示します。

以前のアルゴリズム

新しいアルゴリズム

qiskit.algorithms.MinimumEigenSolver

qiskit.algorithms.minimum_eigensolvers.SamplingMinimumEigensolver

qiskit.algorithms.NumPyMinimumEigensolver

qiskit.algorithms.minimum_eigensolver.NumPyMinimumEigensolver

qiskit.algorithms.QAOA

qiskit.algorithms.minimum_eigensolvers.QAOA

qiskit.algorithms.VQE

qiskit.algorithms.minimum_eigensolvers.SamplingVQE

問題のセットアップ

from qiskit_optimization import QuadraticProgram

problem = QuadraticProgram("sample")
problem.binary_var("x")
problem.binary_var("y")
problem.maximize(linear={"x": 1, "y": -2})
print(problem.prettyprint())
Problem name: sample

Maximize
  x - 2*y

Subject to
  No constraints

  Binary variables (2)
    x y

NumPyMinimumEigensolver#

以前

from qiskit.algorithms import NumPyMinimumEigensolver

from qiskit_optimization.algorithms import MinimumEigenOptimizer

mes = NumPyMinimumEigensolver()
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

新規

from qiskit.algorithms.minimum_eigensolvers import NumPyMinimumEigensolver

from qiskit_optimization.algorithms import MinimumEigenOptimizer

mes = NumPyMinimumEigensolver()
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

QAOA#

以前

from qiskit import BasicAer
from qiskit.algorithms import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.utils import QuantumInstance

from qiskit_optimization.algorithms import MinimumEigenOptimizer

backend = BasicAer.get_backend("qasm_simulator")
shots = 1000
qins = QuantumInstance(backend=backend, shots=shots)
mes = QAOA(optimizer=COBYLA(), quantum_instance=qins)
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

新規

from qiskit.algorithms.minimum_eigensolvers import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler

from qiskit_optimization.algorithms import MinimumEigenOptimizer

shots = 1000
mes = QAOA(sampler=Sampler(), optimizer=COBYLA())
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

VQE (旧) → SamplingVQE (新規)#

以前

from qiskit import BasicAer
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import COBYLA
from qiskit.circuit.library import RealAmplitudes
from qiskit.utils import QuantumInstance

from qiskit_optimization.algorithms import MinimumEigenOptimizer

backend = BasicAer.get_backend("qasm_simulator")
shots = 1000
qins = QuantumInstance(backend=backend, shots=shots)
mes = VQE(ansatz=RealAmplitudes(), optimizer=COBYLA(), quantum_instance=qins)
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

新規

from qiskit.algorithms.minimum_eigensolvers import SamplingVQE
from qiskit.algorithms.optimizers import COBYLA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Sampler

from qiskit_optimization.algorithms import MinimumEigenOptimizer

mes = SamplingVQE(sampler=Sampler(), ansatz=RealAmplitudes(), optimizer=COBYLA())
meo = MinimumEigenOptimizer(min_eigen_solver=mes)
result = meo.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

EstimatorVQE が原因でエラーが発生します。代わりに SamplingVQESamplingVQE を使用できます (前のセルを参照してください)。

from qiskit.algorithms.minimum_eigensolvers import VQE
from qiskit.algorithms.optimizers import COBYLA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator

from qiskit_optimization.algorithms import MinimumEigenOptimizer

mes = VQE(estimator=Estimator(), ansatz=RealAmplitudes(), optimizer=COBYLA())
try:
    meo = MinimumEigenOptimizer(min_eigen_solver=mes)
except TypeError as ex:
    print(ex)
MinimumEigenOptimizer does not support this VQE. You can use  qiskit.algorithms.minimum_eigensolvers.SamplingVQE instead.

WarmStartQAOAOptimizer#

WarmStartQAOAOptimizer は、以前の qiskit.algorithms.QAOA と新しい qiskit.algorithms.minimum_eigensolvers.QAOA の両方を使用できます。

以前

from qiskit import BasicAer
from qiskit.algorithms import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.utils import QuantumInstance

from qiskit_optimization.algorithms import WarmStartQAOAOptimizer, SlsqpOptimizer

backend = BasicAer.get_backend("qasm_simulator")
shots = 1000
qins = QuantumInstance(backend=backend, shots=shots)
qaoa = QAOA(optimizer=COBYLA(), quantum_instance=qins)
optimizer = WarmStartQAOAOptimizer(
    pre_solver=SlsqpOptimizer(), relax_for_pre_solver=True, qaoa=qaoa, epsilon=0.25
)
result = optimizer.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

新規

from qiskit.algorithms.minimum_eigensolvers import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler

from qiskit_optimization.algorithms import WarmStartQAOAOptimizer, SlsqpOptimizer

qaoa = QAOA(sampler=Sampler(), optimizer=COBYLA())
optimizer = WarmStartQAOAOptimizer(
    pre_solver=SlsqpOptimizer(), relax_for_pre_solver=True, qaoa=qaoa, epsilon=0.25
)
result = optimizer.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

GroverOptimizer#

GroverOptimizerQuantumInstanceBaseSampler の両方をサポートしていますが、ユーザーはそれらのいずれかを指定する必要があります。

以前

from qiskit import BasicAer
from qiskit.algorithms.optimizers import COBYLA
from qiskit.utils import QuantumInstance

from qiskit_optimization.algorithms import GroverOptimizer

backend = BasicAer.get_backend("qasm_simulator")
shots = 1000
qins = QuantumInstance(backend=backend, shots=shots)
optimizer = GroverOptimizer(num_value_qubits=3, num_iterations=3, quantum_instance=qins)
result = optimizer.solve(problem)
print(result)
fval=1.0, x=1.0, y=0.0, status=SUCCESS

新規

from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler

from qiskit_optimization.algorithms import GroverOptimizer

optimizer = GroverOptimizer(num_value_qubits=3, num_iterations=3, sampler=Sampler())
result = optimizer.solve(problem)
print(result)
fval=0.0, x=0.0, y=0.0, status=SUCCESS

quantum_instancesampler の両方が設定されているため、エラーが発生します。設定できるのは一つのみです。

from qiskit import BasicAer
from qiskit.algorithms.optimizers import COBYLA
from qiskit.utils import QuantumInstance
from qiskit.primitives import Sampler

from qiskit_optimization.algorithms import GroverOptimizer

backend = BasicAer.get_backend("qasm_simulator")
shots = 1000
qins = QuantumInstance(backend=backend, shots=shots)
try:
    optimizer = GroverOptimizer(
        num_value_qubits=3, num_iterations=3, quantum_instance=qins, sampler=Sampler()
    )
    # raises an error because both quantum_instance and sampler are set.
except ValueError as ex:
    print(ex)
Only one of quantum_instance or sampler can be passed, not both!
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0
qiskit-aer0.11.1
qiskit-optimization0.5.0
qiskit-machine-learning0.6.0
System information
Python version3.9.15
Python compilerClang 14.0.0 (clang-1400.0.29.102)
Python buildmain, Oct 11 2022 22:27:25
OSDarwin
CPUs4
Memory (Gb)16.0
Tue Dec 06 22:08:13 2022 JST

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.