Skip to main content
IBM Quantum Platform

PrepareSlaterDeterminant

class PrepareSlaterDeterminant(occupation, rotation_unitary)

Bases: FermionicGate

Calcula um determinante de Slater a partir de uma ocupação e de uma rotação orbital.

Esta porta é composta por uma ocupação de referência InitializeModes seguida por um OrbitalRotation: ela declara que os modos sobre os quais atua começam no determinante definido por e occupation são, em seguida, girados em rotation_unitary. Como a ocupação inicial é conhecida, a transpilagem dessa porta pode utilizar a decomposição retangular para givens_decomposition_slater() uma síntese com número reduzido de portas (ver GivensDecompositionSlaterDeterminantSynthesis), em vez da decomposição quadrada completa que um por si OrbitalRotation só exigiria.

Seguindo a convenção OrbitalRotation aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j, a rotação dos modos ocupados os mapeia para as colunas correspondentes de rotation_unitary; essas colunas abrangem o espaço ocupado do determinante de Slater preparado.

Semântica da simulação

Nesta simulação, esse portão é do tipo “validar e depois girar”, e não um produtor de estado: dado um vetor de estado de entrada, ele verifica se o vetor está restrito ao subespaço definido occupation por (por meio de InitializeModes) e, em seguida, aplica rotation_unitary (por meio de OrbitalRotation). Portanto, é necessário um vetor de estado de referência real, preparado externamente (por exemplo, por meio de ffsim.slater_determinant()). O comportamento do produtor — que gera os gates que definem a ocupação de referência — está no plug-in de síntese, e não no caminho de simulação.

A aplicação (em vez da omissão) da rotação é o que garante que a fusão de um InitializeModes e um OrbitalRotation nessa única porta deixe o estado final simulado inalterado.

Cuidado

Este é um protótipo em fase inicial de desenvolvimento. Fique atento a possíveis alterações na interface sem aviso prévio durante a fase de desenvolvimento pré-lançamento deste pacote.

A inicialização de uma instância deste portão pode ser feita com os argumentos listados abaixo.

Parâmetros

  • occupation (Sequence[bool]) – uma sequência de valores booleanos que indica a ocupação de referência para cada modo sobre o qual essa porta atua.
  • 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, onde nn é o número de modos (len(occupation)). Ela deve ser quadrada e unitária; isso é de responsabilidade do chamador e não é verificado.

Aumentos

ValueError – se não rotation_unitary for uma matriz quadrada cuja dimensão corresponda ao comprimento de occupation.


Atributos

occupation

A ocupação de referência (um valor booleano por modo) à qual a rotação é aplicada.

rotation_unitary

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

Métodos do protocolo

_apply_unitary_placed_

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

Valida a ocupação de referência e aplica a rotação, posicionando os modos em vec.

Delegados à definição do portão (_build_definition()): o termo inicial InitializeModes verifica se vec está restrito ao subespaço que define occupation , e o termo seguinte o OrbitalRotation gira. Consulte “esses portões” para _apply_unitary_placed_ conhecer toda a semântica (confinamento em subespaço e a rejeição de rotações que misturam o spin).

Parâmetros

  • vec (ndarray) – o vetor de estado de referência a ser validado e girado.
  • norb (int) – o número de orbitais espaciais do vetor de estado global.
  • nelec (int |tuple[int, int]) – seja um único número inteiro para um sistema sem spin, seja um par de números inteiros que armazenam os números dos férmions de spin alfa e beta.
  • 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.

Retorna

O vetor transformado.

Tipo de retorno

ndarray

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