IQPE와 VQE 출력 상태의 변화¶
이 노트북은 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의 큐비트 연산자를 생성한다. 이 예제에서는 알고리즘 소개에서 사용했던것과 동일한 H2 분자에 대해 Qiskit Chemistry를 사용해 계산했던 것과 같은 연산자를 사용한다.
[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 알고리즘 인스턴스를 구성한다. 정밀 하지는 않지만 사용할 만한 계산 값이 빨리 반환 될 수 있도록 적절한 알고리즘 종료 조건을 설정합니다.
[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
전술한 바와 같이, 에너지 추정 결과는 다소 대략적(rough) 이며 수용 가능한 최소 추정 수치와는 거리가 멀다. 그러나 수반되는 variational form은 바닥 고유 상태에 대하여 합리적으로 좋은 근사치가 될 수 있을만큼 충분히 가까우며, 이는 해당 파동 함수(wave function) 가 후속 IQPE 실행을 위한 초기 상태 역할을 할 수 있다는 것을 의미한다. 이제 이와 같은 초기 상태를 준비할 것이다.
[5]:
vqe_state = VarFormBased(var_form, result_vqe.optimal_parameters)
초기 상태를 위하여 VQE로부터 생성된 양자 상태 파동 함수(quantum state wave function) 를 사용하여, 이제 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.
[ ]: