Skip to main content
IBM Quantum Platform

OrbitalRotation

class OrbitalRotation(rotation_unitary)

Basi: FermionicGate

Esegue una rotazione orbitale.

Data una matrice unitaria di n×nn \times n a UU (rotation_unitary), questo gate implementa il cambio di base a particella singola che mappa gli operatori di creazione come

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

il che equivale ad applicare l'operatore unitario a molti corpi

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

Il numero di modi fermionici su cui agisce il gate è pari alla dimensione nn di rotation_unitary.

L'inizializzazione di un'istanza di questo gate può essere effettuata utilizzando gli argomenti elencati di seguito.

Parametri

rotation_unitary (np.ndarray) – la matrice unitaria n×nn \times n UU che definisce la rotazione orbitale tramite aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j. Deve essere quadrata e unitaria; ciò è a carico del chiamante e non viene verificato.


Attributi

rotation_unitary

La matrice unitaria che rappresenta i coefficienti di rotazione orbitale.


Metodi

from_t1_amplitudes

classmethod from_t1_amplitudes(t1)

Costruisce una rotazione orbitale a partire dalle ampiezze di un t1t_1 e (singole).

La rotazione è l’ exp(t1t1)\exp(t_1 - t_1^\dagger) e unitario, in cui la matrice di ampiezza nocc×nvirtn_\text{occ} \times n_\text{virt} t1t_1 è incorporata nel generatore anti-ermitiano su tutti gli orbitali n=nocc+nvirtn = n_\text{occ} + n_\text{virt}

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

con gli orbitali occupati elencati prima di quelli virtuali. Si tratta della rotazione orbitale a eccitazione singola che entra nell’ansatz (L)UCJ quando viene inizializzata a partire dalle ampiezze del metodo dei cluster accoppiati; vedi UCJ.

Parametri

t1 (ndarray) – le ampiezze di t1t_1 e di forma (nocc, nvrt), dove nocc è il numero di orbitali occupati e nvrt è il numero di orbitali virtuali.

Risultati

Un'azione OrbitalRotation sulle modalità di n=nocc+nvirtn = n_\text{occ} + n_\text{virt}, la cui è exp(t1t1)\exp(t_1 - t_1^\dagger)rotation_unitary .

Tipo di restituzione

OrbitalRotation

Metodi del protocollo

_apply_unitary_placed_

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

Applica la rotazione orbitale dopo averla inserita nelle modalità globali del vettore.

La parte locale del gate ( rotation_unitary una matrice di tipo n×nn \times n e che agisce sulle modalità num_modes del gate) viene innanzitutto incorporata nel registro completo: una matrice identità con numero di modalità pari a quello del vettore di stato, in cui viene rotation_unitary inserito nelle righe/colonne selezionate da freg_indices.

Nel caso "spinful", la matrice incorporata deve essere diagonale a blocchi rispetto alla suddivisione alfa/beta. Una rotazione con blocchi fuori diagonale alfa/beta diversi da zero mescola i settori di spin, il che non conserva il numero individuale di elettroni alfa/beta e quindi mappa l'ampiezza al di fuori del settore (n_alpha, n_beta) fisso – un'operazione che il vettore di stato a settore fisso non è in grado di rappresentare. Una rotazione di questo tipo viene respinta con un ValueError.

La matrice incorporata viene quindi applicata in uno dei due modi seguenti:

  • Percorso veloce (solo se ffsim è installato): la matrice incorporata viene applicata tramite il kernel di rotazione di Givens ffsim.apply_orbital_rotation()di. In base alla convenzione "spinful block-spin" (i modi 0..norb sono orbitali alfa, i modi norb..2*norb sono orbitali beta), i due blocchi diagonali corrispondono alle rotazioni per spin passate a ffsim come (mat_a, mat_b).
  • Percorso generale : in caso contrario (ovvero quando non ffsim è disponibile), la rotazione viene applicata come evoluzione exp(G)\exp(G) sotto il suo generatore G=ijlog(U)ijaiajG = \sum_{ij} \log(U)_{ij} a^\dagger_i a_j, dove UU è la matrice incorporata. GG viene convertita in una scipy``LinearOperator tramite linear_operator() (supportata dal kernel matrice-vettore nativo di FCI) e applicata tramite scipy.sparse.linalg.expm_multiply(). Questo rispecchia Evolution._apply_unitary_placed_().

Parametri

  • vec (ndarray) – il vettore di stato su cui agire.
  • norb (int) – il numero di orbitali spaziali del vettore di stato globale.
  • nelec (int |tuple[int, int]) – o un singolo numero intero per un sistema senza spin, oppure una coppia di numeri interi che indicano il numero di fermioni con spin alfa e beta. Un numero intero indica l'interpretazione delle modalità senza spin (le norb modalità sono orbitali); una coppia indica l'interpretazione delle modalità 2 * norb con spin a (orb, spin) blocchi.
  • copy (bool) – se copiare il vettore prima di eseguire operazioni su di esso.
  • freg_indices (list[int]) – gli indici delle modalità assolute (globali) a cui si mappano le modalità locali di questo gate. La rotazione viene incorporata in queste modalità globali prima di essere applicata.

Risultati

Il vettore trasformato.

Aumenti

ValueError – se nelec è una coppia con spin e la rotazione (applicata) mescola i settori di spin alfa e beta.

Tipo di restituzione

ndarray

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.