Skip to main content
IBM Quantum Platform

OrbitalRotation

class OrbitalRotation(rotation_unitary)

Bases: FermionicGate

Implementa una rotación orbital.

Dada una matriz unitaria de tipo « n×nn \times n » UU (rotation_unitary), esta puerta implementa el cambio de base de una sola partícula que mapea los operadores de creación como

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

lo cual equivale a aplicar el operador unitario de muchos cuerpos

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

El número de modos fermiónicos sobre los que actúa la puerta es la dimensión nn de rotation_unitary.

La inicialización de una instancia de esta puerta se puede realizar con los argumentos que se indican a continuación.

Parámetros

rotation_unitary (np.ndarray) – la matriz unitaria n×nn \times n UU que define la rotación orbital mediante aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j. Debe ser cuadrada y unitaria; esto es responsabilidad de quien la invoca y no se verifica.


Atributos

rotation_unitary

La matriz unitaria que representa los coeficientes de rotación orbital.


Métodos

from_t1_amplitudes

classmethod from_t1_amplitudes(t1)

Construye una rotación orbital a partir de amplitudes de « t1t_1 » (singles).

La rotación es el generador unitario exp(t1t1)\exp(t_1 - t_1^\dagger), donde la matriz de amplitudes nocc×nvirtn_\text{occ} \times n_\text{virt} t1t_1 está integrada en el generador antihermitiano sobre todos los orbitales n=nocc+nvirtn = n_\text{occ} + n_\text{virt}

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

con los orbitales ocupados ordenados antes que los virtuales. Se trata de la rotación orbital de excitación única que se introduce en el ansatz (L)UCJ cuando se inicializa a partir de amplitudes de clúster acoplado; véase UCJ.

Parámetros

t1 (ndarray) – las amplitudes de la función de onda « t1t_1 » de forma (nocc, nvrt), donde nocc es el número de orbitales ocupados y nvrt es el número de orbitales virtuales.

Devuelve

Una acción OrbitalRotation sobre los modos de n=nocc+nvirtn = n_\text{occ} + n_\text{virt}, cuyo valor es rotation_unitary exp(t1t1)\exp(t_1 - t_1^\dagger).

Tipo de retorno

OrbitalRotation

Métodos del protocolo

_apply_unitary_placed_

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

Aplica la rotación orbital tras situarla en los modos globales del vector.

La parte local de la puerta ( rotation_unitary una matriz de tipo « n×nn \times n » que actúa sobre los modos num_modes de la puerta) se integra primero en el registro completo: una matriz identidad del número de modos del vector de estado, en cuyas filas y columnas se escribe rotation_unitary el valor indicado por freg_indices.

En el caso de «spinful», la matriz incrustada debe ser diagonal por bloques a lo largo de la división alfa/beta. Una rotación con bloques fuera de la diagonal con valores alfa/beta distintos de cero mezcla los sectores de espín, lo que no conserva los recuentos individuales de electrones alfa/beta y, por lo tanto, desplaza la amplitud fuera del sector (n_alpha, n_beta) fijo —una operación que el vector de estado del sector fijo no puede representar—. Dicha rotación se rechaza con un ValueError.

A continuación, la matriz incrustada se aplica de una de estas dos formas:

  • Ruta rápida (solo si ffsim está instalado): la matriz incrustada se aplica mediante el núcleo de rotación de Givens ffsim.apply_orbital_rotation()de. Según la convención de bloques de espín de Spinful (los modos 0..norb son orbitales alfa, los modos norb..2*norb son orbitales beta), los dos bloques diagonales son las rotaciones por espín que se pasan a ffsim como (mat_a, mat_b).
  • Ruta general : en caso contrario (es decir, cuando no está ffsim disponible), la rotación se aplica como la evolución exp(G)\exp(G) bajo su generador G=ijlog(U)ijaiajG = \sum_{ij} \log(U)_{ij} a^\dagger_i a_j, donde UU es la matriz incrustada. GG se convierte en un mediante scipy``LinearOperator linear_operator() (con el apoyo del núcleo matriz-vector nativo de FCI) y se aplica mediante scipy.sparse.linalg.expm_multiply(). Esto es un reflejo de Evolution._apply_unitary_placed_()...

Parámetros

  • vec (ndarray) – el vector de estado sobre el que actuar.
  • norb (int) – el número de orbitales espaciales del vector de estado global.
  • nelec (int |tuple[int, int]) – o bien un único número entero para un sistema sin espín, o bien un par de números enteros que representan el número de fermiones de espín alfa y de espín beta. Un número entero selecciona la interpretación de modos sin espín (los modos norb son orbitales); un par selecciona la interpretación de modos 2 * norb con espín en (orb, spin) bloques.
  • copy (bool) – si se debe copiar el vector antes de realizar operaciones con él.
  • freg_indices (list[int]) – los índices de los modos absolutos (globales) a los que se asignan los modos locales de esta puerta. La rotación se integra en estos modos globales antes de aplicarse.

Devuelve

El vector transformado.

Subidas

ValueError – si nelec es un par con espín y la rotación (aplicada) mezcla los sectores de espín alfa y beta.

Tipo de retorno

ndarray

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.