Anpassen der target Parameter des Ressourcenstimators
In diesem Artikel erfahren Sie, wie Sie die target Parameter des Azure Quantum Resource Estimators so anpassen, dass sie den Computermerkmalen entsprechen, die Sie targetbenötigen. Der Ressourcenstimator verwendet diese Parameter, um die Ressourcen zu schätzen, die zum Ausführen eines Quantenalgorithmus auf einem Quantencomputer erforderlich sind.
Hinweis
Wenn beim Arbeiten mit dem Resource Estimator ein Problem aufgetreten ist, lesen Sie die Seite Problembehandlung.
Voraussetzungen
Eine Python-Umgebung, in der Python und Pip installiert sind.
Die neueste Version von Visual Studio Code oder öffnen Sie VS Code im Web.
VS Code mit installierten Erweiterungen Azure Quantum Development Kit, Python und Jupyter .
Die neuesten Azure Quantum
qsharp
- undqsharp-widgets
-Pakete.python -m pip install --upgrade qsharp qsharp-widgets
Zielparameter
Der Resource Estimator berechnet die Schätzung der Ressourcen, z. B. die Anzahl der Qubits und die Laufzeit, die erforderlich wäre, um einen bestimmten Quantenalgorithmus mit einer bestimmten Qubit-Technologie und mit einem festen Satz von Architekturoptionen zu implementieren.
Daher benötigt der Resource Estimator eine Reihe von Eingaben mit vordefinierten Werten, um Ihnen den Einstieg zu erleichtern:
- Ein physisches Qubitmodell, das die Eigenschaften der zugrunde liegenden physischen Qubits definiert.
- Ein QEC-Schema (Quantum Error Correction, Quantenfehlerkorrektur), bei dem es sich um das angenommene Quantenfehlerkorrekturschema handelt.
- Ein Fehlerbudget, bei dem es sich um den insgesamt zulässigen Fehler handelt, d. h. die Anzahl der Fehler, die das Programm nicht ausführen darf.
- Einschränkungen auf Komponentenebene, d. h. die Anzahl logischer Zyklen und die Anzahl der T Factory-Kopien.
- Destillationseinheiten zum Angeben von Destillationsalgorithmen für T-Fabriken.
- Pareto-Grenzschätzung , um mehrere Schätzungen der Anzahl von Qubits und der Laufzeit für denselben Algorithmus auszuführen.
Physische Qubitparameter
Wenn der Resource Estimator die physischen Qubit-Annahmen modelliert, verwendet er zwei verschiedene physische Anweisungsgruppen, um die Qubits zu betreiben. Der physische Anweisungssatz kann entweder gatterbasiert oder Majorana sein. Ein gatterbasierter Befehlssatz ermöglicht Messungen für einzelne Qubits, Gatter für einzelne Qubits (einschließlich T-Gatter) und Gatter für zwei Qubit. Ein Majorana-Anweisungssatz bietet ein physisches T-Gatter, Messungen für einzelne Qubits und gemeinsame Messungen für zwei Qubits.
Sie können aus sechs vordefinierten Qubitparametern wählen, von denen vier über gatterbasierte Anweisungssätze und zwei über einen Majorana-Anweisungssatz verfügen. Diese Qubitmodelle decken verschiedene Betriebszeiten und Fehlerraten ab und ermöglichen eine ausreichende Untersuchung der Ressourcenkosten für praktische Quantenanwendungen.
Qubit-Parameter | Python-API-Klasse | BESCHREIBUNG |
---|---|---|
"qubit_gate_ns_e3" , "qubit_gate_ns_e4" |
GATE_NS_E3 , GATE_NS_E4 |
Betriebszeiten und -fidelitäten können zukünftigen Versionen von supraleitenden Transmonqubits oder Spin-Qubits entsprechen, die in der Regel Betriebszeiten im Nanosekunden-Regime haben. Für diese Qubits wird angenommen, dass Gate- und Messvorgänge 50 ns bzw. 100 ns dauern. Es wird angenommen, dass die Fehlerraten für Ein- und Zwei-Qubit-Gate 10^{-3}$ als realistisch targetund 10^{-4}$ für ein hochskaliertes System optimistisch target sind. |
"qubit_gate_us_e3" , "qubit_gate_us_e4" |
GATE_US_E3 , GATE_US_E4 |
Betriebszeiten und -fidelitäten können zukünftigen Versionen von Qubits entsprechen, die auf Ionen basieren, die in der Regel Betriebszeiten im Mikrosekundenregime aufweisen. Basierend auf typischen Annahmen für Ionenqubits wird angenommen, dass Gate- und Messvorgänge 100 μs dauern. Die Fehlerrate für Single-Qubit-Clifford-Gates beträgt 10^{-3}$ als realistisch target und 10^{-4}$ als optimistisch target, während die Fehlerrate für Single-Qubit-Nicht-Clifford-Gates (T-Gate) 10^{-6}$ beträgt. Bei Zwei-Qubit-Gates beträgt die Fehlerrate 10^{-3}$ als realistisch target und 10^{-4}$ als optimistisch target. |
"qubit_maj_ns_e4" , "qubit_maj_ns_e6" |
MAJ_NS_E4 , MAJ_NS_E6 |
Die Betriebszeiten und -fidelitäten können zukünftigen verbesserten Versionen von Majorana-Qubits entsprechen. Für diese Qubits wird angenommen, dass Gate- und Messvorgänge 100 ns dauern. Um den topologischen Schutz in der Hardware zu berücksichtigen, wird angenommen, dass die Fehlerraten von Einzelqubit- und Zwei-Qubit-Joint-Messungen (Clifford-Fehlerraten) als realistisch target10^{-4}$ und 10^{-6}$ als optimistischer targetwert sind. Nicht Clifford-Vorgänge in dieser Architektur verfügen über keinen topologischen Schutz, die Fehlerrate für physische T-Gates ohne Clifford beträgt 5 %. |
Hinweis
Sofern kein anderer Wert angegeben wird, ist "qubit_gate_ns_e3"
der Standardwert für das Qubitmodell .
Als Referenz sind die vollständigen vordefinierten Qubit-Parameter wie folgt:
{
"qubitParams": {
"name": "qubit_gate_ns_e3",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 ns",
"oneQubitGateTime": "50 ns",
"twoQubitGateTime": "50 ns",
"tGateTime": "50 ns",
"oneQubitMeasurementErrorRate": 1e-3,
"oneQubitGateErrorRate": 1e-3,
"twoQubitGateErrorRate": 1e-3,
"tGateErrorRate": 1e-3
}
}
{
"qubitParams": {
"name": "qubit_gate_ns_e4",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 ns",
"oneQubitGateTime": "50 ns",
"twoQubitGateTime": "50 ns",
"tGateTime": "50 ns",
"oneQubitMeasurementErrorRate": 1e-4,
"oneQubitGateErrorRate": 1e-4,
"twoQubitGateErrorRate": 1e-4,
"tGateErrorRate": 1e-4
}
}
{
"qubitParams": {
"name": "qubit_gate_us_e3",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 µs",
"oneQubitGateTime": "100 µs",
"twoQubitGateTime": "100 µs",
"tGateTime": "100 µs",
"oneQubitMeasurementErrorRate": 1e-3,
"oneQubitGateErrorRate": 1e-3,
"twoQubitGateErrorRate": 1e-3,
"tGateErrorRate": 1e-6
}
}
{
"qubitParams": {
"name": "qubit_gate_us_e4",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 µs",
"oneQubitGateTime": "100 µs",
"twoQubitGateTime": "100 µs",
"tGateTime": "100 µs",
"oneQubitMeasurementErrorRate": 1e-4,
"oneQubitGateErrorRate": 1e-4,
"twoQubitGateErrorRate": 1e-4,
"tGateErrorRate": 1e-6
}
}
{
"qubitParams": {
"name": "qubit_maj_ns_e4",
"instructionSet": "Majorana",
"oneQubitMeasurementTime": "100 ns",
"twoQubitJointMeasurementTime": "100 ns",
"tGateTime": "100 ns",
"oneQubitMeasurementErrorRate": 1e-4,
"twoQubitJointMeasurementErrorRate": 1e-4,
"tGateErrorRate": 0.05
}
}
{
"qubitParams": {
"name": "qubit_maj_ns_e6",
"instructionSet": "Majorana",
"oneQubitMeasurementTime": "100 ns",
"twoQubitJointMeasurementTime": "100 ns",
"tGateTime": "100 ns",
"oneQubitMeasurementErrorRate": 1e-6,
"twoQubitJointMeasurementErrorRate": 1e-6,
"tGateErrorRate": 0.01
}
}
Übergeben vordefinierter Qubitparameter
Es gibt zwei Möglichkeiten, vordefinierte Qubitparameter programmgesteuert anzugeben. Sie können den Namen des Qubitmodells für die qubitParams
Klasse auswählen, wenn Sie ausführen qsharp.estimate
. Um beispielsweise den Qubit-Parameter auszuwählen "qubit_maj_ns_e6"
, schreiben Sie Folgendes:
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e6"
},
})
Sie können die Qubitparameter auch mit QubitParams
an die EstimatorParams
-Klasse übergeben. Um beispielsweise den Qubit-Parameter auszuwählen MAJ_NS_E6
, schreiben Sie Folgendes:
from qsharp.estimator import EstimatorParams, QubitParams
params = EstimatorParams()
params.qubit_params.name = QubitParams.MAJ_NS_E6 # qubit_maj_ns_e6 qubit parameter
qsharp.estimate("RunProgram()", params=params)
Anpassen vordefinierter Qubitparameter
Sie können vordefinierte Qubitparameter anpassen, indem Sie den Namen angeben und dann einen der anderen Werte aktualisieren. Um beispielsweise die Fehlerrate bei der Messung von Zwei-Qubit-Gelenken in "qubit_maj_ns_e4" zu verringern, schreiben Sie Folgendes:
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e4",
"twoQubitJointMeasurementErrorRate": 1e-5,
},
})
Oder Sie können die Anweisungen in Form einer Liste übergeben.
from qsharp.estimator import EstimatorParams, QubitParams
params = MicrosoftEstimatorParams()
params.qubit_params.name = QubitParams.MAJ_NS_E4
params.qubit_params.two_qubit_joint_measurement_error_rate = 1e-5
Qubitparameter für Gate-basierte Qubits
Python-Bezeichner | Datentyp | BESCHREIBUNG |
---|---|---|
name |
Zeichenfolge | Name für das Qubitmodell |
instruction_set |
"gate_based" | Zugrunde liegende Qubit-Technologie |
one_qubit_measurement_time |
Zeitzeichenfolge | Vorgangszeit für die Einzelqubitmessung ($t_{\rm meas}$) in ns |
one_qubit_gate_time |
Zeitzeichenfolge | Vorgangszeit für Single-Qubit-Gate ($t_{\rm gate}$) in ns |
two_qubit_gate_time |
Zeitzeichenfolge | Betriebszeit für Zwei-Qubit-Gate in ns |
t_gate_time |
Zeitzeichenfolge | Betriebszeit für Single-Qubit-Nicht-Clifford-Gate in ns |
one_qubit_measurement_error_rate |
float | Fehlerrate bei Einzelqubitmessung |
one_qubit_gate_error_rate |
float | Fehlerrate für Single-Qubit-Clifford-Gate ($p$) |
two_qubit_gate_error_rate |
float | Fehlerrate für Zwei-Qubit-Clifford-Gate |
t_gate_error_rate |
float | Fehlerrate zum Vorbereiten des Single-Qubit-Non-Clifford-Zustands ($p_T$) |
idle_error_rate |
float | Fehlerrate gemäß Leerlauf |
Der folgende Code zeigt, wie benutzerdefinierte Qubitparameter für einen gatebasierten Befehlssatz angegeben werden:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.qubit_params.name = "your_custom_name"
params.qubit_params.instruction_set = "gate_based"
params.qubit_params.t_gate_error_rate = 0.03
params.qubit_params.t_gate_time = "10 ns"
params.qubit_params.idle_error_rate = 0.02
Hinweis
Wenn nicht angegeben, werden die Werte für und standardmäßig one_qubit_gate_time
auf , die Werte für two_qubit_gate_error_rate
und t_gate_error_rate
standardwert auf one_qubit_gate_error_rate
und der Wert für idle_error_rate
standardwerte auf festgelegtone_qubit_measurement_error_rate
.t_gate_time
two_qubit_gate_time
Qubitparameter für Majorana-Qubits
Python-Bezeichner | Datentyp | BESCHREIBUNG |
---|---|---|
name |
Zeichenfolge | Name für das Qubitmodell |
instruction_set |
"majorana" | Zugrunde liegende Qubit-Technologie |
one_qubit_measurement_time |
Zeitzeichenfolge | Vorgangszeit für die Einzelqubitmessung ($t_{\rm meas}$) in ns |
two-qubit_joint_measurement_time |
Zeitzeichenfolge | Betriebszeit für zwei Qubitmessungen in ns |
t_gate_time |
Zeitzeichenfolge | Betriebszeit für Single-Qubit-Nicht-Clifford-Gate in ns |
one_qubit_measurement_error_rate |
float | Fehlerrate bei Einzel-Qubit-Messung |
two_qubit_joint_measurement_error_rate |
float | Fehlerrate bei der Zwei-Qubit-Messung |
t_gate_error_rate |
float | Fehlerrate zum Vorbereiten des Single-Qubit-Non-Clifford-Zustands ($p_T$) |
idle_error_rate |
float | Fehlerrate im Leerlauf |
Eine Mindestvorlage für den Majorana-basierten Befehlssatz mit allen erforderlichen Werten ist:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.qubit_params.name = "your_custom_name"
params.qubit_params.instruction_set = "majorana"
params.qubit_params.one_qubit_measurement_time = "10 ns"
params.qubit_params.one_qubit_measurement_error_rate = 0.01
Hinweis
Wenn nicht angegeben, werden die Werte für two_qubitJointMeasurementTime
und t_gate_time
standardmäßig one_qubit_measurement_time
auf , die Werte für two_qubit_joint_measurement_error_rate
und t_gate_error_rate
standardwert auf one_qubit_measurement_error_rate
und der Wert für idle_error_rate
standardmäßig auf one_qubit_measurement_error_rate
festgelegt.
Für one_qubit_measurement_error_rate
und two_qubit_joint_measurement_error_rate
können Sie die Fehlerraten angeben, die den Messauslesevorgängen, readout
und der Messverarbeitung process
entsprechen. Diese Werte können entweder <double>
Zahlen oder Zahlenpaare sein. Beispiel:
params.qubit_params.two_qubit_joint_measurement_error_rate = \
MeasurementErrorRate(process=0.00005, readout=0.00007)
Hinweis
Wenn Sie in der Majorana-Qubitmessung einen einzelnen numerischen Wert für Die Fehlerraten von Einzel- und Zwei-Qubit angeben, können die Lese- und Prozessfehlerraten gleich sein.
Wichtig
Alle Werte, die nicht angegeben sind, verwenden einen Standardwert, z. B. wird ein gatebasiertes Qubit modelliert "qubit": {"oneQubitGateTime":"200 ns"}
, bei dem sowohl die Zwei-Qubit-Gatezeit als auch die 1-Qubit-Gatezeit 200 ns sind. Für Einheiten müssen Sie Zeitzeichenfolgen angeben, bei denen es sich um Gleitkommazahlen mit doppelter Genauigkeit handelt, gefolgt von einem Leerzeichen und der Zeiteinheit für solche Werte, sofern mögliche Zeitsuffixe ns
, µs
(oder us
), ms
und s
sind.
Schemas zur Quantenfehlerkorrektur
Um Quantenanwendungen im praktischen Maßstab auszuführen, sollten Quantenvorgänge niedrige Fehlerraten aufweisen. Diese Fehlerrate targets geht in der Regel über die Möglichkeiten von rohen physischen Qubits hinaus. Um diese Einschränkung zu überwinden, sind quantenfehlerkorrektur (QEC) und fehlertolerante Berechnungen zwei wichtige Techniken, die die Bausteine großer Quantencomputer bilden. Erstens ermöglicht QEC es uns, mehrere fehleranfällige physische Qubits zu erstellen und ein zuverlässigeres logisches Qubit zu erstellen, das Quanteninformationen besser beibewahrt als die zugrunde liegenden physischen Qubits.
Der Fehlerkorrekturcodeabstand (oder nur kurz code distance) ist ein Parameter, der die Anzahl der Fehler steuert, die korrigiert werden können. Daher die Fehlerrate der logischen Qubits und die Anzahl der physischen Qubits, die für die Codierung erforderlich sind. Sowohl die Genauigkeit als auch die Anzahl physischer Qubits erhöhen sich mit dem Codeabstand. Das Ziel besteht darin, den minimalen Codeabstand zu ermitteln, der die erforderliche Fehlerrate erreichen kann, die für eine bestimmte Anwendung festgelegt wurde.
Die Ressourcenschätzung verwendet die folgende Formel zum Modellieren logischer Fehlerraten mithilfe eines exponentiellen Modells:
$$ P = a\left(\frac{p}{p^*}\right)^{\frac{d+1}{2}} $$
Dabei ist $d$ der Codeabstand, $p$ die physische Fehlerrate und $p^*$ der Schwellenwert für die Quantenfehlerkorrektur. Die physische Fehlerrate $p$ wird aus den Qubitparametern als fehlerrate im schlimmsten Fall eines physischen Clifford-Vorgangs im Gerät extrahiert.
Insbesondere $p = {}$ max(one_qubit_measurement_error_rate
, one_qubit_gate_error_rate
, two_qubit_gate_error_rate
) für Qubitparameter mit einem gatebasierten Befehlssatz und $p = {}$ max(one_qubit_measurement_error_rate
, two_qubit_joint_measurement_error_rate
) für Qubitparameter mit einem Majorana-Anweisungssatz. QEC-Schemas weisen in der Regel einen Fehlerratenschwellenwert $p^*$ auf, unter dem Fehlerkorrektur Fehler unterdrückt.
QEC-Protokoll | Python-API-Klasse | Beschreibung |
---|---|---|
"surface_code " |
SURFACE_CODE |
Der gatebasierte Oberflächencode basiert auf arXiv:1208.0928 und arXiv:1009.3686. Der Majorana-Oberflächencode basiert auf arXiv:1909.03002 und arXiv:2007.00307. |
"floquet_code " |
FLOQUET_CODE |
Nur für Majorana-Qubits. Der Floquet-Code basiert auf arXiv:2202.11829. |
Hinweis
Sofern kein anderer Wert angegeben ist, lautet der Standardwert für das QEC-Schema "surface_code".
Die genauen Parameter für jedes vordefinierte QEC-Schema (einschließlich eines kreuzenden Vorfaktors $a$, der für Simulationen numerisch extrahiert werden kann) sind die folgenden.
{
"qubitParams": {
"instructionSet": "GateBased",
}
"qecScheme": {
"name": "surface_code",
"errorCorrectionThreshold": 0.01,
"crossingPrefactor": 0.03,
"logicalCycleTime": "(4 * twoQubitGateTime + 2 * oneQubitMeasurementTime) * codeDistance",
"physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
}
}
{
"qubitParams": {
"instructionSet": "Majorana",
}
"qecScheme": {
"name": "surface_code",
"errorCorrectionThreshold": 0.0015,
"crossingPrefactor": 0.08,
"logicalCycleTime": "20 * oneQubitMeasurementTime * codeDistance",
"physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
}
}
{
"qubitParams": {
"instructionSet": "Majorana",
}
"qecScheme": {
"name": "floquet_code",
"errorCorrectionThreshold": 0.01,
"crossingPrefactor": 0.07,
"logicalCycleTime": "3 * oneQubitMeasurementTime * codeDistance",
"physicalQubitsPerLogicalQubit": "4 * codeDistance * codeDistance + 8 * (codeDistance - 1)"
}
}
Übergeben vordefinierter QEC-Schemas
Es gibt zwei Möglichkeiten, vordefinierte QEC-Schemas anzugeben. Sie können den QEC-Modellnamen für die "qecScheme"
-Klasse auswählen, wenn Sie ausführen qsharp.estimate
. Um beispielsweise den Floquetcode auszuwählen, schreiben Sie Folgendes:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code"
}
})
Sie können auch mithilfe der -Klasse eine Liste von Schätzparametern an die QECScheme
EstimatorParams
-Klasse übergeben. Um beispielsweise den Floquetcode auszuwählen, schreiben Sie Folgendes:
from qsharp.estimator import EstimatorParams, QubitParams, QECScheme,
params = EstimatorParams()
params.items.qec_scheme.name = QECScheme.FLOQUET_CODE # floquet code QEC scheme
qsharp.estimate("RunProgram()", params=params)
Anpassen vordefinierter QEC-Schemas
Sie können vordefinierte QEC-Schemas anpassen, indem Sie den Namen angeben und dann alle anderen Werte aktualisieren. Wenn Sie z. B. den Überquerungsvorfaktor im Floquetcode erhöhen möchten, schreiben Sie Folgendes:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code",
"crossingPrefactor": 0.07,
}
})
Hinweis
Wenn nicht angegeben, werden die Werte für "logicalCycleTime"
und "physicalQubitsPerLogicalQubit"
standardmäßig "oneQubitMeasurementTime"
auf , der Wert für "errorCorrectionThreshold"
standardmäßig auf 0.01
festgelegt, und der Wert für "crossingPrefactor"
ist standardmäßig auf 0.03
festgelegt.
Anpassen Ihrer QEC-Schemas
Der Resource Estimator kann ein angepasstes QEC-Schema basierend auf der obigen Formel abstrahieren, indem Werte für die "crossingPrefactor"
$a$ und die "errorCorrectionThreshold"
$p^*$ angegeben werden. Darüber hinaus müssen Sie angeben "logicalCycleTime"
, d. h. die Zeit für die Ausführung eines einzelnen logischen Vorgangs, die von der Codeentfernung und den Annahmen der physischen Vorgangszeit der zugrunde liegenden physischen Qubits abhängt. Schließlich berechnet eine zweite Formel die "physicalQubitsPerLogicalQubit"
, d. h. die Anzahl der physischen Qubits, die zum Codieren eines logischen Qubits basierend auf dem Codeabstand erforderlich sind.
Sie können den folgenden Code als Vorlage für QEC-Schemas verwenden:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"crossingPrefactor": <double>,
"errorCorrectionThreshold": <double>,
"logicalCycleTime": <formula string>,
"physicalQubitsPerLogicalQubit": <formula string>
}
})
Innerhalb der Formeln können Sie die Variablen one_qubit_gate_time
, two_qubit_gate_time
, one_qubit_measurement_time
und two_qubit_joint_measurement_time
verwenden, deren Werte aus dem entsprechenden Feld aus den physischen Qubitparametern stammen, sowie die Variable eccDistance
für den Codeabstand, der für das logische Qubit berechnet wird, basierend auf den physischen Qubiteigenschaften, dem Fehlerkorrekturschwellenwert und dem Überquerungs-Präfaktor. Die Zeitvariablen und eccDistance
können verwendet werden, um die logicalCycleTime
Formel zu beschreiben. Für die Formel physicalQubitsPerLogicalQubit
kann nur der eccDistance
verwendet werden.
Fehlerbudget
Das Gesamtfehlerbudget $\epsilon$ legt den insgesamt tolerierten Fehler für den Algorithmus fest, d. h. die zulässige Fehlerwahrscheinlichkeit des Algorithmus. Der globale Wert muss zwischen 0 und 1 liegen, und der Standardwert ist 0,001, was 0,1 % entspricht. Anders ausgedrückt: Der Algorithmus darf maximal einmal in 1.000 Ausführungen fehlschlagen. Dieser Parameter ist äußerst anwendungsspezifisch.
Wenn Sie z. B. den Shor-Algorithmus für die Faktorisierung ganzer Zahlen ausführen, kann ein großer Wert für das Fehlerbudget toleriert werden, da überprüft werden kann, ob die Ausgaben tatsächlich die Hauptfaktoren der Eingabe sind. Andererseits kann ein kleineres Fehlerbudget für einen Algorithmus erforderlich sein, der ein Problem mit einer Lösung löst, das nicht so einfach überprüft werden kann.
Das Fehlerbudget entspricht der Summe aus drei Teilen:
$$ \epsilon = \epsilon_{\log} + \epsilon_{\rm dis} + \epsilon_{\rm syn} $$
Wenn keine weitere Angabe erfolgt, wird das Fehlerbudget $\epsilon$ einheitlich verteilt und gilt für Fehler $\epsilon_{\log}$ zum Implementieren logischer Qubits, das Fehlerbudget $\epsilon_{\rm dis}$ erzeugt T-Zustände durch Destillation und ein Fehlerbudget $\epsilon_{\rm syn}$ zum Synthetisieren von Rotationsgates mit beliebigen Winkeln.
Beachten Sie, dass für die Destillation und Rotationssynthese die jeweiligen Fehlerbudgets $\epsilon_{\rm dis}$ und $\epsilon_{\rm syn}$ gleichmäßig auf alle erforderlichen T-Zustände bzw. alle erforderlichen Rotationsgates verteilt sind. Wenn im Eingabealgorithmus keine Rotationsgates vorhanden sind, wird das Fehlerbudget einheitlich auf logische Fehler und T-Zustandsfehler verteilt.
Übergeben des Fehlerbudgets
Es gibt zwei Möglichkeiten, das Fehlerbudget anzugeben, indem Sie eine Zahl zwischen 0 und 1 festlegen. Sie können das Fehlerbudget übergeben, wenn Sie ausführen qsharp.estimate
. Wenn Sie beispielsweise ein Fehlerbudget von 1/3 auswählen möchten, schreiben Sie Folgendes:
qsharp.estimate("RunProgram()", params=
{'errorBudget': 0.333
})
Sie können auch die Fehlerbudgetparameter an die EstimatorParams
-Klasse übergeben.
from qsharp.estimator import EstimatorParams, QubitParams, QECScheme,
params = EstimatorParams()
params.items.error_budget = 0.333 # error budget of 1/3
qsharp.estimate("RunProgram()", params=params)
Außerdem können Sie jede Komponente des Fehlerbudgets einzeln angeben. Die Summe aller Werte entspricht dem Gesamtfehlerbudget und muss zwischen 0 und 1 betragen. Wenn ein Quantenalgorithmus keine T-Zustände oder Drehungen enthält, können die Werte von t_states
und rotations
0 bzw. sein.
Der folgende Code zeigt, wie sie den Fehlerbudgetparameter mit T-Zuständen und Drehungen angeben:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.error_budget.logical = 0.01
params.error_budget.t_states = 0.02
params.error_budget.rotations = 0.03
Einschränkungen
Sie können die "constraints"
-Klasse verwenden, um Einschränkungen auf der T-Factory-Komponentenebene anzuwenden. Durch das Anpassen der Einschränkungen können Sie die Schätzungen optimieren, um die Anzahl der Qubits oder die Laufzeit zu reduzieren.
Parameter | Datentyp | BESCHREIBUNG |
---|---|---|
logical_depth_factor |
float | Steuern sie die Ausführungszeit. Wenn der Wert größer als 1 ist, wird die anfängliche Anzahl logischer Zyklen, auch als logische Tiefe bezeichnet, mit dieser Zahl multipliziert. Wenn Sie reduzieren logical_depth_factor , können Sie die Anzahl der Aufrufe der T-Factory in einem bestimmten Zeitraum erhöhen, was dazu führt, dass weniger T-Factory-Kopien erforderlich sind, um die gleiche Anzahl von T-Zuständen zu erzeugen. Wenn Sie die Anzahl der T-Factorykopien reduzieren, erhöht sich die Laufzeit des Algorithmus entsprechend. Der Skalierungsfaktor für die Gesamtlaufzeit kann größer sein, da die erforderliche logische Fehlerrate aufgrund der zusätzlichen Anzahl von Zyklen zunimmt. |
max_t_factories |
integer | Maximale Anzahl von T Factory-Kopien. Der Ressourcenschätzunger bestimmt die erforderlichen Ressourcen, indem die optimale Anzahl von T-Factorykopien ausgewählt wird, die die Anzahl der verwendeten physischen Qubits minimiert, ohne den Zeitaufwand zu berücksichtigen. Der max_t_factories Parameter begrenzt die maximale Anzahl von Kopien und passt daher die Anzahl logischer Zyklen entsprechend an. Weitere Informationen finden Sie unter T Factory Physical Estimation.For more information, see T factory physical estimation. |
max_duration |
Zeitzeichenfolge | Maximale Laufzeit für den Algorithmus. Der Ressourcenstimator akzeptiert nur eine oder-Einschränkung max_duration max_physical_qubits zu diesem Zeitpunkt, aber nicht zwei. Wenn max_duration angegeben wird, versucht der Resource Estimator, die beste Schätzung für max_physical_qubits unter lösungen zu finden, die durch die angegebene maximale Anzahl eingeschränkt sind. |
max_physical_qubits |
integer | Maximale Anzahl physischer Qubits für den Algorithmus. Der Ressourcenstimator akzeptiert nur eine oder-Einschränkung max_duration max_physical_qubits zu diesem Zeitpunkt, aber nicht zwei. Wenn max_physical_qubits angegeben wird, versucht der Resource Estimator, die beste Schätzung für max_duration unter lösungen zu finden, die durch die angegebene maximale Anzahl eingeschränkt sind. |
Der folgende Code zeigt, wie Sie die Einschränkungen für einen Quantenalgorithmus angeben:
from qsharp.estimator import EstimatorParams
params = EstimatorParams()
params.constraints.max_duration = "1 s"
params.constraints.logical_depth_factor = 1.5
params.constraints.max_t_factories = 10
Hinweis
Wenn der für max_duration
oder max_physical_qubits
bereitgestellte Wert zu klein ist, um eine realisierbare Lösung zu finden, gibt der Resource Estimator einen Fehler zurück. Wenn weder max_duration
noch max_physical_qubits
Einschränkungen angegeben werden, zielt der Resource Estimator darauf ab, eine Lösung mit der kürzesten Zeit zu finden.
Tipp
Sie können max_duration
und verwenden, max_physical_qubits
um den Lösungsraum zu beeinflussen und möglicherweise Lösungen mit einer längeren Laufzeit, aber einer geringeren Anzahl von Qubits im Vergleich zu Lösungen ohne diese Einschränkungen zu finden. Es besteht ein Kompromiss zwischen Der Laufzeit und der Anzahl der Qubits, und dieser Kompromiss kann für einige Algorithmen effizient verwaltet werden, mit unterschiedlichen Auswirkungen auf verschiedene Algorithmen. Tabelle IV in [arXiv:2211.07629] veranschaulicht die effektive Nutzung des Kompromisses zwischen der Anzahl der Qubits und der Laufzeit für Quantendynamikalgorithmen. Weitere Informationen finden Sie unter Quantum resource estimation with time or number of qubits constraints sample.
Destillationseinheiten
Sie können Spezifikationen für T-Fabriken-Destillationsalgorithmen mit der DistillationUnitSpecification
-Klasse bereitstellen. Die Spezifikation kann entweder vordefiniert oder benutzerdefinierter sein. Sie können eine vordefinierte Spezifikation angeben, indem Sie den Namen der Destillationseinheit auswählen: 15-1 RM
oder 15-1 space-efficient
.
from qsharp.estimator import EstimatorParams, DistillationUnitSpecification
params = EstimatorParams()
unit = DistillationUnitSpecification()
unit.name = "15-1 RM" # predefined distillation unit
params.distillation_unit_specifications.append(unit)
In beiden Fällen steht die Notation 15-1 für 15 T-Eingangszustände und einen T-Ausgabezustand. Die 15-1 space-efficient
-Destillationseinheit verwendet weniger Qubits als 15-1 RM
, erfordert jedoch mehr Laufzeit. Weitere Informationen finden Sie in Tabelle VI.
Tipp
Die Verwendung vordefinierter Destillationseinheiten bietet eine bessere Leistung im Vergleich zu benutzerdefinierten Einheiten.
Anpassen Ihrer Destillationseinheiten
Sie können Ihre eigenen Destillationseinheiten anpassen. Die genauen Parameter für die Destillationseinheiten sind die folgenden.
qsharp.estimate("RunProgram()", params=
{"distillationUnitSpecifications": {
"displayName": <string>,
"numInputTs": <int>,
"numOutputTs": <int>,
"failureProbabilityFormula": <string>,
"outputErrorRateFormula": <string>,
"physicalQubitSpecification": <protocol specific parameters>,
"logicalQubitSpecification": <protocol specific parameters>,
"logicalQubitSpecificationFirstRoundOverride": <protocol specific parameters>, # Only if "logicalQubitSpecification"
}
})
Es wird erwartet, dass alle numerischen Parameter positiv sind. Gibt displayName
an, wie die Destillationseinheit in Ausgabeergebnissen angezeigt wird.
Der folgende Code zeigt, wie die Destillationseinheitsparameter für einen Quantenalgorithmus mithilfe der DistillationUnitSpecification
-Klasse und der ProtocolSpecificDistillationUnitSpecification
-Klasse angegeben werden.
from qsharp.estimator import EstimatorParams, DistillationUnitSpecification, ProtocolSpecificDistillationUnitSpecification
params = EstimatorParams()
unit = DistillationUnitSpecification()
unit.display_name = "T"
unit.failure_probability_formula = "c"
unit.output_error_rate_formula = "r"
unit.num_input_ts = 1
unit.num_output_ts = 2
physical_qubit_specification = ProtocolSpecificDistillationUnitSpecification()
physical_qubit_specification.num_unit_qubits = 1
physical_qubit_specification.duration_in_qubit_cycle_time = 2
unit.physical_qubit_specification = physical_qubit_specification
Die Formeln für failure_probability_formula
und output_error_rate_formula
sind benutzerdefinierte Formeln mit einfachen arithmetischen Vorgängen, Konstanten und nur drei Parametern:
clifford_error_rate
, wird auch alsc
bezeichnet.readout_error_rate
, wird auch alsr
bezeichnet.input_error_rate
, wird auch alsz
bezeichnet.
Sehen Sie sich die folgenden Beispiele für benutzerdefinierte Formeln mit langer und kurzer Notation an. Diese Beispiele veranschaulichen Formeln, die standardmäßig in der Standardimplementierung verwendet werden.
Parameter | Lange Formel | Kurze Formel |
---|---|---|
failure_probability_formula |
"15,0 * input_error_rate + 356,0 * clifford_error_rate" | "15.0 * z + 356.0 * c" |
output_error_rate_formula |
"35.0 * input_error_rate ^ 3 + 7.1 * clifford_error_rate" | "35.0 * z ^ 3 + 7.1 * c" |
Mindestens einer der Parameter physical_qubit_specification
logical_qubit_specification
oder sollte angegeben werden. Wenn nur ersteres bereitgestellt wird, kann die Destillationseinheit auf physische Qubits angewendet werden. Wenn nur letzteres bereitgestellt wird, kann die Destillationseinheit auf logische Qubits angewendet werden. Wenn beides angegeben ist, kann die Destillationseinheit auf beide Arten von Qubits angewendet werden.
Der Parameter logical_qubit_specification_first_round_override
kann nur angegeben werden, wenn logical_qubit_specification
angegeben ist. Wenn dies der Fall ist, werden die Werte von logical_qubit_specification
außer Kraft gesetzt, wenn sie bei der ersten Destillationsrunde angewendet werden. Der Wert <protocol specific parameters>
, für logical_qubit_specification_first_round_override
den erforderlich ist, sollte dem Schema folgen:
{
"numUnitQubits": <int>,
"durationInQubitCycleTime": <double>
}
Pareto-Grenzschätzung
Beim Schätzen der Ressourcen eines Algorithmus ist es wichtig, den Kompromiss zwischen der Anzahl der physischen Qubits und der Laufzeit des Algorithmus zu berücksichtigen. Sie könnten die Zuordnung von so vielen physischen Qubits wie möglich in Betracht ziehen, um die Laufzeit des Algorithmus zu reduzieren. Die Anzahl der physischen Qubits wird jedoch durch die Anzahl der physischen Qubits begrenzt, die in der Quantenhardware verfügbar sind. Das Verständnis des Kompromisses zwischen Laufzeit und Systemskalierung ist einer der wichtigsten Aspekte der Ressourcenschätzung.
Die Pareto-Grenzschätzung bietet mehrere Schätzungen für denselben Algorithmus, wobei jeweils Kompromisse zwischen der Anzahl der Qubits und der Laufzeit angezeigt werden.
Hinweis
Wenn Sie den Resource Estimator in Visual Studio Code mit der Option : Berechnen vonQ# Ressourcenschätzungen ausführen, ist die Pareto-Grenzschätzung standardmäßig aktiviert.
Wenn Sie den Resource Estimator in Python ausführen, müssen Sie den "estimateType"
Parameter als "frontier"
angeben.
result = qsharp.estimate("RunProgram()", params=
{"qubitParams": { "name": "qubit_maj_ns_e4" },
"qecScheme": { "name": "surface_code" },
"estimateType": "frontier", # Pareto frontier estimation
}
)
Wenn Sie die Ergebnisse der Pareto-Grenzschätzung visualisieren möchten, können Sie die EstimatesOverview
Funktion verwenden. Diese Funktion zeigt die Ergebnisse der Grenzschätzung in einer Tabelle und einem Raum-Zeit-Diagramm an. Weitere Informationen finden Sie unter Raumzeitdiagramm.
from qsharp_widgets import EstimatesOverview
EstimatesOverview(result)
Hinweis
Wenn beim Arbeiten mit dem Resource Estimator ein Problem aufgetreten ist, lesen Sie die Seite Problembehandlung, oder wenden Sie sich an AzureQuantumInfo@microsoft.com.
Nächste Schritte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für