VQEにおけるUCCのようなansatzの使用#

VQE クラスで UCC スタイルのansatzを使用する場合、最適化ルーチンをどの初期パラメータセットから開始するかを示す initial_point 属性に特に注意する必要があります。デフォルトでは、VQEは ランダム な初期点からスタートします。このHow toでは、カスタム初期点を設定する方法を紹介します (例えば、Hartree-Fock状態から開始することを保証する場合など)。

  1. 解決したい ElectronicStructureProblem クラスを取得します。

from qiskit_nature.second_q.drivers import PySCFDriver
driver = PySCFDriver(atom="H 0 0 0; H 0 0 0.735", basis="sto-3g")
problem = driver.run()
  1. QubitMapper を設定します:

from qiskit_nature.second_q.mappers import JordanWignerMapper
mapper = JordanWignerMapper()
  1. Ansatz をセットアップします:

from qiskit_nature.second_q.circuit.library import UCCSD, HartreeFock
ansatz = UCCSD(
    problem.num_spatial_orbitals,
    problem.num_particles,
    mapper,
    initial_state=HartreeFock(
        problem.num_spatial_orbitals,
        problem.num_particles,
        mapper,
    ),
)
  1. 解きたい VQE を取得します:

import numpy as np
from qiskit_algorithms import VQE
from qiskit_algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
vqe = VQE(Estimator(), ansatz, SLSQP())
  1. ここで重要なのが、初期点の選択です。HartreeFock を初期点に選んだので、それを確実にするためには、 `` initial_point`` をすべてゼロのパラメーターで初期化する必要があります。 その一つの方法は以下の通りです:

vqe.initial_point = np.zeros(ansatz.num_parameters)

また、次のように HFInitialPoint を使用することもできます:

from qiskit_nature.second_q.algorithms.initial_points import HFInitialPoint
initial_point = HFInitialPoint()
initial_point.ansatz = ansatz
initial_point.problem = problem
vqe.initial_point = initial_point.to_numpy_array()

一見、あまり利点がないように見えるかもしれませんが、ここで重要なのは、 InitialPoint インターフェイスの上にコードを構築できることです。このベースは、 MP2InitialPoint クラスで、MP2スタート地点から以下のように始めることができます:

from qiskit_nature.second_q.algorithms.initial_points import MP2InitialPoint
initial_point = MP2InitialPoint()
initial_point.ansatz = ansatz
initial_point.problem = problem
vqe.initial_point = initial_point.to_numpy_array()
  1. 最終的に、私たちの問題を解決できるようになりました。

from qiskit_nature.second_q.algorithms import GroundStateEigensolver
solver = GroundStateEigensolver(mapper, vqe)
result = solver.solve(problem)

print(f"Total ground state energy = {result.total_energies[0]:.4f}")
Total ground state energy = -1.1373