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)
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 , e . Para isso, esse circuito usa interações de dois qubits da forma
para o modo 'fsim' ou com 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 “ ” com entrelaçamentos de 2 qubits. O entrelaçamento é criado por meio de rotações d 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]) ├
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘A função excitation_preserving() constrói um circuito funcionalmente equivalente, porém mais rápido.
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
TwoLocalpara 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
Truepara 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 comoTruepara 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