Resolución de Problemas con v0.5#
Descripción General#
El enfoque principal de la refactorización de Qiskit Nature v0.5 fue la descripción y representación de operadores y problemas de segunda cuantización. No obstante, el módulo algorithms
y los módulos de soporte también recibieron actualizaciones significativas. Lo más importante es que todos los algoritmos en Nature ahora dependen de los nuevos algoritmos de Qiskit Terra, y estos ahora se basan en Primitivas de Qiskit y se agregaron en Qiskit Terra 0.22. No es la intención proporcionar explicaciones detalladas de las primitivas en esta guía de migración. Te sugerimos que leas los recursos correspondientes de la documentación de Qiskit Terra en su lugar.
Más Recursos#
Para obtener más detalles, consulta los tutoriales correspondientes:
qiskit_nature.mappers
#
Los mapeadores de Qiskit Nature no recibieron ningún cambio en la API (aparte de requerir potencialmente que ciertos argumentos sean palabras clave; consulta también la sección “Demasiados argumentos posicionales”). Sin embargo, todo el módulo qiskit_nature.mappers.second_quantization
se ha movido a qiskit_nature.second_q.mappers
. Entonces, actualizar tu importación es todo lo que necesitas hacer aquí.
qiskit_nature.converters
#
Este módulo contenía un único componente: QubitConverter
. Esto se ha movido a qiskit_nature.second_q.mappers.QubitConverter
para que simplemente puedas actualizar tu ruta de importación.
Los cambios en la API fueron nuevamente mínimos, pero los operadores que esta clase está traduciendo ya no son los SecondQuantizedOp
heredados, sino los nuevos objetos SparseLabelOp
.
qiskit_nature.circuit
#
Todo el módulo qiskit_nature.circuit
se reubicó en qiskit_nature.second_q.circuit
. La razón de esto es que el circuito existente en realidad solo era atribuible a aplicaciones de segunda cuantización, pero la API no reflejaba esto. Actualizar tus importaciones debería solucionar la mayoría de los problemas.
Sin embargo, hay dos detalles más a tener en cuenta, que se indican a continuación.
Número de Orbitales#
Hemos estado describiendo constantemente el número de orbitales a través de num_spin_orbitals
en todo el paquete. Sin embargo, lo que esto implicaba a menudo (sin comprobaciones rigurosas) era que se proporcionaba un número par, ya que se suponía que el número de orbitales de espín era igual al doble del número de orbitales espaciales.
Para ser más rigurosos y evitar el comportamiento mal definido al proporcionar números impares para num_spin_orbitals
, hemos cambiado toda la pila para usar num_spatial_orbitals
en su lugar. Esto está bien definido para cualquier valor entero positivo (y los valores negativos están protegidos).
Lo que esto significa para ti en la práctica es que cada vez que proporcionabas num_spin_orbitals
manualmente en el pasado, ahora necesitas proporcionar la mitad del valor para representar num_spatial_orbitals
.
Previamente#
from qiskit_nature.circuit.library import UCCSD
ansatz = UCCSD()
ansatz.num_spin_orbitals = 10
Nuevo#
from qiskit_nature.second_q.circuit.library import UCCSD
ansatz = UCCSD()
ansatz.num_spatial_orbitals = 5
argumentos del __init__
de UCC/UVCC#
Las subclases UCC
y UVCC
solían tomar los siguientes argumentos para su __init__
:
Previamente#
from qiskit_nature.circuit.library import UCC, UVCC
ucc = UCC(qubit_converter=None, num_particles=None, num_spin_orbitals=None, excitations=None)
uvcc = UVCC(qubit_converter=None, num_modals=None, excitations=None)
Nuevo#
Esto no coincidía con la API de los estados iniciales HartreeFock
y VSCF
. Hemos alineado estas API para que se parezcan a lo siguiente:
from qiskit_nature.second_q.circuit.library import UCC, UVCC
ucc = UCC(num_spatial_orbitals=None, num_particles=None, excitations=None, qubit_converter=None)
uvcc = UVCC(num_modals=None, excitations=None, qubit_converter=None)
Estados iniciales de HartreeFock/VSCF#
Los circuitos de estado inicial HartreeFock
y VSCF
ahora se implementan como BlueprintCircuit
. Eso significa que puedes inicializarlos sin ningún argumento y proporcionar la información más adelante como se muestra a continuación:
Previamente#
from qiskit_nature.circuit.library import HartreeFock, VSCF
from qiskit_nature.converters.second_quantization import QubitConverter
from qiskit_nature.mappers.second_quantization import DirectMapper, JordanWignerMapper
hf = HartreeFock(
num_spin_orbitals=4, num_particles=(1, 1), qubit_converter=QubitConverter(JordanWignerMapper())
)
vscf = VSCF(num_modals=[2, 2])
Nuevo#
from qiskit_nature.second_q.circuit.library import HartreeFock, VSCF
from qiskit_nature.second_q.mappers import DirectMapper, JordanWignerMapper, QubitConverter
hf = HartreeFock()
hf.num_spatial_orbitals = 2
hf.num_particles = (1, 1)
hf.qubit_converter = QubitConverter(JordanWignerMapper())
vscf = VSCF()
vscf.num_modals = [2, 2]
qiskit_nature.algorithms
#
Los algoritmos en Qiskit Nature se han actualizado para usar los nuevos componentes qiskit.algorithms
que se basan en qiskit.primitives
a partir de Qiskit Terra 0.22.
Para que la mayoría de los cambios surtan efecto, puedes volver a actualizar tus rutas de importación de qiskit_nature.algorithms
a qiskit_nature.second_q.algorithms
. Sin embargo, hay algunos detalles a los que debes prestar atención, debido al cambio en los algoritmos basados en primitivas de Qiskit Terra que se utilizan tras bambalinas. Estos detalles se explican a continuación.
qiskit_nature.algorithms.initial_points
#
Este módulo se movió a qiskit_nature.second_q.algorithms.initial_points
. Todo lo que necesitas hacer es actualizar tus importaciones.
qiskit_nature.algorithms.pes_samplers
#
Este módulo se eliminó sin reemplazarlo. La razón de esto es que estamos trabajando hacia un diseño sin controlador (driver) de Qiskit Nature, en cuyo caso el muestreo de la superficie de energía potencial se convierte en responsabilidad del código clásico en lugar de Qiskit Nature.
qiskit_nature.algorithms.ground_state_solvers
#
Este módulo se movió a qiskit_nature.second_q.algorithms.ground_state_solvers
. Además de actualizar tus importaciones, debes prestar atención a lo siguiente:
AdaptVQE
se migró a Qiskit Terra:qiskit.algorithms.minimum_eigensolver.AdaptVQE
. Al hacerlo, ya no es unGroundStateSolver
sino que se convirtió en unMinimumEigensolver
, lo que significa que lo usarías como cualquier otroVQE
y lo inyectarías dentro de unGroundStateSolver
de Qiskit Nature. Para ver el nuevoAdaptVQE
en acción, consulta Cómo usar el AdaptVQE.la API de
VQEUCCFactory
yVQEUVCCFactory
se ha emparejado con la nueva API deVQE
basada en primitivas
Previamente#
from qiskit.providers.basicaer import BasicAer
from qiskit.utils import QuantumInstance
from qiskit_nature.algorithms.ground_state_solvers import VQEUCCFactory
quantum_instance = QuantumInstance(BasicAer.get_backend("statevector_simulator"))
vqe_factory = VQEUCCFactory(quantum_instance=quantum_instance)
Nuevo#
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.ground_state_solvers import VQEUCCFactory
estimator = Estimator()
ansatz = UCCSD()
optimizer = SLSQP()
vqe_factory = VQEUCCFactory(estimator, ansatz, optimizer)
qiskit_nature.algorithms.excited_states_solvers
#
Este módulo se movió a qiskit_nature.second_q.algorithms.excited_states_solvers
. Además de actualizar tus importaciones, debes prestar atención a lo siguiente:
la API de
QEOM
ahora también requiere que se proporcione una primitiva Estimator
Previamente#
from qiskit_nature.algorithms.ground_state_solvers import GroundStateEigensolver, VQEUCCFactory
from qiskit_nature.algorithms.excited_states_solvers import QEOM
from qiskit_nature.converters.second_quantization import QubitConverter
from qiskit_nature.mappers.second_quantization import JordanWignerMapper
vqe_factory = VQEUCCFactory()
converter = QubitConverter(JordanWignerMapper())
ground_state_solver = GroundStateEigensolver(converter, vqe_factory)
qeom = QEOM(ground_state_solver)
Nuevo#
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.ground_state_solvers import (
GroundStateEigensolver,
VQEUCCFactory,
)
from qiskit_nature.second_q.algorithms.excited_states_solvers import QEOM
from qiskit_nature.second_q.mappers import JordanWignerMapper, QubitConverter
estimator = Estimator()
ansatz = UCCSD()
optimizer = SLSQP()
vqe_factory = VQEUCCFactory(estimator, ansatz, optimizer)
converter = QubitConverter(JordanWignerMapper())
ground_state_solver = GroundStateEigensolver(converter, vqe_factory)
qeom = QEOM(ground_state_solver, estimator)