IQPE と VQE 出力状態の発展¶
このノートブックでは、 IQPE (Iterative Quantum Phase Estimation) アルゴリズムの入力、つまり開始状態として、 VQE から得られた出力結果状態を利用する方法を実演します。
これは最初に VQE を実行し、終了時に得られた変分形式によって IQPE の初期状態を準備することで達成されます。
[1]:
import numpy as np
from qiskit import BasicAer
from qiskit.aqua import aqua_globals, QuantumInstance
from qiskit.aqua.algorithms import VQE, NumPyMinimumEigensolver, IQPE
from qiskit.aqua.operators import I, X, Z
from qiskit.circuit.library import TwoLocal
from qiskit.aqua.components.optimizers import SPSA
from qiskit.aqua.components.initial_states.var_form_based import VarFormBased
まず、 VQE 用の量子ビット演算子を作成します。ここではアルゴリズムの紹介で用いたものと同じ、元々は Qiskit Chemistry によって H2 分子のために計算された演算子を使用します。
[2]:
H2_op = (-1.052373245772859 * I ^ I) + \
(0.39793742484318045 * I ^ Z) + \
(-0.39793742484318045 * Z ^ I) + \
(-0.01128010425623538 * Z ^ Z) + \
(0.18093119978423156 * X ^ X)
最初に古典的な NumPyMinimumEigensolver によって、基準となる基底エネルギーを計算しておきます。このようにすることで、後から VQE や IQPE の結果と比較することができます。
[3]:
npme = NumPyMinimumEigensolver()
result = npme.compute_minimum_eigenvalue(operator=H2_op)
ref_value = result.eigenvalue.real
print(f'Reference value: {ref_value:.5f}')
Reference value: -1.85728
基準となる基底エネルギーが得られたので、実験を次に進めます。まず、 VQE アルゴリズムのインスタンスを設定します。ここでは、VQE インスタンスがおおよその推定結果を早く返すよう終了条件を設定しています。
[4]:
seed = 5
aqua_globals.random_seed = seed
var_form = TwoLocal(rotation_blocks=['ry', 'rz'], entanglement_blocks='cz', reps=3)
spsa = SPSA(maxiter=10)
backend = BasicAer.get_backend('qasm_simulator')
qi = QuantumInstance(backend, seed_simulator=seed, seed_transpiler=seed)
vqe = VQE(var_form=var_form, optimizer=spsa, quantum_instance=qi)
result_vqe = vqe.compute_minimum_eigenvalue(operator=H2_op)
print(f'VQE estimated the ground energy to be {result_vqe.eigenvalue.real:.5f}')
print(f'Delta from reference energy value is {(result_vqe.eigenvalue.real - ref_value):.5f}')
VQE estimated the ground energy to be -1.74063
Delta from reference energy value is 0.11664
先に述べたように、エネルギーの推定結果はかなり大雑把なもので、最終的な推定値として許容できるものからはかけ離れています。しかし、それに伴う変分形式が基底固有状態の良い近似となっているということ、つまり対応する波動関数が後に続く IQPE の初期状態として役立つということを言うには、十分近いものとなっています。次にそのような初期状態を用意しましょう。
[5]:
vqe_state = VarFormBased(var_form, result_vqe.optimal_parameters)
VQE が生成した量子状態の波動関数を初期状態として用意できたので、次に IQPE インスタンスの設定と実行に進みます。
[6]:
qi = QuantumInstance(backend, shots=100, seed_simulator=seed, seed_transpiler=seed)
iqpe = IQPE(state_in=vqe_state, num_time_slices=1, num_iterations=6,
expansion_mode='suzuki', expansion_order=2, quantum_instance=qi)
result_iqpe = result_vqe = iqpe.compute_minimum_eigenvalue(operator=H2_op)
print(f"Continuing with VQE's result, IQPE estimated the ground energy to be {result_iqpe.eigenvalue.real:.5f}")
print(f'Delta from reference energy value is {(result_iqpe.eigenvalue.real - ref_value):.5f}')
Continuing with VQE's result, IQPE estimated the ground energy to be -1.84917
Delta from reference energy value is 0.00811
このように IQPE で得られた基底エネルギーの推定結果は、 VQE によって得られた中間結果よりもはるかに正確となっています。
[7]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | 0.23.0 |
Terra | 0.16.0 |
Aer | 0.7.0 |
Ignis | 0.5.0 |
Aqua | 0.8.0 |
IBM Q Provider | 0.11.0 |
System information | |
Python | 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] |
OS | Linux |
CPUs | 1 |
Memory (Gb) | 5.827335357666016 |
Sat Nov 07 16:15:38 2020 EST |
This code is a part of Qiskit
© Copyright IBM 2017, 2020.
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.
[ ]: