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.
Mantıksal bir QDK veya qodec programını qdk.simulation.run_qir (Quantum Intermediate Representation) olarak derlemek için Microsoft Quantum Development Kit'i (QIR) kullanın ve ardından programı bir Q# üzerinden çalıştırmak için OpenQASM kullanın. Bir gürültü modeli ayarlayın ve ardından yerleşik sendrom kod çözücüyü veya isteğe bağlı deq devre düzeyinde kod çözücüyü seçin.
Prerequisites
Başlamadan önce şu görevleri tamamlayın:
- Hata düzeltmesi için QDK yükleyin.
- Bir QEC protokolü geliştirin ve doğrulayın veya başka bir kaynaktan eksiksiz qodec edinin.
-
qodec kullanarak
qdk.ec.auditöğesini denetleyin.
Örneklerde, qodec kodu için yönergeler içeren, protocol adlı bir C4 kullanılır. Bir tane oluşturmak için bkz. Bir QEC protokolü geliştirme ve doğrulama.
import qodec
from qdk import ec
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"],
)
protocol = ec.build_qodec(
c4,
strategy="bare-css/v1",
strict=False,
)
report = ec.audit(protocol)
if report.errors or report.warnings:
raise ValueError(str(report))
Çalıştırmadan önce qodec öğesini denetleyin. Çalışma zamanı qodec'ın denetimlerine, okumalarına, bayraklarına ve çerçeve denklemlerine güvenir, bu nedenle geçersiz bildirimler yanlış mantıksal sonuçlara veya kod çözücü hatalarına neden olabilir.
Bu iş akışı, qodec bir qdk.simulation.run_qir ile kullanır.
qodec araç takımı, biçimindeki gadget devrelerini ayrıştırmak için ayrı Python kullanır. Çağrılmıyor qdk.stim.run.
Arm64
Windows veya Arm64Linux üzerinde, Jupyter biçimli devreler içeren bir Python çalıştırmadan önce Stim öğesini kaynaktan yükleyin ve qodec veya Stim çekirdeğini yeniden başlatın.
qodec çağrıları QIR yönergelerle eşleştirin
QIR programındaki her kuantum çağrısını qodec'in en üst yönerge kümesindeki bir yönergeyle eşleştirin. Yönerge anımsatıcısı, QIR çağrılan adıyla tam olarak eşleşmelidir.
Aşağıdaki tabloda örnek eşlemeler gösterilmektedir:
| Arama kaynağı | Gerekli qodec anımsatıcı tuş |
|---|---|
Q#
X(q) veya OpenQASMx q; |
__quantum__qis__x__body |
Q#
H(q) veya OpenQASMh q; |
__quantum__qis__h__body |
Q#
CNOT(a, b) veya OpenQASMcx a, b; |
__quantum__qis__cx__body |
Q#
Adjoint S(q) veya OpenQASMsdg q; |
__quantum__qis__s__adj |
Q#
M(q) veya OpenQASMc = measure q; |
__quantum__qis__m__body |
Q# yerleşik işlem Foo |
Foo |
OpenQASM intrinsic gate veya def adlı foo |
foo |
QIR bağımsız değişkenler qodec yönerge öğelerine şu sırayla bağlanır:
- Kubit işaretçisi bağımsız değişkenleri blok işlenenlerine bağlanır.
- scalar bağımsız değişkenler komut parametrelerine bağlanır.
- sonuç işaretçisi argümanları yönerge sonuçlarını ve döndürülen bayrakları alır.
Bir kuantum çağrısı üst yönerge kümesindeki bir yönergeyle eşleşmiyorsa derleyici bir hata oluşturur.
Mantıksal yönergeleri bildir Q#
C4 kodundan oluşturulan bir qodec, measure_z_all, syndrome, cx_all ve prepare_z_all gibi özel yönergeleri kullanıma sunar.
Q# yerleşik işlemleri aynı adlarla bildirin.
Özel ölçüm işlemleri bunu gerektirdiğinden, Q# öğesini uyarlamalı hedef profiliyle başlatın.
from qdk import TargetProfile, qsharp
qsharp.init(target_profile=TargetProfile.Adaptive_RI)
C4 yönergeleri Q# işlem olarak tanımlayın.
qsharp.eval("""
@Measurement()
operation prepare_z_all(block : Qubit) : Result { body intrinsic; }
@Measurement()
operation prepare_x_all(block : Qubit) : Result { body intrinsic; }
@Measurement()
operation measure_z_all(block : Qubit) : (Result, Result) { body intrinsic; }
@Measurement()
operation measure_x_all(block : Qubit) : (Result, Result) { body intrinsic; }
operation cx_all(control : Qubit, target : Qubit) : Unit { body intrinsic; }
operation syndrome(block : Qubit) : Unit { body intrinsic; }
""")
Bu programda her Q#Qubit biri kodlanmış bir bloğu temsil eder. Bloğun C4 iki mantıksal kubiti vardır, bu nedenle her ölçüm işlemi iki mantıksal sonuç döndürür. Her hazırlık işlemi bir red işareti döndürür.
Mantıksal Q# denemeyi derleyin
Durum hazırlama ve ölçüm (SPAM) denemesi tanımlayın.
qsharp.eval("""
operation TestSpamZ() : (Result[], Result[]) {
use block = Qubit();
let reject = prepare_z_all(block);
let (left, right) = measure_z_all(block);
([reject], [left, right])
}
""")
İşlemi TestSpamZ olarak QIR derleyin.
qir = str(qsharp.compile("TestSpamZ()"))
QIR, measure_z_all ve prepare_z_all çağrılarını tutar. Program çalıştırıldığında, qodec çalışma zamanı bu adları üst yönerge kümesiyle eşleştirir ve her mantıksal çağrıyı gadget'ıyla değiştirir.
Yerleşik kod çözücü ile çalıştırın
run_qir öğesini çağırın ve qodec öğesini parametre olarak iletin. Eğer decoder, None ise, çalışma zamanı yerleşik minimum ağırlık Pauli kod çözücüsü kullanır.
from qdk.simulation import run_qir
results = run_qir(
qir,
qodec=protocol,
type="stabilizer",
shots=100,
seed=42,
)
print(results[:5])
Bir qodec çalıştırmak için şu simülatör seçeneklerini kullanın:
type değeri |
Behavior |
|---|---|
None veya "stabilizer" |
Dengeleyici arka ucu kullanın |
"cpu" |
Desteklenen programlar için durum vektör arka ucunu kullanın |
"gpu" |
Bir qodec ile desteklenmez |
Çalışma zamanı, ilk yönerge onun bloğunu oluşturuyorsa hariç, her program kubitini ilk kullanımından önce hazırlar. Bir hazırlık yönergesinde çıkış blokları, giriş blokları olmayan ve mantıksal Z öğesini stabilize eden bir eylem bulunur.
Tek kubitli Pauli kod çözücü düzeltmeleri ve qodec çerçeve güncelleştirmeleri gürültülü fiziksel kapılar değil, gürültüsüz Pauli bir çerçeve kullanır.
Simülatör gürültüsünü yapılandır
Yönerge adlarında değil, qodec simülatör işlemlerinde gürültüyü tanımlayın. Çalışma zamanı her alt katman yönergesini bir veya daha fazla simülatör işlemine çevirir, bu nedenle gürültü ayarları bu işlemlere uygulanır.
C4 kılavuzu şu eşlemeleri kullanır:
| Alt katman yönergesi | Simülatör çalıştırma |
NoiseConfig alan |
|---|---|---|
R |
Z+ için hazırlayın veya sıfırlayın | mresetz |
H |
Hadamard | h |
CX |
Denetimli X | cx |
M |
Z-bazlı ölçüm | mresetz |
Basit bir %1 gürültü modeli oluşturun:
from qdk.simulation import NoiseConfig
noise = NoiseConfig()
for gate in (noise.h, noise.cx):
gate.set_depolarizing(0.01)
noise.mresetz.x = 0.01
Denemeyi gürültüyle çalıştırın:
results = run_qir(
qir,
qodec=protocol,
noise=noise,
type="stabilizer",
shots=1000,
seed=42,
on_shot_failure="discard",
)
mresetz Ölçüm veya hazırlık sonrasında gürültü kubit üzerinde etki eder. Simülatörün önceden kaydettiği bir ölçüm bitini tersine çevirmez. Kaydedilen bit çevirmelerini incelemek için qodec readout hata modellerini ve gadget analizini kullanın.
Kontrol çekimi hataları
Çalışma zamanının, bir on_shot_failure bayrak, kod çözücü veya okuma işlemi kabul edilen bir qodec çekim üretmediğinde nasıl yanıt vereceğini seçmek için qodec kullanın.
| Value | Behavior |
|---|---|
"discard" |
Döndürülen listeden başarısız olan görüntüleri atla. Bu değer varsayılandır. |
"raise" |
İlk deneme başarısız olduğunda durdurun. |
"retry" |
Başarısız olan çekimi, en fazla max_retries ek denemeyle yeniden başlatın. |
"discard" ilkesiyle, shots bağımsız değişkeni denenen çekimleri sayar, böylece döndürülen liste, shots değerinden daha az öğe içerebilir.
Bayrak, yalnızca mantıksal program bu bayrağı almadığında çekim ilkesini tetikler. Bir Q#@Measurement() işlem bayrak için fazladan Result bir değer döndürürse, program bayrağı alır ve çekimi reddedip reddetmeyeceğine karar verir.
TestSpamZ Örnekte, program ilk dizideki hazırlık bayrağını döndürür. Yani on_shot_failure="discard" ayarı, döndürülen bayrağın One olduğu satırları kaldırmaz.
Kod çözücü seçin
Hataların kodunun nasıl çözüleceğini seçmek için, kodlanmış her katman için çağrılabilen bir kod çözücü hazırlığı geçirmek üzere decoder parametresini kullanın.
aşağıdaki QDK kod çözücülere sahiptir:
| Kod çözücü | Bunu kullanarak |
|---|---|
| Varsayılan sendrom çözücü | Sendrom kanıtlarından minimum ağırlık Pauli düzeltmeleri çıkarım yapın.
decoder=None adresini kullanın. |
| Çerçeve çözücü | Fiziksel arızalara ilişkin çıkarım yapmadan gürültüsüz kareleri izleyin.
prepare_frame_decoder adresini kullanın. |
| deq kod çözücü |
deq ile devre düzeyi hata modellerini çözümleyin.
prepare_deq_decoder adresini kullanın. |
Varsayılan deq yapılandırmayı kullanın
deq ve prepare_deq_decoder yükleyin, ardından deq-runtime geçirin.
from qdk.simulation.decoders import prepare_deq_decoder
results = run_qir(
qir,
qodec=protocol,
decoder=prepare_deq_decoder,
noise=noise,
type="stabilizer",
shots=1000,
seed=42,
on_shot_failure="discard",
)
Varsayılan olarak, deq adaptör relay belief propagation ve bir pencere koordinatörü kullanır. Bu ayarları değiştirmek için bir çalışma zamanı fabrikası kullanın.
Monolitik deq çalışma zamanını yapılandırın
deq ayarlarını doğrudan seçmek için, prepare_deq_decoder öğesine bir çalışma zamanı fabrikası geçirin.
from functools import partial
from deq.runtime import Runtime
from qdk.simulation import decoders
def make_runtime(seed: int) -> Runtime:
return Runtime(
decoder="black-box-relay-bp",
decoder_config={"parallel": 1, "seed": seed},
coordinator="monolithic",
controller="jit",
)
results = run_qir(
qir,
qodec=protocol,
decoder=partial(
decoders.prepare_deq_decoder,
runtime_factory=make_runtime,
),
noise=noise,
type="stabilizer",
shots=1000,
seed=42,
on_shot_failure="discard",
)
Her fabrika çağrısından yeni bir Runtime döndürün.
QDK her çalışma zamanını başlatır ve kapatır.
Uyarı
Bağdaştırıcı deq şunları gerektirir:
- Kodlanmış bir katman
- Ölçümden bağımsız Clifford yürütme izlemesi
- Dengeleyici arka uç
- Kubit kaybı olmayan bir gürültü modeli
Adaptör deq yeniden deneme ilkesini desteklemiyor. Desteklenmeyen programlar, başka bir kod çözücüye geri dönmek yerine hata verir.
Düşük güvenilirlikli deq sonuçları reddet
Adaptör, deq her mantıksal okuma için bir puan döndürür. Düşük puanlar, seçilen düzeltme için daha güçlü bir tercih olduğunu gösterir. Puanlar, kalibre edilmiş başarısızlık olasılıkları değildir.
Düşük güvenilirlikli sonuçları reddetmek için, aşağıdaki örnekte olduğu gibi kod çözücüyü hazırlarken max_readout_score değerini iletin:
from functools import partial
from qdk.simulation import decoders
scored_decoder = partial(
decoders.prepare_deq_decoder,
max_readout_score=0.2,
)
results = run_qir(
qir,
qodec=protocol,
decoder=scored_decoder,
noise=noise,
type="stabilizer",
shots=1000,
on_shot_failure="discard",
)
Çalışma zamanı yalnızca döndürülen her mantıksal okuma eşikte veya altında bir puana sahip olduğunda bir atış kabul eder. Eşik ham bayraklar veya kullanılmayan ara okumalar için geçerli değildir.
Puan tabanlı reddetme, kabul edilen çekimlerin mantıksal hata oranını düşürebilir. Ancak kabul edilen kare sayısını azaltır ve kod çözücü yükü ekler.
Programları derleyin OpenQASM
Standart OpenQASM işlemler, standart QIR işlemleriyle aynı Q# anımsatıcı kurallarını kullanır.
from qdk import TargetProfile, openqasm
source = """
OPENQASM 3.0;
include "stdgates.inc";
qubit q;
bit c;
x q;
c = measure q;
"""
qir = openqasm.compile(
source,
target_profile=TargetProfile.Adaptive_RI,
)
print(qir)
Bu programı bir qodec aracılığıyla çalıştırmak için, qodec'in en üst yönerge kümesinin uyumlu blok işlenenleri ve bir ölçüm sonucu ile __quantum__qis__m__body ve __quantum__qis__x__body içerdiğinden emin olun.
OpenQASM adlı intrinsic geçit veya foo adlı alt yordam, foo anımsatıcısını kullanır. Kubit argümanları blok işlenenlerine bağlanır.
float, int ve bool bağımsız değişkenleri komut parametrelerine bildirim sırasına göre bağlanır.
qodec çağrıları için OpenQASM şu sınırlamalara sahiptir:
- Özel intrinsic’ler QIR
Resultdöndüremez. Bir ölçüm sonucu almak için standartmeasuredeyimini kullanın. -
OpenQASM programlar özel ölçümler çalıştıramaz, bir çağrıdan birkaç sonuç alamaz veya döndürülen bayrakları alamaz. Bu durumlar için Q#
@Measurement()işlemlerini kullanın. - Çalışma zamanı, OpenQASM programın alamayacağı tüm bayrakları denetler ve bu bayraklar bir atışı reddedebilir.
Ayrıntılı eşleme örnekleri için aşağıdaki QDK notebook'lara bakın:
Gereksinimleri ve sınırlamaları gözden geçirme
Büyük bir deneme çalıştırmadan önce bu gereksinimleri, sınırlamaları ve sonuç farklılıklarını gözden geçirin.
Gereksinimler:
- Her QIR kuantum çağrısının en üst katman qodec yönergesine çözümlenmesi gerekir.
- Çalıştırmadan önce protokolü denetleyin. Çalışma qodec zamanı, yazdığınız denklemlere güvenir ve bunları denetlemez.
Sınırlamalar:
- GPU simülasyonu, qodec yürütmeyi desteklemez.
- Varsayılan gadget hata kümesi katlanarak büyüyebilir, bu nedenle tam uzaklık aramaları uzun sürebilir.
- Stim ve deq paketlerinin platform sınırlamaları vardır. Daha fazla bilgi için bkz. Hata düzeltmesi için InstallQDK.
Sonuç farklılıkları:
- Tam çıkış sayıları kod çözücüye göre farklılık gösterebilir.
- Atma ve yeniden deneme ilkeleri döndürülen sonuç dağılımını değiştirebilir.
Gürültü taramaları, Q# kod çözme ve güvene dayalı reddetme içeren eksiksiz bir deq deney için bkz. QEC protokolü kılavuzu.