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 |
|
BasisType |
eliminado |
ElectronicStructureDriver |
|
ElectronicStructureDriverType |
eliminado |
ElectronicStructureMoleculeDriver |
eliminado |
FCIDumpDriver |
|
GaussianDriver |
|
HDF5Driver |
eliminado |
InitialGuess |
|
MethodType |
|
PSI4Driver |
|
PyQuanteDriver |
eliminado |
PySCFDriver |
|
Además, los dos componentes de qiskit_nature.drivers
se movieron así:
Componente antiguo |
Ubicación nueva |
---|---|
Molécula |
|
UnitsType |
|
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 (verqiskit_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 claseMoleculeInfo
.MoleculeInfo
se ha convertido en un contenedor de datos puro y ya no admite grados de libertad.MoleculeInfo
ahora define por separado losatoms
y lascoords
(coordenadas) a favor del enfoque previamente combinado degeometry
.
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 |
|
ActiveSpaceTransformer |
|
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 |
---|---|
|
|
|
|
|
similar a |
|
|
|
|
|
aun no existia |
|
|
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 |
---|---|
|
|
|
reemplazado por |
|
eliminado |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
eliminado |
|
reemplazado por |
|
eliminado |
|
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 elElectronicStructureProblem
y no para cada operador individualmenteel
BasisTransformer
maneja las transformaciones de base centralmente desde el módulosecond_q.transformers
los nuevos componentes
second_q.properties
no almacenan ningún dato que no sea necesario para la construcción del operadorla
ElectronicEnergy
(que siempre ha sido especial) está en el nuevo módulosecond_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.