Skip to main content
IBM Quantum Platform

Fermion

qiskit_addon_sqd.fermion

Fonctions pour l'étude des systèmes fermioniques.

SCIState

class SCIState(amplitudes, ci_strs_a, ci_strs_b, norb, nelec)

GitHub

Bases : object

Les amplitudes et les déterminants décrivant un état quantique.

Paramètres

amplitudes

Type : ndarray

Un tableau M×NM \times NM=M = len(ci_strs_a) et NN = len(ci_strs_b). amplitudes[i][j] est l'amplitude de la paire de déterminants (ci_strs_a[i], ci_strs_b[j]).

ci_strs_a

Type : ndarray

Les déterminants alpha.

ci_strs_b

Type : ndarray

Les déterminants du bêta.

load

classmethod load(filename)

GitHub

Charger un objet SCIState à partir d'un fichier.npz.

nelec

Type : tuple[int, int]

Le nombre d'électrons alpha et bêta.

norb

Type : int

Le nombre d'orbitales spatiales.

orbital_occupancies

orbital_occupancies()

GitHub

Occupations orbitales moyennes.

Type de retour

tuple [*ndarray*, ndarray ]

rdm

rdm(rank=1, spin_summed=False)

GitHub

Calculer la matrice de densité réduite.

Paramètres

Type de retour

ndarray

save

save(filename)

GitHub

Enregistrer l'objet SCIState dans un fichier.npz.

spin_square

spin_square()

GitHub

Retour au carré.

Type de retour

Float

bitstring_matrix_to_ci_strs

bitstring_matrix_to_ci_strs(bitstring_matrix, open_shell=False)

GitHub

Convertit les chaînes de bits (lignes) d'un site bitstring_matrix en représentations entières des déterminants.

Cette fonction sépare en deux chaque chaîne de bits dans bitstring_matrix , les traduit en représentations entières et les ajoute finalement à leurs listes respectives (spin-up ou spin-down). Ces listes sont triées et éditées par cette fonction.

Paramètres

  • bitstring_matrix (ndarray) – Un tableau 2D de représentations bool de valeurs de bits, chaque ligne représentant une chaîne de bits unique
  • open_shell (bool) – Un drapeau indiquant si les configurations uniques des moitiés gauche et droite des chaînes de bits doivent être séparées. Si False, les configurations des moitiés gauche et droite des chaînes de bits sont combinées en un seul ensemble de configurations uniques. Cet ensemble combiné sera renvoyé pour les chaînes de bits de gauche et de droite.

Retours

Un tuple length-2 de listes de déterminants représentant les moitiés droite (spin-up) et gauche (spin-down) des chaînes de bits, respectivement.

Type de retour

tuple [*ndarray*, ndarray ]

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, symmetrize_spin=False, max_dim=None, include_configurations=None, initial_occupancies=None, carryover_threshold=0.0001, callback=None, seed=None)

GitHub

Exécuter l'algorithme de diagonalisation quantique basée sur l'échantillon (SQD).

Paramètres

  • one_body_tensor (ndarray) – Le tenseur à un corps de l'hamiltonien.

  • two_body_tensor (ndarray) – Le tenseur à deux corps de l'hamiltonien.

  • bit_array (BitArray) – Tableau de chaînes de bits échantillonnées. Chaque chaîne de bits doit comporter la partie alpha et la partie bêta concaténées ensemble, la partie alpha étant concaténée du côté droit, comme suit : [b_N, ..., b_0, a_N, ..., a_0].

  • samples_per_batch (int) – Le nombre de chaînes de bits à inclure dans chaque lot de chaînes de bits sous-échantillonné.

  • norb (int) – Le nombre d'orbitales spatiales.

  • nelec (tuple[int, int]) – Le nombre d'électrons alpha et bêta.

  • num_batches (int) – Le nombre de lots à sous-échantillonner dans chaque itération de récupération de la configuration. Cet argument contrôle indirectement les dimensions des sous-espaces de diagonalisation. Une valeur plus élevée permet d'obtenir un sous-espace de plus grande dimension.

  • energy_tol (float) – Tolérance numérique pour la convergence de l'énergie. Si le changement d'énergie entre les itérations est inférieur à cette valeur, la boucle de récupération de la configuration se termine, si les occupations ont également convergé (voir l'argument occupancies_tol ).

  • occupancies_tol (float) – Tolérance numérique pour la convergence des occupations orbitales moyennes. Si la variation maximale en valeur absolue de l'occupation moyenne d'une orbitale entre les itérations est inférieure à cette valeur, la boucle de récupération de la configuration se termine, si l'énergie a également convergé (voir l'argument energy_tol ).

  • max_iterations (int) – Limite du nombre d'itérations de récupération de la configuration.

  • sci_solver (Callable[[list[tuple[ndarray, ndarray]], ndarray, ndarray, int, tuple[int, int]], list[SCIResult]] | None) –

    Fonction de résolution de l'interaction de la configuration sélectionnée.

    Entrées :

    • Liste de paires (strings_a, strings_b) de tableaux de chaînes CI de spin-alpha et de chaînes CI de spin-bêta dont le produit cartésien donne la base du sous-espace dans lequel effectuer une diagonalisation. Une liste est transmise pour permettre à la fonction de résolution d'effectuer les diagonalisations en parallèle.
    • Tenseur à un corps de l'hamiltonien.
    • Tenseur à deux corps de l'hamiltonien.
    • Le nombre d'orbitales spatiales.
    • Une paire (n_alpha, n_beta) indiquant le nombre d'électrons alpha et bêta.

    Résultat : Liste de triplets (énergie, sci_état, occupations), où chaque triplet contient le résultat de la diagonalisation correspondante.

  • symmetrize_spin (bool) – Indique s'il faut toujours fusionner les chaînes de CI de spin alpha et de spin bêta en une seule liste, de sorte que le sous-espace de diagonalisation soit invariant par rapport à l'échange du spin alpha avec le spin bêta.

  • max_dim (int |tuple[int, int] | None) –

    Limite de la dimension des secteurs de spin du sous-espace SCI. Il peut s'agir de l'un ou l'autre :

    • Un tuple (max_dim_a, max_dim_b) d'entiers donnant des limites distinctes pour les secteurs spin-alpha et spin-bêta. Dans ce cas, la dimension du sous-espace SCI ne dépassera pas max_dim_a * max_dim_b.
    • Un seul entier spécifiant une limite qui sera utilisée pour les secteurs spin-alpha et spin-bêta. Dans ce cas, la dimension du sous-espace SCI ne dépassera pas max_dim**2.
    • Nonedans ce cas, aucune limite n'est fixée.

    Notez que la limite de dimension est fixée sur le(s) secteur(s) de spin, tandis que la dimension totale du sous-espace SCI est le produit des dimensions des secteurs de spin individuels.

  • include_configurations (list[int] | tuple[list[int], list[int]] | ndarray | None) – Configurations à toujours inclure dans le sous-espace de diagonalisation. Vous pouvez spécifier soit une liste unique de chaînes à spin unique à utiliser pour les deux secteurs de spin, soit une paire (alpha_strings, beta_strings) de listes de chaînes à spin unique, une pour chaque spin.

  • initial_occupancies (tuple[ndarray, ndarray] | None) – Estimation initiale de l'occupation moyenne des orbitales.

  • carryover_threshold (float) – Seuil de report des chaînes de bits ayant un poids important dans l'IC d'une itération de récupération de la configuration à l'autre. Toutes les chaînes de CI à un seul spin associées aux configurations dont le coefficient a une valeur absolue supérieure à ce seuil seront incluses dans le sous-espace de diagonalisation pour l'itération suivante. Un seuil plus petit retiendra plus de configurations, ce qui conduira à un sous-espace plus grand et donc à une diagonalisation plus coûteuse.

  • callback (Callable[[list[SCIResult]], None] | None) – Une fonction de rappel à appeler après chaque itération de récupération de la configuration. La fonction reçoit la sortie de la fonction sci\solver, qui est une liste de triplets (énergie, sci_état, occupations), où chaque triplet contient le résultat d'une diagonalisation.

  • seed (int |Generator | None) – Une graine pour le générateur de nombres pseudo-aléatoires.

Retours

L'estimation de l'énergie et l'état de la SCI avec cette énergie.

Type de retour

SCIRésultat

Remarque

Cette fonction prend en charge l'exécution collective multiprocessus (SPMD) via MPI, chaque processus étant contrôlé par un seul thread (MPI_THREAD_FUNNELED ou moins). Lorsqu'elle est appelée conjointement par tous les processus, les arguments doivent être identiques d'un processus à l'autre, et la sémantique suivante s'applique :

  • Cette étape sci_solver est la seule opération collective : tous les processus y participent, ce qui permet à une implémentation sci_solver de répartir la charge de travail entre tous les processus. Les étapes restantes de la boucle de configuration-récupération (préparation des chaînes CI, traitement des résultats de diagonalisation et vérification de la convergence) ne font pas l'objet d'une implémentation distribuée et sont effectuées uniquement par le processus de contrôle.
  • La fonction callback, si elle est fournie, n'est appelée que sur le processus de contrôle.
  • La valeur renvoyée est la même dans chaque processus : le résultat final est diffusé depuis le processus de contrôle vers tous les rangs.

Le fait que le programme appelant doive être lancé sous MPI dépend de la version sci_solver utilisée. Un « collectif » sci_solver, tel que décrit ci-dessus, suppose que le programme s'exécute de manière collective sur l'ensemble des processus. D'autres implémentations exigent que le programme appelant s'exécute en tant que processus unique, en dehors de tout environnement MPI/SPMD. Certaines de ces implémentations peuvent gérer leur propre parallélisme en interne, par exemple en se lançant elles-mêmes mpirun . La valeur par défaut n'est sci_solver pas distribuée et relève de cette dernière catégorie.

Une implémentation sci_solver collective n'est pas tenue de déclencher une exception au niveau d'un seul processus lorsqu'elle rencontre une erreur; elle peut au contraire suivre une sémantique « fail-stop » pour l'ensemble du contexte d'exécution, en interrompant collectivement tous les processus. (Ceci décrit ce qu'une telle implémentation est autorisée à faire, et non le comportement par défaut sci_solver.)

enlarge_batch_from_transitions

enlarge_batch_from_transitions(bitstring_matrix, transition_operators)

GitHub

Appliquer l'ensemble des opérateurs de transition aux configurations représentées dans bitstring_matrix.

Paramètres

  • bitstring_matrix (ndarray) – Un tableau 2D de représentations bool de valeurs binaires, de sorte que chaque ligne représente une chaîne de bits unique.
  • transition_operators (ndarray) – Un tableau 1D ou 2D I, +, -, et n représentant l'action des opérateurs d'identité, de création, d'annihilation ou de nombre. Chaque ligne représente un opérateur de transition.

Retours

Matrice de bitstring représentant l'ensemble augmenté des configurations électroniques après application des opérateurs d'excitation.

Type de retour

ndarray

solve_fermion

solve_fermion(bitstring_matrix, /, hcore, eri, *, open_shell=False, spin_sq=None, shift=0.1, **kwargs)

GitHub

Approximation de l'état fondamental à partir d'intégrales moléculaires et d'un ensemble de configurations électroniques.

Paramètres

  • bitstring_matrix (tuple[ndarray, ndarray] | ndarray) –

    Un ensemble de configurations définissant le sous-espace sur lequel l'hamiltonien sera projeté et diagonalisé.

    Elle peut être spécifiée de deux manières :

    • Matrice de chaînes de bits : Une matrice 2D numpy.ndarray de valeurs bool , où chaque ligne représente une chaîne de bits. Les configurations de spin-up doivent occuper les indices de colonne (N, N/2], et les configurations de spin-down doivent occuper les indices de colonne (N/2, 0], où N est le nombre de qubits.
    • Chaînes CI : Un tuple de deux séquences contenant des représentations entières des déterminants de spin-up et de spin-down, respectivement. Le format attendu est ([a_str_0, ..., a_str_N], [b_str_0, ..., b_str_M]).
  • hcore (ndarray) – Matrice de l'hamiltonien central représentant les intégrales d'un seul électron

  • eri (ndarray) – Intégrales de répulsion électronique représentant des intégrales à deux électrons

  • open_shell (bool) – Un drapeau indiquant si les configurations des moitiés gauche et droite des chaînes de bits doivent être séparées. Si False, les chaînes CI des moitiés gauche et droite des chaînes de bits sont combinées en un seul ensemble de configurations uniques et utilisées pour les sous-espaces alpha et bêta.

  • spin_sq (float | None) – Valeur cible du spin total au carré pour l'état fondamental, S2=s(s+1)S^2 = s(s + 1). Si None, aucun spin ne sera imposé.

  • shift (float) – Changement de niveau pour les états ayant un spin différent. (H+shiftS2)ψ>=Eψ>(H + shift * S^2)|ψ> = E|ψ>

  • **kwargs - Arguments de mot-clé à passer à pyscf.fci.selected_ci.kernel_fixed_space

Retours

  • Énergie minimale issue du calcul de l'ICS
  • L'état fondamental du SCI
  • Tuple contenant l'occupation des orbitales pour les orbitales de spin-up et de spin-down. Formaté comme : (array([occ_a_0, ..., occ_a_N]), array([occ_b_0, ..., occ_b_N]))
  • Valeur d'espérance du spin-carré

Type de retour

tuple[ float, SCIState, tuple [*ndarray*, ndarray ], float ]

solve_sci

solve_sci(ci_strings, one_body_tensor, two_body_tensor, norb, nelec, *, spin_sq=None, **kwargs)

GitHub

Diagonaliser l'hamiltonien dans le sous-espace défini par les chaînes CI.

Paramètres

  • ci_strings (tuple[ndarray, ndarray]) – Paire (strings_a, strings_b) de tableaux de chaînes CI de spin-alpha et de chaînes CI de spin-bêta dont le produit cartésien donne la base du sous-espace dans lequel effectuer une diagonalisation.

  • one_body_tensor (ndarray) – Le tenseur à un corps de l'hamiltonien.

  • two_body_tensor (ndarray) – Le tenseur à deux corps de l'hamiltonien.

  • norb (int) – Le nombre d'orbitales spatiales.

  • nelec (tuple[int, int]) – Le nombre d'électrons alpha et bêta.

  • spin_sq (float | None) – Valeur cible du spin total au carré pour l'état fondamental. Si None, aucun essorage ne sera imposé.

  • **kwargs -

    Arguments du mot-clé à transmettre à pyscf.fci.selected_ci.kernel_fixed_space

Retours

Le résultat de la diagonalisation.

Type de retour

SCIRésultat

solve_sci_batch

solve_sci_batch(ci_strings, one_body_tensor, two_body_tensor, norb, nelec, *, spin_sq=None, **kwargs)

GitHub

Diagonaliser l'hamiltonien dans des sous-espaces.

Paramètres

  • ci_strings (list[tuple[ndarray, ndarray]]) – Liste de paires (strings_a, strings_b) de tableaux de chaînes CI de spin-alpha et de chaînes CI de spin-bêta dont le produit cartésien donne la base du sous-espace dans lequel effectuer une diagonalisation.

  • one_body_tensor (ndarray) – Le tenseur à un corps de l'hamiltonien.

  • two_body_tensor (ndarray) – Le tenseur à deux corps de l'hamiltonien.

  • norb (int) – Le nombre d'orbitales spatiales.

  • nelec (tuple[int, int]) – Le nombre d'électrons alpha et bêta.

  • spin_sq (float | None) – Valeur cible du spin total au carré pour l'état fondamental. Si None, aucun essorage ne sera imposé.

  • **kwargs -

    Arguments du mot-clé à transmettre à pyscf.fci.selected_ci.kernel_fixed_space

Retours

Les résultats des diagonalisations dans les sous-espaces donnés par ci_strings.

Type de retour

liste [SCIResult]

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)

GitHub

Optimiser les orbitales pour produire un état fondamental minimal.

Le processus implique une itération en trois étapes :

Pour num_iters itérations :

  • Faites pivoter les intégrales par rapport aux paramètres, k_flat
  • Diagonaliser et approximer l'énergie de l'état fondamental et les amplitudes de la fonction d'onde
  • Optimiser k_flat en utilisant la descente de gradient et les amplitudes de la fonction d'onde trouvées à l'étape 2

Voir Sec. II A 4 pour une discussion plus détaillée sur cette technique d'optimisation orbitale.

Obsolète depuis la version 0.13.0

La fonction qiskit_addon_sqd.fermion.optimize_orbitals() est obsolète depuis la version 0.13.0 de qiskit-addon-sqd. Il ne sera supprimé pas avant le v0.15.0. L'optimisation orbitale est désormais prise en charge par le package ffsim. Consultez la page /addons/qiskit-addon-sqd/guides /opt imize-orbitals pour obtenir des instructions sur la manière d’optimiser la base hamiltonienne avec ffsim.

Paramètres

  • bitstring_matrix (tuple[ndarray, ndarray] | ndarray) –

    Un ensemble de configurations définissant le sous-espace sur lequel l'hamiltonien sera projeté et diagonalisé.

    Elle peut être spécifiée de deux manières :

    • Matrice de chaînes de bits : Une matrice 2D numpy.ndarray de valeurs bool , où chaque ligne représente une chaîne de bits. Les configurations de spin-up doivent occuper les indices de colonne (N, N/2], et les configurations de spin-down doivent occuper les indices de colonne (N/2, 0], où N est le nombre de qubits.
    • Chaînes CI : Un tuple de deux séquences contenant des représentations entières des déterminants de spin-up et de spin-down, respectivement. Le format attendu est ([a_str_0, ..., a_str_N], [b_str_0, ..., b_str_M]).
  • hcore (ndarray) – Matrice de l'hamiltonien central représentant les intégrales d'un seul électron

  • eri (ndarray) – Intégrales de répulsion électronique représentant des intégrales à deux électrons

  • k_flat (ndarray) – 1D définissant la transformation orbitale, K. Le tableau doit spécifier le triangle supérieur de l'opérateur de la transformation antisymétrique dans l'ordre des lignes majeures, à l'exclusion de la diagonale.

  • open_shell (bool) – Un drapeau indiquant si les configurations des moitiés gauche et droite des chaînes de bits doivent être séparées. Si False, les chaînes CI des moitiés gauche et droite des chaînes de bits sont combinées en un seul ensemble de configurations uniques et utilisées pour les sous-espaces alpha et bêta.

  • spin_sq (float) – Valeur cible du spin total au carré pour l'état fondamental

  • num_iters (int) – Le nombre d'itérations de l'optimisation orbitale à effectuer

  • num_steps_grad (int) – Le nombre de pas de descente de gradient à effectuer lors de chaque itération d'optimisation

  • learning_rate (float) – Le taux d'apprentissage à utiliser lors de la descente de gradient

  • **kwargs -

    Arguments du mot-clé à transmettre à pyscf.fci.selected_ci.kernel_fixed_space

Retours

  • L'énergie de l'état fondamental trouvée lors de la dernière itération d'optimisation
  • Un réseau optimisé 1D définissant la transformation orbitale
  • Tuple contenant l'occupation des orbitales pour les orbitales de spin-up et de spin-down. Formaté comme : (array([occ_a_0, ..., occ_a_N]), array([occ_b_0, ..., occ_b_N]))

Type de retour

tuple[ float, ndarray, tuple [*ndarray*, ndarray ]]

rotate_integrals

rotate_integrals(hcore, eri, k_flat)

GitHub

Effectuez une transformation de similitude sur les intégrales.

La transformation est décrite comme suit :

H~^=U^(k)H^U^(k)\hat{\widetilde{H}} = \hat{U^{\dagger}}(k)\hat{H}\hat{U}(k)

Pour plus d'informations sur la façon dont U^\hat{U} et U^\hat{U^{\dagger}} sont générés à partir de k_flat et appliqués aux intégrales à un et deux corps, voir Sec. II A 4.

Obsolète depuis la version 0.13.0

La fonction qiskit_addon_sqd.fermion.rotate_integrals() est obsolète depuis la version 0.13.0 de qiskit-addon-sqd. Il ne sera supprimé pas avant le v0.15.0. L'optimisation orbitale est désormais prise en charge par le package ffsim. Consultez la page /addons/qiskit-addon-sqd/guides /opt imize-orbitals pour obtenir des instructions sur la manière d’optimiser la base hamiltonienne avec ffsim.

Paramètres

  • hcore (ndarray) – Matrice de l'hamiltonien central représentant les intégrales d'un seul électron
  • eri (ndarray) – Intégrales de répulsion électronique représentant des intégrales à deux électrons
  • k_flat (ndarray) – 1D définissant la transformation orbitale, K. Le tableau doit spécifier le triangle supérieur de l'opérateur de la transformation antisymétrique dans l'ordre des lignes majeures, à l'exclusion de la diagonale.

Retours

  • La matrice hamiltonienne du noyau tourné
  • La matrice ERI tournée

Type de retour

tuple [*ndarray*, ndarray ]

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.