Delen via


target De parameters van de resource-estimator aanpassen

In dit artikel wordt beschreven hoe u de target parameters van de Azure Quantum Resource Estimator kunt aanpassen aan de machinekenmerken die u wilt instellen. De resource-estimator gebruikt deze parameters om de resources te schatten die nodig zijn om een kwantumalgoritmen uit te voeren op een kwantumcomputer.

Notitie

Als u problemen ondervindt wanneer u met de resource-estimator werkt, raadpleegt u de pagina Probleemoplossing.

Vereisten

Doelparameters

De resource-estimator berekent de schatting van resources, zoals het aantal qubits en de uitvoeringstijd, dat nodig zou zijn om een bepaald kwantumalgoritme te implementeren op een kwantumcomputer met een bepaalde qubittechnologie en vaste set architectuurkeuzen.

De resource estimator neemt een reeks invoerwaarden met vooraf gedefinieerde waarden om u eenvoudig aan de slag te laten gaan:

  • Een fysiek qubitmodel, waarmee de eigenschappen van de onderliggende fysieke qubits worden gedefinieerd.
  • Een QEC-schema (Quantum Error Correction), het veronderstelde kwantumfoutcorrectieschema.
  • Een foutbudget, de algemene toegestane fout, gedefinieerd als het aantal keren dat het programma mag mislukken.
  • Beperkingen op onderdeelniveau, het aantal logische cycli en het aantal T-factorykopieën.
  • Destillatie-eenheden om T factory-destillatiealgoritmen op te geven.
  • Pareto grens schatting om meerdere schattingen uit te voeren voor het aantal qubits en runtime voor hetzelfde algoritme.

Tip

Als u al een aantal vooraf berekende schattingen voor een bewerking kent, kunt u deze opnemen om de uitvoering van de resource-estimator te optimaliseren. Zie Hoe u bekende schattingen gebruikt met de resource-estimator voor meer informatie.

Parameters voor fysieke qubits

Wanneer de Resource Estimator de veronderstellingen van fysieke qubits modelleert, worden twee verschillende fysieke instructiesets gebruikt om op de qubits te werken. De fysieke instructieset kan gate-based of Majorana zijn. Een instructieset op basis van poorten biedt meting van één qubit, enkele qubitpoorten (inclusief T-poorten) en twee qubitpoorten. Een Majorana-instructieset biedt een fysieke T-gate, single-qubit-meting en twee qubit-gezamenlijke meetbewerkingen.

U kunt kiezen uit zes vooraf gedefinieerde qubitparameters, waarvan vier op poorten gebaseerde instructiesets en twee met een Majorana-instructieset. Deze qubitmodellen hebben betrekking op een reeks bewerkingstijden en foutpercentages, waardoor de resourcekosten die nodig zijn voor het inschakelen van praktische kwantumtoepassingen voldoende worden onderzocht.

Qubitparameter Python-API-klasse Beschrijving
"qubit_gate_ns_e3" , "qubit_gate_ns_e4" GATE_NS_E3 , GATE_NS_E4 Bewerkingstijden en betrouwbaarheid kunnen overeenkomen met toekomstige versies van supergeleidende transmon-qubits of kring qubits, die doorgaans bewerkingstijden hebben in het nanoseconde-regime. Voor deze qubits worden poort- en meetbewerkingen uitgegaan van respectievelijk 50 ns en 100 ns. Foutpercentages met één qubit en twee qubitpoorten worden verondersteld $10^{-3}$ als realistisch targette zijn en $10^{-4}$ als optimistisch target voor een opgeschaald systeem.
"qubit_gate_us_e3" , "qubit_gate_us_e4" GATE_US_E3 , GATE_US_E4 Bewerkingstijden en betrouwbaarheid kunnen overeenkomen met toekomstige versies van qubits op basis van ionen, die doorgaans bewerkingstijden hebben in het microseconde-regime. Op basis van typische veronderstellingen voor ion-qubits worden poort- en meetbewerkingen verondersteld om 100 μs te nemen. Foutpercentage voor single-qubit Clifford-poorten is $10^{-3}$ als realistisch target en $10^{-4}$ als optimistisch target, terwijl de foutpercentage voor niet-Clifford-poorten (T-poort) $ 10^{-6}$ is. Voor poorten met twee qubits is de foutsnelheid $10^{-3}$ als realistisch target en $10^{-4}$ als optimistisch target.
"qubit_maj_ns_e4" , "qubit_maj_ns_e6" MAJ_NS_E4 , MAJ_NS_E6 Bewerkingstijden en betrouwbaarheid kunnen overeenkomen met toekomstige verbeterde versies van Majorana-qubits. Voor deze qubits worden poort- en meetbewerkingen verondersteld om 100 ns te nemen. Om rekening te houden met topologische bescherming in de hardware, worden single-qubit- en twee-qubit-foutpercentages (Clifford-foutpercentages) verondersteld $10^{-4}$ als realistisch targette zijn en $10^{-6}$ als optimistisch target. Niet-Clifford-bewerkingen in deze architectuur hebben geen topologische bescherming, foutpercentage voor fysieke T-poorten van niet-Clifford is 5%.

Notitie

Tenzij u een andere waarde opgeeft, is "qubit_gate_ns_e3"de standaardwaarde voor het qubitmodel.

Parameters voor vooraf gedefinieerde qubitparameters

Ter referentie zijn de volledige vooraf gedefinieerde qubitparameters als volgt:

{
    "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
    }
}

Vooraf gedefinieerde qubitparameters doorgeven

Er zijn twee manieren om programmatisch vooraf gedefinieerde qubitparameters op te geven. Een manier is om de naam van het qubit-model voor de qubitParams klasse te selecteren wanneer u qsharp.estimate uitvoert. Als u bijvoorbeeld de "qubit_maj_ns_e6" qubitparameter wilt selecteren, schrijft u de volgende code:

from qdk import qsharp

qsharp.estimate("RunProgram()", params=
                {"qubitParams": {
                        "name": "qubit_maj_ns_e6"
                    },
                })

Een andere manier is om de qubitparameters door te geven aan de EstimatorParams klasse met behulp van QubitParams. Als u bijvoorbeeld de MAJ_NS_E6 qubitparameter wilt selecteren, schrijft u de volgende code:

from qdk import qsharp
from qdk.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)

Vooraf gedefinieerde qubitparameters aanpassen

U kunt vooraf gedefinieerde qubitparameters aanpassen door de naam op te geven en vervolgens een van de andere waarden bij te werken. Als u bijvoorbeeld de foutfrequentie van twee qubit-gezamenlijke metingen in qubit_maj_ns_e4wilt verlagen, schrijft u de volgende code:

qsharp.estimate("RunProgram()", params=
                {"qubitParams": {
                        "name": "qubit_maj_ns_e4",
                        "twoQubitJointMeasurementErrorRate": 1e-5,
                    },
                })

U kunt ook de instructies doorgeven in de vorm van een lijst.

from qsharp.estimator import EstimatorParams, QubitParams

params = EstimatorParams()
params.qubit_params.name = QubitParams.MAJ_NS_E4
params.qubit_params.two_qubit_joint_measurement_error_rate = 1e-5

Parameters van qubits voor op poorten gebaseerde qubits

Python-id Gegevenstype Beschrijving
name tekenreeks Naam voor het qubitmodel
instruction_set "gate_based" Onderliggende qubittechnologie
one_qubit_measurement_time tijdtekenreeks Bewerkingstijd voor meting met één qubit ($t_{\rm meas}$) in ns
one_qubit_gate_time tijdtekenreeks Bewerkingstijd voor poort met één qubit ($t_{\rm gate}$) in ns
two_qubit_gate_time tijdtekenreeks Bewerkingstijd voor twee qubitpoorten in ns
t_gate_time tijdtekenreeks Bewerkingstijd voor niet-Clifford-poort met één qubit in ns
one_qubit_measurement_error_rate zwevend Foutpercentage voor meting met één qubit
one_qubit_gate_error_rate zwevend Foutpercentage voor single-qubit Clifford-poort ($p$)
two_qubit_gate_error_rate zwevend Foutpercentage voor gate van twee qubit Clifford
t_gate_error_rate zwevend Foutpercentage voor het voorbereiden van de status single-qubit non-Clifford ($p_T$)
idle_error_rate zwevend Foutpercentage dat overeenkomt met inactiviteit

De volgende code laat zien hoe u aangepaste qubitparameters opgeeft voor een instructieset op basis van een poort:

from qdk.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

Notitie

De standaardwaarde voor two_qubit_gate_time en t_gate_time is one_qubit_gate_time, de standaardwaarde voor two_qubit_gate_error_rate en t_gate_error_rate is one_qubit_gate_error_rate, en de standaardwaarde voor idle_error_rate is one_qubit_measurement_error_rate.

Qubitparameters voor Majorana-qubits

Python-id Gegevenstype Beschrijving
name tekenreeks Naam voor het qubitmodel
instruction_set "majorana" Onderliggende qubittechnologie
one_qubit_measurement_time tijdtekenreeks Bewerkingstijd voor meting met één qubit ($t_{\rm meas}$) in ns
two-qubit_joint_measurement_time tijdtekenreeks Bewerkingstijd voor meting van twee qubits in ns
t_gate_time tijdtekenreeks Bewerkingstijd voor niet-Clifford-poort met één qubit in ns
one_qubit_measurement_error_rate zwevend Foutpercentage voor meting met één qubit
two_qubit_joint_measurement_error_rate zwevend Foutpercentage voor meting van twee qubits
t_gate_error_rate zwevend Foutpercentage voor het voorbereiden van de status single-qubit non-Clifford ($p_T$)
idle_error_rate zwevend Foutpercentage dat overeenkomt met inactiviteit

Een minimumsjabloon voor een instructieset op basis van Majorana met alle vereiste waarden is:

from qdk.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

Notitie

De standaardwaarde voor two_qubitJointMeasurementTime en t_gate_time is one_qubit_measurement_time, de standaardwaarde voor two_qubit_joint_measurement_error_rate en t_gate_error_rate is one_qubit_measurement_error_rate, en de standaardwaarde voor idle_error_rate is one_qubit_measurement_error_rate.

Voor one_qubit_measurement_error_rate en two_qubit_joint_measurement_error_rate, kunt u de foutpercentages opgeven die overeenkomen met metingsleesbewerkingen, readouten meetverwerking, process. Deze waarden kunnen getallen of paren getallen zijn <double> . Bijvoorbeeld:

params.qubit_params.two_qubit_joint_measurement_error_rate = \
    MeasurementErrorRate(process=0.00005, readout=0.00007)

Notitie

Als u één numerieke waarde opgeeft voor foutpercentages met één qubit en twee qubits in majorana-qubitmeting, zijn zowel lees- als procesfoutpercentages mogelijk gelijk.

Belangrijk

Alle waarden die niet zijn opgegeven, hebben een standaardwaarde. Bijvoorbeeld, het opgeven van "qubit": {"oneQubitGateTime":"200 ns"} modelleert een poort-gebaseerde qubit waarin zowel de poorttijd van de twee-qubit gate als die van de één-qubit gate elk 200 ns is. Voor eenheden moet u tijdtekenreeksen opgeven, die drijvendekommanummers met dubbele precisie zijn, gevolgd door een spatie en de tijdseenheid voor dergelijke waarden. De ondersteunde tijdachtervoegsels zijn ns, µs (of us), msen s.

Kwantumfoutcorrectieschema's

Als u praktische kwantumtoepassingen wilt uitvoeren, moeten kwantumbewerkingen lage foutpercentages hebben. Deze foutpercentages targets vallen doorgaans buiten de mogelijkheden van onbewerkte fysieke qubits. Om deze beperking te overwinnen, zijn kwantumfoutcorrectie (QEC) en fouttolerante berekeningen twee cruciale technieken die de bouwstenen vormen van grootschalige kwantumcomputers. Ten eerste kunnen we met QEC meerdere foutgevoelige fysieke qubits opstellen en een betrouwbaardere logische qubit bouwen die kwantuminformatie beter bewaart dan de onderliggende fysieke qubits.

De resource-estimator gebruikt de volgende formule om logische foutpercentages te modelleren met behulp van een exponententieel model,

$$ P = ad^k\left(\frac{p}{p^*}\right)^{\frac{d+1}{2}} $$

waarbij $a$ een kruisingsprefactor is, $d$ de afstandscode, $k$ een macht van de afstandscoëfficiënt is (meestal ingesteld op 0), $p$ de fysieke foutmarge en $p^*$ de drempelwaarde voor kwantumfoutcorrectie. De kruising vooraf-factor $a$ kan numeriek worden geëxtraheerd voor simulaties.

De codeafstand $d$ is een parameter die het aantal fouten bepaalt dat kan worden gecorrigeerd. Codeafstand definieert dus de foutsnelheid van de logische qubits en het aantal fysieke qubits dat nodig is om ze te coderen. Zowel nauwkeurigheid als het aantal fysieke qubits nemen toe met codeafstand. Het doel van een QEC-schema is om de minimale codeafstand te vinden die de vereiste foutfrequentie voor een bepaalde toepassing kan bereiken.

De fysieke foutsnelheid $p$ wordt geëxtraheerd uit de qubitparameters als de slechtste foutpercentage van een fysieke Clifford-bewerking die op het apparaat wordt uitgevoerd. Met name $p = {}$ max(one_qubit_measurement_error_rate, one_qubit_gate_error_rate, ) two_qubit_gate_error_ratevoor qubitparameters met een instructieset op basis van poorten en $p = {}$ max(one_qubit_measurement_error_rate, two_qubit_joint_measurement_error_rate) voor qubitparameters met een Majorana-instructieset. QEC-schema's hebben doorgaans een drempelwaarde voor foutpercentages $p^*$ waaronder foutcorrectie fouten onderdrukt.

De Azure Quantum Resource Estimator ondersteunt twee vooraf gedefinieerde QEC-schema's: een surface-code en een floquetcode.

QEC-protocol Python-API-klasse Beschrijving
surface_code SURFACE_CODE De oppervlaktecode op basis van poorten is gebaseerd op arXiv:1208.0928 en arXiv:1009.3686. De Majorana-surfacecode is gebaseerd op arXiv:1909.03002 en arXiv:2007.00307.
floquet_code FLOQUET_CODE Alleen voor Majorana-qubits. De floquetcode is gebaseerd op arXiv:2202.11829.

Notitie

Tenzij er een andere waarde is opgegeven, is de standaardwaarde voor het QEC-schema 'surface_code'.

Parameters voor vooraf gedefinieerde QEC-schema's

De exacte parameters voor elk vooraf gedefinieerd QEC-schema zijn het volgende.

{
    "qubitParams": {
        "instructionSet": "GateBased",
    }
    "qecScheme": {
        "name": "surface_code",
        "errorCorrectionThreshold": 0.01,
        "crossingPrefactor": 0.03,
        "distanceCoefficientPower": 0,
        "logicalCycleTime": "(4 * twoQubitGateTime + 2 * oneQubitMeasurementTime) * codeDistance",
        "physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
    }
}

{
    "qubitParams": {
        "instructionSet": "Majorana",
    }
    "qecScheme": {
        "name": "surface_code",
        "errorCorrectionThreshold": 0.0015,
        "crossingPrefactor": 0.08,
        "distanceCoefficientPower": 0,
        "logicalCycleTime": "20 * oneQubitMeasurementTime * codeDistance",
        "physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
    }
}

{
    "qubitParams": {
        "instructionSet": "Majorana",
    }
    "qecScheme": {
        "name": "floquet_code",
        "errorCorrectionThreshold": 0.01,
        "crossingPrefactor": 0.07,
        "distanceCoefficientPower": 0,
        "logicalCycleTime": "3 * oneQubitMeasurementTime * codeDistance",
        "physicalQubitsPerLogicalQubit": "4 * codeDistance * codeDistance + 8 * (codeDistance - 1)"
    }
}

Vooraf gedefinieerde QEC-schema's doorgeven

Er zijn twee manieren om vooraf gedefinieerde QEC-schema's op te geven. U kunt de naam van het QEC-model voor de "qecScheme" klasse selecteren wanneer u deze uitvoert qsharp.estimate. Als u bijvoorbeeld de floquetcode wilt selecteren, schrijft u:

qsharp.estimate("RunProgram()", params=
                {"qecScheme": {
                        "name": "floquet_code"
                    }
                })

U kunt ook een lijst met schattingsparameters doorgeven aan de EstimatorParams. Als u bijvoorbeeld de floquetcode wilt selecteren, schrijft u:

from qdk import qsharp
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)

Vooraf gedefinieerde QEC-schema's aanpassen

U kunt vooraf gedefinieerde QEC-schema's aanpassen door de naam op te geven en vervolgens een van de andere waarden bij te werken. Als u bijvoorbeeld de kruising vooraf in de floquet-code wilt verhogen, schrijft u:

qsharp.estimate("RunProgram()", params=
                {"qecScheme": {
                        "name": "floquet_code",
                        "crossingPrefactor": 0.07,
                    }
                })

Notitie

De standaardwaarde voor "logicalCycleTime" en "physicalQubitsPerLogicalQubit" is "oneQubitMeasurementTime", de standaardwaarde voor "errorCorrectionThreshold" is 0.01, en de standaardwaarde voor "crossingPrefactor" is 0.03.

Uw QEC-schema's aanpassen

De resource-estimator kan een aangepast QEC-schema abstraheren op basis van de bovenstaande formule door waarden op te geven voor de "crossingPrefactor" $a$, de distanceCoefficientPower $k$en de "errorCorrectionThreshold" $p^*$. U moet ook de "logicalCycleTime"tijd opgeven om één logische bewerking uit te voeren en die afhankelijk is van de codeafstand en de veronderstellingen van de fysieke bewerkingstijd van de onderliggende fysieke qubits. Ten slotte berekent een tweede formule het "physicalQubitsPerLogicalQubit"aantal fysieke qubits dat is vereist om één logische qubit te coderen op basis van de codeafstand.

U kunt de volgende code gebruiken als sjabloon voor QEC-schema's:

qsharp.estimate("RunProgram()", params=
                {"qecScheme": {
                        "crossingPrefactor": <double>,
                        "errorCorrectionThreshold": <double>,
                        "distanceCoefficientPower": <integer>,
                        "logicalCycleTime": <formula string>,
                        "physicalQubitsPerLogicalQubit": <formula string>
                    }
                })                

In de formules kunt u de variabelen one_qubit_gate_time, two_qubit_gate_time, en one_qubit_measurement_timetwo_qubit_joint_measurement_time, waarvan de waarden worden opgehaald uit het corresponderende veld van de fysieke qubitparameters, evenals de variabele eccDistance voor de codeafstand die is berekend voor de logische qubit, op basis van de fysieke qubiteigenschappen, de drempelwaarde voor foutcorrectie en de kruisingsvoorfactor. De tijdvariabelen en eccDistance kunnen worden gebruikt om de logicalCycleTime formule te beschrijven. Voor de formule physicalQubitsPerLogicalQubitkan alleen de eccDistance formule worden gebruikt.

Foutbudget

Het totale foutbudget $\epsilon$ stelt de totale getolereerde fout voor het algoritme in, dat wil gezegd, de toegestane foutkans van het algoritme. De globale waarde moet tussen 0 en 1 zijn en de standaardwaarde is 0,001, wat overeenkomt met 0,1%. Met andere woorden, het algoritme mag maximaal één keer in 1000 uitvoeringen mislukken. Deze parameter is zeer specifiek voor toepassingen.

Als u bijvoorbeeld het algoritme van Shor uitvoert voor het factoren van gehele getallen, kan een grote waarde voor het foutbudget worden getolereerd, omdat men kan controleren of de uitvoer inderdaad de belangrijkste factoren van de invoer zijn. Aan de andere kant kan een kleiner foutbudget nodig zijn voor het oplossen van een probleem met een oplossing, dat niet efficiënt kan worden geverifieerd.

Het foutbudget komt overeen met de som van drie delen:

$$ \epsilon = \epsilon_{\log} + \epsilon_{\rm dis} + \epsilon_{\rm syn} $$

De logische fouten $\epsilon_{\log}$ is de fout bij het implementeren van logische qubits, de T-statusfout $\epsilon_{\rm dis}$ is de fout van het produceren van T-statussen via distillatie en de rotatiepoortfout $\epsilon_{\rm syn}$ is de fout van het synthetiseren van draaipoorten met willekeurige hoeken.

Notitie

Tenzij er een andere waarde is opgegeven, wordt het foutbudget $\epsilon$ uniform verdeeld over de logische fout, T-statusfout en draaipoortfout.

Houd er rekening mee dat voor distillatie- en rotatiesynthese de respectieve foutbudgetten $\epsilon_{\rm dis}$ en $\epsilon_{\rm syn}$ uniform worden verdeeld over alle vereiste T-statussen en alle vereiste draaipoorten. Als het invoeralgoritmen geen draaipoorten bevatten, wordt het foutenbudget uniform verdeeld over logische fouten en T-statusfouten.

Geef het foutbudget door

Er zijn twee manieren om het foutbudget op te geven door een getal tussen 0 en 1 in te stellen. U kunt het foutbudget doorgeven wanneer het wordt uitgevoerd qsharp.estimate. Als u bijvoorbeeld een foutbudget van 1/3 wilt selecteren, schrijft u:

qsharp.estimate("RunProgram()", params=
                {'errorBudget': 0.333
                })

U kunt de foutbudgetparameters ook doorgeven aan de EstimatorParams klasse.

from qdk import qsharp
from qdk.estimator import EstimatorParams, QubitParams, QECScheme

params = EstimatorParams()
params.items.error_budget = 0.333 # error budget of 1/3

qsharp.estimate("RunProgram()", params=params)

U kunt ook elk onderdeel van het foutbudget afzonderlijk opgeven. De som van alle waarden is het totale foutbudget en moet tussen 0 en 1 zijn. Als een kwantumalgoritmen geen T-statussen of rotaties bevatten, zijn de waarden van t_states respectievelijk rotations 0.

De volgende code laat zien hoe u de parameter voor het foutbudget met T-statussen en rotaties opgeeft:

from qdk.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

Beperkingen

U kunt de "constraints" klasse gebruiken om beperkingen toe te passen op het onderdeelniveau van T Factory . Door beperkingen aan te passen, kunt u de schattingen optimaliseren voor het verminderen van het aantal qubits of het verminderen van de runtime.

Parameter Gegevenstype Beschrijving
logical_depth_factor zwevend De uitvoeringstijd beheren. Als de waarde groter is dan 1, wordt het eerste aantal logische cycli, ook wel logische diepte genoemd, vermenigvuldigd met dit getal. Door te verminderen logical_depth_factor, kunt u het aantal aanroepen van de T-fabriek in een bepaalde tijd verhogen, wat resulteert in minder T-fabriekskopieën die nodig zijn om hetzelfde aantal T-statussen te produceren. Wanneer u het aantal T Factory-kopieën vermindert, neemt de algoritmeruntime dienovereenkomstig toe. De schaalfactor voor de totale runtime kan groter zijn, omdat het vereiste logische foutpercentage toeneemt vanwege het extra aantal cycli.
max_t_factories geheel getal Maximum aantal T-fabriekskopieën. De resource-estimator bepaalt de resources die vereist zijn door het optimale aantal T Factory-kopieën te selecteren waarmee het aantal gebruikte fysieke qubits wordt geminimaliseerd, zonder rekening te houden met de tijdsoverhead. De max_t_factories parameter beperkt het maximum aantal exemplaren en past daarom het aantal logische cycli dienovereenkomstig aan. Zie de fysieke schatting van T Factory voor meer informatie.
max_duration tijdtekenreeks Maximale runtime voor het algoritme. De resource-estimator accepteert slechts één van max_duration of max_physical_qubits beperkingen op het moment, maar niet twee. Als max_duration dit is opgegeven, probeert de resource-estimator de beste schatting te vinden voor max_physical_qubits oplossingen die zijn beperkt door het opgegeven maximumaantal.
max_physical_qubits geheel getal Maximum aantal fysieke qubits voor het algoritme. De resource-estimator accepteert slechts één van max_duration of max_physical_qubits beperkingen op het moment, maar niet twee. Als max_physical_qubits dit is opgegeven, probeert de resource-estimator de beste schatting te vinden voor max_duration oplossingen die zijn beperkt door het opgegeven maximumaantal.

De volgende code laat zien hoe u de beperkingen voor een kwantumalgoritmen opgeeft:

from qdk.estimator import EstimatorParams

params = EstimatorParams()

params.constraints.max_duration = "1 s"
params.constraints.logical_depth_factor = 1.5
params.constraints.max_t_factories = 10

Notitie

Als de waarde die is opgegeven aan max_duration of max_physical_qubits te klein is om een haalbare oplossing te vinden, retourneert de resource-estimator een fout. Als er geen beperkingen max_duration of max_physical_qubits beperkingen zijn opgegeven, is de resource-estimator erop gericht om een oplossing met de kortste tijd te vinden.

Tip

U kunt de oplossingsruimte gebruiken max_duration en max_physical_qubits beïnvloeden, mogelijk oplossingen vinden met langere runtime, maar een kleiner aantal qubits vergeleken met oplossingen zonder deze beperkingen. Er bestaat een afweging tussen runtime en het aantal qubits, en deze afweging kan efficiënt worden beheerd voor sommige algoritmen, met verschillende effecten op verschillende algoritmen. Tabel IV in [arXiv:2211.07629] illustreert het effectieve gebruik van de afweging tussen het aantal qubits en runtime voor kwantumdynamische algoritmen. Zie De schatting van kwantumresources met tijd of aantal qubitsbeperkingen voor meer informatie.

Destillatie-eenheden

U kunt specificaties opgeven voor T factory's destillatiealgoritmen met de DistillationUnitSpecification klasse. De specificatie kan vooraf gedefinieerd of aangepast zijn. U kunt een vooraf gedefinieerde specificatie opgeven door de naam van de distillatie-eenheid te selecteren: 15-1 RM of 15-1 space-efficient.

from qdk.estimator import EstimatorParams, DistillationUnitSpecification

params = EstimatorParams()
unit = DistillationUnitSpecification()
unit.name = "15-1 RM" # predefined distillation unit

params.distillation_unit_specifications.append(unit)

In beide gevallen staat notatie 15-1 voor 15 invoer-T-statussen en 1 uitvoer T-status. De 15-1 space-efficient distillatie-eenheid gebruikt minder qubits dan 15-1 RM maar vereist meer runtime. Zie Tabel VI voor meer informatie.

Tip

U krijgt betere prestaties wanneer u vooraf gedefinieerde distillatie-eenheden gebruikt in plaats van aangepaste eenheden.

Uw distillatie-eenheden aanpassen

U kunt uw eigen distillatie-eenheden aanpassen. De exacte parameters voor de distillatie-eenheden zijn de volgende.

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"
                        }
                })

Naar verwachting zijn alle numerieke parameters positief. De displayName geeft aan hoe de distillatie-eenheid wordt weergegeven in uitvoerresultaten.

De volgende code laat zien hoe u de parameters voor de distillatie-eenheid voor een kwantumalgoritmen opgeeft met behulp van de DistillationUnitSpecification

from qdk.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

De formules voor failure_probability_formula en output_error_rate_formula zijn aangepaste formules met eenvoudige rekenkundige bewerkingen, constanten en slechts drie parameters:

  • clifford_error_rate, ook aangeduid als c.
  • readout_error_rate, ook aangeduid als r.
  • input_error_rate, ook aangeduid als z.

Zie de volgende voorbeelden van aangepaste formules met behulp van lange en korte notatie. Deze voorbeelden illustreren formules die standaard worden gebruikt in de standaard implementatie.

Parameter Lange formule Korte formule
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"

Ten minste één van de parameters physical_qubit_specification of logical_qubit_specification moet worden opgegeven. Als alleen de vroegere wordt verstrekt, kan de distillatie-eenheid worden toegepast op fysieke qubits. Als alleen de laatste wordt verstrekt, kan de distillatie-eenheid worden toegepast op logische qubits. Als beide worden verstrekt, kan de distillatie-eenheid worden toegepast op beide typen qubits.

De parameter logical_qubit_specification_first_round_override kan alleen worden opgegeven als logical_qubit_specification deze is opgegeven. Zo ja, dan overschrijft het de waarden van logical_qubit_specification wanneer ze worden toegepast bij de eerste ronde van distillatie. De waarde <protocol specific parameters> die vereist is voor logical_qubit_specification_first_round_override moet het volgende schema hebben:

{
    "numUnitQubits": <int>,
    "durationInQubitCycleTime": <double>
}

Schatting van paretogrens

Bij het schatten van de resources van een algoritme is het belangrijk om rekening te houden met het verschil tussen het aantal fysieke qubits en de runtime van het algoritme. U kunt overwegen om zoveel mogelijk fysieke qubits toe te kennen om de runtime van het algoritme te verminderen. Het aantal fysieke qubits wordt echter beperkt door het aantal fysieke qubits dat beschikbaar is in de kwantumhardware. Inzicht in de balans tussen runtime en systeemschaal is een van de belangrijkste aspecten van de schatting van resources.

De pareto grensraming biedt meerdere schattingen voor hetzelfde algoritme, elk met afwegingen tussen het aantal qubits en de runtime.

Notitie

Als u de resource-estimator in Visual Studio Code uitvoert met de QDKopdracht : Resourceschattingen berekenen , is de schatting van de pareto-grens standaard ingeschakeld.

Als u de resource-estimator uitvoert in Python, moet u de "estimateType" parameter opgeven als "frontier".

result = qsharp.estimate("RunProgram()", params=
                    {"qubitParams": { "name": "qubit_maj_ns_e4" },
                    "qecScheme": { "name": "surface_code" },
                    "estimateType": "frontier", # Pareto frontier estimation
                    }
                )

Als u de resultaten van pareto grensraming wilt visualiseren, kunt u de EstimatesOverview functie gebruiken. Met deze functies worden de resultaten van de grensraming in een tabel en een tijddiagram weergegeven. Zie het diagram ruimtetijd voor meer informatie.

from qdk.widgets import EstimatesOverview

EstimatesOverview(result)

Notitie

Als u problemen ondervindt wanneer u met de resource-estimator werkt, raadpleegt u de pagina Probleemoplossing of neemt u contact op AzureQuantumInfo@microsoft.com.

Volgende stappen