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
が固有値にアクセスするための拡張を持っているからです。
対応する表を以下に示します。
以前のアルゴリズム |
新しいアルゴリズム |
---|---|
|
|
|
|
|
|
|
|
問題のセットアップ
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
Estimator
で VQE
が原因でエラーが発生します。代わりに SamplingVQE
で SamplingVQE
を使用できます (前のセルを参照してください)。
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
#
GroverOptimizer
は QuantumInstance
と BaseSampler
の両方をサポートしていますが、ユーザーはそれらのいずれかを指定する必要があります。
以前
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_instance
と sampler
の両方が設定されているため、エラーが発生します。設定できるのは一つのみです。
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 Software | Version |
---|---|
qiskit-terra | 0.23.0 |
qiskit-aer | 0.11.1 |
qiskit-optimization | 0.5.0 |
qiskit-machine-learning | 0.6.0 |
System information | |
Python version | 3.9.15 |
Python compiler | Clang 14.0.0 (clang-1400.0.29.102) |
Python build | main, Oct 11 2022 22:27:25 |
OS | Darwin |
CPUs | 4 |
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.