この記事では、targetの入力パラメーターを、対象とするマシンの特性に合わせてカスタマイズする方法について説明します。 リソース推定器は、これらのパラメーターを使用して、量子コンピューターで量子アルゴリズムを実行するために必要なリソースを見積もります。
注記
リソース見積もりツールを使用するときに問題が発生した場合は、「 トラブルシューティング」ページを参照してください。
前提条件
Python と Pip がインストールされた Python 環境。
最新バージョンの Visual Studio Code (VS Code) または WEB 用の VS Code を開きます。
Microsoft Quantum Development Kit (QDK)、Python、Jupyter 拡張機能がインストールされている VS Code。
最新の
qdkPython ライブラリ、jupyterのエクストラ付き。python -m pip install --upgrade "qdk[jupyter]"
ターゲット パラメーター
リソース推定器は、量子ビットの数や実行時間などのリソースの推定を計算します。これは、特定の量子ビット テクノロジと固定されたアーキテクチャの選択肢を持つ量子コンピューターに特定の量子アルゴリズムを実装するために必要になります。
リソース推定器は、事前に定義された値を使用して一連の入力を受け取り、簡単に開始できます。
- 基になる物理量子ビットのプロパティを定義する 物理量子ビット モデル。
- 量子エラー修正 (QEC) スキーム。これは、想定される量子エラー修正スキームです。
- エラー予算。これは、プログラムが失敗できる回数として定義された、許容される全体的なエラーです。
- コンポーネント レベルに対する制約。論理サイクルの数と T ファクトリ のコピー数です。
- T ファクトリ蒸留アルゴリズムを指定する蒸留ユニット。
- 同じアルゴリズムの量子ビット数と実行時間に対して複数の推定値を実行するパレートフロンティア推定。
ヒント
操作の事前計算済みの見積もりが既にわかっている場合は、それらを組み込んでリソース推定の実行時間を最適化できます。 詳細については、「 リソース推定機能で既知の見積もりを使用する方法」を参照してください。
物理量子ビット パラメーター
リソース推定器は、物理量子ビットの仮定をモデル化するときに、2 つの異なる物理命令セットを使用して量子ビットを操作します。 物理命令セットには、ゲート ベースまたは Majorana のいずれかを指定できます。 ゲートベースの命令セットは、単一量子ビット測定、単一量子ビット ゲート ("T ゲート" を含む)、および 2 量子ビット ゲートを提供します。 Majorana 命令セットは、物理的な T ゲート、単一量子ビット測定、および 2 量子ビットジョイント測定操作を提供します。
6 つの定義済みの量子ビット パラメーターから選択できます。そのうちの 4 つにはゲートベースの命令セットがあり、2 つには Majorana 命令セットがあります。 これらの量子ビット モデルは、実用的な量子アプリケーションを実行するために必要なリソース コストを十分に調べることができるように、さまざまな操作時間とエラー 率をカバーします。
| 量子ビット パラメーター | Python API クラス | 説明 |
|---|---|---|
"qubit_gate_ns_e3" , "qubit_gate_ns_e4" |
GATE_NS_E3 , GATE_NS_E4 |
操作時間と忠実度は、通常ナノ秒の体制で操作時間を持つ トランスモン量子ビットまたは スピン量子ビットの将来のバージョンに対応する可能性があります。 これらの量子ビットでは、ゲート操作と測定操作はそれぞれ 50 ns と 100 ns を要すると想定されます。 単一量子ビットと 2 量子ビット のゲート エラー レートは、現実的な{-3}として $10^target$、スケールアップ システムのオプティミスティック {-4}として $10^target$ であると見なされます。 |
"qubit_gate_us_e3" , "qubit_gate_us_e4" |
GATE_US_E3 , GATE_US_E4 |
操作時間と忠実度は、通常はマイクロ秒単位の操作時間を持つ ionsに基づく量子ビットの将来のバージョンに対応する可能性があります。 イオン量子ビットの典型的な仮定に基づいて、ゲートおよび測定の操作は100μsかかると仮定されます。 単一量子ビットのクリフォード ゲートのエラー率は、現実的な{-3}として $10^target$ で、オプティミスティック {-4}として $10^target$ ですが、単一量子ビットの非クリフォード ゲート (T ゲート) のエラー率は $10^{-6}$ です。 2 量子ビット ゲートの場合、誤差率は現実的な{-3}として $10^target$ であり、楽観的な{-4}として $10^target$ です。 |
"qubit_maj_ns_e4" , "qubit_maj_ns_e6" |
MAJ_NS_E4 , MAJ_NS_E6 |
操作時間と忠実度は、 Majorana 量子ビットの将来の改善されたバージョンに対応する可能性があります。 これらの量子ビットの場合、ゲートと測定の操作には 100 ns を要すると想定されます。 ハードウェアのトポロジ保護を考慮するために、単一量子ビットと 2 量子ビットの共同測定誤差率 (クリフォード誤差率) は、現実的な{-4}として $10^target$、オプティミスティック {-6}として $10^target$ と見なされます。 このアーキテクチャの非クリフォード操作にはトポロジ保護がなく、クリフォード以外の物理 T ゲートのエラー率は 5% です。 |
注記
量子ビット モデルの既定値は "qubit_gate_ns_e3"。
定義済みの量子ビットパラメーターのパラメーター設定
参考までに、定義済みの量子ビット パラメーターは次のとおりです。
{
"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
}
}
定義済みの量子ビット パラメーターを渡す
定義済みの量子ビット パラメーターをプログラムで指定するには、2 つの方法があります。 1 つの方法は、qubitParamsを実行するときに、qsharp.estimate クラスの量子ビット モデル名を選択することです。 たとえば、"qubit_maj_ns_e6"操作を使用してアルゴリズムを実行するQ# プログラムのRunProgram()量子ビット パラメーターを選択するには、次の Python コードを実行します。
from qdk import qsharp
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e6"
},
})
もう 1 つの方法は、EstimatorParamsを使用して量子ビット パラメーターをQubitParamsに渡すことです。 たとえば、 MAJ_NS_E6 量子ビット パラメーターを選択するには、次のコードを実行します。
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)
定義済みの量子ビット パラメーターをカスタマイズする
定義済みの量子ビット パラメーターをカスタマイズします。 は、変更する名前とその他の値を指定します。 たとえば、 qubit_maj_ns_e4の 2 量子ビットジョイント測定の誤差率を下げるには、次のコードを実行します。
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e4",
"twoQubitJointMeasurementErrorRate": 1e-5,
},
})
または、リストの形式で指示を渡すことができます。
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
ゲートベース量子ビットのパラメーター
| Python 識別子 | データの種類 | 説明 |
|---|---|---|
name |
文字列 | 量子ビット モデルの名前 |
instruction_set |
ゲートベース | 基になる量子ビット テクノロジ |
one_qubit_measurement_time |
時刻文字列 | 単一量子ビット測定 ($t_{\rm meas}$) の操作時間 (ns) |
one_qubit_gate_time |
時刻文字列 | 単一量子ビット ゲート ($t_{\rm gate}$) の操作時間 (ns) |
two_qubit_gate_time |
時刻文字列 | ns 単位の 2 量子ビット ゲートの動作時間 |
t_gate_time |
時刻文字列 | 単一量子ビット非クリフォード ゲートの動作時間 (ns) |
one_qubit_measurement_error_rate |
float | 単一量子ビット測定のエラー 率 |
one_qubit_gate_error_rate |
float | 単一量子ビット クリフォード ゲートのエラー 率 ($p$) |
two_qubit_gate_error_rate |
float | 2 量子ビット クリフォード ゲートのエラー 率 |
t_gate_error_rate |
float | 単一量子ビットの非クリフォード状態を準備するためのエラー率 ($p_T$) |
idle_error_rate |
float | アイドリングに対応するエラー率 |
次のコードは、ゲート ベースの命令セットにカスタム量子ビット パラメーターを指定する方法を示しています。
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
注記
two_qubit_gate_timeとt_gate_timeの既定値は、one_qubit_gate_timeの値です。
two_qubit_gate_error_rateとt_gate_error_rateの既定値は、one_qubit_gate_error_rateの値です。
idle_error_rateの既定値は、one_qubit_measurement_error_rateの値です。
Majorana 量子ビットのパラメーター
| Python 識別子 | データの種類 | 説明 |
|---|---|---|
name |
文字列 | 量子ビット モデルの名前 |
instruction_set |
majorana | 基になる量子ビット テクノロジ |
one_qubit_measurement_time |
時刻文字列 | 単一量子ビット測定 ($t_{\rm meas}$) の操作時間 (ns) |
two-qubit_joint_measurement_time |
時刻文字列 | ns での 2 量子ビット測定の動作時間 |
t_gate_time |
時刻文字列 | 単一量子ビット非クリフォード ゲートの動作時間 (ns) |
one_qubit_measurement_error_rate |
float | 単一量子ビット測定のエラー 率 |
two_qubit_joint_measurement_error_rate |
float | 2 量子ビット測定のエラー 率 |
t_gate_error_rate |
float | 単一量子ビットの非クリフォード状態を準備するためのエラー率 ($p_T$) |
idle_error_rate |
float | アイドリングに対応するエラー率 |
必要なすべての値を持つ Majorana 命令セットの最小テンプレートは次のとおりです。
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
注記
two_qubitJointMeasurementTimeとt_gate_timeの既定値は、one_qubit_measurement_timeの値です。
two_qubit_joint_measurement_error_rateとt_gate_error_rateの既定値は、one_qubit_measurement_error_rateの値です。
idle_error_rateの既定値は、one_qubit_measurement_error_rateの値です。
one_qubit_measurement_error_rateとtwo_qubit_joint_measurement_error_rateでは、測定の読み出し、readout、測定処理、processに対応するエラー率を指定できます。 これらの値には、 <double> 数値または数値のペアを指定できます。 次に例を示します。
params.qubit_params.two_qubit_joint_measurement_error_rate = \
MeasurementErrorRate(process=0.00005, readout=0.00007)
注記
Majorana 量子ビット測定で単一量子ビットと 2 量子ビットの誤差率に 1 つの数値を指定した場合、読み取り出力エラー率とプロセス エラー レートの両方が等しい可能性があります。
指定しない値はすべて既定値になります。 たとえば、 "qubit": {"oneQubitGateTime":"200 ns"}を指定した場合、リソース推定器は、2 量子ビット ゲート時間と 1 量子ビット ゲート時間の両方が 200 ns であるゲートベースの量子ビットをモデル化します。 単位の場合は、倍精度浮動小数点数の後にスペースとそのような値の時間単位が続く時刻文字列を指定する必要があります。 サポートされている時刻サフィックスは、 ns、 µs (または us)、 ms、および sです。
量子エラー訂正のスキーム
実用的な規模の量子アプリケーションを実行するには、量子操作のエラー率が低い必要があります。 これらのエラー 率 targets は、通常、生の物理量子ビットの機能を超えています。 この制限を克服するために、量子エラー修正 (QEC) とフォールト トレラント計算は、大規模な量子コンピューターの構成要素を形成する 2 つの重要な手法です。 QEC スキームは、エラーが発生しやすい個々の物理量子ビットのより大きなグループから、エラートレラントな論理量子ビットを構築します。 論理量子ビットは、基になる物理量子ビットよりも量子情報を保持します。
リソース推定器は、次の指数式を使用して論理誤差率をモデル化します。
$$ P = ad^k\left(\frac{p}{p^*}\right)^{\frac{d+1}{2}} $$
ここで、$a$ は交差プリファクター、$d$ はコード距離、$k$ は距離係数の累乗 (通常は 0 に設定)、$p$ は物理エラー率、$p^*$ は量子誤差補正しきい値です。 シミュレーションで使用するために、交差するプリファクター $a$ を数値で抽出できます。
コード距離 $d$ は、修正できるエラーの数を制御するパラメーターです。 コード距離は、論理量子ビットのエラー レートと、論理量子ビットのエンコードに必要な物理量子ビットの数を定義します。 コード距離に合わせて、精度と物理量子ビットの数の両方が増加します。 QEC スキームの目的は、特定のアプリケーションに対して設定した必要なエラーレートを達成できる最小コード距離を見つけることです。
物理エラー率 $p$ は、デバイスで実行される物理的なクリフォード操作の最悪の場合のエラー 率として、量子ビット パラメーターから抽出されます。 特に、ゲートベースの命令セットを持つ量子ビット パラメーターの場合は $p = {}$ max(one_qubit_measurement_error_rate, one_qubit_gate_error_rate, two_qubit_gate_error_rate) であり、Majorana 命令セットを持つ量子ビット パラメーターの場合は $p = {}$ max(one_qubit_measurement_error_rate, two_qubit_joint_measurement_error_rate) です。 QEC スキームには、通常、エラー修正によってエラーが抑制されるエラー レートしきい値$p^*$ があります。
Microsoft Quantum リソース推定器では、2 つの定義済みの QEC スキーム (サーフェス コードとフローケ コード) がサポートされています。
| QEC プロトコル | Python API クラス | 説明 |
|---|---|---|
surface_code
|
SURFACE_CODE |
ゲート ベースのサーフェス コードは、 arXiv:1208.0928 および arXiv:1009.3686 に基づいています。 Majorana サーフェス コードは、 arXiv:1909.03002 および arXiv:2007.00307 に基づいています。 |
floquet_code
|
FLOQUET_CODE |
Majorana 量子ビットの場合のみ。 フローケ コードは、 arXiv:2202.11829 に基づいています。 |
注記
QEC スキームの既定値は "surface_code"。
定義済みの QEC スキームのパラメーター
定義済みの各 QEC スキームの正確なパラメーターは次のとおりです。
{
"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)"
}
}
定義済みの QEC スキームを渡す
定義済みの QEC スキームを指定するには、2 つの方法があります。
"qecScheme"を実行するときに、qsharp.estimate クラスの QEC モデル名を選択できます。 たとえば、フローケ コードを選択するには、次のコードを実行します。
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code"
}
})
EstimatorParams クラスとQECScheme クラスを使用して、推定パラメータの一覧を渡すこともできます。 たとえば、フローケ コードを選択するには、次のコードを実行します。
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)
定義済みの QEC スキームをカスタマイズする
定義済みの QEC スキームをカスタマイズするには、変更する名前とその他の値を指定します。 たとえば、フローケ コードの交差のプリファクターを増やすには、次のコードを実行します。
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code",
"crossingPrefactor": 0.07,
}
})
注記
"logicalCycleTime"と"physicalQubitsPerLogicalQubit"の既定値は、"oneQubitMeasurementTime"の値です。
"errorCorrectionThreshold" の既定値は 0.01 です。
"crossingPrefactor" の既定値は 0.03 です。
QEC スキームをカスタマイズする
リソース推定器は、 "crossingPrefactor" $a$、 distanceCoefficientPower $k$、および "errorCorrectionThreshold" $p^*$ の値を指定することで、上記の数式に基づいてカスタマイズされた QEC スキームを抽象化できます。 また、 "logicalCycleTime"を指定する必要があります。これは、1 つの論理操作の実行にかかる時間であり、基になる物理量子ビットのコード距離と物理操作時間の前提条件によって異なります。 別の数式は、 "physicalQubitsPerLogicalQubit"を計算します。これは、コード距離に基づいて 1 つの論理量子ビットをエンコードするために必要な物理量子ビットの数です。
QEC スキームのテンプレートとして、次のコードを使用できます。
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"crossingPrefactor": <double>,
"errorCorrectionThreshold": <double>,
"distanceCoefficientPower": <integer>,
"logicalCycleTime": <formula string>,
"physicalQubitsPerLogicalQubit": <formula string>
}
})
数式内では、変数 one_qubit_gate_time、 two_qubit_gate_time、 one_qubit_measurement_time、および two_qubit_joint_measurement_timeを使用できます。 これらの変数の値は、 物理量子ビット パラメーターの対応するフィールドと、論理量子ビット、エラー修正しきい値、および交差プリファクターに対して計算されたコード距離の変数 eccDistance から取得されます。 時間変数と eccDistance を使用して、 logicalCycleTime 式を記述できます。 数式 physicalQubitsPerLogicalQubitでは、 eccDistance のみを使用できます。
エラーバジェット(エラーに対する予算)
合計エラー予算 $\epsilon$ は、アルゴリズムの全体的な許容誤差を設定します。これは、アルゴリズムの許容故障確率です。 グローバル値は 0 ~ 1 で、既定値は 0.001 で、0.1% に対応します。 言い換えると、アルゴリズムは 1000 回の実行で最大 1 回失敗できます。 このパラメーターは、アプリケーション固有のものです。
たとえば、Shor のアルゴリズムを実行して大きな整数を考慮している場合は、出力が入力の主要な要因であるかどうかを確認できるため、エラー予算の大きな値を許容できる可能性があります。 一方、効率的に検証できないソリューションの問題を解決するアルゴリズムでは、より小さなエラー予算が必要になる場合があります。
エラー予算は、次の 3 つの部分の合計に対応します。
$$ \epsilon = \epsilon_{\log} + \epsilon_{\rm dis} + \epsilon_{\rm syn} $$
論理エラー $\epsilon_{\log}$ は論理量子ビットを実装するエラー、T 状態エラー $\epsilon_{\rm dis}$ は蒸留による T 状態の生成エラー、回転ゲート エラー $\epsilon_{\rm syn}$ は任意の角度で回転ゲートを合成するエラーです。
注記
別の値を指定しない限り、エラーバジェット $\epsilon$ は論理誤差、T 状態誤差、回転ゲート誤差の間で均一に分散されます。
蒸留と回転の合成では、各エラー予算 $\epsilon_{\rm dis}$ と $\epsilon_{\rm syn}$ がそれぞれ、必要なすべての T 状態とすべての必要な回転ゲートに均等に分散されます。 入力アルゴリズムに回転ゲートがない場合、エラー予算は論理エラーと T 状態エラーに一様に分散されます。
エラー予算を渡す
エラーの予算を指定するには、2 つの方法があります。 1 つの方法は、 qsharp.estimateを実行するときにエラー予算を渡すことです。 たとえば、1/3 のエラー予算を選択するには、次のコードを実行します。
qsharp.estimate("RunProgram()", params=
{'errorBudget': 0.333
})
エラー予算パラメーターを EstimatorParams クラスに渡すこともできます。
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)
また、エラー予算の各コンポーネントを個別に指定することもできます。 すべての値の合計はエラー予算の合計であり、0 から 1 の間である必要があります。 量子アルゴリズムに T 状態または回転が含まれていない場合、 t_states と rotations の値はそれぞれ 0 にすることができます。
次のコードは、T 状態とローテーションでエラー予算パラメーターを指定する方法を示しています。
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
制約
constraints クラスのEstimatorParams属性を使用して、T ファクトリ コンポーネント レベルに制約を適用できます。 制約を調整する場合は、見積もりを最適化して量子ビットの数を減らしますが、実行時間を長くしたり、実行時間を短縮して量子ビットの数を増やしたりすることができます。
| パラメーター | データの種類 | 説明 |
|---|---|---|
logical_depth_factor |
float | 実行時間を制御します。 値が 1 より大きい場合、論理サイクルの初期数 ( logical depth とも呼ばれます) にこの数が乗算されます。
logical_depth_factorを減らすことで、特定の時間内に T ファクトリの呼び出しの数を増やすことができます。その結果、同じ数の T 状態を生成するために必要な T ファクトリ のコピーが少なくなります。 T ファクトリのコピー数を減らすと、それに応じてアルゴリズムの実行時間が増加します。 必要な論理エラー率が増加するのはサイクル数が増えるため、合計実行時間のスケーリング 係数が大きくなる可能性があります。 |
max_t_factories |
整数 | T ファクトリのコピーの最大数。 リソース推定器は、時間オーバーヘッドを考慮せずに、使用される物理量子ビットの数を最小限に抑える T ファクトリ コピーの最適な数を選択することによって必要なリソースを決定します。
max_t_factories パラメーターは、コピーの最大数を制限するため、それに応じて論理サイクルの数を調整します。 詳細については、「 T ファクトリの物理推定を参照してください。 |
max_duration |
時刻文字列 | アルゴリズムの最大実行時間。 リソース推定器は、その時点で max_duration 制約または max_physical_qubits 制約のうち 1 つだけを受け入れますが、2 つは受け入れません。
max_durationが指定されている場合、リソース推定器は、指定された最大数によって制約されるソリューション間でmax_physical_qubitsの最適な見積もりを検索しようとします。 |
max_physical_qubits |
整数 | アルゴリズムの物理量子ビットの最大数。 リソース推定器は、その時点で max_duration 制約または max_physical_qubits 制約のうち 1 つだけを受け入れますが、2 つは受け入れません。
max_physical_qubitsが指定されている場合、リソース推定器は、指定された最大数によって制約されるソリューション間でmax_durationの最適な見積もりを検索しようとします。 |
次のコードは、量子アルゴリズムの制約を指定する方法を示しています。
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
max_durationまたはmax_physical_qubitsに指定した値が小さすぎて実現可能なソリューションが見つからない場合、リソース推定器はエラーを返します。
max_durationまたはmax_physical_qubitsの値を指定しない場合、リソース推定は、最短の実行時に最適化された見積もりを優先します。
注記
実行時間と量子ビット数の間にはトレードオフがあります。 一部のアルゴリズムでは、 max_duration と max_physical_qubitsでこのトレードオフを管理できます。 [arXiv:2211.07629] の表 IV は、量子ビット数と量子ダイナミクス アルゴリズムの実行時間の間のトレードオフの効果的な使用を示しています。 詳細については、「時間または量子ビット数の制約を使用したquantum リソースの推定サンプル」を参照してください。
蒸留ユニット
DistillationUnitSpecification クラスを使用して、T ファクトリ蒸留アルゴリズムの仕様を指定できます。 この仕様は、事前定義済みまたはカスタムのどちらかです。 定義済みの仕様を指定するには、蒸留ユニット名 15-1 RM または 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)
どちらの場合も、 15-1 は 15 個の入力 T 状態と 1 つの出力 T 状態を意味します。
15-1 space-efficient蒸留ユニットは、15-1 RMよりも少ない量子ビットを使用しますが、より長い実行時間が必要です。 詳しくは、「表 VI」をご覧ください。
ヒント
カスタム ユニットの代わりに定義済みの蒸留ユニットを使用すると、パフォーマンスが向上します。
蒸留ユニットをカスタマイズする
独自の蒸留ユニットをカスタマイズできます。 蒸留ユニットの正確なパラメーターは次のとおりです。
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"
}
})
すべての数値パラメーターは正である必要があります。
displayNameは、出力結果に蒸留ユニットを表示する方法を指定します。
次のコードは、ProtocolSpecificDistillationUnitSpecificationを使用して、量子アルゴリズムの蒸留単位パラメーターを指定する方法を示しています。
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
failure_probability_formulaとoutput_error_rate_formulaの数式は、基本的な算術演算と定数を含むカスタム数式です。 これらの数式には、次のパラメーターしかありません。
-
clifford_error_rateは、cとも表されます。 -
readout_error_rateは、rとも表されます。 -
input_error_rateは、zとも表されます。
長短表記のカスタム数式の次の例を参照してください。 これらの例は、標準実装で使用される既定の数式です。
| パラメーター | 長い数式 | 短い数式 |
|---|---|---|
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" |
パラメーター 、 physical_qubit_specification 、または logical_qubit_specificationの少なくとも 1 つの値を指定します。
failure_probability_formulaのみを指定した場合、蒸留ユニットは物理量子ビットに適用されます。
output_error_rate_formulaのみを指定した場合、蒸留は論理量子ビットに適用されます。 両方のパラメーターを指定すると、両方の種類の量子ビットに蒸留単位が適用されます。
logical_qubit_specification_first_round_override パラメーターの値を指定する場合にのみ、logical_qubit_specification パラメーターの値を指定できます。
logical_qubit_specification_first_round_override パラメーターは、蒸留の第 1 ラウンドで適用された場合にlogical_qubit_specificationの値をオーバーライドします。 値 <protocol specific parameters> は logical_qubit_specification_first_round_overrideに必要であり、次のスキームが必要です。
{
"numUnitQubits": <int>,
"durationInQubitCycleTime": <double>
}
パレートフロンティア推定
パレートフロンティア推定を実行する
アルゴリズムの実行に必要なリソースを見積もる場合は、物理量子ビットの数とアルゴリズムのランタイムの間のトレードオフを考慮することが重要です。 より多くの量子ビットを使用する場合は、アルゴリズムの実行時間を短縮できる可能性があります。 ただし、使用できる物理量子ビットの数は、ハードウェア設計によって制限されます。
パレートフロンティア推定は、同じアルゴリズムに対して複数の推定値を提供します。 各見積もりには、量子ビットの数と実行時間の間のトレードオフが表示されます。
注記
vs Code で QDK: リソース見積もりの計算 コマンドを使用してリソース推定を実行すると、パレートフロンティア推定が既定で有効になります。
Python でリソース推定を実行するには、"estimateType"として "frontier" パラメーターを指定する必要があります。
result = qsharp.estimate("RunProgram()", params=
{"qubitParams": { "name": "qubit_maj_ns_e4" },
"qecScheme": { "name": "surface_code" },
"estimateType": "frontier", # Pareto frontier estimation
}
)
パレートフロンティア推定の結果を視覚化するには、 EstimatesOverview 関数を使用できます。 この関数は、フロンティア推定の結果をテーブルと時空間図に表示します。 詳細については、「 時空間図を参照してください。
from qdk.widgets import EstimatesOverview
EstimatesOverview(result)
注記
リソース見積もりツールを使用するときに問題が発生した場合は、[ トラブルシューティング] ページを参照するか、 AzureQuantumInfo@microsoft.comにお問い合わせください。