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

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

この方法の基本は、UCCようなansatzのhow-to (TODO: add link) と同じです。 したがって、ここでは VSCFInitialPoint の使い方を簡単に説明します。

  1. すでに :class:`~qiskit_nature.second_q.problems.VibrationalStructureProblem」 と :class:`~qiskit_nature.second_q.mappers.QubitMapper」を持っていると仮定します:

from qiskit_nature.second_q.mappers import DirectMapper
from qiskit_nature.second_q.problems import VibrationalStructureProblem
problem: VibrationalStructureProblem = ...
num_modals = [2, 2, 2]  # some example of what problem.num_modals might yield
mapper = DirectMapper()
  1. Ansatz をセットアップします:

from qiskit_nature.second_q.circuit.library import UVCCSD, VSCF
ansatz = UVCCSD(
    num_modals,
    mapper,
    initial_state=VSCF(
        num_modals,
        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. ここで重要なのが、初期点の選択です。VSCF を初期点に選んだので、それを確実にするためには、 `` initial_point`` をすべてゼロのパラメーターで初期化する必要があります。 その方法の一つは以下の通りです:

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

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

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

UCC-ansatz case のように、これは InitialPoint インターフェイスの上に、より多くのコードを構築するときに便利です。