Skip to main content
IBM Quantum Platform

RealAmplitudes

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

GitHub

Bases: TwoLocal

O circuito de 2 locais de amplitudes reais.

O circuito RealAmplitudes é uma função de onda experimental heurística usada como Ansatz em aplicações químicas ou circuitos de classificação em aprendizado de máquina. O circuito consiste em camadas alternadas de rotações YY e emaranhados CXCX. O padrão de emaranhamento pode ser definido pelo usuário ou selecionado a partir de um conjunto predefinido. Ele é chamado de RealAmplitudes , pois os estados quânticos preparados terão apenas amplitudes reais, a parte complexa é sempre 0.

Por exemplo, um circuito RealAmplitudes com 2 repetições em 3 qubits com emaranhamento 'reverse_linear' é

┌──────────┐ ░            ░ ┌──────────┐ ░            ░ ┌──────────┐
┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
├──────────┤ ░      ┌─┴─┐ ░ ├──────────┤ ░      ┌─┴─┐ ░ ├──────────┤
┤ Ry(θ[1]) ├─░───■──┤ X ├─░─┤ Ry(θ[4]) ├─░───■──┤ X ├─░─┤ Ry(θ[7]) ├
├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤
┤ Ry(θ[2]) ├─░─┤ X ├──────░─┤ Ry(θ[5]) ├─░─┤ X ├──────░─┤ Ry(θ[8]) ├
└──────────┘ ░ └───┘      ░ └──────────┘ ░ └───┘      ░ └──────────┘

O entrelaçamento pode ser definido usando a palavra-chave entanglement como string ou uma lista de pares de índices. Consulte a documentação de TwoLocal e NLocal para obter mais detalhes. As opções adicionais que podem ser definidas incluem o número de repetições, ignorando as portas de rotação em qubits que não estão emaranhados, deixando de fora a camada de rotação final e inserindo barreiras entre as camadas de rotação e emaranhamento.

Se alguns qubits não estiverem emaranhados com outros qubits, faz sentido não aplicar portas de rotação nesses qubits, pois uma sequência de YY rotações pode ser reduzida a uma única YY rotação com ângulos de rotação somados.

Exemplos

>>> ansatz = RealAmplitudes(3, reps=2)  # create the circuit on 3 qubits
>>> print(ansatz.decompose())
     ┌──────────┐                 ┌──────────┐                 ┌──────────┐
q_0:Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6])
     ├──────────┤        ┌─┴─┐    ├──────────┤        ┌─┴─┐    ├──────────┤
q_1:Ry(θ[1]) ├──■─────┤ X ├────┤ Ry(θ[4]) ├──■─────┤ X ├────┤ Ry(θ[7])
     ├──────────┤┌─┴─┐┌──┴───┴───┐└──────────┘┌─┴─┐┌──┴───┴───┐└──────────┘
q_2:Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
     └──────────┘└───┘└──────────┘            └───┘└──────────┘
>>> ansatz = RealAmplitudes(3, entanglement='full', reps=2, flatten=True)
>>> print(ansatz)
     ┌──────────┐          ┌──────────┐                      ┌──────────┐
q_0:RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
     ├──────────┤┌─┴─┐  │  └──────────┘┌──────────┐┌─┴─┐  │  └──────────┘┌──────────┐
q_1:RY(θ[1]) ├┤ X ├──┼───────■──────┤ RY(θ[4]) ├┤ X ├──┼───────■──────┤ RY(θ[7])
     ├──────────┤└───┘┌─┴─┐   ┌─┴─┐    ├──────────┤└───┘┌─┴─┐   ┌─┴─┐    ├──────────┤
q_2:RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8])
     └──────────┘     └───┘   └───┘    └──────────┘     └───┘   └───┘    └──────────┘
>>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True,
... flatten=True)
>>> qc = QuantumCircuit(3)  # create a circuit and append the RY variational form
>>> qc.compose(ansatz, inplace=True)
>>> qc.draw()
     ┌──────────┐ ░            ░ ┌──────────┐ ░            ░ ┌──────────┐
q_0:RY(θ[0]) ├─░───■────────░─┤ RY(θ[3]) ├─░───■────────░─┤ RY(θ[6])
     ├──────────┤ ░ ┌─┴─┐      ░ ├──────────┤ ░ ┌─┴─┐      ░ ├──────────┤
q_1:RY(θ[1]) ├─░─┤ X ├──■───░─┤ RY(θ[4]) ├─░─┤ X ├──■───░─┤ RY(θ[7])
     ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤
q_2:RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8])
     └──────────┘ ░      └───┘ ░ └──────────┘ ░      └───┘ ░ └──────────┘
>>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True,
... flatten=True)
>>> print(ansatz)
     ┌──────────┐ ░ ┌───┐                ░ ┌──────────┐
q_0:RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4])
     ├──────────┤ ░ └─┬─┘┌─┴─┐           ░ ├──────────┤
q_1:RY(θ[1]) ├─░───┼──┤ X ├──■────────░─┤ RY(θ[5])
     ├──────────┤ ░   │  └───┘┌─┴─┐      ░ ├──────────┤
q_2:RY(θ[2]) ├─░───┼───────┤ X ├──■───░─┤ RY(θ[6])
     ├──────────┤ ░   │       └───┘┌─┴─┐ ░ ├──────────┤
q_3:RY(θ[3]) ├─░───■────────────┤ X ├─░─┤ RY(θ[7])
     └──────────┘ ░                └───┘ ░ └──────────┘
>>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
... skip_unentangled_qubits=True, flatten=True)
>>> print(ansatz)
     ┌──────────┐                 ┌──────────┐                 ┌──────────┐
q_0:RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6])
     └──────────┘  │       │      └──────────┘  │       │      └──────────┘
q_1: ──────────────┼───────┼────────────────────┼───────┼──────────────────
     ┌──────────┐  │     ┌─┴─┐    ┌──────────┐  │     ┌─┴─┐    ┌──────────┐
q_2:RY(θ[1]) ├──┼─────┤ X ├────┤ RY(θ[4]) ├──┼─────┤ X ├────┤ RY(θ[7])
     ├──────────┤┌─┴─┐┌──┴───┴───┐└──────────┘┌─┴─┐┌──┴───┴───┐└──────────┘
q_3:RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
     └──────────┘└───┘└──────────┘            └───┘└──────────┘
Veja Também

A função real_amplitudes() 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.real_amplitudes.RealAmplitudes está obsoleta desde o Qiskit 2.1. Ele será removido no Qiskit 3.0. Em vez disso, use a função qiskit.circuit.library.real_amplitudes.

Parâmetros

  • num_qubits (int | None) – O número de qubits do circuito RealAmplitudes.
  • 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 string (‘full’, ‘linear’, ‘reverse_linear’, ‘circular’ ou ‘sca’), uma lista de pares de inteiros que especificam os índices dos qubits entrelaçados entre si, ou uma função que retorne tal lista quando fornecido o índice da camada de entrelaçamento. Usar o entrelaçamento “reverse_linear” como padrão. Observe que o entrelaçamento “reverse_linear” proporciona o mesmo operador unitário que o “full”, mas com menos portas de entrelaçamento. Consulte a seção Exemplos em 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 False, uma camada de rotação será adicionada no final do ansatz. Se for True, nenhuma camada de rotação será adicionada.
  • 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.

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.