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:
Clase anterior |
Guía práctica |
---|---|
|
Encontrar energías de estado excitado con un NumPyEigensolver |
|
Encontrar la energía del estado fundamental con un NumPyMinimumEigensolver |
|
|
|
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