Compondo vários circuitos quânticos em um programa quântico único no QISKit

9

Fiquei me perguntando se existe uma maneira de compor um programa com múltiplos circuitos quânticos sem ter o registro reinicializado em para cada circuito.0 0

Especificamente, eu gostaria de executar um segundo circuito quântico depois de executar o primeiro, como neste exemplo:

qp = QuantumProgram()
qr = qp.create_quantum_register('qr',2)
cr = qp.create_classical_register('cr',2)

qc1 = qp.create_circuit('B1',[qr],[cr])
qc1.x(qr)

qc1.measure(qr[0], cr[0])
qc1.measure(qr[1], cr[1])

qc2 = qp.create_circuit('B2', [qr], [cr])
qc2.x(qr)
qc2.measure(qr[0], cr[0])
qc2.measure(qr[1], cr[1])

#qp.add_circuit('B1', qc1)
#qp.add_circuit('B2', qc2)

pprint(qp.get_qasms())

result = qp.execute()

print(result.get_counts('B1'))
print(result.get_counts('B2'))

Infelizmente, o que eu recebo é o mesmo resultado para as duas execuções (ou seja, uma contagem de 11para B1e em B2vez de 11e 00para a segunda, como se B2fosse executada em um estado completamente novo inicializado 00depois B1.

asdf
fonte
11
Então, eu poderia entender como você deseja um longo circuito composto de várias partes e deseja ver a saída após cada parte?
James Wootton
sim. Imagine que eu tenha uma base de código que me dá circuitos, e eu quero ser capaz de compor-los como um quebra-cabeça :)
asdf
(a medida é lá apenas para mostrar que não é o comportamento esperado)
asdf

Respostas:

2

No Qiskit, você pode compor dois circuitos para criar um circuito maior. Você pode fazer isso simplesmente usando o +operador nos circuitos.

Aqui está o seu programa reescrito para ilustrar isso (nota: você precisa da versão mais recente do Qiskit para isso, atualize com pip install -U qiskit).

from qiskit import *
qr = QuantumRegister(2)
cr = ClassicalRegister(2)
qc1 = QuantumCircuit(qr, cr)
qc1.x(qr)

qc2 = QuantumCircuit(qr, cr)
qc2.x(qr)

qc3 = qc1 + qc2

Você pode ver que qc3 é uma concatenação de q1 e q2.

print(qc3.qasm())

Rendimentos:

OPENQASM 2.0;
include "qelib1.inc";
qreg q0[2];
creg c0[2];
x q0[0];
x q0[1];
x q0[0];
x q0[1];

Agora, você parece querer investigar o estado duas vezes: uma vez onde qc1 termina e uma vez quando qc2 termina. Você pode fazer isso em um simulador inserindo snapshotcomandos. Isso salvará o vetor de estado em um determinado ponto do circuito. Não reduz o estado.

from qiskit.extensions.simulator import *
qc1.snapshot('0')    # save the snapshot in slot "0"
qc2.snapshot('1')    # save the snapshot in slot "1"
qc2.measure(qr, cr)  # measure to get final counts

qc3 = qc1 + qc2

Agora você pode executar qc3em um simulador.

job = execute(qc3, 'local_qasm_simulator')
result = job.result()
print(result.get_snapshot('0'))
print(result.get_snapshot('1'))
print(result.get_counts())

Rendimentos: [0. + 0.j 0. + 0.j 0. + 0.j 1. + 0.j] [1. + 0.j 0. + 0.j 0. + 0.j 0. + 0.j] {'00': 1024}

Portanto, o estado volta para | 00> conforme o esperado.

Ali Javadi
fonte
0

Depois que você faz uma medição, a função de onda do registro / estado quântico entra em colapso e perde sua natureza quântica. Não faz sentido aplicar outro circuito nele.

Vidya Sagar V
fonte
Claro, mas se eu remover a medida, esperaria obter 00, enquanto recebo 1. A medida é apenas para mostrar que quero iniciar o segundo circuito com os qubits inicializados em 11.
asdf
Na verdade, eu quero a minha função de onda a entrar em colapso em estado quântico e não 00 se quiser colocar dessa maneira ...
asdf
2
@Vidya Entendo que ele entra em colapso, mas não concordo que não faria sentido aplicar outro circuito na saída colapsada de um circuito anterior.
JanVdA 06/06