Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Użyj qodec i modułu qdk.ec z Microsoft Quantum Development Kit (QDK), aby zdefiniować kod korekcji błędów kwantowych (QEC) i przekształcić go w wykonywalny protokół. W tym artykule zdefiniujesz kod błędu, utworzysz poziom bazowy qodec, zweryfikujesz jego deklaracje, obliczysz odległość gadżetu i zapiszesz protokół.
Przykłady w tym artykule używają kodu $[[4,2,2]]$ C4, który przechowuje dwa kubity logiczne w czterech kubitach fizycznych i wykrywa każdy pojedynczy błąd fizyczny Pauli.
Prerequisites
Przed rozpoczęciem wykonaj następujące zadania:
- Zainstaluj QDK do korekcji błędów.
- Użyj środowiska w Python wersji 3.11 lub nowszej.
- Upewnij się, że qodecStim analizator jest dostępny. W systemie LinuxArm64 lub WindowsArm64 zainstaluj program Stim ze źródła, a następnie uruchom ponownie Python lub jądro Jupyter przed wywołaniem metody
build_qodec.
Zdefiniuj kod
qodec.Code Utwórz obiekt ze stabilizatorami kodu i po jednym logicznym przedstawicielu X oraz Z dla każdego kubitu logicznego.
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"],
)
Pakiet qodec używa notacji rzadkiej dla ciągów Pauli. Każdy składnik ma literę Pauli i fizyczną etykietę kubitu. Na przykład operator X_0 X_2 stosuje X do kubitów fizycznych 0 i 2.
Definicja kodu jest statycznym obiektem matematycznym. Nie obejmuje obwodów, które przygotowują, zachowują lub mierzyją zakodowane stany.
Analizowanie kodu
Aby sprawdzić stan operatorów kodu, utwórz element 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 nie zmienia się, jeśli później zmienisz oryginalny obiekt qodec.Code.
Oblicz odległość kodu
Aby znaleźć minimalną liczbę dozwolonych błędów fizycznych, które powodują nietrywialny efekt logiczny z syndromem zerowym, wywołaj metodę 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)
Domyślnie wyszukiwanie przypisuje koszt równy jeden każdemu błędowi X, Y lub Z pojedynczego kubitu. Zwrócony Distance ma poświadczone ograniczenia oraz konstrukcję świadczącą dla każdej skończonej granicy górnej.
Gdy pełne dokładne wyszukiwanie jest zbyt kosztowne, użyj polecenia 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)
Domyślnym solverem jest HiGHS. Aby użyć innego modułu rozwiązywania, ustaw solver="enumeration", lub zainstaluj MWPF i ustaw solver="mwpf".
Utwórz punkt odniesienia qodec
qodec opisuje sposób uruchamiania zakodowanych instrukcji. Zawiera zestawy instrukcji, kody, warstwy, gadżety, obwody, kontrole i równania odczytu.
Użyj polecenia build_qodec, aby utworzyć protokół dwuwarstwowy na podstawie kodu C4.
protocol = ec.build_qodec(
c4,
strategy="bare-css/v1",
strict=False,
)
W tym przykładzie użyto bare-css/v1, aby umożliwić inspekcję prostego protokołu bez kubitów flagi.
Caution
Strategia bare-css/v1 nie gwarantuje obwodów odpornych na uszkodzenia. Oblicz dystans każdego gadżetu przed użyciem protokołu dla hałaśliwych eksperymentów.
Kreator próbuje utworzyć następujące instrukcje logiczne:
prepare_z_allprepare_x_allsyndromemeasure_z_allmeasure_x_allh_allcx_all
Sufiks _all oznacza, że instrukcja działa na każdym kubitie logicznym w bloku. Na przykład cx_all stosuje CNOT między odpowiednimi kubitami logicznymi w dwóch blokach.
Nie każdy kod obsługuje każdą instrukcję docelową. W przypadku strict=True, który jest domyślny, konstruktor zgłasza błąd, gdy nie może zbudować i zweryfikować kandydata. W strict=Falseprogramie konstruktor przechowuje obsługiwane instrukcje i rejestruje pominięcia w programie protocol.metadata["qdk.ec"]["build"]["omitted"].
Sprawdź warstwę logiczną i jej widżety.
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)
Druga warstwa zawiera fizyczny Stim zestaw instrukcji używany przez wygenerowane obwody.
Sprawdź gadżet
Instrukcja warunkowa deklaruje umowę. Jego gadżet dostarcza obwód, który implementuje umowę.
prepare_z_all Sprawdź gadżet.
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)
Porównaj działanie obliczone z obwodu z zadeklarowanym celem instrukcji.
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 tworzy migawkę danych wejściowych, więc nie odzwierciedla on późniejszych zmian. Po edycji gadżetu utwórz nowy profil.
Przeprowadź audyt protokołu
Użyj polecenia audit, aby sprawdzić cały qodec.
report = ec.audit(protocol)
print(report)
Jeśli inspekcja nie znajdzie żadnych błędów ani ostrzeżeń, wyświetla:
audit: ok
Inspekcja sprawdza następujące obszary:
- Algebra kodów
- Instrukcja i struktura warstw
- Wywołania Circuit i powiązania parametrów
- Akcje gadżetu
- Kontrole i równania odczytu
- Równania flag
- Relacje ramek wejściowych i wyjściowych
- Granice referencyjne i kompletność protokołu
Aby działać na określonych poziomach ważności, użyj kolekcji raportów.
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)
Wartość report.ok oznacza, że raport nie zawiera błędów. Ostrzeżenia nie zmieniają tej właściwości.
Wyprowadź brakujące równania
Użyj filled, gdy projekt gadżetu lub qodec pomija sprawdzanie lub logiczne równania odczytu, które można uzyskać dzięki dokładnej symulacji.
Poniższy przykład tworzy niekompletną kopię protokołu.
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))
Wypełnij obsługiwane równania, a następnie przeprowadź audyt wyniku.
completed = ec.filled(draft)
print(ec.audit(completed))
Funkcja filled zwraca nowy gadżet lub qodec i nie zmienia danych wejściowych. Wyprowadza sprawdzenia, obserwowalne równania odczytu i zależności między układami odniesienia. Zachowuje powiązania flag, ponieważ symulacja bez szumu nie może zidentyfikować błędów, które flaga powinna wykryć.
Jeśli oryginalny protokół ma już zweryfikowane równania bezpośrednie, filled zachowuje je, gdy jest to możliwe.
Analizuj usterki gadżetów
Audyt bez błędów potwierdza spójność bez zakłóceń. Nie dowodzi odporności na awarie.
Wywołaj metodę GadgetProfile.distance, aby znaleźć minimalną liczbę dozwolonych błędów obwodu, które powodują awarię logiczną, podczas gdy wszystkie zadeklarowane kontrole i flagi mają wartość zero. Połączone uszkodzenie musi również pozostawić każde wyjście wewnątrz jego przestrzeni kodowej.
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}")
Domyślny model błędów obejmuje te zdarzenia po każdym wywołaniu mechanizmu przerywacza:
- Błąd Pauli na kubitach, których dotyczy wywołanie
- Przełączenie bitu odczytu generowanego przez wywołanie
- Powiązane współwystępowanie tych błędów
Każde zdarzenie przy jednym wywołaniu kosztuje jedno, nawet jeśli ma skorelowany błąd wielokubitowy.
Kod może mieć dystans dwa, podczas gdy jeden z jego gadżetów ma dystans jeden. Na przykład pojedynczy błąd obwodu może rozprzestrzeniać się przez ancillę i utworzyć niewykryty błąd logiczny. Dodaj obwody kontroli lub sygnałowe, a następnie utwórz nową GadgetProfile i ponownie oblicz odległość.
Sprawdź określony błąd
Służy FaultEvent.after do definiowania błędu po indeksie wywołania obwodu liczonym od zera.
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)
Element FaultEffect może zawierać zmienione testy, odczyty logiczne i znaki ramki wyjściowej. Użyj jawnych zestawów błędów, gdy domyślny model na poziomie obwodu nie jest zgodny z założeniami sprzętowymi.
result = profile.distance(faults=[fault])
print(result)
Dokładne wyszukiwanie gadżetów może zająć dużo czasu, ponieważ domyślny zestaw błędów rośnie wykładniczo wraz z zasięgiem każdego wywołania. Użyj distance_bounds, jawnego zestawu błędów lub upper_bound , jeśli musisz ograniczyć wyszukiwanie.
Zapisz protokół
Sprawdź końcowo qodec przed zapisaniem go.
report = ec.audit(protocol)
if report.errors or report.warnings:
raise ValueError(str(report))
Zapisz protokół jako pojedynczy YAML pakiet zbiorczy, a następnie załaduj go ponownie, aby sprawdzić, czy jest zgodny z oryginałem.
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)
Pakiet jednoplikowy przechowuje manifest, definicje kodu, zestawy instrukcji, gadżety i źródła obwodów w jednym pliku YAML, co ułatwia udostępnianie i ponowne ładowanie.
Uruchom protokół
Po tym, jak qodec przejdzie inspekcję i spełni Twoje wymagania dotyczące odległości, skompiluj program logiczny do reprezentacji kwantowej pośredniej (QIR) i uruchom go za pośrednictwem protokołu. Zobacz Uruchamianie i dekodowanie programów logicznych.
Aby zobaczyć kompletny przykład, który dodaje obwody flagowe i porównuje logiczne współczynniki błędów, zobacz przewodnik po protokole QEC w QDK repozytorium GitHub.