Komponowanie wielu obwodów kwantowych w jednym programie kwantowym w QISKit

9

Zastanawiałem się, czy istnieje sposób na skomponowanie programu z wieloma obwodami kwantowymi bez ponownej inicjalizacji rejestru dla wartości dla każdego obwodu.0

W szczególności chciałbym uruchomić drugi obwód kwantowy po uruchomieniu pierwszego, jak w tym przykładzie:

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'))

Niestety, otrzymuję ten sam wynik dla dwóch przebiegów (tj. Liczba 11dla B1i B2zamiast 11i 00dla drugiego, tak jakby B2był uruchamiany w zupełnie nowym stanie zainicjowanym 00po B1.

asdf
źródło
1
Więc czy mogę to zrozumieć, ponieważ chcesz jednego długiego obwodu złożonego z wielu części i chcesz widzieć wynik po każdej części?
James Wootton,
tak. Wyobraź sobie, że mam bazę kodu, która daje mi obwody, i chcę móc je układać jak puzzle :)
asdf
(środek ma na celu pokazanie, że nie jest to oczekiwane zachowanie)
asdf

Odpowiedzi:

2

W Qiskit możesz skomponować dwa obwody, aby uzyskać większy obwód. Możesz to zrobić po prostu za pomocą +operatora w obwodach.

Oto twój program przepisany, aby to zilustrować (uwaga: potrzebujesz do tego najnowszej wersji Qiskit, zaktualizuj za pomocą 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

Widać, że qc3 jest konkatenacją q1 i q2.

print(qc3.qasm())

Wydajność:

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

Teraz wydaje się, że chcesz zbadać stan dwukrotnie: raz, gdy kończy się qc1, i raz, gdy kończy się qc2. Możesz to zrobić w symulatorze, wstawiając snapshotpolecenia. Uratuje to statevector w danym punkcie obwodu. Nie zwija stanu.

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

Możesz teraz wykonać qc3na symulatorze.

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

Wydajność: [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}

Tak więc stan wraca do | 00> zgodnie z oczekiwaniami.

Ali Javadi
źródło
0

Po wykonaniu pomiaru funkcja falowa stanu kwantowego / rejestru zapada się i traci swoją kwantową naturę. Zastosowanie na nim innego obwodu nie ma sensu.

Vidya Sagar V.
źródło
Pewnie, ale jeśli usunę takt, spodziewam się, że otrzymam 00, a ja dostanę 1. Miara ma tylko pokazać, że chcę rozpocząć drugi obwód z kubitami zainicjowanymi na 11.
asdf
Rzeczywiście chcę, aby moja funkcja falowa zawaliła się w stanie kwantowym, a nie 00, jeśli chcesz, aby była w ten sposób ...
asdf
2
@Vidya Rozumiem, że się zawala, ale nie zgadzam się, że nie byłoby sensu stosować innego obwodu do zwiniętego wyjścia poprzedniego obwodu.
JanVdA