Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Gunakan qodec dan qdk.ec modul dari Microsoft Quantum Development Kit (QDK) untuk menentukan kode koreksi kesalahan kuantum (QEC) dan mengubahnya menjadi protokol yang dapat dieksekusi. Dalam artikel ini, Anda menentukan kode kesalahan, membangun baseline qodec, memvalidasi deklarasinya, menghitung jarak gadget, dan menyimpan protokol.
Contoh dalam artikel ini menggunakan kode $[[4,2,2]]$ C4 , yang menyimpan dua kubit logis dalam empat qubit fisik dan mendeteksi kesalahan fisik Pauli tunggal.
Prerequisites
Selesaikan tugas-tugas ini sebelum Anda memulai:
- Instal QDK untuk koreksi kesalahan.
- Gunakan lingkungan dengan Python 3.11 atau yang lebih baru.
- Konfirmasikan bahwa pengurai qodecStim tersedia. Pada LinuxArm64 atau WindowsArm64, instal Stim dari sumber, lalu mulai ulang Python atau kernel Jupyter sebelum Anda memanggil
build_qodec.
Tentukan kode
Buat qodec.Code objek dengan stabilizer kode dan satu perwakilan X dan Z logis untuk setiap kubit logis.
import qodec
c4 = qodec.Code(
"C4",
stabilizers=["X_0 X_1 X_2 X_3", "Z_0 Z_1 Z_2 Z_3"],
x=["X_0 X_1", "X_0 X_2"],
z=["Z_0 Z_2", "Z_0 Z_1"],
)
Paket qodec menggunakan notasi sparse untuk string Pauli. Setiap istilah memiliki penanda huruf Pauli dan label kubit fisik. Misalnya, X_0 X_2 menerapkan X ke qubit fisik 0 dan 2.
Definisi kode adalah objek matematika statis. Ini tidak termasuk sirkuit yang menyiapkan, mempertahankan, atau mengukur keadaan yang dikodekan.
Menganalisis kode
Untuk memeriksa snapshot operator pada kode, buat CodeProfile.
from qdk import ec
profile = ec.CodeProfile(c4)
print("Physical support:", sorted(profile.support))
print("Physical qubits:", profile.length)
print("Logical qubits:", profile.logical_qubit_count)
print("Stabilizers:", profile.stabilizers)
print("Logical X operators:", profile.x)
print("Logical Z operators:", profile.z)
Profil tidak berubah jika nanti Anda mengubah objek asli qodec.Code.
Hitung jarak kode
Untuk menemukan jumlah minimum kesalahan fisik yang diizinkan yang menyebabkan efek logis nontrivial dengan sindrom nol, panggil distance.
distance = profile.distance()
print("Code distance:", distance)
error = distance.witness.product
syndrome = profile.syndrome_of(error)
logical_effect = profile.logical_effect_of(error)
print("Witness:", error)
print("Syndrome:", sorted(syndrome))
print("Logical effect:", logical_effect)
assert distance.value == 2
assert profile.is_logical(error)
Secara default, pencarian menetapkan biaya satu untuk setiap kesalahan X, Y, atau Z qubit tunggal.
Distance yang dikembalikan memiliki batas tersertifikasi dan saksi untuk setiap batas atas berhingga.
Ketika pencarian eksak lengkap terlalu mahal, gunakan distance_bounds.
bounds = profile.distance_bounds(upper_bound=4)
print("Distance bounds:", bounds)
print("Lower bound:", bounds.lower_bound)
print("Upper bound:", bounds.upper_bound)
Solver bawaan adalah HiGHS. Untuk menggunakan pemecah yang berbeda, atur solver="enumeration", atau instal MWPF dan atur solver="mwpf".
Membangun baseline qodec
Sebuah qodec menjelaskan cara menjalankan instruksi yang dikodekan. Ini memiliki set instruksi, kode, lapisan, perangkat, sirkuit, verifikasi, dan persamaan keluaran.
Gunakan build_qodec untuk membuat protokol dua lapisan dari C4 kode.
protocol = ec.build_qodec(
c4,
strategy="bare-css/v1",
strict=False,
)
Contoh ini menggunakan bare-css/v1 agar Anda dapat memeriksa protokol sederhana tanpa qubit bendera.
Caution
Strategi bare-css/v1 tidak menjanjikan sirkuit yang toleran terhadap kesalahan. Hitung jarak setiap gadget sebelum Anda menggunakan protokol untuk eksperimen dengan noise.
Builder mencoba membuat instruksi logis ini:
prepare_z_allprepare_x_allsyndromemeasure_z_allmeasure_x_allh_allcx_all
Akhiran _all berarti bahwa instruksi bertindak pada setiap qubit logis dalam blok. Misalnya, cx_all menerapkan CNOT antara qubit logis yang sesuai dalam dua blok.
Tidak semua kode mendukung setiap instruksi calon. Dengan strict=True, yang merupakan default, builder memunculkan kesalahan ketika tidak dapat membangun dan memverifikasi kandidat. Dengan strict=False, builder menyimpan instruksi yang didukung dan mencatat bagian yang dihilangkan di protocol.metadata["qdk.ec"]["build"]["omitted"].
Periksa lapisan logika dan gawainya.
logical_layer = protocol.layers[0]
print("Instructions:")
for mnemonic in logical_layer.instruction_set.instructions:
print(" -", mnemonic)
print("Gadgets:")
for mnemonic in logical_layer.gadgets:
print(" -", mnemonic)
Lapisan kedua berisi set instruksi fisik Stim yang digunakan oleh sirkuit yang dihasilkan.
Memeriksa gadget
Instruksi logis mendeklarasikan sebuah kontrak. Gadget-nya menyediakan sirkuit yang mengimplementasikan kontrak.
prepare_z_all Periksa gadget.
gadget = logical_layer.gadgets["prepare_z_all"]
gadget_profile = ec.GadgetProfile(gadget)
print("Declared objective:")
print(gadget_profile.objective)
print("Computed action:")
print(gadget_profile.action)
Bandingkan aksi yang dihitung dari sirkuit dengan tujuan instruksi yang dinyatakan.
objective = gadget_profile.objective
assert objective is not None
if gadget_profile.action.is_equivalent_to(objective):
print("The gadget implements its declared instruction.")
else:
print(objective.why_not_equivalent_to(gadget_profile.action))
GadgetProfile mengambil snapshot dari inputnya, sehingga tidak mencerminkan perubahan berikutnya. Setelah Anda mengedit gadget, buat profil baru.
Audit protokol
Gunakan audit untuk memeriksa seluruh qodec.
report = ec.audit(protocol)
print(report)
Jika audit tidak menemukan kesalahan atau peringatan, audit akan mencetak:
audit: ok
Audit memeriksa area ini:
- Aljabar kode
- Instruksi dan struktur lapisan
- Panggilan sirkuit dan pengikatan parameter
- Aksi gadget
- Pemeriksaan dan persamaan pembacaan
- Tandai persamaan
- Hubungan bingkai input dan output
- Batas referensi dan kelengkapan protokol
Untuk bertindak berdasarkan tingkat keparahan tertentu, gunakan koleksi laporan.
if report.errors:
for diagnostic in report.errors:
print(diagnostic)
raise ValueError("The qodec has audit errors.")
if report.warnings:
for diagnostic in report.warnings:
print(diagnostic)
Nilai report.ok berarti bahwa laporan tidak memiliki kesalahan. Peringatan tidak mengubah properti tersebut.
Menurunkan persamaan yang hilang
Gunakan filled saat gadget draf atau qodec menghilangkan pemeriksaan atau persamaan keluaran logis yang dapat diturunkan melalui simulasi eksak.
Contoh berikut membuat salinan protokol yang tidak lengkap.
draft = qodec.Qodec.loads(protocol.dumps())
draft_gadgets = draft.layers[0].gadgets
draft_gadgets["measure_x_all"].readouts = []
draft_gadgets["cx_all"].checks = []
print(ec.audit(draft))
Masukkan persamaan yang didukung, lalu periksa hasilnya.
completed = ec.filled(draft)
print(ec.audit(completed))
Fungsi filled mengembalikan gadget baru atau qodec dan tidak mengubah inputnya. Ini menurunkan cek, persamaan bacaan yang dapat diamati, dan relasi kerangka acuan. Ini mempertahankan pengikatan flag karena simulasi tanpa suara tidak dapat mengidentifikasi fault mana yang harus dideteksi flag.
Jika protokol asli sudah memiliki persamaan langsung terverifikasi, filled menyimpannya jika memungkinkan.
Analisis kerusakan gadget
Audit tanpa kesalahan membuktikan konsistensi tanpa kebisingan. Ini tidak membuktikan fault tolerance.
Panggil GadgetProfile.distance untuk menemukan jumlah minimum kesalahan sirkuit yang diizinkan yang menyebabkan kegagalan logis sementara semua pemeriksaan dan bendera yang dinyatakan tetap nol. Kesalahan gabungan juga harus memastikan setiap output tetap berada dalam ruang kodenya.
protocol = completed
for mnemonic, gadget in sorted(protocol.layers[0].gadgets.items()):
result = ec.GadgetProfile(gadget).distance()
witness = result.witness if result.upper_bound is not None else "none"
print(f"{mnemonic}: distance={result}, witness={witness}")
Model kesalahan default mencakup peristiwa ini setelah setiap panggilan sirkuit:
- Kesalahan Pauli pada qubit yang dipengaruhi panggilan
- Perubahan bit readout yang dihasilkan oleh pemanggilan
- Kombinasi kesalahan-kesalahan tersebut yang saling berkorelasi
Setiap peristiwa pada satu panggilan dikenakan biaya satu, bahkan ketika memiliki kesalahan multiqubit yang berkorelasi.
Kode dapat memiliki jarak dua sementara salah satu gawai-gawainya memiliki jarak satu. Misalnya, kesalahan sirkuit tunggal dapat menyebar melalui ancilla dan membuat kesalahan logis yang tidak terdeteksi. Tambahkan pemeriksaan atau sirkuit yang ditandai, lalu buat GadgetProfile baru dan hitung lagi jaraknya.
Memeriksa gangguan tertentu
Gunakan FaultEvent.after untuk menentukan fault berdasarkan indeks panggilan sirkuit berbasis nol.
gadget = protocol.layers[0].gadgets["syndrome"]
profile = ec.GadgetProfile(gadget)
fault = ec.FaultEvent.after(0, ec.Pauli("X_0"))
(effect,) = profile.effects_of([fault])
print("Fault:", fault)
print("Changed quantities:", effect)
Sebuah FaultEffect dapat mencakup pemeriksaan yang diubah, tampilan bacaan logis, dan tanda bingkai output. Gunakan set kesalahan eksplisit saat model tingkat sirkuit default tidak cocok dengan asumsi perangkat keras Anda.
result = profile.distance(faults=[fault])
print(result)
Pencarian gadget yang tepat dapat memakan waktu lama karena set kesalahan default tumbuh secara eksponensial dengan setiap dukungan panggilan. Gunakan distance_bounds, fault set eksplisit, atau upper_bound saat Anda perlu membatasi pencarian.
Simpan protokol
Audit final qodec sebelum Anda menyimpannya.
report = ec.audit(protocol)
if report.errors or report.warnings:
raise ValueError(str(report))
Simpan protokol sebagai satu YAML bundel, lalu muat lagi untuk memeriksa apakah hasilnya cocok dengan yang asli.
from pathlib import Path
output_directory = Path("qodec-output")
output_directory.mkdir(exist_ok=True)
saved_path = protocol.save(str(output_directory), single_file=True)
loaded = qodec.Qodec.load(saved_path)
assert loaded == protocol
print("Saved qodec:", saved_path)
Bundel file tunggal menyimpan manifes, definisi kode, set instruksi, gadget, dan sumber sirkuit dalam satu YAML file, yang memudahkan untuk berbagi dan memuat ulang.
Jalankan protokol
Setelah qodec lolos audit dan memenuhi persyaratan jarak Anda, kompilasikan program logis ke Representasi Perantara Quantum (QIR) dan jalankan melalui protokol. Lihat Menjalankan dan mendekode program logis.
Untuk contoh lengkap yang menambahkan sirkuit bendera dan membandingkan tingkat kesalahan logis, lihat panduan protokol QEC di QDK repositori GitHub.