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)
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 e emaranhados . 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 rotações pode ser reduzida a uma única 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]) ├────────────
└──────────┘└───┘└──────────┘ └───┘└──────────┘A função real_amplitudes() constrói um circuito funcionalmente equivalente, porém mais rápido.
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
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 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
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.
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