Skip to main content
IBM Quantum Platform

OrbitalRotation

class OrbitalRotation(rotation_unitary)

Bases : FermionicGate

Met en œuvre une rotation orbitale.

Pour une matrice unitaire d’ n×nn \times n e UU (rotation_unitary), cette porte met en œuvre le changement de base à une particule qui associe aux opérateurs de création les éléments suivants :

aijUjiaj,a^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j,

ce qui revient à appliquer l'opérateur unitaire à N corps

exp(ijlog(U)ijaiaj).\exp\left(\sum_{ij} \log(U)_{ij} \, a^\dagger_i a_j\right).

Le nombre de modes fermioniques sur lesquels agit la porte correspond à la dimension nn de rotation_unitary.

L'initialisation d'une instance de cette porte peut s'effectuer à l'aide des arguments indiqués ci-dessous.

Paramètres

rotation_unitary (np.ndarray) – la matrice unitaire n×nn \times n UU définissant la rotation orbitale via aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j. Elle doit être carrée et unitaire; cela relève de la responsabilité de l'appelant et n'est pas vérifié.


Attributs

rotation_unitary

La matrice unitaire représentant les coefficients de rotation orbitale.


Méthodes

from_t1_amplitudes

classmethod from_t1_amplitudes(t1)

Construit une rotation orbitale à partir des amplitudes d' t1t_1 s (singles).

La rotation est l' exp(t1t1)\exp(t_1 - t_1^\dagger) unitaire, où la matrice d'amplitude d' nocc×nvirtn_\text{occ} \times n_\text{virt} t1t_1 est intégrée dans le générateur anti-hermiten sur l'ensemble des orbitales n=nocc+nvirtn = n_\text{occ} + n_\text{virt}

G=(0t1t10),G = \begin{pmatrix} 0 & -t_1^* \\ t_1^\top & 0 \end{pmatrix},

les orbitales occupées étant classées avant les orbitales virtuelles. Il s'agit de la rotation orbitale à excitation unique intégrée dans l'ansatz (L)UCJ lorsqu'il est initialisé à partir d'amplitudes de type « coupled-cluster »; voir UCJ.

Paramètres

t1 (ndarray) – les amplitudes de l' t1t_1(nocc, nvrt), où nocc est nvrt le nombre d'orbitales occupées et le nombre d'orbitales virtuelles.

Retours

Une action OrbitalRotation sur les modes d' n=nocc+nvirtn = n_\text{occ} + n_\text{virt}, dont la forme est rotation_unitary exp(t1t1)\exp(t_1 - t_1^\dagger).

Type de retour

OrbitalRotation

Méthodes protocolaires

_apply_unitary_placed_

_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)

Applique la rotation orbitale après l'avoir appliquée aux modes globaux du vecteur.

La matrice locale de la porte ( rotation_unitary une matrice d' n×nn \times n s agissant sur les modes num_modes de la porte) est d'abord intégrée dans le registre complet : une matrice identité dont le nombre de modes correspond à celui du vecteur d'état, avec inscrit rotation_unitary dans les lignes/colonnes sélectionnées par freg_indices.

Dans le cas « spinful », la matrice intégrée doit être diagonale par blocs par rapport à la séparation alpha/bêta. Une rotation comportant des blocs hors diagonale alpha/bêta non nuls mélange les secteurs de spin, ce qui ne préserve pas les nombres d'électrons alpha/bêta individuels et, par conséquent, fait sortir l'amplitude du secteur (n_alpha, n_beta) fixe – une opération que le vecteur d'état du secteur fixe ne peut pas représenter. Une telle rotation est rejetée avec un ValueError.

La matrice intégrée est ensuite appliquée de l'une des deux manières suivantes :

  • Voie rapide (uniquement si ffsim est installé) : la matrice intégrée est appliquée via le noyau de rotation de Givens ffsim.apply_orbital_rotation()de. Selon la convention « spinful » pour les blocs de spin (les modes 0..norb correspondent aux orbitales alpha, les modes norb..2*norb aux orbitales bêta), les deux blocs diagonaux correspondent aux rotations par spin transmises à ffsim sous la forme (mat_a, mat_b).
  • Parcours général : dans le cas contraire (c'est-à-dire lorsque n'est ffsim pas disponible), la rotation est appliquée sous la forme de l'évolution exp(G)\exp(G) sous son générateur G=ijlog(U)ijaiajG = \sum_{ij} \log(U)_{ij} a^\dagger_i a_j, où UU est la matrice intégrée. GG est converti en un via scipy``LinearOperator linear_operator() (grâce au noyau matrice-vecteur FCI natif) puis appliqué via scipy.sparse.linalg.expm_multiply(). Cela correspond à Evolution._apply_unitary_placed_().

Paramètres

  • vec (ndarray) – le vecteur d'état sur lequel agir.
  • norb (int) – le nombre d'orbitales spatiales du vecteur d'état global.
  • nelec (int |tuple[int, int]) – soit un seul nombre entier pour un système sans spin, soit une paire de nombres entiers indiquant le nombre de fermions de spin alpha et de fermions de spin bêta. Un entier correspond à l'interprétation des modes sans spin (les modes norb sont des orbitales); une paire correspond à l'interprétation des modes avec spin (orb, spin) par blocs (les modes 2 * norb sont des orbitales).
  • 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 superposent les modes locaux de cette porte. La rotation est appliquée à ces modes globaux avant d'être mise en œuvre.

Retours

Le vecteur transformé.

Augmentations

ValueError – si nelec est une paire à spin et si la rotation (appliquée) mélange les secteurs de spin alpha et bêta.

Type de retour

ndarray

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