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 un GroundStateSolver sino que se convirtió en un MinimumEigensolver, lo que significa que lo usarías como cualquier otro VQE y lo inyectarías dentro de un GroundStateSolver de Qiskit Nature. Para ver el nuevo AdaptVQE en acción, consulta Cómo usar el AdaptVQE.

  • la API de VQEUCCFactory y VQEUVCCFactory se ha emparejado con la nueva API de VQE 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:

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)