注釈
このページは tutorials/algorithms/01_algorithms_introduction.ipynb から生成されました。
Qiskit におけるアルゴリズム入門¶
このチュートリアルは Qiskit によるアルゴリズムの入門編となっており、入門にあたって様々な機能の理解に役立つ高水準の概観を提供しています。その他のチュートリアルでは、アルゴリズムやその使用方法などについて、より詳細な資料を提供します。
アルゴリズム・ライブラリの構成¶
Qiskit は、多くの アルゴリズム を提供しており、それらは適用可能なタスクに応じてカテゴリーごとにグループ分けされています。例えば、化学的なハミルトニアンの基底エネルギーや、イジング・ハミルトニアンとして表現された最適化問題の解といった、演算子の最小固有値を求めるための Minimum Eigensolvers
があります。また、量子系の時間発展を解くための Time Evolvers
や、金融アプリケーションなどに用いられる推定のための Amplitude Estimators
があります。カテゴリーの全セットは、上記リンク先のアルゴリズム・ドキュメンテーションで見ることができます。
アルゴリズムは設定可能で、多くの場合構成の一部は小さなブロックの形になり、構成ブロック・タイプの異なるインスタンスを与えることができます。例えば、変数量子固有ソルバーである VQE
の場合、QuantumCircuit
と古典的なオプティマイザーの形で、試行波動方程式を取ります。
VQE インスタンスを構築する例を見てみましょう。ここで TwoLocal
は変分形式 (試行波動関数) 、つまりパラメーター表示されている変分可能な回路であり、 SLSQP
は古典的なオプティマイザーです。これらは別々のインスタンスとして作成され、 VQE の構築時に渡されます。例えば、別の古典的なオプティマイザーや変分形式を試す場合には、単純に所望のインスタンスを作成して、 VQE に渡すだけでよいです。
[1]:
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import TwoLocal
num_qubits = 2
ansatz = TwoLocal(num_qubits, "ry", "cz")
optimizer = SLSQP(maxiter=1000)
VQE オプティマイザーが最小固有値を求める際の変分パラメーターが θ[0] から θ[7] であるような QuantumCircuit
となっていることを確認するため、 ansatz を描画してみましょう。パラメータについては、後ほど作業例で説明します。
[2]:
ansatz.decompose().draw("mpl", style="iqx")
[2]:

しかしアルゴリズムの実行には、これだけではまだ不十分です。次に進みましょう。
アルゴリズムの実行¶
アルゴリズムは、Primitiveを利用して期待値やサンプル回路を評価します。Primitiveはシミュレーターや実機に基づいており、同じインタフェースを実装しているため、アルゴリズムで互換性を持って使用することができます。
VQEでは、期待値を評価する必要があります。例えば、デフォルトの Qiskit Terra インストール済み環境に同梱されている qiskit.primitives.Estimator
を使用することができます。
[3]:
from qiskit.primitives import Estimator
estimator = Estimator()
このEstimetorは、正確な状態ベクトルシミュレーションを使用して期待値を評価します。また、ショットベースでノイズシミュレーターや実際のバックエンドを使用することもできます。 シミュレーターの詳細については、Qiskit Aer を実際のハードウェアについては Qiskit IBM Runtime を参照してください。
すべての成分が用意されてたので、VQEをインスタンス化できます:
[4]:
from qiskit.algorithms.minimum_eigensolvers import VQE
vqe = VQE(estimator, ansatz, optimizer)
これで compute_mininum_eigenvalue() メソッドを呼び出すことができるようになりました。後者は、NatureやOptimizationなどのアプリケーションモジュールで選択されるインターフェースで、特定のカテゴリ内の任意のアルゴリズムと互換性を持って動作できるようにするためのものです。
完全な実例¶
これまでに学んだことをまとめ、完全な実例を作成します。 VQE は、最小の固有値、つまり、ハミルトニアン演算子の最小エネルギー値を検出するので、 VQE の操作を行うためのオペレーターが必要となります。 そのような作用素は以下のようになります。 これは元々Natureアプリケーションモジュールによって、原子間距離 0.735A の H2 分子のハミルトニアンとして作成されたものです。 これは、 Pauli項の合計です。アルゴリズムを実行することが目標であるため、これ以上のことを明言しませんが、他のチュートリアルで演算子についてより深く説明しています。
[5]:
from qiskit.quantum_info import SparsePauliOp
H2_op = SparsePauliOp.from_list([
("II", -1.052373245772859),
("IZ", 0.39793742484318045),
("ZI", -0.39793742484318045),
("ZZ", -0.01128010425623538),
("XX", 0.18093119978423156)
])
それでは VQE を実行して、その返り値を表示してみましょう。
[6]:
result = vqe.compute_minimum_eigenvalue(H2_op)
print(result)
{ 'aux_operators_evaluated': None,
'cost_function_evals': 102,
'eigenvalue': -1.857275020719397,
'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da26a470>,
'optimal_parameters': { ParameterVectorElement(θ[0]): -2.403507257619715,
ParameterVectorElement(θ[5]): 1.7060524493254914,
ParameterVectorElement(θ[1]): 3.085467047665086,
ParameterVectorElement(θ[2]): -2.1949965223522487,
ParameterVectorElement(θ[3]): 4.276089268519914,
ParameterVectorElement(θ[4]): -3.098644972035885,
ParameterVectorElement(θ[6]): 0.032773583818940334,
ParameterVectorElement(θ[7]): 2.8861019033185396},
'optimal_point': array([-2.40350726, 3.08546705, -2.19499652, 4.27608927, -3.09864497,
1.70605245, 0.03277358, 2.8861019 ]),
'optimal_value': -1.857275020719397,
'optimizer_evals': None,
'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da2a4d60>,
'optimizer_time': 0.29071593284606934}
上記の結果から、与えられたH2分子の電子基底状態エネルギーである最小固有値 \(\approx -1.85727\) を見つけるまで、オプティマイザーが行ったコスト関数(=エネルギー)評価の回数を見ることができます。また、ansatzの最適パラメーターは、ansatzが最小値であった時の値を見ればわかります。
VQE内部のprimitiveを更新します¶
最後に、VQE内部のestimator primitiveも変更してみましょう。シミュレーションの結果に満足して、今度はショットベースのシミュレーターを使ったり、ハードウェアで実行したくなったのではないでしょうか?
この例では、Qiskit Terraの参照primitiveを使用して、ショットベースのestimatorに変更します。しかし、このprimitiveを例えばQiskit Aerのestimator (qiskit_aer.primitives.Estimator
) や、実際のバックエンド (qiskit_ibm_runtime.Estimator
) で置き換えることができます。
ノイズの多い損失関数に対しては、SPSAオプティマイザが一般的に良い性能を示すので、オプティマイザーも更新します。ショットベースとノイズの多いシミュレーションの詳細については、noisy VQE tutorial も参照してください。
[7]:
from qiskit.algorithms.optimizers import SPSA
estimator = Estimator(options={"shots": 1000})
vqe.estimator = estimator
vqe.optimizer = SPSA(maxiter=100)
result = vqe.compute_minimum_eigenvalue(operator=H2_op)
print(result)
{ 'aux_operators_evaluated': None,
'cost_function_evals': 200,
'eigenvalue': -1.8574503552440247,
'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da2f4250>,
'optimal_parameters': { ParameterVectorElement(θ[0]): -7.7940259581467375,
ParameterVectorElement(θ[5]): 0.28827257835035214,
ParameterVectorElement(θ[1]): -1.8091021117029589,
ParameterVectorElement(θ[2]): -2.460381278734678,
ParameterVectorElement(θ[3]): -7.725013961075425,
ParameterVectorElement(θ[4]): -1.3793338621798832,
ParameterVectorElement(θ[6]): -2.4148423942537587,
ParameterVectorElement(θ[7]): -1.8555574263247812},
'optimal_point': array([-7.79402596, -1.80910211, -2.46038128, -7.72501396, -1.37933386,
0.28827258, -2.41484239, -1.85555743]),
'optimal_value': -1.8574503552440247,
'optimizer_evals': None,
'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da26a5f0>,
'optimizer_time': 0.8142139911651611}
注:ここではシミュレーターのランダムシードを固定していないため、再実行すると若干結果が異なります。
これで Qiskit におけるアルゴリズムの入門編は終了です。このシリーズの他のアルゴリズム・チュートリアルでは、より広い範囲のアルゴリズムをより詳細に学ぶことができます。
[8]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
qiskit-terra | 0.23.0.dev0+f52bb33 |
qiskit-aer | 0.11.1 |
qiskit-ignis | 0.7.1 |
qiskit-ibmq-provider | 0.19.2 |
qiskit-nature | 0.5.0 |
qiskit-optimization | 0.5.0 |
qiskit-machine-learning | 0.6.0 |
System information | |
Python version | 3.10.4 |
Python compiler | Clang 12.0.0 |
Python build | main, Mar 31 2022 03:38:35 |
OS | Darwin |
CPUs | 4 |
Memory (Gb) | 32.0 |
Wed Dec 07 11:02:26 2022 CET |
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.
[ ]: