Skip to main content
IBM Quantum Platform

OrbitalRotation

class OrbitalRotation(rotation_unitary)

Bases: FermionicGate

Implementa uma rotação orbital.

Dada uma matriz unitária de tipo “ n×nn \times nUU (rotation_unitary), esse portão implementa a mudança de base de partícula única que mapeia os operadores de criação da seguinte forma:

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

o que equivale a aplicar o operador unitário de muitos corpos

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

O número de modos fermiónicos sobre os quais a porta atua é a dimensão nn de rotation_unitary.

A inicialização de uma instância dessa porta pode ser feita com os argumentos listados a seguir.

Parâmetros

rotation_unitary (np.ndarray) – a matriz unitária n×nn \times n UU que define a rotação orbital por meio de aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j. Ela deve ser quadrada e unitária; isso é de responsabilidade do chamador e não é verificado.


Atributos

rotation_unitary

A matriz unitária que representa os coeficientes de rotação orbital.


Métodos

from_t1_amplitudes

classmethod from_t1_amplitudes(t1)

Constrói uma rotação orbital a partir de amplitudes de tipo “ t1t_1 ” (singles).

A rotação é o exp(t1t1)\exp(t_1 - t_1^\dagger) unitário, em que a matriz de amplitude nocc×nvirtn_\text{occ} \times n_\text{virt} t1t_1 está incorporada ao gerador anti-hermitiano sobre todos os orbitais n=nocc+nvirtn = n_\text{occ} + n_\text{virt}

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

com os orbitais ocupados listados antes dos virtuais. Trata-se da rotação orbital de excitação única que entra na hipótese (L)UCJ quando ela é inicializada a partir de amplitudes do método de clusters acoplados; consulte UCJ.

Parâmetros

t1 (ndarray) – as amplitudes de forma do t1t_1(nocc, nvrt), em que nocc é o número de orbitais ocupados e nvrt é o número de orbitais virtuais.

Retorna

Um modo que atua OrbitalRotation em n=nocc+nvirtn = n_\text{occ} + n_\text{virt}, cujo valor é exp(t1t1)\exp(t_1 - t_1^\dagger)rotation_unitary .

Tipo de retorno

OrbitalRotation

Métodos do protocolo

_apply_unitary_placed_

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

Aplica a rotação orbital após posicioná-la nos modos globais do vetor.

A parte local da porta ( rotation_unitary uma matriz de tipo n×nn \times n que atua sobre os modos num_modes da porta) é, em primeiro lugar, incorporada ao registro completo: uma matriz identidade com o número de modos do vetor de estado, com inscrito rotation_unitary nas linhas/colunas selecionadas por freg_indices.

No caso do spinful, a matriz incorporada deve ser diagonal em blocos em relação à divisão alfa/beta. Uma rotação com blocos fora da diagonal com valores diferentes de zero para alfa/beta mistura os setores de spin, o que não conserva as contagens individuais de elétrons alfa/beta e, portanto, mapeia a amplitude para fora do setor (n_alpha, n_beta) fixo — uma operação que o vetor de estado do setor fixo não pode representar. Essa rotação é rejeitada com um ValueError.

A matriz incorporada é então aplicada de uma das duas maneiras a seguir:

  • Caminho rápido (somente quando ffsim estiver instalado): a matriz incorporada é aplicada por meio do kernel de rotação de Givens ffsim.apply_orbital_rotation()do. De acordo com a convenção de blocos de spin (os modos 0..norb são orbitais alfa, os modos norb..2*norb são orbitais beta), os dois blocos diagonais correspondem às rotações por spin passadas ao ffsim como (mat_a, mat_b).
  • Caminho geral : caso contrário (ou seja, quando não estiver ffsim disponível), a rotação é aplicada como a evolução exp(G)\exp(G) sob seu gerador G=ijlog(U)ijaiajG = \sum_{ij} \log(U)_{ij} a^\dagger_i a_j, onde UU é a matriz incorporada. GG é convertida em um scipy``LinearOperator por meio de linear_operator() (com o suporte do kernel matriz-vetor nativo do FCI) e aplicada por meio de scipy.sparse.linalg.expm_multiply(). Isso reflete Evolution._apply_unitary_placed_().

Parâmetros

  • vec (ndarray) – o vetor de estado sobre o qual se deve agir.
  • norb (int) – o número de orbitais espaciais do vetor de estado global.
  • nelec (int |tuple[int, int]) – ou um único número inteiro, no caso de um sistema sem spin, ou um par de números inteiros que representam o número de férmions de spin alfa e de spin beta. Um número inteiro seleciona a interpretação dos modos sem spin (os norb modos são orbitais); um par seleciona a interpretação dos modos 2 * norb com spin em blocos (orb, spin) .
  • copy (bool) – se é necessário copiar o vetor antes de realizar operações nele.
  • freg_indices (list[int]) – os índices dos modos absolutos (globais) para os quais os modos locais dessa porta se mapeiam. A rotação é incorporada a esses modos globais antes de ser aplicada.

Retorna

O vetor transformado.

Aumentos

ValueError – se nelec for um par com spin e a rotação (aplicada) misturar os setores de spin alfa e beta.

Tipo de retorno

ndarray

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.