Problemas de Estructura Electrónica con v0.5#

Más recursos#

Asegúrate de consultar los siguientes tutoriales sobre cómo usar el nuevo código:

TL;DR#

Esta sección te brinda una celda con un código v0.4 seguida de una celda con un código v0.5 que hace lo mismo. Esperemos que esto ya te brinde toda la información que estabas buscando.

Previamente#

from qiskit_nature.drivers import Molecule
from qiskit_nature.drivers.second_quantization import (
    ElectronicStructureDriverType,
    ElectronicStructureMoleculeDriver,
    PySCFDriver,
)
from qiskit_nature.problems.second_quantization import ElectronicStructureProblem
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer
from qiskit_nature.settings import settings

settings.dict_aux_operators = True

molecule = Molecule(
    geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1
)

driver = ElectronicStructureMoleculeDriver(
    molecule, basis="sto3g", driver_type=ElectronicStructureDriverType.PYSCF
)
# or equivalently:
driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

transformer = FreezeCoreTransformer()

problem = ElectronicStructureProblem(driver, transformers=[transformer])

# Note: at this point, `driver.run()` has NOT been called yet. We can trigger this indirectly like so:
second_q_ops = problem.second_q_ops()

hamiltonian = second_q_ops["ElectronicEnergy"]
print(hamiltonian)
Fermionic Operator
register length=4, number terms=36
  -1.2563390730032498 * ( +_0 -_0 )
+ -0.47189600728114245 * ( +_1 -_1 )
+ -1.2563390730032498 * ( +_2 -_2 )
+ -0.47189600728114245 * ( +_3 -_3 )
+ -0.33785507740175813 * ( +_0 +_0 -_0 -_0 )
+ -0. ...

Nuevo#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

molecule = MoleculeInfo(["H", "H"], [(0.0, 0.0, 0.0), (0.0, 0.0, 0.735)], charge=0, multiplicity=1)

driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

# this is now done explicitly
problem = driver.run()

transformer = FreezeCoreTransformer()

# and you also apply transformers explicitly
problem = transformer.transform(problem)

hamiltonian = problem.hamiltonian.second_q_op()
print("\n".join(str(hamiltonian).splitlines()[:10] + ["..."]))
Fermionic Operator
number spin orbitals=4, number terms=36
  0.33785507740175813 * ( +_0 +_0 -_0 -_0 )
+ 0.09046559989211565 * ( +_0 +_0 -_1 -_1 )
+ 0.09046559989211556 * ( +_0 +_1 -_0 -_1 )
+ 0.33229086512764827 * ( +_0 +_1 -_1 -_0 )
+ 0.33785507740175813 * ( +_0 +_2 -_2 -_0 )
+ 0.09046559989211564 * ( +_0 +_2 -_3 -_1 )
+ 0.09046559989211556 * ( +_0 +_3 -_2 -_1 )
+ 0.33229086512764816 * ( +_0 +_3 -_3 -_0 )
...

qiskit_nature.drivers#

Esta sección trata exclusivamente de la migración de los controladores (drivers).

El contenido del submódulo drivers se ha dividido en varios lugares. La siguiente tabla resume dónde terminó cada uno de los componentes de qiskit_nature.drivers.second_quantization.

Componente antiguo

Ubicación nueva

BaseDriver

qiskit_nature.second_q.drivers.BaseDriver

BasisType

eliminado

ElectronicStructureDriver

qiskit_nature.second_q.drivers.ElectronicStructureDriver

ElectronicStructureDriverType

eliminado

ElectronicStructureMoleculeDriver

eliminado

FCIDumpDriver

qiskit_nature.second_q.formats.fcidump.FCIDump

GaussianDriver

qiskit_nature.second_q.drivers.GaussianDriver

HDF5Driver

eliminado

InitialGuess

qiskit_nature.second_q.drivers.InitialGuess

MethodType

qiskit_nature.second_q.drivers.MethodType

PSI4Driver

qiskit_nature.second_q.drivers.Psi4Driver

PyQuanteDriver

eliminado

PySCFDriver

qiskit_nature.second_q.drivers.PySCFDriver

Además, los dos componentes de qiskit_nature.drivers se movieron así:

Componente antiguo

Ubicación nueva

Molécula

qiskit_nature.second_q.formats.molecule_info.MoleculeInfo

UnitsType

qiskit_nature.units.DistanceUnit

Vale la pena agregar algunas notas:

  • Se eliminó el controlador para pyquante2 porque su código fuente no se ha actualizado durante más de 3 años. Originalmente, se admitía para habilitar el uso de Qiskit Nature en Windows; sin embargo, desde entonces psi4 también ha agregado compatibilidad con Windows y la integración del Subsistema de Windows para Linux ha abierto más posibilidades de desarrollo.

  • El HDF5Driver se eliminó a favor de admitir el QCSchema estandarizado (ver qiskit_nature.second_q.formats.qcschema).

  • El ElectronicStructureMoleculeDriver se eliminó porque nos dirigimos hacia un futuro con una integración más estrecha, similar a un complemento, con códigos clásicos, lo que hace que el concepto de controladores (drivers) donde Qiskit inicia una simulación clásica quede obsoleto. Todavía puedes usar los métodos .from_molecule(...) de los controladores restantes en combinación con la clase MoleculeInfo.

  • MoleculeInfo se ha convertido en un contenedor de datos puro y ya no admite grados de libertad.

  • MoleculeInfo ahora define por separado los atoms y las coords (coordenadas) a favor del enfoque previamente combinado de geometry.

Uso de controladores (drivers) que se migraron a qiskit_nature.second_q.drivers#

Previamente#

from qiskit_nature.drivers import Molecule
from qiskit_nature.drivers.second_quantization import PySCFDriver

molecule = Molecule(
    geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1
)

driver = PySCFDriver.from_molecule(molecule)

result = driver.run()
print(type(result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

Nuevo#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo

molecule = MoleculeInfo(["H", "H"], [(0.0, 0.0, 0.0), (0.0, 0.0, 0.735)], charge=0, multiplicity=1)

driver = PySCFDriver.from_molecule(molecule, basis="sto3g")

result = driver.run()
print(type(result))
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

¡Observa cómo los tipos de devolución difieren significativamente! Para obtener más información al respecto, asegúrate de leer la sección qiskit_nature.problems.

Uso de controladores (drivers) que se migraron a qiskit_nature.second_q.formats#

Previamente#

from qiskit_nature.drivers.second_quantization import FCIDumpDriver

path_to_fcidump = "aux_files/h2.fcidump"
driver = FCIDumpDriver(path_to_fcidump)

result = driver.run()
print(type(result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

Nuevo#

from qiskit_nature.second_q.formats.fcidump import FCIDump

path_to_fcidump = "aux_files/h2.fcidump"
fcidump = FCIDump.from_file(path_to_fcidump)
print(type(fcidump))

from qiskit_nature.second_q.formats.fcidump_translator import fcidump_to_problem

problem = fcidump_to_problem(fcidump)
print(type(problem))
<class 'qiskit_nature.second_q.formats.fcidump.fcidump.FCIDump'>
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

La razón para distinguir entre drivers y formats está motivada por el hecho de que el concepto de drivers (en el que Qiskit Nature inicia una simulación clásica a través de otro programa) quedará obsoleto al avanzar hacia una integración más estrecha con los códigos clásicos a través de complementos (plugins).

Sin embargo, admitir varios formats y convertirlos en objetos nativos o representaciones de Qiskit Nature es fundamental para permitir una rápida adopción e integración con otros códigos clásicos. La diferencia conceptual también se refleja, ya que cargar un problema desde un formato no ejecuta otro código, sino que simplemente carga los datos desde el disco.

qiskit_nature.transformers#

Esta sección trata exclusivamente de la migración de los transformadores.

La siguiente tabla resume dónde ha terminado cada uno de los componentes de qiskit_nature.transformers.

Componente antiguo

Ubicación nueva

BaseTransformer

qiskit_nature.second_q.transformers.BaseTransformer

ActiveSpaceTransformer

qiskit_nature.second_q.transformers.ActiveSpaceTransformer

FreezeCoreTransformer

qiskit_nature.second_q.transformers.FreezeCoreTransformer

Los transformadores aún conservan su funcionalidad de transformar el resultado de un controlador en una versión transformada del mismo. Sin embargo, dado que el tipo de salida de los drivers ha cambiado (ver arriba), también lo ha hecho el tipo de entrada y salida de nuestros transformers.

De forma realista, todo lo que necesitas hacer aquí es actualizar tus declaraciones de importación, como se muestra a continuación.

Previamente#

from qiskit_nature.drivers.second_quantization import PySCFDriver
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer

transformer = FreezeCoreTransformer()
driver = PySCFDriver()

transformed_result = transformer.transform(driver.run())
print(type(transformed_result))
<class 'qiskit_nature.properties.second_quantization.electronic.electronic_structure_driver_result.ElectronicStructureDriverResult'>

Nuevo#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

transformer = FreezeCoreTransformer()
driver = PySCFDriver()

transformed_result = transformer.transform(driver.run())
print(type(transformed_result))
<class 'qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem'>

El ElectronicStructureProblem (qiskit_nature.problems)#

Esta sección detalla todos los cambios en torno al ElectronicStructureProblem.

Podría decirse que el ElectronicStructureProblem es la clase que ha recibido los cambios más significativos, porque fue el principal motivador de esta refactorización. Para comenzar, la siguiente tabla resume los componentes electrónicos del nuevo módulo qiskit_nature.second_q.problems y muestra de dónde se originaron estas partes en el código anterior:

Nuevo componente

Ubicación antigua

BaseProblem

qiskit_nature.problems.second_quantization.BaseProblem

EigenstateResult

qiskit_nature.results.EigenstateResult

PropertiesContainer

similar a qiskit_nature.properties.GroupedProperty

ElectronicBasis

qiskit_nature.properties.second_quantization.electronic.bases.ElectronicBasis

ElectronicStructureProblem

qiskit_nature.problems.second_quantization.electronic.ElectronicStructureProblem

ElectronicPropertiesContainer

aun no existia

ElectronicStructureResult

qiskit_nature.results.ElectronicStructureResult

Previamente#

from qiskit_nature.drivers.second_quantization import PySCFDriver
from qiskit_nature.problems.second_quantization.electronic import ElectronicStructureProblem
from qiskit_nature.transformers.second_quantization.electronic import FreezeCoreTransformer

driver = PySCFDriver()
transformer = FreezeCoreTransformer()
problem = ElectronicStructureProblem(driver, transformers=[transformer])

# we trigger driver.run() implicitly like so:
second_q_ops = problem.second_q_ops()

hamiltonian_op = second_q_ops.pop("ElectronicEnergy")
aux_ops = second_q_ops

Nuevo#

from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.transformers import FreezeCoreTransformer

driver = PySCFDriver()

problem = driver.run()

transformer = FreezeCoreTransformer()

problem = transformer.transform(problem)

hamiltonian_op, aux_ops = problem.second_q_ops()

Para obtener más información sobre el nuevo y mejorado ElectronicStructureProblem, consulta el tutorial de estructura electrónica.

qiskit_nature.properties#

El módulo de propiedades se ha refactorizado y dividido en varias ubicaciones. En esta sección, solo nos centraremos en sus componentes electrónicos.

La siguiente tabla enlista dónde se ha movido cada componente de qiskit_nature.properties.

Componente antiguo

Ubicación nueva

Property

qiskit_nature.second_q.properties.SparseLabelOpsFactory

GroupedProperty

reemplazado por qiskit_nature.second_q.problems.PropertiesContainer

second_quantization.DriverMetadata

eliminado

second_quantization.electronic.ElectronicEnergy

qiskit_nature.second_q.hamiltonians.ElectronicEnergy

second_quantization.electronic.ElectronicDipoleMoment

qiskit_nature.second_q.properties.ElectronicDipoleMoment

second_quantization.electronic.AngularMomentum

qiskit_nature.second_q.properties.AngularMomentum

second_quantization.electronic.Magnetization

qiskit_nature.second_q.properties.Magnetization

second_quantization.electronic.ParticleNumber

qiskit_nature.second_q.properties.ParticleNumber

second_quantization.electronic.bases.ElectronicBasis

qiskit_nature.second_q.problems.ElectronicBasis

second_quantization.electronic.bases.ElectronicBasisTransform

qiskit_nature.second_q.transformers.BasisTransformer

second_quantization.electronic.integrals.IntegralProperty

eliminado

second_quantization.electronic.integrals.ElectronicIntegrals

reemplazado por qiskit_nature.second_q.operators.ElectronicIntegrals

second_quantization.electronic.integrals.OneBodyElectronicIntegrals

eliminado

second_quantization.electronic.integrals.TwoBodyElectronicIntegrals

eliminado

Te sugerimos que consultes el tutorial de estructura electrónica para obtener explicaciones más detalladas, pero dejaremos algunos comentarios aquí:

  • la ElectronicBasis ahora solo se rastrea en el ElectronicStructureProblem y no para cada operador individualmente

  • el BasisTransformer maneja las transformaciones de base centralmente desde el módulo second_q.transformers

  • los nuevos componentes second_q.properties no almacenan ningún dato que no sea necesario para la construcción del operador

  • la ElectronicEnergy (que siempre ha sido especial) está en el nuevo módulo second_q.hamiltonians para resaltar este rol especial

Si anteriormente creabas instancias personalizadas de Property utilizando, por ejemplo, tus propias integrales de uno y dos cuerpos, te sugerimos que consultes la documentación de las nuevas qiskit_nature.second_q.operators.ElectronicIntegrals. Muestra ejemplos de cómo hacer esto en Qiskit Nature v0.5.