Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
QDKQEC kodu tanımlamak ve Microsoft Quantum Development Kit’teki (qodec) qdk.ec modülünü kullanarak bunu yürütülebilir bir protokole dönüştürmek için kullanın. Bu makalede bir hata kodu tanımlarsınız, temel qodec oluşturursunuz, bildirimlerini doğrularsınız, gadget uzaklığını hesaplarsınız ve protokolü kaydedersiniz.
Bu makaledeki örneklerde, iki mantıksal kubiti dört fiziksel kubitte depolayan ve herhangi bir tekil fiziksel C4 hatayı algılayan $[[4,2,2]]$ Pauli kodu kullanılır.
Prerequisites
Başlamadan önce şu görevleri tamamlayın:
- Hata düzeltmesi için QDK yükleyin.
- 3.11 veya üzeri bir Python ortam kullanın.
-
qodec
Stim ayrıştırıcısının kullanılabilir olduğunu onaylayın.
Windows
Arm64 veya LinuxArm64 üzerinde, Stim bileşenini kaynaktan yükleyin ve ardından Jupyter çağrısından önce
build_qodecveya Python çekirdeğini yeniden başlatın.
Kodu tanımlayın
Kod dengeleyicileri ve her mantıksal kubit için bir mantıksal X ve Z temsilcisi ile bir qodec.Code nesne oluşturun.
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"],
)
qodec paketi, Pauli dizeler için seyrek gösterim kullanır. Her terimin bir Pauli harfi ve fiziksel kubit etiketi vardır. Örneğin, X_0 X_2 0 ve 2 fiziksel kubitlerine X uygular.
Kod tanımı statik bir matematiksel nesnedir. Kodlanmış durumları hazırlayan, koruyan veya ölçen devreleri içermez.
Kodu analiz etme
Kod işleçlerinin anlık görüntüsünü incelemek için bir CodeProfileoluşturun.
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)
Daha sonra özgün qodec.Code nesneyi değiştirirseniz profil değişmez.
Kod uzaklığını hesaplayın
Sıfır sendromlu, önemsiz olmayan bir mantıksal etkiye neden olan izin verilen en az fiziksel hata sayısını bulmak için distance çağrısını yapın.
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)
Varsayılan olarak, arama her tek kubitli X, Y veya Z hatasına bir maliyet atar. Döndürülen Distance, sertifikalı sınırlara ve herhangi bir sonlu üst sınır için bir tanığa sahiptir.
Tam ve tam eşleşmeli arama çok maliyetli olduğunda distance_bounds kullanın.
bounds = profile.distance_bounds(upper_bound=4)
print("Distance bounds:", bounds)
print("Lower bound:", bounds.lower_bound)
print("Upper bound:", bounds.upper_bound)
Varsayılan çözücü HiGHS’dır. Farklı bir çözücü kullanmak için solver="enumeration" ayarlayın veya MWPF yükleyip solver="mwpf" ayarlayın.
Bir temel oluşturun qodec
qodec, kodlanmış yönergelerin nasıl çalıştırıldığını açıklar. Yönerge kümeleri, kodlar, katmanlar, aygıtlar, devreler, denetimler ve çıktı denklemleri vardır.
C4 kullanarak build_qodec kodundan iki katmanlı bir protokol oluşturun.
protocol = ec.build_qodec(
c4,
strategy="bare-css/v1",
strict=False,
)
Bu örnek, bayrak kubitleri olmadan basit bir protokolü incelemenize olanak sağlamak için bare-css/v1 kullanır.
Caution
bare-css/v1 stratejisi hataya dayanıklı devreler vaat etmez. Gürültülü denemeler için protokolü kullanmadan önce her gadget'ın mesafesini hesaplayın.
Oluşturucu şu mantıksal yönergeleri oluşturmaya çalışır:
prepare_z_allprepare_x_allsyndromemeasure_z_allmeasure_x_allh_allcx_all
_all son eki, bir yönergenin bir bloktaki her mantıksal kubit üzerinde hareket etmesi anlamına gelir. Örneğin, cx_all iki bloktaki ilgili mantıksal kubitler arasında CNOT uygular.
Her kod, her aday yönergeyi desteklemez. Varsayılan olan strict=True ile, oluşturucu bir adayı oluşturamadığında ve doğrulayamadığında hata verir.
strict=False ile oluşturucu desteklenen yönergeleri tutar ve eksikleri protocol.metadata["qdk.ec"]["build"]["omitted"] içinde kaydeder.
Mantıksal katmanı ve araçlarını inceleyin.
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)
İkinci katman, oluşturulan devrelerin kullandığı fiziksel Stim yönerge kümesini içerir.
Gadget’ı inceleyin
Mantıksal komut bir sözleşme tanımlar. Gadget'ı, sözleşmeyi uygulayan devreyi verir.
prepare_z_all gadget’ını inceleyin.
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)
Devreden hesaplanan işlemi bildirilen komut amacıyla karşılaştırın.
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, girdisinin anlık görüntüsünü alır, böylece sonraki değişiklikleri yansıtmaz. Bir gadget'ı düzenledikten sonra yeni bir profil oluşturun.
Protokolü denetleyin
qodec tüm audit öğesini denetlemek için kullanın.
report = ec.audit(protocol)
print(report)
Denetim hata veya uyarı bulmazsa şunu yazdırır:
audit: ok
Denetim şu alanları denetler:
- Kod cebiri
- Yönerge ve katman yapısı
- Circuit çağrıları ve parametre bağlamaları
- Gadget eylemleri
- Denetimler ve gösterim denklemleri
- Denklemleri işaretle
- Giriş ve çıkış çerçevesi ilişkileri
- Referans sınırları ve protokol eksiksizliği
Belirli önem dereceleri üzerinde işlem yapmak için rapor koleksiyonlarını kullanın.
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)
report.ok değeri, raporda hata olmadığı anlamına gelir. Uyarılar bu özelliği değiştirmez.
Eksik denklemleri türet
qodec öğesini, bir taslak araç veya filled tam benzetimin türetebileceği denetimleri ya da mantıksal okuma denklemlerini atladığında kullanın.
Aşağıdaki örnek, protokolün tamamlanmamış bir kopyasını oluşturur.
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))
Desteklenen denklemleri doldurun ve ardından sonucu kontrol edin.
completed = ec.filled(draft)
print(ec.audit(completed))
filled işlevi yeni bir araç veya qodec döndürür ve girdisini değiştirmez. Bunlardan denetimler, gözlemlenebilir okuma denklemleri ve çerçeve ilişkileri türetir. Gürültüsüz benzetim bir bayrağın hangi hataları algılaması gerektiğini belirleyemediği için bayrak bağlamalarını korur.
Özgün protokolün zaten doğrulanmış doğrudan denklemleri varsa, filled mümkün olduğunda bunları korur.
Gadget hatalarını analiz et
Hatasız denetim, parazitsiz tutarlılığı kanıtlar. Hataya dayanıklılığı kanıtlamaz.
Bildirilen tüm denetimler ve bayraklar sıfır kalırken mantıksal hataya neden olan izin verilen en düşük devre hatası sayısını bulmak için GadgetProfile.distance çağrısı yapın. Birleşik arıza da her çıkışı kendi kod alanında bırakmalıdır.
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}")
Varsayılan hata modeli, her circuit çağrısından sonra şu olayları içerir:
- Pauli Çağrının dokunduğu kubitlerde oluşan bir hata
- Çağrının ürettiği bir okuma çıktısı bitinin terslenmesi
- Bu hataların ilişkili bileşimi
Tek bir çağrıdaki her olay, bağıntılı çok kübitli hataya sahip olsa bile bir olarak sayılır.
Bir kodun mesafesi iki olabilirken gadget’larından birinin mesafesi bir olabilir. Örneğin, tek bir devre hatası bir ankillaya yayılabilir ve algılanmayan bir mantıksal hata oluşturabilir. Denetimler veya bayrak devreleri ekleyin, ardından yeni bir GadgetProfile oluşturun ve mesafeyi yeniden hesaplayın.
Belirli bir hatayı inceleyin
Sıfır tabanlı bir devre çağrısı dizininden sonra arıza tanımlamak için FaultEvent.after kullanın.
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)
Bir belge FaultEffect değiştirilmiş denetimleri, mantıksal okumaları ve çıkış çerçevesi işaretlerini içerebilir. Varsayılan devre düzeyi modeli donanım varsayımlarınızla eşleşmediğinde açık hata kümelerini kullanın.
result = profile.distance(faults=[fault])
print(result)
Varsayılan hata kümesi her çağrının desteğiyle üstel olarak arttığı için tam gadget aramaları uzun sürebilir. Aramayı sınırlamanız gerektiğinde upper_bound, açık bir hata kümesi veya distance_bounds kullanın.
Protokolü kaydet
Kaydetmeden önce final qodec kontrol edin.
report = ec.audit(protocol)
if report.errors or report.warnings:
raise ValueError(str(report))
Protokolü tek YAML bir paket olarak kaydedin ve ardından orijinaliyle eşleşip eşleşmediğini denetlemek için yeniden yükleyin.
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)
Tek dosyalı paket, bildirim dosyasını, kod tanımlarını, yönerge kümelerini, araçları ve devre kaynaklarını tek bir YAML dosyada depolar ve bu da paylaşımı ve yeniden yüklemeyi kolaylaştırır.
Protokolü çalıştırın
qodec denetiminden geçtikten ve uzaklık gereksinimlerinizi karşıladıktan sonra, Kuantum Ara Gösterimine (QIR) bir mantıksal program derleyin ve protokol aracılığıyla çalıştırın. Bkz. Mantıksal programları çalıştırma ve kod çözümleme.
Bayrak devreleri ekleyen ve mantıksal hata oranlarını karşılaştıran eksiksiz bir örnek için QEC protokolü kılavuzunaQDK GitHub deposunda bakın.