Zusammenstellen mehrerer Quantenschaltungen in einem einzigen Quantenprogramm in QISKit

9

Ich habe mich gefragt, ob es eine Möglichkeit gibt, ein Programm mit mehreren Quantenschaltungen zu erstellen, ohne dass das Register für jede Schaltung bei initialisiert wird .0

Insbesondere möchte ich nach dem Ausführen der ersten eine zweite Quantenschaltung ausführen, wie in diesem Beispiel:

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

Leider , was ich bekommen , ist das gleiche Ergebnis für die beiden Läufe (dh eine Zählung 11für die B1und B2statt 11und 00für die zweite, als ob B2auf einem völlig neuen Zustand auf initialisiert läuft 00nach B1.

asdf
quelle
1
Könnte ich es also so verstehen, dass Sie eine lange Schaltung wollen, die aus mehreren Teilen besteht, und Sie möchten die Ausgabe nach jedem Teil sehen können?
James Wootton
Ja. Stellen Sie sich vor, ich habe eine Codebasis, die mir Schaltkreise gibt, und ich möchte sie als Puzzle zusammenstellen können :)
asdf
(Die Maßnahme ist nur da, um Ihnen zu zeigen, dass dies nicht das erwartete Verhalten ist)
asdf

Antworten:

2

In Qiskit können Sie zwei Schaltkreise zusammenstellen, um einen größeren Schaltkreis zu erstellen. Sie können dies einfach tun, indem Sie den +Operator auf den Schaltkreisen verwenden.

Hier ist Ihr Programm neu geschrieben, um dies zu veranschaulichen (Hinweis: Sie benötigen dazu die neueste Version von Qiskit, aktualisieren Sie mit 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

Sie können sehen, dass qc3 eine Verkettung von q1 und q2 ist.

print(qc3.qasm())

Ausbeuten:

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

Nun möchten Sie den Status anscheinend zweimal prüfen: einmal dort, wo qc1 endet, und einmal, wenn qc2 endet. Sie können dies in einem Simulator tun, indem Sie snapshotBefehle einfügen . Dadurch wird der Zustandsvektor an einem bestimmten Punkt in der Schaltung gespeichert. Es bricht den Staat nicht zusammen.

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

Sie können jetzt qc3auf einem Simulator ausführen .

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

Ausbeuten: [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}

Der Zustand geht also wie erwartet auf | 00> zurück.

Ali Javadi
quelle
0

Sobald Sie eine Messung durchführen, kollabiert die Wellenfunktion des Quantenzustands / Registers und es verliert seine Quantennatur. Es ist nicht sinnvoll, eine andere Schaltung darauf anzuwenden.

Vidya Sagar V.
quelle
Sicher, aber wenn ich das Maß entferne, würde ich erwarten, 00 zu bekommen, während ich 1 bekomme. Das Maß soll nur zeigen, dass ich den zweiten Schaltkreis mit den auf 11 initialisierten Qubits starten möchte.
asdf
In der Tat möchte ich, dass meine Wellenfunktion im Quantenzustand zusammenbricht und nicht 00, wenn Sie möchten, dass es so ausgedrückt wird ...
asdf
2
@Vidya Ich verstehe, dass es zusammenbricht, aber ich stimme nicht zu, dass es keinen Sinn machen würde, eine andere Schaltung auf den zusammengeklappten Ausgang einer vorherigen Schaltung anzuwenden.
JanVdA