Usar un ansatz similar a UVCC con un VQE#

Cuando se utiliza un ansatz de estilo UVCC con un VQE, se debe prestar especial atención al atributo initial_point que indica a partir de qué conjunto de parámetros iniciales debe comenzar la rutina de optimización. Por defecto, VQE comenzará desde un punto inicial aleatorio. En este tutorial, mostramos cómo se puede establecer un punto inicial personalizado (por ejemplo, para garantizar que uno comience desde el estado VSCF).

Los conceptos básicos de esta guía práctica son idénticos a la guía del ansatz similar a UCC (TODO: agregar enlace). Por lo tanto, aquí simplemente mostraremos cómo usar VSCFInitialPoint así:

  1. Asumiendo que ya tenemos nuestros VibrationalStructureProblem y 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. Configuramos nuestro ansatz:

from qiskit_nature.second_q.circuit.library import UVCCSD, VSCF
ansatz = UVCCSD(
    num_modals,
    mapper,
    initial_state=VSCF(
        num_modals,
        mapper,
    ),
)
  1. Configuramos un 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. Ahora viene el paso clave: elegir el punto inicial. Ya que elegimos el estado inicial de VSCF antes, para asegurarnos de que comenzamos desde eso, necesitamos inicializar nuestro initial_point con todos los parámetros todo en cero. Una forma de hacerlo es así:

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

Alternativamente, también se puede usar VSCFInitialPoint así:

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()

Al igual que en el caso UCC-ansatz case, esto es principalmente útil cuando se construye más código sobre la interfaz InitialPoint.