稀疏模擬器是 Azure Quantum 開發環境的預設本機模擬器,並利用量子狀態向量的稀疏表示法。 這項功能可讓疏鬆模擬器將用來表示量子狀態的記憶體使用量降到最低,藉此讓模擬能超過更多量子位。 疏鬆模擬器對於代表計算基礎中疏鬆的量子狀態有效率,也就是說,大部分幅度係數在計算基礎中都是零的量子狀態。 因此,稀疏模擬器使用户能够探索比全狀態模擬器所能表示的更大應用,這會在指數級的大量零振幅上浪費記憶體和時間。
如需疏鬆模擬器的詳細資訊,請參閱 Jaques 和 Häner (arXiv:2105.01533) 。
呼叫疏鬆模擬器
稀疏模擬器是 Visual Studio Code 中已安裝 Azure Quantum Development Kit 延伸模組的預設本機模擬器。
| 案例 | 方法 |
|---|---|
| Q#在 VS Code 中的程式中 | 選取 [執行檔案]Q# |
| 在 Python 筆記本數據格中 | result=qsharp.eval("Program_Entry_Operation()")或 result=qsharp.run("Program_Entry_Operation()", shots=##) |
%%qsharp在筆記本數據格中 |
Program_Entry_Operation() |
將泡利噪聲添加到稀疏模擬器中
稀疏模擬器支持在模擬中添加泡利噪聲。 此功能可讓您模擬雜訊對量子運算和量測的影響。 雜訊模型是使用泡利雜訊機率字典指定的,其中索引鍵是泡利運算子 X、 Y和 Z,值是套用對應泡利運算子的機率。 雜訊模型可以用於 Q# 程式、Python 程式中,或在 VS Code 設定中進行配置。
使用 VS Code 設定新增泡利雜訊
您可以在 Visual Studio Code 中設定 Simulation:Pauli 雜訊使用者Q#>設定,以全域設定泡利雜訊。
這些設定會套用至在 VS Code 中執行之所有 Q# 程式的直方圖結果,以及程式中參考的所有閘道、測量和量子位元。 設定與使用 ConfigurePauliNoise() 功能相同。
在未配置噪聲的情況下,執行以下的 GHz 範例程式時,直方圖會大約有一半的情況顯示 $\ket{00000}$,另一半顯示 $\ket{11111}$。
import Std.Diagnostics.*;
import Std.Measurement.*;
operation Main() : Result []{
let num = 5;
return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
H(qs[0]);
ApplyCNOTChain(qs);
let results = MeasureEachZ(qs);
ResetAll(qs);
return results;
}
然而,添加 1% 位元翻轉雜訊顯示狀態開始擴散,而 25% 雜訊時,該狀態與雜訊無法區分。
將帕克里噪聲新增至 Q# 程式
您可以使用此功能 ConfigurePauliNoise() 來設定或修改個別 Q# 程式的雜訊模型。 使用 ConfigurePauliNoise(),您可以精細地控制雜訊在 Q# 程式中應用的位置。
備註
如果您在 VS Code 設定中配置雜訊,則雜訊會套用至所有 Q# 程式。 如果您在Q#程式中使用ConfigurePauliNoise配置雜訊,該程式執行期間,此雜訊會覆蓋您的 VS Code 雜訊設定。
例如,在上一個程式中,您可以在量子位元分配後立即新增雜訊:
...
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
ConfigurePauliNoise(0.05, 0.0, 0.0); // 5% bit-flip noise applies to all operations
H(qs[0]);
...
或在測量操作之前。
...
use qs = Qubit[n];
H(qs[0]);
ApplyCNOTChain(qs);
ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies only to measurement operation
let results = MeasureEachZ(qs);
...
您也可以使用 ConfigurePauliNoise() 來重設或清除雜訊配置。 在此範例中,雜訊設定是在量子位元配置之後設定,然後在 Hadamard 作業之後立即清除,因此雜訊只會套用至 H(); 作業。
...
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
ConfigurePauliNoise(0.05, 0.0, 0.0); // noise applies to H() operation
H(qs[0]);
ConfigurePauliNoise(0.0, 0.0, 0.0); // clear noise settings
...
程式庫中 Std.Diagnostics 提供下列函數,以設定程式中的 Q# 雜訊:
| 功能 | Description | Example |
|---|---|---|
ConfigurePauliNoise() |
設定模擬器執行的泡利雜訊,參數代表 X、Y 和 Z 閘道的機率。 雜訊配置適用於程式中的所有 Q# 後續閘門、量測和量子位元。 略過 VS Code 中的任何雜訊設定,並可由後續 ConfigurePauliNoise() 呼叫重設。 |
ConfigurePauliNoise(0.1, 0.0, 0.5)或 ConfigurePauliNoise(BitFlipNoise(0.1)) |
BitFlipNoise() |
將雜訊配置為僅具有指定機率的 X 閘極。 雜訊配置適用於程式中的所有 Q# 後續閘門、量測和量子位元。 | 10% 位元翻轉雜訊:ConfigurePauliNoise(BitFlipNoise(0.1)) $\等價$ ConfigurePauliNoise(0.1, 0.0, 0.0) |
PhaseFlipNoise() |
將雜訊設定為僅具有指定機率的 Z 閘極。 雜訊配置適用於程式中的所有 Q# 後續閘門、量測和量子位元。 | 10% 相位翻轉雜訊:ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\等價$ ConfigurePauliNoise(0.0, 0.0, 0.1) |
DepolarizingNoise() |
將雜訊配置為 X、Y 或 Z 閘極,機率相等。 | 6% 去極化雜訊:ConfigurePauliNoise(DepolarizingNoise(0.06)) $\等價$ ConfigurePauliNoise(0.2, 0.2, 0.2) |
NoNoise() |
將雜訊模型設定為無雜訊。 |
ConfigurePauliNoise(NoNoise()) $\等價$ ConfigurePauliNoise(0.0, 0.0, 0.0) |
ApplyIdleNoise |
在模擬期間將設定的雜訊套用至單一量子位元。 | ...use q = Qubit[2];ConfigurePauliNoise(0.1, 0.0, 0.0);ApplyIdleNoise(q[0]);... |
將泡利雜訊新增至 Python 程式或 Jupyter Notebook
泡利雜訊配置可透過Python套件 qdk.qsharp 使用,直方圖功能則由套件 qdk.widgets 提供。 噪音已作為參數被添加至 qsharp.run 方法。
qsharp.BitFlipNoiseqsharp.PhaseFlipNoiseqsharp.DepolarizingNoise
以下示例顯示了 10% 去極化噪聲對貝爾態測量的影響。
from qdk import qsharp
from qdk import widgets
%%qsharp
operation BellPair() : Result[] {
use q = Qubit[2];
H(q[0]);
CNOT(q[0], q[1]);
MResetEachZ(q)
}
results = qsharp.run("BellPair()", 20, noise=qsharp.DepolarizingNoise(0.1))
results
透過指定每個泡利運算子的機率,可以將任意泡利雜訊新增至雜訊模型。 讓我們使用前面的GHz範例程式:
%%qsharp
operation GHzSample() : Result[] {
use q = Qubit[5];
H(q[0]);
ApplyCNOTChain(q);
MResetEachZ(q)
}
此程式執行會以 20% 的機率套用雜訊(其中 50% 為位元翻轉,50% 為相位翻轉),
result = qsharp.run("GHzSample()", 20, noise=(0.1, 0.0, 0.1))
display(widgets.Histogram(result))
並且此運行以 10% 機率應用 Pauli-Y 噪聲。
result = qsharp.run("GHzSample()", 20, noise=(0.0, 0.1, 0.0))
display(widgets.Histogram(result))