VQEにおけるUVCCのようなansatzの使用#
VQE
クラスで UVCC
スタイルのansatzを使用する場合、最適化ルーチンをどの初期パラメータセットから開始するかを示す initial_point
属性に特に注意する必要があります。デフォルトでは、VQEは ランダム な初期点からスタートします。このHow toでは、カスタム初期点を設定する方法を紹介します (例えば、VSCF状態から開始することを保証する場合など)。
この方法の基本は、UCCようなansatzのhow-to (TODO: add link) と同じです。 したがって、ここでは VSCFInitialPoint
の使い方を簡単に説明します。
すでに :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()
Ansatz をセットアップします:
from qiskit_nature.second_q.circuit.library import UVCCSD, VSCF
ansatz = UVCCSD(
num_modals,
mapper,
initial_state=VSCF(
num_modals,
mapper,
),
)
解きたい
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())
ここで重要なのが、初期点の選択です。
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
インターフェイスの上に、より多くのコードを構築するときに便利です。