PrepareSlaterDeterminant
class PrepareSlaterDeterminant(occupation, rotation_unitary)
Bases : FermionicGate
Permet de calculer un déterminant de Slater à partir d'une occupation et d'une rotation orbitale.
Cette porte est constituée d'une occupation de référence InitializeModes suivie d'un OrbitalRotation: elle indique que les modes sur lesquels elle agit commencent dans le déterminant défini par et occupation sont ensuite pivotés de rotation_unitary. Comme l'occupation initiale est connue, la transcompilation de cette porte peut utiliser la décomposition rectangulaire givens_decomposition_slater() pour obtenir une synthèse avec un nombre réduit de portes (voir GivensDecompositionSlaterDeterminantSynthesis) plutôt que la décomposition carrée complète qu'un seul OrbitalRotation exigerait.
Conformément à la convention OrbitalRotation « », la rotation des modes occupés les fait correspondre aux colonnes correspondantes de rotation_unitary; ces colonnes couvrent l'espace occupé du déterminant de Slater préparé.
Sémantique de la simulation
Dans le cadre de la simulation, cette porte est de type « validation puis rotation » et non un générateur d’états : à partir d’un vecteur d’état entrant, elle vérifie que ce vecteur est confiné au sous-espace défini occupation par (via InitializeModes) puis applique rotation_unitary (via OrbitalRotation). Il nécessite donc un vecteur d'état de référence réel, généré en externe (par exemple via ffsim.slater_determinant()). Le comportement du générateur – qui émet les signaux de porte définissant l'occupation de référence – se trouve dans le plug-in de synthèse, et non dans le chemin de simulation.
C'est l'application (plutôt que l'abandon) de la rotation qui garantit que la fusion d'un InitializeModes et d'un OrbitalRotation en cette porte unique laisse l'état final simulé inchangé.
Il s'agit d'un prototype de développement précoce. Attention aux modifications de son interface pouvant survenir sans préavis pendant la phase de développement préliminaire de ce logiciel.
L'initialisation d'une instance de cette porte s'effectue à l'aide des arguments indiqués ci-dessous.
Paramètres
- occupation (Sequence[bool]) – une séquence de valeurs booléennes indiquant la fonction de référence pour chaque mode sur lequel cette porte agit.
- rotation_unitary (np.ndarray) – la matrice unitaire définissant la rotation orbitale via , où est le nombre de modes (
len(occupation)). Elle doit être carrée et unitaire; cela relève de la responsabilité de l'appelant et n'est pas vérifié.
Augmentations
ValueError – si n'est rotation_unitary pas une matrice carrée dont la dimension correspond à la longueur de occupation.
Attributs
occupation
La profession de référence (une valeur booléenne par mode) à laquelle la rotation est appliquée.
rotation_unitary
La matrice unitaire représentant les coefficients de rotation orbitale.
Méthodes protocolaires
_apply_unitary_placed_
_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)
Vérifie la profession de référence et applique la rotation, en plaçant les modes sur vec.
Délégués à la définition de la porte (_build_definition()): le premier InitializeModes vérifie que vec est confiné au sous-espace occupation définit et le second le fait OrbitalRotation pivoter. Consultez ces portes _apply_unitary_placed_ pour en connaître toute la sémantique (confinement en sous-espace et rejet des rotations entraînant un mélange de spins).
Paramètres
- vec (ndarray) – le vecteur d'état de référence à valider et à faire pivoter.
- norb (int) – le nombre d'orbitales spatiales du vecteur d'état global.
- nelec (int |tuple[int, int]) – soit un seul entier pour un système sans spin, soit une paire d'entiers indiquant les nombres de fermions à spin alpha et à spin bêta.
- copy (bool) – s'il faut copier le vecteur avant d'effectuer une opération dessus.
- freg_indices (list[int]) – les indices des modes absolus (globaux) auxquels se mappent les modes locaux de cette porte.
Retours
Le vecteur transformé.
Type de retour