Visualisasi timing circuit
Versi paket
Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami menyarankan menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.6.1
qiskit-ibm-runtime~=0.50.0
Meskipun timeline drawer yang sudah ada di Qiskit berguna untuk circuit statis, ini mungkin tidak mencerminkan timing dynamic circuit secara akurat karena operasi implisit seperti broadcasting dan penentuan cabang. Sebagai bagian dari dukungan dynamic circuit, IBM Quantum Compute Service mengembalikan informasi timing circuit yang akurat di dalam hasil job saat diminta.
- Ini adalah fungsi eksperimental. Statusnya preview release dan karenanya bisa berubah.
- Fungsi ini hanya berlaku untuk job IBM Quantum Sampler dan Executor.
- Meskipun total waktu circuit dikembalikan dalam metadata "compilation", ini BUKAN waktu yang digunakan untuk penagihan (waktu QPU).
Opsi ini juga berfungsi dengan dry-run job. Berikan dry_run=True ke run() untuk mendapatkan jadwal waktu circuit tanpa menggunakan waktu QPU.
Aktifkan pengambilan data timing
Untuk mengaktifkan pengambilan data timing, atur flag eksperimental scheduler_timing ke True saat menjalankan job primitif.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
sampler = Sampler(backend)
sampler.options.experimental = {
"execution": {
"scheduler_timing": True,
},
}
sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()
Akses data timing circuit
Saat diminta, data timing circuit untuk setiap PUB dikembalikan dalam metadata hasil job, di bawah ["compilation"]["scheduler_timing"]["timing"]. Field ini berisi informasi timing mentah. Untuk menampilkan informasi timing, gunakan alat visualisasi bawaan, seperti yang dijelaskan di bagian Visualisasikan timing-nya.
Gunakan kode berikut untuk mengakses data timing circuit untuk PUB pertama:
job_result = sampler_job.result()
circuit_schedule = job_result[0].metadata["compilation"]["scheduler_timing"]
circuit_schedule_timing = circuit_schedule["timing"]
Memahami data timing mentah
Meskipun memvisualisasikan data timing circuit dengan metode draw_circuit_schedule_timing adalah kasus penggunaan yang paling umum, mungkin berguna untuk memahami struktur data timing mentah yang dikembalikan. Ini bisa membantumu, misalnya, untuk mengekstrak informasi secara terprogram.
Data timing yang dikembalikan dalam ["compilation"]["scheduler_timing"]["timing"] adalah daftar string. Setiap string merepresentasikan satu instruksi pada suatu channel dan dipisahkan koma menjadi tipe data berikut:
-
Branch- Menentukan apakah instruksi berada dalam alur kontrol (then / else) atau cabang utama. -
Instruction- Gate dan qubit yang dioperasikan. -
Channel- Channel tempat instruksi tersebut ditugaskan. Bisa salah satu dari berikut:-
Qubit x- Channel drive untuk qubit x. -
AWGRx_y(arbitrary waveform generator readout) - Digunakan oleh channel readout untuk berkomunikasi saat mengukur qubit. Argumen x dan y bersesuaian dengan ID instrumen readout dan nomor qubit.
-
-
T0- Waktu mulai instruksi dalam jadwal lengkap. -
Duration- Durasi instruksi, dalam satuan dt detik, di mana 1 dt = 1 siklus penjadwalan. Kamu bisa menemukan nilaidtsebuah backend menggunakanbackend.dt. -
Pulse- Jenis operasi pulse yang digunakan.
Contoh:
main,barrier,Qubit 0,7,0,barrier # A barrier on the main branch on qubit 0 at time 7 with 0 duration
main,reset_0,Qubit 0,7,64,play # A reset instruction on the main branch on qubit 0 at time 7 with duration 64 and a play operation
...
Visualisasikan timing-nya
Dengan qiskit-ibm-runtime v0.43.0 atau lebih baru, kamu bisa memvisualisasikan timing circuit. Untuk memvisualisasikan timing, kamu perlu mengubah metadata hasil ke fig menggunakan metode draw_circuit_schedule_timing. Metode ini mengembalikan gambar plotly, yang bisa kamu tampilkan langsung, simpan ke file, atau keduanya. Untuk informasi lebih lanjut tentang perintah plotly yang digunakan, lihat fig.show() dan fig.write_image("<path.format>").
from qiskit_ibm_runtime.visualization import draw_circuit_schedule_timing
# Create a figure from the metadata
fig = draw_circuit_schedule_timing(
circuit_schedule=circuit_schedule_timing,
included_channels=None,
filter_readout_channels=False,
filter_barriers=False,
width=1000,
)
# Uncomment the following line to display the figure
# fig.show(renderer="notebook")
# Save to a file
# fig.write_html("scheduler_timing.html")

Memahami gambar yang dihasilkan
Gambar output data timing circuit dari draw_circuit_schedule_timing menyampaikan informasi berikut:
-
Sumbu X adalah waktu dalam satuan dt detik, di mana 1 dt = 1 siklus penjadwalan. Kamu bisa menemukan nilai
dtsebuah backend menggunakanbackend.dt. -
Sumbu Y adalah channel (bayangkan channel sebagai instrumen yang memancarkan pulse).
-
Receive channel- Satu-satunya channel yang bukan merupakan instrumen tersendiri. Ini adalah instruksi yang dijalankan di semua channel yang merupakan bagian dari prosedur komunikasi dengan hub pada saat itu. -
Qubit x- Channel drive untuk qubit x. -
AWGRx_y(arbitrary waveform generator readout) - Digunakan oleh channel readout untuk berkomunikasi saat mengukur qubit. Argumen x dan y bersesuaian dengan ID instrumen readout dan nomor qubit. -
Hub- Mengontrol broadcasting.
-
Selain itu, setiap instruksi memiliki format X_Y, di mana X adalah nama instruksi dan Y adalah jenis pulse. Tipe play menerapkan pulse kontrol, dan capture merekam keadaan qubit. Kamu juga bisa mengarahkan kursor ke setiap instruksi untuk mendapatkan detail lebih lanjut. Misalnya, gambar sebelumnya menunjukkan pulse kontrol untuk gate X yang diterapkan pada qubit 10 pada 1161 dt.
Contoh end-to-end
Contoh ini menunjukkan cara mengaktifkan opsi, mendapatkan informasi timing circuit dari metadata, dan menampilkannya sebagai gambar.
Pertama, siapkan lingkungan, definisikan circuit dan ubah ke circuit ISA, lalu definisikan dan jalankan job.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.transpiler import generate_preset_pass_manager
# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
# Create a dynamic circuit
qubits = QuantumRegister(1)
clbits = ClassicalRegister(1)
qc = QuantumCircuit(qubits, clbits)
(q0,) = qubits
(c0,) = clbits
qc.h(q0)
qc.measure(q0, c0)
with qc.if_test((c0, 1)):
qc.x(q0)
qc.measure(q0, c0)
# Convert to an ISA circuit for the given backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
# Generate samplers for backend targets
sampler = Sampler(backend)
sampler.options.experimental = {"execution": {"scheduler_timing": True}}
# Submit jobs
sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()
print(
f">>> {' Job ID:':<10} {sampler_job.job_id()} ({sampler_job.status()})"
)
>>> Job ID: dbjed5pkdqps7390ev00 (DONE)
Selanjutnya, dapatkan timing jadwal circuit:
# Get the circuit schedule timing
result[0].metadata["compilation"]["scheduler_timing"]["timing"]
'main,rz_0,Qubit 0,875,0,shift_phase\nmain,sx_0,Qubit 0,875,6,play\nmain,sx_0,Qubit 0,879,0,shift_phase\nmain,rz_0,Qubit 0,882,0,shift_phase\nmain,barrier,Qubit 0,882,0,barrier\nmain,measure_0,Qubit 0,882,180,play\nmain,measure_0,AWGR0_0,1003,205,capture\nmain,barrier,Qubit 0,1409,0,barrier\nmain,broadcast,Hub,1003,406,broadcast\nmain,receive,Receive,1409,7,receive\nthen,x_0,Qubit 0,1424,6,play\nmain,barrier,Qubit 0,1437,0,barrier\nmain,measure_0,Qubit 0,1437,180,play\nmain,measure_0,AWGR0_0,1558,205,capture\nmain,barrier,Qubit 0,1852,0,barrier\nmain,barrier,Qubit 0,1852,0,barrier\nmain,FINI_0,Qubit 0,1852,180,play\nmain,FINI_0,AWGR0_0,1973,205,capture\nmain,FINI_0,Qubit 0,2267,6,play\nmain,FINI_0,Qubit 0,2273,180,play\nmain,FINI_0,AWGR0_0,2394,205,capture\nmain,FINI_0,Qubit 0,2688,6,play\nmain,barrier,Qubit 0,2694,0,barrier\n'
Terakhir, kamu bisa memvisualisasikan dan menyimpan timing:
from qiskit_ibm_runtime.visualization import draw_circuit_schedule_timing
circuit_schedule = result[0].metadata["compilation"]["scheduler_timing"][
"timing"
]
fig = draw_circuit_schedule_timing(
circuit_schedule=circuit_schedule,
included_channels=None,
filter_readout_channels=False,
filter_barriers=False,
width=1000,
)
# Uncomment the following line to display the figure
# fig.show(renderer="notebook")
# Save to a file
# fig.write_html("scheduler_timing.html")
Langkah selanjutnya
- Classical feedforward dan alur kontrol (dynamic circuit)
- Visualisasi circuit