La Guía de Migración de (Minimum)EigensolverFactory#

Todas las clases de fábrica que podrían usarse para construir objetos MinimumEigensolver o Eigensolver han quedado obsoletas como parte de la versión 0.6 de Qiskit Nature.

Su ventaja sobre una documentación mejorada sobre cómo configurar correctamente estos algoritmos para su uso con Qiskit Nature ha disminuido con el tiempo. Por lo tanto, ahora puedes encontrar Guías prácticas adecuadas, como se indica a continuación, que detallan cómo puedes lograr la misma funcionalidad que solían proporcionar estas clases. La siguiente tabla resume dónde debes buscar los pasos para reemplazar una clase de fábrica:

Table 1 Reemplazos de (Minimum)EigensolverFactory#

Clase anterior

Guía práctica

NumPyEigensolverFactory

Encontrar energías de estado excitado con un NumPyEigensolver

NumPyMinimumEigensolverFactory

Encontrar la energía del estado fundamental con un NumPyMinimumEigensolver

VQEUCCFactory

Usar un ansatz similar a UCC con un VQE

VQEUVCCFactory

Usar un ansatz similar a UVCC con un VQE

Para facilitar la transición a estas guías, proporcionamos un ejemplo para VQEUCCFactory y otro para NumPyEigensolverFactory a continuación.

Configuración#

Para los siguientes ejemplos, necesitamos un ElectronicStructureProblem simple que podemos obtener de un PySCFDriver así:

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import ParityMapper

driver = PySCFDriver(atom="H 0 0 0; H 0 0 0.735")
problem = driver.run()

hamiltonian = problem.hamiltonian.second_q_op()

mapper = ParityMapper(num_particles=problem.num_particles)

qubit_op = mapper.map(hamiltonian)
aux_ops = {}
aux_ops.update(mapper.map(problem.properties.particle_number.second_q_ops()))
aux_ops.update(mapper.map(problem.properties.angular_momentum.second_q_ops()))

VQEUCCFactory#

La manera anterior:

from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit_nature.second_q.circuit.library import UCCSD
from qiskit_nature.second_q.algorithms import VQEUCCFactory

solver_factory = VQEUCCFactory(Estimator(), UCCSD(), SLSQP())

solver = solver_factory.get_solver(problem, mapper)

result = solver.compute_minimum_eigenvalue(qubit_op, aux_ops)
print(f"Eigenvalue = {result.eigenvalue: .6f}")
Eigenvalue = -1.857275

Y la nueva manera correspondiente:

from qiskit.algorithms.minimum_eigensolvers import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit_nature.second_q.circuit.library import HartreeFock, UCCSD
from qiskit_nature.second_q.algorithms.initial_points import HFInitialPoint

ansatz = UCCSD(
    problem.num_spatial_orbitals,
    problem.num_particles,
    mapper,
    initial_state=HartreeFock(
        problem.num_spatial_orbitals,
        problem.num_particles,
        mapper,
    ),
)

initial_point = HFInitialPoint()
initial_point.ansatz = ansatz
initial_point.problem = problem

solver = VQE(Estimator(), ansatz, SLSQP())
solver.initial_point = initial_point.to_numpy_array()

result = solver.compute_minimum_eigenvalue(qubit_op, aux_ops)
print(f"Eigenvalue = {result.eigenvalue: .6f}")
Eigenvalue = -1.857275

NumPyEigensolverFactory#

La manera anterior:

from qiskit_nature.second_q.algorithms import NumPyEigensolverFactory

solver_factory = NumPyEigensolverFactory(
    k=10,
    use_default_filter_criterion=True,
)

solver = solver_factory.get_solver(problem)

result = solver.compute_eigenvalues(qubit_op, aux_ops)

for idx, eigenvalue in enumerate(result.eigenvalues):
    print(f"{idx}: {eigenvalue: .6f}")
0: -1.857275
1: -0.882722
2: -0.224911

Y la nueva manera correspondiente:

from qiskit.algorithms.eigensolvers import NumPyEigensolver

solver = NumPyEigensolver(k=10)
solver.filter_criterion = problem.get_default_filter_criterion()

result = solver.compute_eigenvalues(qubit_op, aux_ops)

for idx, eigenvalue in enumerate(result.eigenvalues):
    print(f"{idx}: {eigenvalue: .6f}")
0: -1.857275
1: -0.882722
2: -0.224911