Menyusun beberapa sirkuit kuantum dalam program kuantum tunggal di QISKit

9

Saya bertanya-tanya apakah ada cara untuk menyusun program dengan beberapa sirkuit kuantum tanpa register diinisialisasi ulang pada untuk setiap sirkuit.0

Secara khusus, saya ingin menjalankan sirkuit kuantum kedua setelah menjalankan yang pertama, seperti dalam contoh ini:

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

Sayangnya, apa yang saya dapatkan adalah hasil yang sama untuk dua kali berjalan (yaitu hitungan 11untuk B1dan B2bukannya 11dan 00untuk yang kedua, seolah-olah B2dijalankan pada keadaan yang sama sekali baru diinisialisasi 00setelah B1.

asdf
sumber
1
Jadi bisakah saya memahaminya karena Anda ingin satu sirkuit panjang yang terdiri dari beberapa bagian, dan Anda ingin dapat melihat output setelah setiap bagian?
James Wootton
Iya. Bayangkan saya memiliki basis kode yang memberi saya sirkuit, dan saya ingin dapat menyusunnya sebagai puzzle :)
asdf
(Ukurannya ada hanya untuk menunjukkan kepada Anda bahwa itu bukan perilaku yang diharapkan)
asdf

Jawaban:

2

Di Qiskit Anda dapat membuat dua sirkuit untuk membuat sirkuit yang lebih besar. Anda dapat melakukan ini hanya dengan menggunakan +operator di sirkuit.

Berikut adalah program Anda yang ditulis ulang untuk menggambarkan hal ini (catatan: Anda memerlukan versi terbaru Qiskit untuk ini, tingkatkan dengan 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

Anda dapat melihat bahwa qc3 adalah gabungan dari q1 dan q2.

print(qc3.qasm())

Hasil:

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

Sekarang, Anda tampaknya ingin menyelidiki keadaan dua kali: sekali di mana qc1 berakhir, dan satu kali ketika qc2 berakhir. Anda dapat melakukan ini di simulator dengan memasukkan snapshotperintah. Ini akan menyimpan statevector pada titik tertentu di sirkuit. Itu tidak runtuh negara.

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

Anda sekarang dapat mengeksekusi qc3di simulator.

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

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

Jadi negara kembali ke | 00> seperti yang diharapkan.

Ali Javadi
sumber
0

Setelah Anda melakukan pengukuran, fungsi gelombang negara kuantum / register runtuh dan kehilangan sifat kuantumnya. Tidak masuk akal untuk menerapkan sirkuit lain di atasnya.

Vidya Sagar V
sumber
Tentu yakin, tetapi jika saya menghapus ukuran, saya akan berharap untuk mendapatkan 00, sementara saya mendapatkan 1. Ukuran ini hanya untuk menunjukkan bahwa saya ingin memulai sirkuit kedua dengan qubit diinisialisasi ke 11.
asdf
Memang saya ingin fungsi gelombang saya runtuh dalam keadaan kuantum dan bukan 00 jika Anda ingin meletakkannya dengan cara itu ...
asdf
2
@Vidya Saya mengerti bahwa itu runtuh tapi saya tidak setuju itu tidak masuk akal untuk menerapkan sirkuit lain pada output yang runtuh dari sirkuit sebelumnya.
JanVdA