Skip to main content
IBM Quantum Platform

ExcitationPreserving

class qiskit.circuit.library.ExcitationPreserving(num_qubits=None, mode='iswap', entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='ExcitationPreserving', flatten=None)

GitHub

Bases: TwoLocal

O ansatz da função de onda com preservação da excitação heurística.

O circuito ExcitationPreserving preserva a proporção dos estados 00|00\rangle, 01+10|01\rangle + |10\rangle e 11|11\rangle. Para isso, esse circuito usa interações de dois qubits da forma

(10000cos(θ/2)isin(θ/2)00isin(θ/2)cos(θ/2)0000eiϕ)\providecommand{\rotationangle}{\theta/2} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right) & 0 \\ 0 & -i\sin\left(\rotationangle\right) & \cos\left(\rotationangle\right) & 0 \\ 0 & 0 & 0 & e^{-i\phi} \end{pmatrix}

para o modo 'fsim' ou com eiϕ=1e^{-i\phi} = 1 para o modo 'iswap'.

Observe que outras funções de onda, como as UCC-ansatzes, também preservam a excitação. No entanto, eles podem se tornar complexos rapidamente, enquanto esse circuito motivado pela heurística segue um padrão mais simples.

Esta função de onda experimental consiste em camadas de rotações de tipo “ ZZ ” com entrelaçamentos de 2 qubits. O entrelaçamento é criado por meio de rotações d XX+YYXX+YY e e, opcionalmente, de um portão de fase controlada para o modo 'fsim'.

Consulte RealAmplitudes para obter mais detalhes sobre os possíveis argumentos e opções, como ignorar qubits não entrelaçados, que também se aplicam neste caso.

As rotações do ExcitationPreserving ansatz podem ser escritas como

Exemplos

>>> ansatz = ExcitationPreserving(3, reps=1, insert_barriers=True, entanglement='linear')
>>> print(ansatz.decompose())  # show the circuit
     ┌──────────┐ ░ ┌────────────┐┌────────────┐                             ░ ┌──────────┐
q_0:RZ(θ[0]) ├─░─┤0           ├┤0           ├─────────────────────────────░─┤ RZ(θ[5])
     ├──────────┤ ░ │  RXX(θ[3]) ││  RYY(θ[3]) │┌────────────┐┌────────────┐ ░ ├──────────┤
q_1:RZ(θ[1]) ├─░─┤1           ├┤1           ├┤0           ├┤0           ├─░─┤ RZ(θ[6])
     ├──────────┤ ░ └────────────┘└────────────┘│  RXX(θ[4]) ││  RYY(θ[4]) │ ░ ├──────────┤
q_2:RZ(θ[2]) ├─░─────────────────────────────┤1           ├┤1           ├─░─┤ RZ(θ[7])
     └──────────┘ ░                             └────────────┘└────────────┘ ░ └──────────┘
>>> ansatz = ExcitationPreserving(2, reps=1, flatten=True)
>>> qc = QuantumCircuit(2)  # create a circuit and append the RY variational form
>>> qc.cry(0.2, 0, 1)  # do some previous operation
>>> qc.compose(ansatz, inplace=True)  # add the excitation-preserving
>>> qc.draw()
                ┌──────────┐┌────────────┐┌────────────┐┌──────────┐
q_0: ─────■─────┤ RZ(θ[0]) ├┤0           ├┤0           ├┤ RZ(θ[3])
     ┌────┴────┐├──────────┤│  RXX(θ[2]) ││  RYY(θ[2]) │├──────────┤
q_1:RY(0.2) ├┤ RZ(θ[1]) ├┤1           ├┤1           ├┤ RZ(θ[4])
     └─────────┘└──────────┘└────────────┘└────────────┘└──────────┘
>>> ansatz = ExcitationPreserving(3, reps=1, mode='fsim', entanglement=[[0,2]],
... insert_barriers=True, flatten=True)
>>> print(ansatz.decompose())
     ┌──────────┐ ░ ┌────────────┐┌────────────┐        ░ ┌──────────┐
q_0:RZ(θ[0]) ├─░─┤0           ├┤0           ├─■──────░─┤ RZ(θ[5])
     ├──────────┤ ░ │            ││            │ │      ░ ├──────────┤
q_1:RZ(θ[1]) ├─░─┤  RXX(θ[3]) ├┤  RYY(θ[3]) ├─┼──────░─┤ RZ(θ[6])
     ├──────────┤ ░ │            ││            │ │θ[4]  ░ ├──────────┤
q_2:RZ(θ[2]) ├─░─┤1           ├┤1           ├─■──────░─┤ RZ(θ[7])
     └──────────┘ ░ └────────────┘└────────────┘        ░ └──────────┘
Veja Também

A função excitation_preserving() constrói um circuito funcionalmente equivalente, porém mais rápido.

Descontinuado desde a versão 2.1

A classe qiskit.circuit.library.n_local.excitation_preserving.ExcitationPreserving está obsoleta desde o Qiskit 2.1. Ele será removido no Qiskit 3.0. Em vez disso, use a função qiskit.circuit.library.excitation_preserving.

**Parâmetros

  • num_qubits (int | None) – O número de qubits do circuito ExcitationPreserving.
  • mode (str) – Escolha o modo de emaranhamento, que pode ser "iswap" ou "fsim".
  • reps (int) – Especifica a frequência com que a estrutura de uma camada de rotação seguida por uma camada de emaranhamento é repetida.
  • entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Especifica a estrutura de entrelaçamento. Pode ser uma cadeia de caracteres ('full', 'linear' ou 'sca'), uma lista de pares de números inteiros especificando os índices de qubits emaranhados entre si ou um chamável que retorna essa lista com o índice da camada de emaranhamento. Consulte a seção Exemplos de TwoLocal para obter mais detalhes.
  • initial_state (QuantumCircuit | None) – Um objeto QuantumCircuit para anexar ao circuito.
  • skip_unentangled_qubits (bool) – Se for True, os portões de qubit único serão aplicados somente aos qubits que estão emaranhados com outro qubit. Se for False, os portões de qubit único são aplicados a cada qubit no Ansatz. O padrão é False.
  • skip_final_rotation_layer (bool) – Se for True, uma camada de rotação será adicionada no final do ansatz. Se for False, nenhuma camada de rotação será adicionada. O padrão é verdadeiro.
  • parameter_prefix (str) – As portas parametrizadas exigem a definição de um parâmetro, para o qual usamos ParameterVector.
  • insert_barriers (bool) – Se for True, serão inseridas barreiras entre cada camada. Se for False, nenhuma barreira será inserida.
  • flatten (bool | None) – Defina essa opção como True para gerar um circuito plano em vez de aninhá-lo em várias camadas de objetos de porta. Por padrão, atualmente, o conteúdo do circuito de saída será agrupado em objetos aninhados para uma visualização mais limpa. No entanto, se estiver usando esse circuito para qualquer coisa além de visualização, é altamente recomendável definir esse sinalizador como True para evitar uma grande sobrecarga de desempenho para a vinculação de parâmetros.
  • name (str) – Nome do circuito.

Aumentos

ValueError - Se o modo selecionado não for compatível.


Atributos

parameter_bounds

Retorna os limites dos parâmetros.

Retorna

Os limites dos parâmetros.

name

Tipo: str

Um nome legível por humanos para o circuito.

Exemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.