Fermión
qiskit_addon_sqd.fermion
Funciones para el estudio de sistemas fermiónicos.
SCIState
class SCIState(amplitudes, ci_strs_a, ci_strs_b, norb, nelec)
Bases: object
Las amplitudes y determinantes que describen un estado cuántico.
Parámetros
amplitudes
Tipo: ndarray
Una matriz donde len(ci_strs_a) y = len(ci_strs_b). amplitudes[i][j] es la amplitud del par de determinantes (ci_strs_a[i], ci_strs_b[j]).
El signo de cada amplitud sigue la convención que adopta PySCF, según la cual un determinante ordena sus operadores de creación de tal forma que cada operador de espín alfa preceda a cada operador de espín beta. rdm() y spin_square() pasarlas a PySCF, por lo que un solucionador que las ordene de forma diferente deberá aplicar la fase de reordenación antes de rellenar este campo. De lo contrario, esos métodos devuelven valores erróneos sin avisar, aunque las energías y las magnitudes de amplitud sigan pareciendo correctas.
ci_strs_a
Tipo: ndarray
Los determinantes alfa.
ci_strs_b
Tipo: ndarray
Los determinantes beta.
load
nelec
norb
Tipo: int
El número de orbitales espaciales.
orbital_occupancies
rdm
rdm(rank=1, spin_summed=False)
Calcula la matriz de densidad reducida.
Parámetros
Tipo de retorno
save
spin_square
SCIResult
class SCIResult(energy, sci_state, orbital_occupancies, rdm1=None, rdm2=None, carryover=None)
Bases: object
Resultado de un cálculo de SCI.
Parámetros
- energy (float)
- sci_state (SCIState | None)
- orbital_occupancies (tuple[ndarray, ndarray])
- rdm1 (ndarray | None)
- rdm2 (ndarray | None)
- carryover (tuple[ndarray, ndarray] | None)
carryover
Tipo: tuple[ndarray, ndarray] | None
Valor predeterminado: None
Las cadenas de CI que se mantendrán en la siguiente iteración, elegidas por el solucionador.
Un par (strings_a, strings_b) de matrices de cadenas CI de espín alfa y espín beta, cada una ordenada por peso marginal descendente. Tiene la misma forma que un subespacio, ya que es eso lo que se utiliza para construir las cuerdas.
Activa esta opción cuando el solucionador clasifique y seleccione los determinantes por sí mismo, algo para lo que un solucionador de valores propios que recorta su propio subespacio está perfectamente preparado. Cuando es None, diagonalize_fermionic_hamiltonian() selecciona el valor arrastrado de sci_state utilizando su argumento carryover_threshold , tal y como siempre ha hecho.
Ten en cuenta que el siguiente subespacio está generado por el producto cartesiano de las dos matrices, por lo que, por lo general, es más amplio que el conjunto de configuraciones que se clasificaron. La selección de las 150 configuraciones de mayor peso de un subespacio suele implicar cerca de 150 cadenas distintas de espín alfa y 150 cadenas distintas de espín beta, cuyo producto abarca aproximadamente 22 500 configuraciones. Utiliza el argumento max_dim de diagonalize_fermionic_hamiltonian() para acotar el resultado.
energy
Tipo: float
La energía de SCI.
orbital_occupancies
rdm1
Valor predeterminado: None
Matriz de densidad reducida de una partícula con suma de espín.
rdm2
Valor predeterminado: None
Matriz de densidad reducida de dos partículas con suma de espín.
sci_state
El estado de la lesión medular.
Esto puede ocurrir None cuando el solucionador no materializa el vector propio. En ese caso, el solucionador debe proporcionar carryover, ya que, de lo contrario, el bucle de recuperación de la configuración lo deduciría a partir de las amplitudes.
SubspacePolicy
class SubspacePolicy(*args, **kwargs)
Bases: Protocol
El calendario de una iteración de recuperación de la configuración.
Una política determina cómo utiliza una iteración las diagonalizaciones que se le proporcionan: cómo las configuraciones muestreadas se convierten en subespacios, si los resultados de una ronda de diagonalizaciones se refinan en una ronda posterior, qué resultado comunica la iteración y qué cadenas de CI sirven de semilla para la siguiente iteración.
Pasa una implementación como argumento policy de diagonalize_fermionic_hamiltonian(). El valor por defecto, StandardPolicy, diagonaliza los lotes submuestreados y conserva el mejor resultado. TrimPolicy filtra los lotes y diagonaliza los elementos supervivientes fusionados.
Una política determina qué cadenas contiene un subespacio. Las restricciones sobre la forma de un subespacio corresponden a la función que lo invoca, por lo que el bucle las aplica a cualquier resultado que devuelva la política: las configuraciones solicitadas a través de include_configurations se aplican a cada subespacio, se aplica la simetrización de espín cuando así se solicita y cada sector de espín se trunca a max_dim. Una política no las recibe ni puede anularlas.
Una política solo genera datos. Nunca se le pasa ningún valor y sci_solver nunca realiza la diagonalización por sí misma: devuelve refine() los subespacios que se van a diagonalizar y el bucle llama al solucionador con ellos.
Esto es importante en el contexto de la ejecución multiproceso. A diferencia de un sci_solver, al que acceden todos los procesos a la vez, una política se ejecuta únicamente en el proceso de control y sus valores de retorno se transmiten al resto; por lo tanto, dichos valores de retorno deben poder ser serializados. Por lo tanto, una política no debe llamar a qiskit_addon_sqd.processes.broadcast(), barrier(), ni a ninguna otra operación colectiva: los demás procesos no la están ejecutando y la llamada se bloquearía.
prepare_subspaces
prepare_subspaces(request)
Construye primero los subespacios para diagonalizar.
Parámetros
request (SubspaceRequest) – Las cadenas de bits, las cadenas de acarreo y los tamaños de lote a partir de los cuales se va a realizar la construcción.
Devuelve
Un par (strings_a, strings_b) por subespacio, cada uno de los cuales abarca el producto cartesiano de las dos matrices.
Tipo de retorno
refine
refine(results, round_index)
Decide si los resultados de una ronda dan lugar a una nueva ronda.
Parámetros
- results (list[SCIResult]) – Los resultados de la ronda que acaba de concluir, uno por subespacio.
- round_index (int) – El índice de esa ronda, contando desde cero.
Devuelve
Los subespacios para una ronda más, o None para detener el juego e informar de los resultados de esta ronda. Devolver subespacios en cada llamada provoca un error ValueError una vez que se alcanza el límite de rondas.
Tipo de retorno
select_carryover
select_carryover(result, *, symmetrize_spin=False)
Elige las cadenas de CI que servirán de semilla para la siguiente iteración.
Parámetros
- result (SCIResult) – El resultado elegido por
select_result(). - symmetrize_spin (bool) – Si los dos sectores de spin comparten una misma lista de cadenas. Al igual que en el caso de
SubspaceRequest.symmetrize_spin, esto se pasa como parámetro porque los sectores se fusionan antes de clasificarlos, por lo que no se puede aplicar después.
Devuelve
Las cadenas «spin-alpha» y «spin-beta», en orden descendente de peso, ya que ese es el orden que mantiene max_dim un truncamiento a.
Tipo de retorno
select_result
select_result(results)
Elige el resultado que muestra una iteración, de entre los de su ronda final.
El resultado elegido es el criterio con el que se evalúa la convergencia, el que se devuelve si su energía es la más baja observada y el que se obtiene select_carryover() .
Parámetros
Tipo de retorno
SubspaceRequest
class SubspaceRequest(bitstrings, probabilities, carryover_strings_a, carryover_strings_b, norb, nelec, samples_per_batch, num_batches, rng, iteration, symmetrize_spin)
Bases: object
Las entradas a con las que se SubspacePolicy construyen los subespacios de una iteración.
Parámetros
- bitstrings (ndarray)
- probabilities (ndarray)
- carryover_strings_a (ndarray)
- carryover_strings_b (ndarray)
- norb (int)
- nelec (tuple[int, int])
- samples_per_batch (int)
- num_batches (int)
- rng (Generator)
- iteration (int)
- symmetrize_spin (bool)
bitstrings
Tipo: ndarray
Las cadenas de bits preseleccionadas o recuperadas, en forma de matriz e 2D, bool con una cadena de bits por fila y la parte alfa concatenada a la derecha, de la siguiente manera: [b_N, ..., b_0, a_N, ..., a_0].
carryover_strings_a
Tipo: ndarray
Las cadenas CI de spin-alfa heredadas de la iteración anterior, ordenadas por orden descendente de peso. Vacío en la primera iteración.
carryover_strings_b
Tipo: ndarray
Las cadenas de intervalos de confianza (CI) de beta de espín se han mantenido de la iteración anterior. Es igual a carryover_strings_a cuando se aplicó la simetrización de espín.
iteration
Tipo: int
El índice de la iteración actual de recuperación de la configuración, contando desde cero.
nelec
norb
Tipo: int
El número de orbitales espaciales.
num_batches
Tipo: int
El número de lotes que hay que fabricar.
probabilities
Tipo: ndarray
Una probabilidad para cada una de las cadenas de bits.
rng
Tipo: Generator
El generador de números aleatorios del bucle.
Utiliza este generador en lugar de crear otro, y no lo reinicies: el seed argumento de es diagonalize_fermionic_hamiltonian() lo que hace que una ejecución sea reproducible, y controla únicamente este generador.
samples_per_batch
Tipo: int
El número de cadenas de bits que debe contener cada lote.
symmetrize_spin
Tipo: bool
Si los dos sectores de giro comparten una única lista de cadenas de CI.
Se trata de una restricción sobre la forma de un subespacio, que el bucle impone a cualquier resultado que devuelva una política. Esto aparece aquí porque la fusión de los sectores no es algo que se pueda aplicar a posteriori: la fusión se produce antes de que se clasifiquen las cadenas, de modo que la clasificación abarca ambos sectores a la vez, y concatenar dos listas clasificadas por separado daría lugar a un orden diferente. Por lo tanto, una política que clasifique cadenas debe tenerlo en cuenta. batch_to_ci_strings() lo hace por la misma razón.
StandardPolicy
class StandardPolicy(*, carryover_threshold=0.0001)
Bases: object
Por defecto SubspacePolicy: diagonalizar los lotes y quedarse con el mejor.
En cada iteración se realizan submuestreos de lotes num_batches de cadenas samples_per_batch de bits, se diagonaliza cada uno de ellos y se indica la energía más baja entre todas ellas. Las cadenas de ese resultado cuyas amplitudes superan el valor de carryover_threshold «seed» sirven para iniciar la siguiente iteración.
Este es el comportamiento de diagonalize_fermionic_hamiltonian() cuando no se policy especifica ningún; pasar una instancia de forma explícita equivale a omitirla.
Inicializar la política.
Parámetros
carryover_threshold (float) – Umbral para el traspaso de cadenas de bits con un peso CI elevado. Las cadenas de CI cuya amplitud sea superior a este valor se mantienen.
prepare_subspaces
prepare_subspaces(request)
Realiza un submuestreo de los lotes de forma independiente y construye un subespacio a partir de cada uno de ellos.
Parámetros
request (SubspaceRequest)
Tipo de retorno
refine
refine(results, round_index)
Detente tras la primera ronda, en la que se diagonalizó cada lote.
Los argumentos no se utilizan porque este calendario nunca solicita una segunda ronda; forman parte de la interfaz SubspacePolicy .
Parámetros
Tipo de retorno
select_carryover
select_carryover(result, *, symmetrize_spin=False)
Conserva las cuerdas cuyas amplitudes superen el umbral.
Parámetros
Tipo de retorno
select_result
batch_to_ci_strings
batch_to_ci_strings(batch, norb, carryover_strings_a=None, carryover_strings_b=None, *, symmetrize_spin=False)
Convierte un lote de cadenas de bits en un par de matrices de cadenas CI por espín.
Las cadenas de cada sector de giro se devuelven en orden descendente según el número de veces que se han muestreado, con las cadenas que se repiten situadas antes que ellas. Ese orden es el que se mantiene cuando posteriormente se realiza un truncamiento a una dimensión máxima, por lo que es importante.
Este es el paso que necesita una política de subespacio para convertir cadenas de bits submuestreadas en un subespacio, y se expone para que una política no tenga que volver a implementarlo.
Parámetros
- batch (ndarray) – Una matriz 2D de cadenas
boolde bits, una por fila, con la parte alfa concatenada a la derecha, así:[b_N, ..., b_0, a_N, ..., a_0]. - norb (int) – El número de orbitales espaciales.
- carryover_strings_a (ndarray | None) – Cadenas CI de Spin-alpha que deben colocarse antes de las muestreadas, en el orden en que deben mantenerse. Por defecto, no hay ninguno.
- carryover_strings_b (ndarray | None) – Lo mismo ocurre con el espín beta. Cuando
symmetrize_spinse establece, esto se ignora, ya que los dos sectores contienen las mismas cadenas. - symmetrize_spin (bool) – Si se deben fusionar los dos sectores de spin en una única lista de cadenas, que se utilizará para ambos. La fusión se produce antes de que se clasifiquen las cadenas, de modo que la clasificación se realiza sobre ambos sectores a la vez, en lugar de dentro de cada uno de ellos.
Devuelve
Las matrices de cadenas de CI de espín alfa y espín beta. Cuando symmetrize_spin se establece, ambos son el mismo array.
Tipo de retorno
bitstring_matrix_to_ci_strs
bitstring_matrix_to_ci_strs(bitstring_matrix, open_shell=False)
Convierte las cadenas de bits (filas) de bitstring_matrix en representaciones enteras de los determinantes.
Esta función separa cada cadena de bits en bitstring_matrix por la mitad, las traduce a representaciones de enteros y, finalmente, las añade a sus respectivas listas (spin-up o spin-down). Estas listas se ordenan y se emiten desde esta función.
Parámetros
- bitstring_matrix (ndarray) – Una matriz 2D de representaciones
boolde valores de bits, de forma que cada fila representa una única cadena de bits - open_shell (bool) – Un indicador que especifica si las configuraciones únicas de las mitades izquierda y derecha de las cadenas de bits deben mantenerse separadas. En ese caso
False, las configuraciones de las mitades izquierda y derecha de las cadenas de bits se combinan en un único conjunto de configuraciones únicas. Ese conjunto combinado se devolverá tanto para la cadena de bits izquierda como para la derecha.
Devuelve
Una tupla length-2 de listas de determinantes que representan las mitades derecha (spin-up) e izquierda (spin-down) de las cadenas de bits, respectivamente.
Tipo de retorno
diagonalize_fermionic_hamiltonian
diagonalize_fermionic_hamiltonian(one_body_tensor, two_body_tensor, bit_array, samples_per_batch, norb, nelec, *, num_batches=1, energy_tol=1e-08, occupancies_tol=1e-05, max_iterations=100, sci_solver=None, policy=None, symmetrize_spin=False, max_dim=None, include_configurations=None, initial_occupancies=None, carryover_threshold=None, callback=None, seed=None)
Ejecuta el algoritmo de diagonalización cuántica basado en muestras (SQD).
Parámetros
-
one_body_tensor (ndarray) – El tensor de un cuerpo del Hamiltoniano.
-
two_body_tensor (ndarray) – El tensor de dos cuerpos del Hamiltoniano.
-
bit_array (BitArray |ndarray) – Matriz de cadenas de bits muestreadas, que se proporciona como una matriz booleana de Qiskit o
BitArraycomo una matriz booleana bidimensional de NumPy. Cada cadena de bits debe tener las partes alfa y beta concatenadas, con la parte alfa concatenada a la derecha, de esta forma:[b_N, ..., b_0, a_N, ..., a_0]. -
samples_per_batch (int) – El número de cadenas de bits que se deben incluir en cada lote de cadenas de bits sometidas a submuestreo.
-
norb (int) – El número de orbitales espaciales.
-
nelec (tuple[int, int]) – El número de electrones alfa y beta.
-
num_batches (int) – El número de lotes que se van a submuestrear en cada iteración de recuperación de la configuración. Este argumento determina indirectamente las dimensiones de los subespacios de diagonalización. Un valor más alto dará lugar a dimensiones de subespacio mayores.
-
energy_tol (float) – Tolerancia numérica para la convergencia de la energía. Si la variación de energía entre iteraciones es inferior a este valor, el bucle de recuperación de la configuración se cerrará, siempre que las ocupaciones también hayan convergido (véase el
occupancies_tolargumento). -
occupancies_tol (float) – Tolerancia numérica para la convergencia de las ocupaciones orbitales medias. Si la variación máxima del valor absoluto de la ocupación media de una órbita entre iteraciones es inferior a este valor, el bucle de recuperación de la configuración se cerrará, siempre que la energía también haya convergido (véase el argumento
energy_tol). -
max_iterations (int) – Límite del número de iteraciones de recuperación de la configuración.
-
sci_solver (Callable[[list[tuple[ndarray, ndarray]], ndarray, ndarray, int, tuple[int, int]], list[SCIResult]] | None) –
Función del solucionador de interacciones de configuración seleccionada.
Entradas:
- Lista de pares (strings_a, strings_b) de matrices de cadenas CI de espín alfa y cadenas CI de espín beta, cuyo producto cartesiano constituye la base del subespacio en el que se llevará a cabo la diagonalización. Cada subespacio de una iteración se transmite en una sola llamada, de modo que el solucionador pueda diagonalizarlos simultáneamente en lugar de uno tras otro.
- Tensor de un cuerpo del Hamiltoniano.
- Tensor de dos cuerpos del Hamiltoniano.
- El número de orbitales espaciales.
- Un par (n_alpha, n_beta) que indica el número de electrones alfa y beta.
Resultado: Lista de
SCIResult, uno por cada subespacio proporcionado. Cualquier vector propio que devuelva debe respetar la convención de signos descrita enSCIState.amplitudes.Un solucionador que selecciona sus propias cadenas de CI de arrastre puede devolverlas en
SCIResult.carryover, en cuyo caso se utilizan en lugar de las que esta función seleccionaría mediantecarryover_threshold. Un solucionador de este tipo puede dejarSCIResult.sci_statecomoNone, de modo que nunca tenga que devolver el vector propio.TrimPolicyHace las dos cosas.Un solucionador también puede devolver menos resultados que los subespacios que se le han proporcionado; así es como un solucionador que fusiona sus subespacios informa de la única diagonalización que ha realizado sobre ellos.
Consulte la nota que figura a continuación para conocer la semántica que se aplica cuando esta función se invoca de forma conjunta desde varios procesos.
-
policy (SubspacePolicy | None) –
El esquema de cada iteración: cómo las configuraciones muestreadas se convierten en subespacios, si una ronda de diagonalizaciones da lugar a otra, qué resultado arroja la iteración y qué cadenas de CI sirven de semilla para la siguiente. Consulte
SubspacePolicy.El valor por defecto es
StandardPolicy, lo que diagonaliza los lotes submuestreados y conserva el mejor resultado.TrimPolicyEn su lugar, filtra los lotes y diagonaliza los supervivientes fusionados.Una política devuelve los subespacios y esta función los
sci_solverutiliza. Ambos son independientes, por lo que cualquier política funciona con cualquier solucionador. -
symmetrize_spin (bool) – Si se deben fusionar siempre las cadenas de integrales de condensación (CI) de espín alfa y espín beta en una única lista, de modo que el subespacio de diagonalización sea invariante con respecto al intercambio entre el espín alfa y el espín beta. Para ello es necesario que el número de electrones alfa y beta sea igual, así como que haya un único valor compartido
max_dimpor ambos sectores de espín; de lo contrario, se produce un error. La invariancia garantiza que el estado devuelto no mezcle componentes de espín total par e impar, pero no garantiza que el estado sea un vector propio del operador de espín total . Cabe señalar que la fusión de las dos listas aumenta el número de cadenas CI en cada sector de espín hasta en un factor de dos, por lo que la dimensión del subespacio de diagonalización puede crecer hasta en un factor de cuatro (menos cuando las listas se solapan, lo cual es habitual). Este crecimiento sigue estando sujeto al límitemax_dim, si es que se establece alguno. -
max_dim (int |tuple[int, int] | None) –
Límite de la dimensión de los sectores de espín del subespacio SCI. Puede ser cualquiera:
- Una tupla
(max_dim_a, max_dim_b)de enteros que dan límites separados para los sectores de espín-alfa y espín-beta. En este caso, la dimensión del subespacio SCI no superarámax_dim_a * max_dim_b. - Un único número entero que especifica un límite que se utilizará para los sectores de espín-alfa y espín-beta. En este caso, la dimensión del subespacio SCI no superará
max_dim**2. Noneen cuyo caso no se establece ningún límite.
Obsérvese que el límite de dimensión se establece en el sector o sectores de espín, mientras que la dimensión completa del subespacio SCI es el producto de las dimensiones de los sectores de espín individuales.
- Una tupla
-
include_configurations (list[int] | tuple[list[int], list[int]] | ndarray | None) – Configuraciones que deben incluirse siempre en el subespacio de diagonalización. Puedes especificar bien una única lista de cadenas de espín único que se utilizará para ambos sectores de espín, bien un par (alpha_strings, beta_strings) de listas de cadenas de espín único, una para cada espín.
-
initial_occupancies (tuple[ndarray, ndarray] | None) – Estimación inicial de los niveles de ocupación medios de los orbitales.
-
carryover_threshold (float | None) –
Umbral para trasladar cadenas de bits con un peso de CI elevado de una iteración de recuperación de la configuración a la siguiente. Todas las cadenas de CI de un solo giro asociadas a configuraciones cuyo coeficiente tenga un valor absoluto superior a este umbral se incluirán en el subespacio de diagonalización para la siguiente iteración. Un umbral más bajo conservará más configuraciones, lo que dará lugar a un subespacio más amplio y, por lo tanto, a una diagonalización más costosa. El valor predeterminado es
1e-4.Se trata de una configuración de la política predeterminada, que selecciona el traspaso mediante el establecimiento de umbrales de amplitud. Otra política lo elige a su manera, por lo que al pasar tanto esto como se aumenta
policyValueError;StandardPolicyen su lugar, pasa el umbral a si lo estás creando de forma explícita. -
callback (Callable[[list[SCIResult]], None] | None) – Una función de llamada de retorno que se ejecutará tras cada iteración de recuperación de la configuración. A la función se le pasará el resultado de la función sci_solver, que es una lista de tripletas (energía, sci_state, ocupaciones), en la que cada tripleta contiene el resultado de una diagonalización.
-
seed (Generator |int | None) – Una semilla para el generador de números pseudoaleatorios.
Devuelve
La estimación de la energía y el estado SCI con esa energía.
Tipo de retorno
Esta función admite la ejecución colectiva multiproceso (SPMD) mediante MPI, con un único hilo que controla cada proceso (MPI_THREAD_FUNNELED o menos). Cuando se invoca de forma colectiva desde todos los procesos, los argumentos deben coincidir entre todos ellos, y se aplica la siguiente semántica:
- El paso
sci_solveres la única operación colectiva: todos los procesos participan en él, por lo que una implementaciónsci_solverpuede distribuir el trabajo entre todos los procesos. Los pasos restantes del ciclo de configuración-recuperación (preparación de las cadenas de CI, procesamiento de los resultados de la diagonalización y comprobación de la convergencia) no cuentan con una implementación distribuida y se llevan a cabo únicamente en el proceso de control. - El
callback, si se proporciona, solo se ejecuta en el proceso de control. - El valor devuelto es el mismo en todos los procesos: el resultado final se transmite desde el proceso de control a todos los rangos.
- Solo se tienen en cuenta los resultados que
sci_solverdevuelve un colectivo en el proceso de control; lo que devuelve en los demás procesos se ignora por completo y no tiene por qué ser significativo. Esto permite que un solucionador deje la energía, el estado y las ocupaciones de cada diagonalización en el proceso que las haya calculado, en lugar de agruparlas en cada rango. Un solucionador que haga esto debe asegurarse, no obstante, de que el proceso de control reciba un resultado para cada subespacio, recopilándolos de todos los grupos de procesos si los ha distribuido.
Que el programa que realiza la llamada se ejecute bajo MPI depende de la versión que se sci_solver esté utilizando. Un «colectivo» sci_solver, tal y como se ha descrito anteriormente, espera que el programa se ejecute de forma colectiva en todos los procesos. Otras implementaciones requieren que el programa que realiza la llamada se ejecute como un único proceso, fuera de cualquier entorno MPI/SPMD. Es posible que algunas de estas implementaciones gestionen su propio paralelismo de forma interna, por ejemplo, ejecutándose ellas mpirun mismas. El valor por defecto no sci_solver se distribuye y entra dentro de esta última categoría.
No es necesario que una implementación sci_solver colectiva genere una excepción en un único proceso cuando se encuentra con un error; en su lugar, puede seguir una semántica de «fail-stop» para el contexto de ejecución en su conjunto, interrumpiendo todos los procesos de forma colectiva. (Esto describe lo que se permite que haga dicha implementación, no el comportamiento por defecto sci_solver.)
Dado que cada subespacio de una iteración se procesa en una sola llamada sci_solver , una implementación colectiva puede dividir los procesos en grupos y diagonalizar varios subespacios a la vez —un grupo por subespacio—, en lugar de asignar a cada subespacio todos los procesos por turnos. La forma de hacerlo es responsabilidad de la propia implementación: este paquete no divide los procesos, y nada en su interfaz los describe. Una implementación que sí los separe debe limitar sus operaciones colectivas al grupo que está realizando una diagonalización determinada, y no debe utilizar ni qiskit_addon_sqd.processes.broadcast() qiskit_addon_sqd.processes.barrier() para tal fin, ya que estos operan sobre todos los procesos y no sobre un grupo.
El número de veces que se invoca al solucionador por iteración, y el número de subespacios, viene determinado por policy. Con TrimPolicy, por ejemplo, se llama dos veces: una vez con cada lote y otra vez con el subespacio único fusionado. Por lo tanto, un solucionador que divide los procesos solo necesita una de esas divisiones, que puede crear en la primera llamada y reutilizar, en lugar de volver a crearla cada vez. Ten en cuenta también que el número de subespacios es el mismo en todos los procesos, ya que se transmiten antes de que se llame al solucionador. Esto es importante porque la división de los procesos es, en sí misma, una operación colectiva: todos los procesos deben participar y ponerse de acuerdo sobre cómo se lleva a cabo dicha división. Un solucionador puede basar esa decisión con total seguridad en el número de subespacios que ha recibido, pero no en ningún otro factor que pueda variar de un proceso a otro.
enlarge_batch_from_transitions
enlarge_batch_from_transitions(bitstring_matrix, transition_operators)
Aplica el conjunto de operadores de transición a las configuraciones representadas en bitstring_matrix.
Parámetros
- bitstring_matrix (ndarray) – Una matriz 2D de representaciones
boolde valores de bits de forma que cada fila representa una única cadena de bits. - transition_operators (ndarray) – Una matriz 1D o 2D
I,+,-, yncadenas que representan la acción de los operadores de identidad, creación, aniquilación o número. Cada fila representa un operador de transición.
Devuelve
Matriz de cadenas de bits que representa el conjunto aumentado de configuraciones electrónicas tras aplicar los operadores de excitación.
Tipo de retorno
solve_fermion
solve_fermion(bitstring_matrix, /, hcore, eri, *, open_shell=False, spin_sq=None, shift=0.1, **kwargs)
Aproximar el estado básico dadas las integrales moleculares y un conjunto de configuraciones electrónicas.
Parámetros
-
bitstring_matrix (tuple[ndarray, ndarray] | ndarray) –
Conjunto de configuraciones que definen el subespacio en el que se proyectará y diagonalizará el hamiltoniano.
Puede especificarse de dos maneras:
- Matriz de cadenas de bits: Una 2D
numpy.ndarrayde valoresbool, donde cada fila representa una cadena de bits. Las configuraciones de spin-up deben ocupar los índices de columna(N, N/2], y las configuraciones de spin-down deben ocupar los índices de columna(N/2, 0], dondeNes el número de qubits. - Cadenas CI: Una tupla de dos secuencias que contienen representaciones enteras de determinantes de spin-up y spin-down, respectivamente. El formato esperado es
([a_str_0, ..., a_str_N], [b_str_0, ..., b_str_M]).
- Matriz de cadenas de bits: Una 2D
-
hcore (ndarray) – Matriz hamiltoniana central que representa las integrales de un solo electrón
-
eri (ndarray) – Integrales de repulsión electrónica que representan integrales de dos electrones
-
open_shell (bool) – Un indicador que especifica si las configuraciones de las mitades izquierda y derecha de las cadenas de bits deben mantenerse separadas. Si
False, las cadenas CI de las mitades izquierda y derecha de las cadenas de bits se combinan en un único conjunto de configuraciones únicas y se utilizan tanto para el subespacio alfa como para el subespacio beta. -
spin_sq (float | None) – Valor objetivo del cuadrado del espín total para el estado fundamental, . Si
None, no se impondrá ningún espín. -
shift (float) – Desplazamiento de nivel para estados con espín diferente.
-
**kwargs - Argumentos de palabra clave para pasar a pyscf.fci.selected_ci.kernel_fixed_space
Devuelve
- Energía mínima del cálculo SCI
- El estado básico de SCI
- Tupla que contiene las ocupaciones orbitales de los orbitales spin-up y spin-down. Formateado como:
(array([occ_a_0, ..., occ_a_N]), array([occ_b_0, ..., occ_b_N])) - Valor esperado del espín al cuadrado
Tipo de retorno
tupla [ float, SCIState, tupla [ ndarray, ndarray ], float ]
solve_sci
solve_sci(ci_strings, one_body_tensor, two_body_tensor, norb, nelec, *, spin_sq=None, **kwargs)
Diagonalizar el Hamiltoniano en el subespacio definido por las cadenas CI.
Parámetros
-
ci_strings (tuple[ndarray, ndarray]) – Par (strings_a, strings_b) de matrices de cadenas CI de espín alfa y cadenas CI de espín beta, cuyo producto cartesiano constituye la base del subespacio en el que se llevará a cabo la diagonalización.
-
one_body_tensor (ndarray) – El tensor de un cuerpo del Hamiltoniano.
-
two_body_tensor (ndarray) – El tensor de dos cuerpos del Hamiltoniano.
-
norb (int) – El número de orbitales espaciales.
-
nelec (tuple[int, int]) – El número de electrones alfa y beta.
-
spin_sq (float | None) – Valor objetivo del cuadrado del espín total en el estado fundamental. En ese caso
None, no se impondrá ningún efecto. -
**...de las cargas.
Argumentos de palabra clave para pasar a pyscf.fci.selected_ci.kernel_fixed_space
Devuelve
El resultado de la diagonalización.
Tipo de retorno
solve_sci_batch
solve_sci_batch(ci_strings, one_body_tensor, two_body_tensor, norb, nelec, *, spin_sq=None, **kwargs)
Diagonalizar el Hamiltoniano en subespacios.
Parámetros
-
ci_strings (list[tuple[ndarray, ndarray]]) – Lista de pares (strings_a, strings_b) de matrices de cadenas CI de espín alfa y cadenas CI de espín beta, cuyo producto cartesiano constituye la base del subespacio en el que se llevará a cabo la diagonalización.
-
one_body_tensor (ndarray) – El tensor de un cuerpo del Hamiltoniano.
-
two_body_tensor (ndarray) – El tensor de dos cuerpos del Hamiltoniano.
-
norb (int) – El número de orbitales espaciales.
-
nelec (tuple[int, int]) – El número de electrones alfa y beta.
-
spin_sq (float | None) – Valor objetivo del cuadrado del espín total en el estado fundamental. En ese caso
None, no se impondrá ningún efecto. -
**...de las cargas.
Argumentos de palabra clave para pasar a pyscf.fci.selected_ci.kernel_fixed_space
Devuelve
Los resultados de las diagonalizaciones en los subespacios dados por ci_strings.
Tipo de retorno
optimize_orbitals
optimize_orbitals(bitstring_matrix, /, hcore, eri, k_flat, *, open_shell=False, spin_sq=0.0, num_iters=10, num_steps_grad=10000, learning_rate=0.01, **kwargs)
Optimizar los orbitales para producir un estado fundamental mínimo.
El proceso consiste en iterar 3 pasos:
Para num_iters iteraciones:
- Gira las integrales con respecto a los parámetros,
k_flat - Diagonalizar y aproximar la energía del estado base y las amplitudes de la función de onda
- Optimizar
k_flatutilizando el descenso de gradiente y las amplitudes de la función de onda encontradas en el paso 2
Consulte Sec. II A 4 para una discusión más detallada sobre esta técnica de optimización orbital.
La función qiskit_addon_sqd.fermion.optimize_orbitals() ha quedado obsoleta a partir de la versión qiskit-addon-sqd 0.13.0. Se eliminará no antes del v0.15.0. El paquete ffsim ya admite la optimización orbital. Consulta /addons/qiskit-addon-sqd/guides /opt imize-orbitals para obtener una guía sobre cómo optimizar la base hamiltoniana con ffsim.
Parámetros
-
bitstring_matrix (tuple[ndarray, ndarray] | ndarray) –
Conjunto de configuraciones que definen el subespacio en el que se proyectará y diagonalizará el hamiltoniano.
Puede especificarse de dos maneras:
- Matriz de cadenas de bits: Una 2D
numpy.ndarrayde valoresbool, donde cada fila representa una cadena de bits. Las configuraciones de spin-up deben ocupar los índices de columna(N, N/2], y las configuraciones de spin-down deben ocupar los índices de columna(N/2, 0], dondeNes el número de qubits. - Cadenas CI: Una tupla de dos secuencias que contienen representaciones enteras de determinantes de spin-up y spin-down, respectivamente. El formato esperado es
([a_str_0, ..., a_str_N], [b_str_0, ..., b_str_M]).
- Matriz de cadenas de bits: Una 2D
-
hcore (ndarray) – Matriz hamiltoniana central que representa las integrales de un solo electrón
-
eri (ndarray) – Integrales de repulsión electrónica que representan integrales de dos electrones
-
k_flat (ndarray) – 1D matriz que define la transformada orbital,
K. La matriz debe especificar el triángulo superior del operador de transformación antisimétrica en orden fila-mayor, excluyendo la diagonal. -
open_shell (bool) – Un indicador que especifica si las configuraciones de las mitades izquierda y derecha de las cadenas de bits deben mantenerse separadas. Si
False, las cadenas CI de las mitades izquierda y derecha de las cadenas de bits se combinan en un único conjunto de configuraciones únicas y se utilizan tanto para el subespacio alfa como para el subespacio beta. -
spin_sq (float) – Valor objetivo del cuadrado del espín total en el estado fundamental
-
num_iters (int) – Número de iteraciones de optimización orbital que se deben realizar
-
num_steps_grad (int) – El número de pasos de descenso por gradiente que se deben realizar durante cada iteración de optimización
-
learning_rate (float) – La tasa de aprendizaje que se utilizará durante el descenso por gradiente
-
**...de las cargas.
Argumentos de palabra clave para pasar a pyscf.fci.selected_ci.kernel_fixed_space
Devuelve
- La energía del estado base encontrada durante la última iteración de optimización
- Una matriz optimizada 1D que define la transformada orbital
- Tupla que contiene las ocupaciones orbitales de los orbitales spin-up y spin-down. Formateado como:
(array([occ_a_0, ..., occ_a_N]), array([occ_b_0, ..., occ_b_N]))
Tipo de retorno
rotate_integrals
rotate_integrals(hcore, eri, k_flat)
Realiza una transformada de semejanza sobre las integrales.
La transformación se describe como:
Para más información sobre cómo y se generan a partir de k_flat y se aplican a las integrales de uno y dos cuerpos, consulte Sec. II A 4.
La función qiskit_addon_sqd.fermion.rotate_integrals() ha quedado obsoleta a partir de la versión qiskit-addon-sqd 0.13.0. Se eliminará no antes del v0.15.0. El paquete ffsim ya admite la optimización orbital. Consulta /addons/qiskit-addon-sqd/guides /opt imize-orbitals para obtener una guía sobre cómo optimizar la base hamiltoniana con ffsim.
Parámetros
- hcore (ndarray) – Matriz hamiltoniana central que representa las integrales de un solo electrón
- eri (ndarray) – Integrales de repulsión electrónica que representan integrales de dos electrones
- k_flat (ndarray) – 1D matriz que define la transformada orbital,
K. La matriz debe especificar el triángulo superior del operador de transformación antisimétrica en orden fila-mayor, excluyendo la diagonal.
Devuelve
- La matriz hamiltoniana del núcleo rotada
- La matriz ERI rotada
Tipo de retorno